From cd2183b54fb657d56f6d409b9cd3d63a73f1ffdc Mon Sep 17 00:00:00 2001 From: mustachemo Date: Tue, 21 Nov 2023 08:42:09 -0800 Subject: [PATCH 01/17] layout copied and pasted --- dashboard/layout.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/dashboard/layout.py b/dashboard/layout.py index f711179..facdd1d 100644 --- a/dashboard/layout.py +++ b/dashboard/layout.py @@ -44,7 +44,7 @@ label="Opens a modal for cell higlighting options", children=dmc.Button("Highlight Cells", id="btn-higlight-cells", variant="subtle", leftIcon=DashIconify(icon="bx:highlight"),), ), - dmc.Modal( # This is the modal that will open when the enforce datatypes button is clicked + dmc.Modal( # This is the modal that will open when the highlight cells button is clicked title="Choose options for cell highlighting", id="higlight-cells-modal", zIndex=10000, @@ -116,6 +116,28 @@ label="Distinguish cells that don't match their columns enforced formatting, set in user preferences", children=dmc.Button("Enforce Formatting", id="btn-enforce-format", variant="subtle", leftIcon=DashIconify(icon="streamline:interface-edit-write-2-change-document-edit-modify-paper-pencil-write-writing"),) ), + dmc.Modal( # This is the modal that will open when the enforce formatting button is clicked + title="Select a column to enforce formatting", + id="enforce-formatting-modal", + zIndex=10000, + children=[ + dmc.Space(h=20), + html.Div(id='column-type-selector-2'), + dmc.Space(h=20), + dmc.Group( + [ + dmc.Button("Submit", id="formatting-modal-submit-button"), + dmc.Button( + "Close", + color="red", + variant="outline", + id="formatting-modal-close-button", + ), + ], + position="right", + ), + ], + ), dmc.Space(h=20), dmc.MenuLabel("Cleaning Operations", style={"padding-left": "5px"}), dmc.Tooltip( From be58fb9a68b574715d99fe8a80d4042d94ef46a0 Mon Sep 17 00:00:00 2001 From: mustachemo Date: Tue, 21 Nov 2023 08:48:56 -0800 Subject: [PATCH 02/17] able to populate columns correctly --- dashboard/__init__.py | 26 ++++++++++++++++++++++++++ dashboard/layout.py | 2 +- dashboard/utils/userPreferences.py | 24 ++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/dashboard/__init__.py b/dashboard/__init__.py index 3f53e86..3405929 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -252,6 +252,32 @@ def update_column_datatypes(_, modal_children, columns): return columns +###################### ENFORCE FORMATTING (OPEN MODAL) ###################### +@callback( + Output("enforce-formatting-modal", "opened"), + Input("btn-enforce-format", "n_clicks"), + Input("formatting-modal-close-button", "n_clicks"), + Input("formatting-modal-submit-button", "n_clicks"), + State("enforce-formatting-modal", "opened"), + prevent_initial_call=True, +) +def enforce_dtypes_modal(nc1, nc2, nc3, opened): + return not opened + +###################### ENFORCE FORMATTING (FILL MODAL WITH COLUMNS) ###################### +@callback( + Output("column-format-selector", "children"), + Input("enforce-formatting-modal", "opened"), + State("editable-table", "columns"), + prevent_initial_call=True, +) +def populate_format_selection(opened, columns): + if not opened or not columns: + return dmc.Text("Upload a file to enforce formatting!", style={"color": "black", "fontWeight": "bold", "textAlign": "center"}) + + return UserPreferences.populate_format_selection(opened, columns) + + ###################### CHECK CELLS DATATYPE [CLEANING OPERATION] ###################### @callback( Output('editable-table', 'data', allow_duplicate=True), diff --git a/dashboard/layout.py b/dashboard/layout.py index facdd1d..033e20f 100644 --- a/dashboard/layout.py +++ b/dashboard/layout.py @@ -122,7 +122,7 @@ zIndex=10000, children=[ dmc.Space(h=20), - html.Div(id='column-type-selector-2'), + html.Div(id='column-format-selector'), dmc.Space(h=20), dmc.Group( [ diff --git a/dashboard/utils/userPreferences.py b/dashboard/utils/userPreferences.py index e523012..6acae21 100644 --- a/dashboard/utils/userPreferences.py +++ b/dashboard/utils/userPreferences.py @@ -44,3 +44,27 @@ def populate_datatype_selection(opened, columns): ) return children + +def populate_format_selection(opened, columns): + children = [] + + for col_details in columns: + col_name = col_details['name'] + dropdown_value = col_details.get('format', None) + + input_text = dcc.Input( + id={'type': 'format-input', 'index': col_name}, + value=dropdown_value, + placeholder="Enter format", + style={'width': '9rem'} + ) + + children.append( + html.Div( + [html.Label(col_name), input_text], + style={"display": "flex", "justifyContent": "space-between", + "alignItems": "center", "padding": "0.5rem", "borderBottom": "1px solid #000"} + ) + ) + + return children \ No newline at end of file From 739d80e190928cb513428277b7fe33cfe0c08e8d Mon Sep 17 00:00:00 2001 From: mustachemo Date: Tue, 21 Nov 2023 10:17:35 -0800 Subject: [PATCH 03/17] attempting to make formatting examples more clear --- dashboard/__init__.py | 26 ++++- dashboard/layout.py | 4 +- dashboard/utils/userPreferences.py | 162 ++++++++++++++++++++++++++++- 3 files changed, 188 insertions(+), 4 deletions(-) diff --git a/dashboard/__init__.py b/dashboard/__init__.py index 3405929..f4515db 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -275,7 +275,31 @@ def populate_format_selection(opened, columns): if not opened or not columns: return dmc.Text("Upload a file to enforce formatting!", style={"color": "black", "fontWeight": "bold", "textAlign": "center"}) - return UserPreferences.populate_format_selection(opened, columns) + children = [] + children.append(UserPreferences.create_regex_instructional_area()) + children.append(dmc.Space(h=20)) + + for col_details in columns: + col_name = col_details['name'] + dropdown_value = col_details.get('format', None) + + input_text = dmc.TextInput( + id={'type': 'format-input', 'index': col_name}, + value=dropdown_value, + placeholder="Enter format", + style={'width': '9rem'} + ) + + + children.append( + html.Div( + [html.Label(col_name), input_text], + style={"display": "flex", "justifyContent": "space-between", + "alignItems": "center", "padding": "0.5rem", "borderBottom": "1px solid #000"} + ) + ) + + return children ###################### CHECK CELLS DATATYPE [CLEANING OPERATION] ###################### diff --git a/dashboard/layout.py b/dashboard/layout.py index 033e20f..4f08ced 100644 --- a/dashboard/layout.py +++ b/dashboard/layout.py @@ -117,11 +117,11 @@ children=dmc.Button("Enforce Formatting", id="btn-enforce-format", variant="subtle", leftIcon=DashIconify(icon="streamline:interface-edit-write-2-change-document-edit-modify-paper-pencil-write-writing"),) ), dmc.Modal( # This is the modal that will open when the enforce formatting button is clicked - title="Select a column to enforce formatting", + title="Input a specified format for each column", id="enforce-formatting-modal", zIndex=10000, + size="60rem", children=[ - dmc.Space(h=20), html.Div(id='column-format-selector'), dmc.Space(h=20), dmc.Group( diff --git a/dashboard/utils/userPreferences.py b/dashboard/utils/userPreferences.py index 6acae21..51a3f01 100644 --- a/dashboard/utils/userPreferences.py +++ b/dashboard/utils/userPreferences.py @@ -1,4 +1,114 @@ from dash import html, dcc +import dash_mantine_components as dmc + +definition_items = [ + dmc.ListItem([dmc.Kbd("\\d"), " - Digit (0-9)"]), + dmc.ListItem([dmc.Kbd("\\w"), " - Alphanumeric (a-z, A-Z, 0-9)"]), + dmc.ListItem([dmc.Kbd("\\s"), " - Whitespace (space, tab)"]), + dmc.ListItem([dmc.Kbd("^"), " - Start of string"]), + dmc.ListItem([dmc.Kbd("$"), " - End of string"]), + dmc.ListItem([dmc.Kbd("[]"), " - Character set"]), + dmc.ListItem([dmc.Kbd("[^]"), " - Negated set"]), + dmc.ListItem([dmc.Kbd("()"), " - Group"]), + dmc.ListItem([dmc.Kbd("|"), " - Or"]), + dmc.ListItem([dmc.Kbd("?"), " - Zero or one"]), + dmc.ListItem([dmc.Kbd("*"), " - Zero or more"]), + dmc.ListItem([dmc.Kbd("+"), " - One or more"]), + dmc.ListItem([dmc.Kbd("{n}"), " - Exactly n"]), + dmc.ListItem([dmc.Kbd("{n,}"), " - n or more"]), + dmc.ListItem([dmc.Kbd("{n,m}"), " - Between n and m"]), + dmc.ListItem([dmc.Kbd("."), " - Any character (except newline)"]), + dmc.ListItem([dmc.Kbd("\\"), " - Escape special character"]), + dmc.ListItem([dmc.Kbd("\\A"), " - Start of string"]), + dmc.ListItem([dmc.Kbd("\\b"), " - Word boundary"]), + dmc.ListItem([dmc.Kbd("\\B"), " - Non-word boundary"]), +] + +# Create the header row +header_row = html.Tr([ + html.Th("Pattern"), + html.Th("Explanation"), + html.Th("Example") +]) + +# Create the data rows +data_rows = [ + html.Tr([ + html.Td(dmc.Kbd("ab(cd|ef)")), + html.Td("Matches 'abcd' or 'abef'."), + html.Td([dmc.Highlight("'abcdxyz', ", highlight="abcd"), dmc.Highlight("'abefxyz'", highlight="abef")]) + ]), + html.Tr([ + html.Td(dmc.Kbd("(a|b)c")), + html.Td("Matches 'ac' or 'bc'."), + html.Td([dmc.Highlight("'acxyz', ", highlight="ac"), dmc.Highlight("'bcxyz'", highlight="bc")]) + ]), +] + +# Create the table component +regex_table = dmc.Table( + striped=True, + highlightOnHover=True, + children=[ + html.Thead(header_row), + html.Tbody(data_rows) + ] +) + + +example_items = [ + dmc.ListItem([ + dmc.Kbd("ab(cd|ef)"), + " - Matches 'abcd' or 'abef'. Example: ", + dmc.Highlight("'abcd' in 'abcdxyz', 'abef' in 'abefxyz'", highlight="abcd|abef") + ]), + dmc.ListItem([ + dmc.Kbd("(a|b)c"), + " - Matches 'ac' or 'bc'. Example: ", + dmc.Highlight("'ac' in 'acxyz', 'bc' in 'bcxyz'", highlight="ac|bc") + ]), + dmc.ListItem([ + dmc.Kbd("\\d{2,4}"), + " - Matches 2 to 4 digits. Example: ", + dmc.Highlight("'12' in '1234', '123' in '1234', '1234' in '1234'", highlight="12|123|1234") + ]), + dmc.ListItem([ + dmc.Kbd("a\\d+b"), + " - Matches 'a' followed by one or more digits, then 'b'. Example: ", + dmc.Highlight("'a123b' in 'a123bxyz'", highlight="a123b") + ]), + dmc.ListItem([ + dmc.Kbd("\\b\\w+\\b"), + " - Matches whole words. Example: ", + dmc.Highlight("'hello' in 'hello world'", highlight="hello") + ]), + dmc.ListItem([ + dmc.Kbd("[A-Z]{3}"), + " - Matches any three uppercase letters. Example: ", + dmc.Highlight("'ABC' in 'ABCdef'", highlight="ABC") + ]), + dmc.ListItem([ + dmc.Kbd("\\w+@\\w+\\.com"), + " - Matches email addresses ending in '.com'. Example: ", + dmc.Highlight("'user@example.com' in 'user@example.com'", highlight="user@example.com") + ]), + dmc.ListItem([ + dmc.Kbd("https?://\\w+\\.\\w+"), + " - Matches HTTP and HTTPS URLs. Example: ", + dmc.Highlight("'http://example.com' and 'https://example.com'", highlight="http://example.com|https://example.com") + ]), + dmc.ListItem([ + dmc.Kbd("\\d+\\.\\d{2}"), + " - Matches a number with two decimal places. Example: ", + dmc.Highlight("'123.45' in 'The price is 123.45 dollars'", highlight="123.45") + ]), + dmc.ListItem([ + dmc.Kbd("\\[\\w+\\]"), + " - Matches text within brackets. Example: ", + dmc.Highlight("'[tag]' in 'This is a [tag] in text'", highlight="[tag]") + ]), +] + def extract_dropdown_values(children): @@ -67,4 +177,54 @@ def populate_format_selection(opened, columns): ) ) - return children \ No newline at end of file + return children + +def create_regex_instructional_area(): + return dmc.Alert( + children=[ + dmc.Title(order=4, children="Understanding Regular Expressions", style={"textAlign": "center"}), + dmc.Divider(my="sm"), + dmc.AccordionMultiple(children=[ + dmc.AccordionItem( + [ + dmc.AccordionControl("Common Definitions"), + dmc.AccordionPanel( + dmc.List( + children=definition_items + ), + style={"textAlign": "center"} + ) + ], + value="definitions", + ), + dmc.AccordionItem( + [ + dmc.AccordionControl("Common Examples"), + dmc.AccordionPanel( + dmc.List( + children=regex_table + ) + ) + ], + value="examples", + ) + ]), + html.A( + "Learn More", + href="https://docs.python.org/3/library/re.html", + target="_blank", + style={ + "textDecoration": "none", + "color": "inherit", + "padding": "10px 20px", + "border": "1px solid", + "display": "inline-block", + "marginTop": "10px", + "borderRadius": "4px" + } + ) + ], + style={"maxWidth": 800, "margin": "0 auto"} + ) + + From 181f7c1ae60e6449c4ac72cbce22d536defd72f3 Mon Sep 17 00:00:00 2001 From: mustachemo Date: Tue, 21 Nov 2023 11:25:27 -0800 Subject: [PATCH 04/17] formatt styling done --- dashboard/__init__.py | 2 +- dashboard/layout.py | 2 +- dashboard/utils/parameters.py | 170 +++++++++++++++++++++++++++++ dashboard/utils/userPreferences.py | 156 +++++--------------------- 4 files changed, 200 insertions(+), 130 deletions(-) create mode 100644 dashboard/utils/parameters.py diff --git a/dashboard/__init__.py b/dashboard/__init__.py index f4515db..932eaa0 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -287,7 +287,7 @@ def populate_format_selection(opened, columns): id={'type': 'format-input', 'index': col_name}, value=dropdown_value, placeholder="Enter format", - style={'width': '9rem'} + style={'width': '20rem'} ) diff --git a/dashboard/layout.py b/dashboard/layout.py index 4f08ced..94833d5 100644 --- a/dashboard/layout.py +++ b/dashboard/layout.py @@ -120,7 +120,7 @@ title="Input a specified format for each column", id="enforce-formatting-modal", zIndex=10000, - size="60rem", + size="70rem", children=[ html.Div(id='column-format-selector'), dmc.Space(h=20), diff --git a/dashboard/utils/parameters.py b/dashboard/utils/parameters.py new file mode 100644 index 0000000..55fe913 --- /dev/null +++ b/dashboard/utils/parameters.py @@ -0,0 +1,170 @@ +from dash import html +import dash_mantine_components as dmc + +definition_items = [ + dmc.Col( + html.Div( + style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, + children=[dmc.Kbd("."), html.Span("Matches any character except a newline")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, + children=[dmc.Kbd("^"), html.Span("Matches the start of the string")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, + children=[dmc.Kbd("$"), html.Span("Matches the end of the string or just before the newline")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, + children=[dmc.Kbd("*"), html.Span("Matches 0 or more repetitions of the preceding RE")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, + children=[dmc.Kbd("+"), html.Span("Matches 1 or more repetitions of the preceding RE")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, + children=[dmc.Kbd("?"), html.Span("Matches 0 or 1 repetitions of the preceding RE")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, + children=[dmc.Kbd("{m,n}"), html.Span("Matches from m to n repetitions of the preceding RE")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={ + "display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px" + }, + children=[dmc.Kbd("[...]"), html.Span("Matches any character inside the square brackets")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={ + "display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px" + }, + children=[dmc.Kbd("[^...]"), html.Span("Matches any character not inside the square brackets")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, + children=[dmc.Kbd("(?=...)"), html.Span("Matches if ... matches next, but doesn’t consume any of the string (lookahead assertion)")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, + children=[dmc.Kbd("\\d"), html.Span("Matches any Unicode decimal digit")] + ), + xs=12, md=4 + ), + dmc.Col( + html.Div( + style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, + children=[dmc.Kbd("\\w"), html.Span("Matches Unicode word characters")] + ), + xs=12, md=4 + ), +] + + +# Create the header row +header_row = html.Tr([ + html.Th("Pattern"), + html.Th("Explanation"), + html.Th("Case") +]) + +# Create the data rows +data_rows = [ + html.Tr([ + html.Td(dmc.Kbd("ab(cd|ef)")), + html.Td("Matches 'abcd' or 'abef'."), + html.Td([dmc.Highlight("'abcdxyz', ", highlight="abcd"), dmc.Highlight("'abefxyz'", highlight="abef")]) + ]), + html.Tr([ + html.Td(dmc.Kbd("(a|b)c")), + html.Td("Matches 'ac' or 'bc'."), + html.Td([dmc.Highlight("'acxyz', ", highlight="ac"), dmc.Highlight("'bcxyz'", highlight="bc")]) + ]), + html.Tr([ + html.Td(dmc.Kbd(r"^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$")), + html.Td("Matches a simple email address."), + html.Td(dmc.Highlight("'user@example.com'", highlight="user@example.com")) + ]), + html.Tr([ + html.Td(dmc.Kbd(r"https?://(?:www\.)?\w+\.\w+")), + html.Td("Matches HTTP and HTTPS URLs."), + html.Td(dmc.Highlight("'http://www.example.com'", highlight="http://www.example.com")) + ]), + html.Tr([ + html.Td(dmc.Kbd(r"\(\d{3}\)\s\d{3}-\d{4}")), + html.Td("Matches US phone number with area code in brackets."), + html.Td(dmc.Highlight("'(123) 456-7890'", highlight="(123) 456-7890")) + ]), + html.Tr([ + html.Td(dmc.Kbd(r"^\d{5}-\d{4}$")), + html.Td("Matches US ZIP code in 5-digit + 4 format."), + html.Td(dmc.Highlight("'12345-6789'", highlight="12345-6789")) + ]), + html.Tr([ + html.Td(dmc.Kbd(r"#[a-fA-F0-9]{6}")), + html.Td("Matches hexadecimal color codes."), + html.Td(dmc.Highlight("'#1a2b3c'", highlight="#1a2b3c")) + ]), + html.Tr([ + html.Td(dmc.Kbd(r"^[A-Z][a-z]+\s[A-Z][a-z]+$")), + html.Td("Matches people's names."), + html.Td(dmc.Highlight("'John Doe'", highlight="John Doe")) + ]), + html.Tr([ + html.Td(dmc.Kbd(r"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b")), + html.Td("Matches email addresses (case-insensitive) with subdomains."), + html.Td(dmc.Highlight("'first.last@example.co.uk'", highlight="first.last@example.co.uk")) + ]), + html.Tr([ + html.Td(dmc.Kbd(r"^\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}$")), + html.Td("Matches credit card numbers."), + html.Td(dmc.Highlight("'1234 5678 9012 3456'", highlight="1234 5678 9012 3456")) + ]), + html.Tr([ + html.Td(dmc.Kbd(r"\b\d{1,3}(,\d{3})*\b")), + html.Td("Matches numbers with commas for every thousand."), + html.Td(dmc.Highlight("'1,234,567'", highlight="1,234,567")) + ]), +] + +# Create the table component +regex_table = dmc.Table( + striped=True, + highlightOnHover=True, + children=[ + html.Thead(header_row), + html.Tbody(data_rows) + ] +) \ No newline at end of file diff --git a/dashboard/utils/userPreferences.py b/dashboard/utils/userPreferences.py index 51a3f01..cf97ede 100644 --- a/dashboard/utils/userPreferences.py +++ b/dashboard/utils/userPreferences.py @@ -1,114 +1,6 @@ from dash import html, dcc import dash_mantine_components as dmc - -definition_items = [ - dmc.ListItem([dmc.Kbd("\\d"), " - Digit (0-9)"]), - dmc.ListItem([dmc.Kbd("\\w"), " - Alphanumeric (a-z, A-Z, 0-9)"]), - dmc.ListItem([dmc.Kbd("\\s"), " - Whitespace (space, tab)"]), - dmc.ListItem([dmc.Kbd("^"), " - Start of string"]), - dmc.ListItem([dmc.Kbd("$"), " - End of string"]), - dmc.ListItem([dmc.Kbd("[]"), " - Character set"]), - dmc.ListItem([dmc.Kbd("[^]"), " - Negated set"]), - dmc.ListItem([dmc.Kbd("()"), " - Group"]), - dmc.ListItem([dmc.Kbd("|"), " - Or"]), - dmc.ListItem([dmc.Kbd("?"), " - Zero or one"]), - dmc.ListItem([dmc.Kbd("*"), " - Zero or more"]), - dmc.ListItem([dmc.Kbd("+"), " - One or more"]), - dmc.ListItem([dmc.Kbd("{n}"), " - Exactly n"]), - dmc.ListItem([dmc.Kbd("{n,}"), " - n or more"]), - dmc.ListItem([dmc.Kbd("{n,m}"), " - Between n and m"]), - dmc.ListItem([dmc.Kbd("."), " - Any character (except newline)"]), - dmc.ListItem([dmc.Kbd("\\"), " - Escape special character"]), - dmc.ListItem([dmc.Kbd("\\A"), " - Start of string"]), - dmc.ListItem([dmc.Kbd("\\b"), " - Word boundary"]), - dmc.ListItem([dmc.Kbd("\\B"), " - Non-word boundary"]), -] - -# Create the header row -header_row = html.Tr([ - html.Th("Pattern"), - html.Th("Explanation"), - html.Th("Example") -]) - -# Create the data rows -data_rows = [ - html.Tr([ - html.Td(dmc.Kbd("ab(cd|ef)")), - html.Td("Matches 'abcd' or 'abef'."), - html.Td([dmc.Highlight("'abcdxyz', ", highlight="abcd"), dmc.Highlight("'abefxyz'", highlight="abef")]) - ]), - html.Tr([ - html.Td(dmc.Kbd("(a|b)c")), - html.Td("Matches 'ac' or 'bc'."), - html.Td([dmc.Highlight("'acxyz', ", highlight="ac"), dmc.Highlight("'bcxyz'", highlight="bc")]) - ]), -] - -# Create the table component -regex_table = dmc.Table( - striped=True, - highlightOnHover=True, - children=[ - html.Thead(header_row), - html.Tbody(data_rows) - ] -) - - -example_items = [ - dmc.ListItem([ - dmc.Kbd("ab(cd|ef)"), - " - Matches 'abcd' or 'abef'. Example: ", - dmc.Highlight("'abcd' in 'abcdxyz', 'abef' in 'abefxyz'", highlight="abcd|abef") - ]), - dmc.ListItem([ - dmc.Kbd("(a|b)c"), - " - Matches 'ac' or 'bc'. Example: ", - dmc.Highlight("'ac' in 'acxyz', 'bc' in 'bcxyz'", highlight="ac|bc") - ]), - dmc.ListItem([ - dmc.Kbd("\\d{2,4}"), - " - Matches 2 to 4 digits. Example: ", - dmc.Highlight("'12' in '1234', '123' in '1234', '1234' in '1234'", highlight="12|123|1234") - ]), - dmc.ListItem([ - dmc.Kbd("a\\d+b"), - " - Matches 'a' followed by one or more digits, then 'b'. Example: ", - dmc.Highlight("'a123b' in 'a123bxyz'", highlight="a123b") - ]), - dmc.ListItem([ - dmc.Kbd("\\b\\w+\\b"), - " - Matches whole words. Example: ", - dmc.Highlight("'hello' in 'hello world'", highlight="hello") - ]), - dmc.ListItem([ - dmc.Kbd("[A-Z]{3}"), - " - Matches any three uppercase letters. Example: ", - dmc.Highlight("'ABC' in 'ABCdef'", highlight="ABC") - ]), - dmc.ListItem([ - dmc.Kbd("\\w+@\\w+\\.com"), - " - Matches email addresses ending in '.com'. Example: ", - dmc.Highlight("'user@example.com' in 'user@example.com'", highlight="user@example.com") - ]), - dmc.ListItem([ - dmc.Kbd("https?://\\w+\\.\\w+"), - " - Matches HTTP and HTTPS URLs. Example: ", - dmc.Highlight("'http://example.com' and 'https://example.com'", highlight="http://example.com|https://example.com") - ]), - dmc.ListItem([ - dmc.Kbd("\\d+\\.\\d{2}"), - " - Matches a number with two decimal places. Example: ", - dmc.Highlight("'123.45' in 'The price is 123.45 dollars'", highlight="123.45") - ]), - dmc.ListItem([ - dmc.Kbd("\\[\\w+\\]"), - " - Matches text within brackets. Example: ", - dmc.Highlight("'[tag]' in 'This is a [tag] in text'", highlight="[tag]") - ]), -] - +from dashboard.utils.parameters import definition_items, regex_table def extract_dropdown_values(children): @@ -182,15 +74,37 @@ def populate_format_selection(opened, columns): def create_regex_instructional_area(): return dmc.Alert( children=[ - dmc.Title(order=4, children="Understanding Regular Expressions", style={"textAlign": "center"}), - dmc.Divider(my="sm"), + html.Div( + style={ + "display": "flex", + "justifyContent": "space-around", + "alignItems": "center", + "marginBottom": "1rem" + }, + children=[ + dmc.Title(order=4, children="Understanding Regular Expressions"), + html.A( + "Learn More", + href="https://docs.python.org/3/library/re.html", + target="_blank", + style={ + "textDecoration": "none", + "color": "inherit", + "padding": "10px 20px", + "border": "1px solid", + "borderRadius": "4px", + } + ) + ] + ), dmc.AccordionMultiple(children=[ dmc.AccordionItem( [ dmc.AccordionControl("Common Definitions"), dmc.AccordionPanel( - dmc.List( - children=definition_items + dmc.Grid( + children=definition_items, + style={"margin": "0 auto"} ), style={"textAlign": "center"} ) @@ -209,22 +123,8 @@ def create_regex_instructional_area(): value="examples", ) ]), - html.A( - "Learn More", - href="https://docs.python.org/3/library/re.html", - target="_blank", - style={ - "textDecoration": "none", - "color": "inherit", - "padding": "10px 20px", - "border": "1px solid", - "display": "inline-block", - "marginTop": "10px", - "borderRadius": "4px" - } - ) ], - style={"maxWidth": 800, "margin": "0 auto"} + style={"maxWidth": "70rem", "margin": "0 auto"} ) From d152be4d0e02e7034429fb085099f390964f8d9a Mon Sep 17 00:00:00 2001 From: mustachemo Date: Tue, 21 Nov 2023 12:23:40 -0800 Subject: [PATCH 05/17] able to store input! --- dashboard/__init__.py | 40 ++++++++++++++++++++++++++++++ dashboard/layout.py | 3 ++- dashboard/utils/userPreferences.py | 10 ++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/dashboard/__init__.py b/dashboard/__init__.py index 932eaa0..287a2ce 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -10,6 +10,7 @@ import dashboard.utils.userPreferences as UserPreferences import dashboard.utils.dataAnalysis as DataAnalysis from .layout import layout +import json cache = diskcache.Cache("./cache") long_callback_manager = DiskcacheManager(cache) @@ -301,6 +302,45 @@ def populate_format_selection(opened, columns): return children +###################### ENFORCE FORMATTING (SUBMIT MODAL) ###################### +@callback( + Output('formatting-store', 'data'), + Input('formatting-modal-submit-button', 'n_clicks'), + State('column-format-selector', 'children'), + State('editable-table', 'columns'), + prevent_initial_call=True +) +def update_column_formatting(_, modal_children, columns): + if not columns: + raise exceptions.PreventUpdate + + format_values = UserPreferences.extract_input_values(modal_children) + + print(f'Formatting options: {format_values}') + + # Create a dictionary with column names as keys and formatting options as values + column_formats = { + col['name']: fmt_val for col, fmt_val in zip(columns, format_values) if fmt_val + } + # print(f'Formatting options: {column_formats}') + # print(f'formatting with json: {json.dumps(column_formats)}') + + # Return the dictionary to be stored in dcc.Store as a JSON string + return json.dumps(column_formats) + +@callback( + Output('store-output', 'children'), + Input('formatting-store', 'data'), + prevent_initial_call=True +) +def display_store_data(data): + if data is None: + return "No data in the store." + else: + print(f'Formatting options: {data}') + # Assuming the data is stored as a JSON string + return html.Pre(data) # Use html.Pre for preformatted text to preserve spaces and line breaks + ###################### CHECK CELLS DATATYPE [CLEANING OPERATION] ###################### @callback( diff --git a/dashboard/layout.py b/dashboard/layout.py index 94833d5..a94e2a6 100644 --- a/dashboard/layout.py +++ b/dashboard/layout.py @@ -9,6 +9,7 @@ dcc.Store(id='initial-table-data'), dcc.Store(id='initial-table-columns'), dcc.Store(id='noncomplient-indices'), + dcc.Store(id='formatting-store'), # Sidebar # Sidebar @@ -18,7 +19,7 @@ src="./assets/images/logo.jpeg", alt="USCS", width=40), dmc.Title(f"United States Cold Storage", order=5,), ], style={"display": "flex", "justifyContent": "center", "alignItems": "center", "gap": "1rem", "marginBottom": "1rem", "borderBottom": "1px solid #ccc", 'padding': "1rem"}), - + html.Div(id='store-output'), html.Div([ dmc.Menu([ dmc.MenuLabel("Data Analysis", style={"padding-left": "5px"}), diff --git a/dashboard/utils/userPreferences.py b/dashboard/utils/userPreferences.py index cf97ede..feeb760 100644 --- a/dashboard/utils/userPreferences.py +++ b/dashboard/utils/userPreferences.py @@ -19,6 +19,16 @@ def extract_dropdown_values(children): return dropdown_values +def extract_input_values(children): + input_values = [] + + for child in children: + if isinstance(child, dict) and child.get('type') == 'Div': + for inner_child in child['props']['children']: + if inner_child['type'] == 'TextInput': + input_values.append(inner_child['props']['value']) + + return input_values def populate_datatype_selection(opened, columns): data_type_options = ["text", "numeric", "datetime", "any"] From 95dde18b66d50f8e508748f11c2c943339b44cc7 Mon Sep 17 00:00:00 2001 From: mustachemo Date: Tue, 21 Nov 2023 14:06:06 -0800 Subject: [PATCH 06/17] updated formatting preferences to accept previous inputs --- dashboard/__init__.py | 31 ++++++++++-------------------- dashboard/layout.py | 1 - dashboard/utils/userPreferences.py | 2 +- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/dashboard/__init__.py b/dashboard/__init__.py index 287a2ce..d0fa355 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -270,23 +270,28 @@ def enforce_dtypes_modal(nc1, nc2, nc3, opened): Output("column-format-selector", "children"), Input("enforce-formatting-modal", "opened"), State("editable-table", "columns"), + State('formatting-store', 'data'), prevent_initial_call=True, ) -def populate_format_selection(opened, columns): +def populate_format_selection(opened, columns, formatting_options): if not opened or not columns: return dmc.Text("Upload a file to enforce formatting!", style={"color": "black", "fontWeight": "bold", "textAlign": "center"}) + formatting_options = json.loads(formatting_options) if formatting_options else None + children = [] children.append(UserPreferences.create_regex_instructional_area()) children.append(dmc.Space(h=20)) for col_details in columns: col_name = col_details['name'] - dropdown_value = col_details.get('format', None) + + # Retrieve the format from the stored formatting if it exists, otherwise set to None + placeholder_value = formatting_options.get(col_name, None) if formatting_options else None input_text = dmc.TextInput( id={'type': 'format-input', 'index': col_name}, - value=dropdown_value, + value=placeholder_value, placeholder="Enter format", style={'width': '20rem'} ) @@ -315,31 +320,15 @@ def update_column_formatting(_, modal_children, columns): raise exceptions.PreventUpdate format_values = UserPreferences.extract_input_values(modal_children) - - print(f'Formatting options: {format_values}') # Create a dictionary with column names as keys and formatting options as values column_formats = { col['name']: fmt_val for col, fmt_val in zip(columns, format_values) if fmt_val } - # print(f'Formatting options: {column_formats}') - # print(f'formatting with json: {json.dumps(column_formats)}') - # Return the dictionary to be stored in dcc.Store as a JSON string - return json.dumps(column_formats) + print(f'Formatting options: {column_formats}') -@callback( - Output('store-output', 'children'), - Input('formatting-store', 'data'), - prevent_initial_call=True -) -def display_store_data(data): - if data is None: - return "No data in the store." - else: - print(f'Formatting options: {data}') - # Assuming the data is stored as a JSON string - return html.Pre(data) # Use html.Pre for preformatted text to preserve spaces and line breaks + return json.dumps(column_formats) ###################### CHECK CELLS DATATYPE [CLEANING OPERATION] ###################### diff --git a/dashboard/layout.py b/dashboard/layout.py index a94e2a6..4f13223 100644 --- a/dashboard/layout.py +++ b/dashboard/layout.py @@ -11,7 +11,6 @@ dcc.Store(id='noncomplient-indices'), dcc.Store(id='formatting-store'), - # Sidebar # Sidebar html.Div([ html.Div([ diff --git a/dashboard/utils/userPreferences.py b/dashboard/utils/userPreferences.py index feeb760..6a89549 100644 --- a/dashboard/utils/userPreferences.py +++ b/dashboard/utils/userPreferences.py @@ -36,7 +36,7 @@ def populate_datatype_selection(opened, columns): for col_details in columns: col_name = col_details['name'] - dropdown_value = col_details.get('type', None) + dropdown_value = col_details.get('type', 'any') dropdown = dcc.Dropdown( id={'type': 'datatype-dropdown', 'index': col_name}, From e2569cc5b10210a2b30103982a8ca4fb2aa8e8d9 Mon Sep 17 00:00:00 2001 From: mustachemo Date: Tue, 21 Nov 2023 14:52:27 -0800 Subject: [PATCH 07/17] works now, but need testing --- dashboard/__init__.py | 75 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/dashboard/__init__.py b/dashboard/__init__.py index d0fa355..cb3de20 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -11,6 +11,7 @@ import dashboard.utils.dataAnalysis as DataAnalysis from .layout import layout import json +import re cache = diskcache.Cache("./cache") long_callback_manager = DiskcacheManager(cache) @@ -331,6 +332,72 @@ def update_column_formatting(_, modal_children, columns): return json.dumps(column_formats) + +###################### CHECK CELLS FORMATTING [CLEANING OPERATION] ###################### +@callback( + Output('editable-table', 'data', allow_duplicate=True), + Output('notifications-container', 'children', allow_duplicate=True), + Output('btn-confirm-changes-container', 'children', allow_duplicate=True), + [Input('btn-check-cells-formatting', 'n_clicks')], + State('formatting-store', 'data'), # State to hold formatting options + State('editable-table', 'columns'), + State('editable-table', 'data'), + prevent_initial_call=True +) +def show_noncompliant_format_data(n_clicks, formatting_store_data, columns, data): + if columns is None or data is None or n_clicks is None: + raise exceptions.PreventUpdate + + if formatting_store_data is None: + notification = dmc.Notification( + title="No formatting options found!", + id="simple-notify", + color="yellow", + action="show", + message="", + autoClose=3000, + icon=DashIconify(icon="akar-icons:circle-alert") + ) + return no_update, notification, no_update + + # Load the stored formatting options + formatting_options = json.loads(formatting_store_data) + df = pd.DataFrame.from_dict(data) + non_compliant_rows = set() # To track rows with non-compliant data + + for col in columns: + col_name = col['name'] + # Ensure the column has a formatting pattern stored + if col_name in formatting_options: + pattern = formatting_options[col_name] + regex = re.compile(pattern) + + # Find non-compliant indices and add them to the set + non_compliant_indices = df[col_name].apply(lambda x: not regex.match(str(x)) if x else False) + non_compliant_rows.update(non_compliant_indices[non_compliant_indices].index.tolist()) + + # Filter the dataframe to keep only rows with non-compliant data + df_filtered = df.loc[list(non_compliant_rows)] + + if df_filtered.empty: + print("No format non-compliant data found") + + notification = dmc.Notification( + title="No format non-complient data found!", + id="simple-notify", + color="yellow", + action="show", + message="", + autoClose=3000, + icon=DashIconify(icon="akar-icons:circle-alert") + ) + return no_update, notification, no_update + + confirm_button = dmc.Button("Confirm Changes", id="btn-confirm-changes", style={"backgroundColor": "#12B886"}) + + return df_filtered.to_dict('records'), [], confirm_button + + ###################### CHECK CELLS DATATYPE [CLEANING OPERATION] ###################### @callback( Output('editable-table', 'data', allow_duplicate=True), @@ -342,7 +409,7 @@ def update_column_formatting(_, modal_children, columns): State('editable-table', 'data'), prevent_initial_call=True ) -def show_noncomplient_data(n_clicks, columns, data): +def show_noncomplient_dtype_data(n_clicks, columns, data): if columns is None or data is None or n_clicks is None: raise exceptions.PreventUpdate @@ -408,10 +475,10 @@ def is_numeric(val): # print(df_filtered) if df_filtered.empty: - print("No non-compliant data found") + print("No datatype non-compliant data found") notification = dmc.Notification( - title="No non-complient data found!", + title="No datatype non-complient data found!", id="simple-notify", color="yellow", action="show", @@ -435,7 +502,7 @@ def is_numeric(val): State('editable-table', 'data'), prevent_initial_call=True ) -def style_noncompliant_cells(cache, columns, data): +def style_noncompliant_dtype_cells(cache, columns, data): if not cache: raise exceptions.PreventUpdate From ea7cee792c7c403d6efc213347ede53cdab8d480 Mon Sep 17 00:00:00 2001 From: mustachemo Date: Tue, 21 Nov 2023 15:02:52 -0800 Subject: [PATCH 08/17] update test file --- dashboard/assets/data/test.xlsx | Bin 10804 -> 14205 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dashboard/assets/data/test.xlsx b/dashboard/assets/data/test.xlsx index e35cc141b553c005edd57bc9db76f30b58c8509f..bfbbf7bb38d96786fd813912958b3b3b6ad914b6 100644 GIT binary patch literal 14205 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 U0M+I9?j2abG|+^mu>5ZQ9~L;g>i_@% literal 10804 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 H$G`svoeT-1 From e6f51ec4c40644b513009783e0a0f21552d6d04d Mon Sep 17 00:00:00 2001 From: mustachemo Date: Tue, 21 Nov 2023 15:18:59 -0800 Subject: [PATCH 09/17] styled format selector better --- dashboard/utils/parameters.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/dashboard/utils/parameters.py b/dashboard/utils/parameters.py index 55fe913..f83c058 100644 --- a/dashboard/utils/parameters.py +++ b/dashboard/utils/parameters.py @@ -7,49 +7,49 @@ style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, children=[dmc.Kbd("."), html.Span("Matches any character except a newline")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, children=[dmc.Kbd("^"), html.Span("Matches the start of the string")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, children=[dmc.Kbd("$"), html.Span("Matches the end of the string or just before the newline")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, children=[dmc.Kbd("*"), html.Span("Matches 0 or more repetitions of the preceding RE")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, children=[dmc.Kbd("+"), html.Span("Matches 1 or more repetitions of the preceding RE")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, children=[dmc.Kbd("?"), html.Span("Matches 0 or 1 repetitions of the preceding RE")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, children=[dmc.Kbd("{m,n}"), html.Span("Matches from m to n repetitions of the preceding RE")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( @@ -58,7 +58,7 @@ }, children=[dmc.Kbd("[...]"), html.Span("Matches any character inside the square brackets")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( @@ -67,28 +67,28 @@ }, children=[dmc.Kbd("[^...]"), html.Span("Matches any character not inside the square brackets")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, children=[dmc.Kbd("(?=...)"), html.Span("Matches if ... matches next, but doesn’t consume any of the string (lookahead assertion)")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, children=[dmc.Kbd("\\d"), html.Span("Matches any Unicode decimal digit")] ), - xs=12, md=4 + xs=12, md=6 ), dmc.Col( html.Div( style={"display": "flex", "alignItems": "center", "justifyContent": "start", "gap": "10px"}, children=[dmc.Kbd("\\w"), html.Span("Matches Unicode word characters")] ), - xs=12, md=4 + xs=12, md=6 ), ] From bfd1285e90690ebf655021fdc74329bbbf8fd29c Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 27 Nov 2023 11:40:07 -0800 Subject: [PATCH 10/17] got rid of extra file --- downloadbutton.py | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 downloadbutton.py diff --git a/downloadbutton.py b/downloadbutton.py deleted file mode 100644 index d178d22..0000000 --- a/downloadbutton.py +++ /dev/null @@ -1,22 +0,0 @@ -import dash_mantine_components as dmc -from dash import Dash, html, Output, Input, callback - -app = Dash(__name__) - -data = [["csv", "csv"], ["xsls", "xsls"], ["pdf", "pdf"], ["html", "html"], ["xml", "xml"]] - -app.layout = html.Div( - [ - dmc.Button("Download", style={"backgroundColor": "#0C7FDA"}), - dmc.RadioGroup( - [dmc.Radio(l, value=k) for k, l in data], - id="radiogroup-simple", - value="react", - size="sm", - mt=10, - ), - ] -) - -if __name__ == "__main__": - app.run_server() \ No newline at end of file From 127e499473579dbd221011eda0b9fc2ca8524269 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 27 Nov 2023 11:51:22 -0800 Subject: [PATCH 11/17] formatting higlighting works! --- dashboard/__init__.py | 52 ++++++++++++++++++++++++++++++++++++------- dashboard/layout.py | 1 + 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/dashboard/__init__.py b/dashboard/__init__.py index cb3de20..e519a14 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -327,8 +327,6 @@ def update_column_formatting(_, modal_children, columns): col['name']: fmt_val for col, fmt_val in zip(columns, format_values) if fmt_val } - print(f'Formatting options: {column_formats}') - return json.dumps(column_formats) @@ -336,6 +334,7 @@ def update_column_formatting(_, modal_children, columns): ###################### CHECK CELLS FORMATTING [CLEANING OPERATION] ###################### @callback( Output('editable-table', 'data', allow_duplicate=True), + Output('noncomplient-indices-2', 'data'), Output('notifications-container', 'children', allow_duplicate=True), Output('btn-confirm-changes-container', 'children', allow_duplicate=True), [Input('btn-check-cells-formatting', 'n_clicks')], @@ -380,8 +379,6 @@ def show_noncompliant_format_data(n_clicks, formatting_store_data, columns, data df_filtered = df.loc[list(non_compliant_rows)] if df_filtered.empty: - print("No format non-compliant data found") - notification = dmc.Notification( title="No format non-complient data found!", id="simple-notify", @@ -391,11 +388,52 @@ def show_noncompliant_format_data(n_clicks, formatting_store_data, columns, data autoClose=3000, icon=DashIconify(icon="akar-icons:circle-alert") ) - return no_update, notification, no_update + return no_update, no_update, notification, no_update confirm_button = dmc.Button("Confirm Changes", id="btn-confirm-changes", style={"backgroundColor": "#12B886"}) - return df_filtered.to_dict('records'), [], confirm_button + return df_filtered.to_dict('records'), df_filtered.index.tolist(), [], confirm_button + + +###################### CLEAN CELLS FORMATTING [CLEANING OPERATION] highlighting ###################### +@callback( + Output('editable-table', 'style_data_conditional', allow_duplicate=True), + [Input('noncomplient-indices-2', 'data')], + State('editable-table', 'columns'), + State('editable-table', 'data'), + State('formatting-store', 'data'), # State to hold formatting options + prevent_initial_call=True +) +def style_noncompliant_format_cells(cache, columns, data, formatting_store_data): + if not cache: + raise exceptions.PreventUpdate + + if formatting_store_data is None: + return no_update + + # Load the stored formatting options + formatting_options = json.loads(formatting_store_data) + df = pd.DataFrame.from_dict(data) + style_data_conditional = [] + + for col in columns: + col_name = col['name'] + # Ensure the column has a formatting pattern stored + if col_name in formatting_options: + pattern = formatting_options[col_name] + regex = re.compile(pattern) + + # Find non-compliant indices and add them to the set + non_compliant_indices = df[col_name].apply(lambda x: not regex.match(str(x)) if x else False) + non_compliant_rows = non_compliant_indices[non_compliant_indices].index.tolist() + + for idx in non_compliant_rows: + style_data_conditional.append({ + 'if': {'row_index': idx, 'column_id': col['name']}, + 'backgroundColor': '#93c5fd', + }) + + return style_data_conditional ###################### CHECK CELLS DATATYPE [CLEANING OPERATION] ###################### @@ -475,8 +513,6 @@ def is_numeric(val): # print(df_filtered) if df_filtered.empty: - print("No datatype non-compliant data found") - notification = dmc.Notification( title="No datatype non-complient data found!", id="simple-notify", diff --git a/dashboard/layout.py b/dashboard/layout.py index 4f13223..2d233ce 100644 --- a/dashboard/layout.py +++ b/dashboard/layout.py @@ -9,6 +9,7 @@ dcc.Store(id='initial-table-data'), dcc.Store(id='initial-table-columns'), dcc.Store(id='noncomplient-indices'), + dcc.Store(id='noncomplient-indices-2'), dcc.Store(id='formatting-store'), # Sidebar From be152f432215f1b47713551ff1a9178a88ffb551 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 27 Nov 2023 11:55:27 -0800 Subject: [PATCH 12/17] removed extra buttons --- dashboard/__init__.py | 2 +- dashboard/layout.py | 27 ++++++++++++++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/dashboard/__init__.py b/dashboard/__init__.py index e519a14..4997782 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -107,7 +107,7 @@ def highlight_cells(submit_btn, highlight_empty_cells, highlight_dtype_cells, co prevent_initial_call=True ) def remove_duplicate_rows(data, n_clicks): - if data is None and n_clicks is None: + if data is None or n_clicks is None: raise exceptions.PreventUpdate df = pd.DataFrame.from_dict(data) diff --git a/dashboard/layout.py b/dashboard/layout.py index 2d233ce..154da3c 100644 --- a/dashboard/layout.py +++ b/dashboard/layout.py @@ -182,17 +182,7 @@ transitionDuration=300, label="Distinguish cells that don't match their columns enforced formatting, set in user preferences", children=dmc.Button("Check Cells Formatting", id="btn-check-cells-formatting", variant="subtle", leftIcon=DashIconify(icon="mdi:checkbox-outline"),), - ), - dmc.Tooltip( - withArrow=True, - width=200, - multiline=True, - position="right", - transition="fade", - transitionDuration=300, - label="Check all cells for any issues", - children=dmc.Button("Clean All", id="btn-clean-all", variant="subtle", color="red", leftIcon=DashIconify(icon="material-symbols:cleaning-services-outline"),), - ), + ) ]), ], style={"fontSize": "26px"}), ], className="sidebar"), @@ -290,6 +280,21 @@ 'backgroundColor': '#c4b5fd', 'margin': '0.5rem', })), + dmc.Tooltip( + withArrow=True, + width=200, + multiline=True, + position="right", + transition="fade", + transitionDuration=300, + label="Cells with noncomplient formatting", + children=html.Div(style={ + 'display': 'inline-block', + 'width': '20px', + 'height': '20px', + 'backgroundColor': '#93c5fd', + 'margin': '0.5rem', + })), ], style={"display": "flex", "backgroundColor": "grey"}), From ee8dfc862c12e1af7239a3f1af465e44d8a0fe1f Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 27 Nov 2023 12:07:30 -0800 Subject: [PATCH 13/17] addded check empty cells function --- dashboard/__init__.py | 75 ++++++++++++++++++++++++++++++++++++++++++- dashboard/layout.py | 1 + 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/dashboard/__init__.py b/dashboard/__init__.py index 4997782..1f68a75 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -330,6 +330,79 @@ def update_column_formatting(_, modal_children, columns): return json.dumps(column_formats) +###################### CHECK EMPTY/CORRUPT CELLS [CLEANING OPERATION] ###################### +@callback( + Output('editable-table', 'data', allow_duplicate=True), + Output('noncomplient-indices-3', 'data'), + Output('notifications-container', 'children', allow_duplicate=True), + Output('btn-confirm-changes-container', 'children', allow_duplicate=True), + [Input('btn-check-empty-corrupt-cells', 'n_clicks')], + State('editable-table', 'columns'), + State('editable-table', 'data'), + prevent_initial_call=True +) +def show_noncomplient_empty_data(n_clicks, columns, data): + if columns is None or data is None or n_clicks is None: + raise exceptions.PreventUpdate + + df = pd.DataFrame.from_dict(data) + non_compliant_rows = set() # To track rows with non-compliant data + + for col in columns: + # Find non-compliant indices and add them to the set + non_compliant_indices = df[col['name']].apply(lambda x: pd.isna(x)) + non_compliant_rows.update(non_compliant_indices[non_compliant_indices].index.tolist()) + + # Filter the dataframe to keep only rows with non-compliant data + df_filtered = df.loc[list(non_compliant_rows)] + + if df_filtered.empty: + notification = dmc.Notification( + title="No empty/corrupt data found!", + id="simple-notify", + color="yellow", + action="show", + message="", + autoClose=3000, + icon=DashIconify(icon="akar-icons:circle-alert") + ) + return no_update, no_update, notification, no_update + + confirm_button = dmc.Button("Confirm Changes", id="btn-confirm-changes", style={"backgroundColor": "#12B886"}) + + return df_filtered.to_dict('records'), df_filtered.index.tolist(), [], confirm_button + + +###################### CLEAN EMPTY/CORRUPT CELLS [CLEANING OPERATION] highlighting ###################### +@callback( + Output('editable-table', 'style_data_conditional', allow_duplicate=True), + [Input('noncomplient-indices-3', 'data')], + State('editable-table', 'columns'), + State('editable-table', 'data'), + prevent_initial_call=True +) +def style_noncompliant_empty_cells(cache, columns, data): + if not cache: + raise exceptions.PreventUpdate + + df = pd.DataFrame.from_dict(data) + style_data_conditional = [] + + for col in columns: + # Find non-compliant indices + non_compliant_indices = df[col['name']].apply(pd.isna) + non_compliant_rows = non_compliant_indices[non_compliant_indices].index.tolist() + + for idx in non_compliant_rows: + style_data_conditional.append({ + 'if': {'row_index': idx, 'column_id': col['name']}, + 'backgroundColor': '#f87171', # Red background to highlight non-compliant cells + }) + + + return style_data_conditional + + ###################### CHECK CELLS FORMATTING [CLEANING OPERATION] ###################### @callback( @@ -357,7 +430,7 @@ def show_noncompliant_format_data(n_clicks, formatting_store_data, columns, data autoClose=3000, icon=DashIconify(icon="akar-icons:circle-alert") ) - return no_update, notification, no_update + return no_update, no_update, notification, no_update # Load the stored formatting options formatting_options = json.loads(formatting_store_data) diff --git a/dashboard/layout.py b/dashboard/layout.py index 154da3c..d4bea25 100644 --- a/dashboard/layout.py +++ b/dashboard/layout.py @@ -10,6 +10,7 @@ dcc.Store(id='initial-table-columns'), dcc.Store(id='noncomplient-indices'), dcc.Store(id='noncomplient-indices-2'), + dcc.Store(id='noncomplient-indices-3'), dcc.Store(id='formatting-store'), # Sidebar From ba3c8d6b2fcefe49d8651c479da21ea8ceb7b254 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 27 Nov 2023 12:15:09 -0800 Subject: [PATCH 14/17] cleaning code --- dashboard/__init__.py | 230 ++++++++++++++++++++++-------------------- dashboard/layout.py | 9 +- 2 files changed, 122 insertions(+), 117 deletions(-) diff --git a/dashboard/__init__.py b/dashboard/__init__.py index 1f68a75..db6b928 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -15,16 +15,11 @@ cache = diskcache.Cache("./cache") long_callback_manager = DiskcacheManager(cache) - -# This is the main app object app = Dash(__name__, suppress_callback_exceptions=True) -# Improves load time by not loading all callbacks at once. 5-10% improvement -# app.config.suppress_callback_exceptions = True - app.layout = layout -# region handleFile +# region handleFile ###################### UPLOAD FILE ###################### @callback( @@ -42,9 +37,39 @@ def upload_file(prevData, files, fileNames): if files is None: raise exceptions.PreventUpdate + return HandleFile.importFiles(prevData, files, fileNames) +###################### DOWNLOAD FILE ###################### +@callback( + Output("download-file", "data"), + Output("notifications-container", "children", allow_duplicate=True), + Input("btn-download", "n_clicks"), + State('editable-table', 'data'), + State('editable-table', 'columns'), + State('file-type-select', 'value'), + prevent_initial_call=True, +) +def download_file(_, data, columns, fileType): + if (data == None or columns == None): + print("Nothing to export") + raise exceptions.PreventUpdate - return HandleFile.importFiles(prevData, files, fileNames) + notification = dmc.Notification( + title="File Exported Successfuly!", + id="simple-notify", + color="green", + action="show", + autoClose=3000, + message='', + icon=DashIconify(icon="akar-icons:circle-alert"), + ) + + return HandleFile.exportFile(data, columns, fileType), notification + +# endregion + + +# region dataAnalysis ###################### Data Analytics ###################### @callback( @@ -96,115 +121,12 @@ def highlight_cells(submit_btn, highlight_empty_cells, highlight_dtype_cells, co if submit_btn: return new_highlighting - - -###################### REMOVE DUPLICATE ROWS ###################### -@callback( - Output('editable-table', 'data'), - Output('notifications-container', 'children', allow_duplicate=True), - State('editable-table', 'data'), - Input('btn-remove-duplicates', 'n_clicks'), - prevent_initial_call=True -) -def remove_duplicate_rows(data, n_clicks): - if data is None or n_clicks is None: - raise exceptions.PreventUpdate - - df = pd.DataFrame.from_dict(data) - df.drop_duplicates(inplace=True) - - # Count how many rows were removed - rows_removed = len(data) - len(df) - - if rows_removed == 0: - notification = dmc.Notification( - title="No duplicate rows found!", - id="simple-notify", - color="yellow", - action="show", - autoClose=3000, - message="", - icon=DashIconify(icon="akar-icons:circle-alert") - ) - return no_update, notification - - else: - notification = dmc.Notification( - title="Duplicate rows removed!", - id="simple-notify", - color="yellow", - action="show", - autoClose=3000, - message=f'{rows_removed} rows removed', - icon=DashIconify(icon="akar-icons:circle-check"), - ) - - return df.to_dict('records'), notification - - -###################### DOWNLOAD FILE ###################### -@callback( - Output("download-file", "data"), - Output("notifications-container", "children", allow_duplicate=True), - Input("btn-download", "n_clicks"), - State('editable-table', 'data'), - State('editable-table', 'columns'), - State('file-type-select', 'value'), - prevent_initial_call=True, -) -def download_file(_, data, columns, fileType): - if (data == None or columns == None): - print("Nothing to export") - raise exceptions.PreventUpdate - - notification = dmc.Notification( - title="File Exported Successfuly!", - id="simple-notify", - color="green", - action="show", - autoClose=3000, - message='', - icon=DashIconify(icon="akar-icons:circle-alert"), - ) - - return HandleFile.exportFile(data, columns, fileType), notification + # endregion -# region datacleaner - -# @app.long_callback( -# Output("editable-table", "data"), -# Output("log-textbox", "children"), -# Input("clean-data-button", "n_clicks"), -# State("editable-table", "data"), -# State("editable-table", "columns"), -# State("auto-clean-checkbox", "checked"), -# running=[(Output("clean-data-button", "disabled"), True, False), -# (Output("cancel-button", "disabled"), False, True) -# ], -# cancel=[Input("cancel-button", "n_clicks")], -# manager=long_callback_manager, -# prevent_initial_call=True, -# ) -# def cleanData(_, data, columns, isAutoClean): -# # todo manual clean -# # todo get and use user preferences -# # todo clean up logging -# # reconsider what to report based on frontend needs -# userPreferences = {"*": "int"} -# if (isAutoClean): -# data, message, changedCells, emptyCells, needsAttention = DataCleaner.cleanDataAuto( -# data, columns, userPreferences) -# message = f"changed{changedCells}, empty{emptyCells}, needsAttention{needsAttention}" -# print(message) -# return data, message - -# print("Not implemented") -# raise exceptions.NonExistentEventException - -# endregion +# region userPreferences ###################### ENFORCE DATATYPES (OPEN MODAL) ###################### @callback( @@ -330,6 +252,55 @@ def update_column_formatting(_, modal_children, columns): return json.dumps(column_formats) +# endregion + +# region dataCleaner + +###################### REMOVE DUPLICATE ROWS ###################### +@callback( + Output('editable-table', 'data'), + Output('notifications-container', 'children', allow_duplicate=True), + State('editable-table', 'data'), + Input('btn-remove-duplicates', 'n_clicks'), + prevent_initial_call=True +) +def remove_duplicate_rows(data, n_clicks): + if data is None or n_clicks is None: + raise exceptions.PreventUpdate + + df = pd.DataFrame.from_dict(data) + df.drop_duplicates(inplace=True) + + # Count how many rows were removed + rows_removed = len(data) - len(df) + + if rows_removed == 0: + notification = dmc.Notification( + title="No duplicate rows found!", + id="simple-notify", + color="yellow", + action="show", + autoClose=3000, + message="", + icon=DashIconify(icon="akar-icons:circle-alert") + ) + return no_update, notification + + else: + notification = dmc.Notification( + title="Duplicate rows removed!", + id="simple-notify", + color="yellow", + action="show", + autoClose=3000, + message=f'{rows_removed} rows removed', + icon=DashIconify(icon="akar-icons:circle-check"), + ) + + return df.to_dict('records'), notification + + + ###################### CHECK EMPTY/CORRUPT CELLS [CLEANING OPERATION] ###################### @callback( Output('editable-table', 'data', allow_duplicate=True), @@ -674,6 +645,8 @@ def is_numeric(val): return style_data_conditional +# endregion + # ###################### CLEAN CELLS DATATYPE [CONFIRM BUTTON] (persist changes) ###################### @callback( Output('initial-table-data', 'data', allow_duplicate=True), @@ -745,5 +718,38 @@ def reset_table(n_clicks, initial_data): return initial_data, [], [] +# @app.long_callback( +# Output("editable-table", "data"), +# Output("log-textbox", "children"), +# Input("clean-data-button", "n_clicks"), +# State("editable-table", "data"), +# State("editable-table", "columns"), +# State("auto-clean-checkbox", "checked"), +# running=[(Output("clean-data-button", "disabled"), True, False), +# (Output("cancel-button", "disabled"), False, True) +# ], +# cancel=[Input("cancel-button", "n_clicks")], +# manager=long_callback_manager, +# prevent_initial_call=True, +# ) +# def cleanData(_, data, columns, isAutoClean): +# # todo manual clean +# # todo get and use user preferences +# # todo clean up logging +# # reconsider what to report based on frontend needs +# userPreferences = {"*": "int"} +# if (isAutoClean): +# data, message, changedCells, emptyCells, needsAttention = DataCleaner.cleanDataAuto( +# data, columns, userPreferences) +# message = f"changed{changedCells}, empty{emptyCells}, needsAttention{needsAttention}" +# print(message) +# return data, message + +# print("Not implemented") +# raise exceptions.NonExistentEventException + + if __name__ == '__main__': app.run(debug=True) + + diff --git a/dashboard/layout.py b/dashboard/layout.py index d4bea25..d0ec708 100644 --- a/dashboard/layout.py +++ b/dashboard/layout.py @@ -149,8 +149,8 @@ position="right", transition="fade", transitionDuration=300, - label="Distinguish and iterate over empty and corrupt cells", - children=dmc.Button("Check Empty/Corrupt Cells", id="btn-check-empty-corrupt-cells", variant="subtle", leftIcon=DashIconify(icon="iconoir:info-empty"),) + label="Removes duplicate rows from the imported data", + children=dmc.Button("Remove Duplicates", id="btn-remove-duplicates", variant="subtle", leftIcon=DashIconify(icon="bx:duplicate"),) ), dmc.Tooltip( withArrow=True, @@ -159,10 +159,9 @@ position="right", transition="fade", transitionDuration=300, - label="Removes duplicate rows from the imported data", - children=dmc.Button("Remove Duplicates", id="btn-remove-duplicates", variant="subtle", leftIcon=DashIconify(icon="bx:duplicate"),) + label="Distinguish and iterate over empty and corrupt cells", + children=dmc.Button("Check Empty/Corrupt Cells", id="btn-check-empty-corrupt-cells", variant="subtle", leftIcon=DashIconify(icon="iconoir:info-empty"),) ), - dmc.Tooltip( withArrow=True, width=200, From ca4f276a9d62c50abd779535eca22927c5307acf Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 27 Nov 2023 12:26:51 -0800 Subject: [PATCH 15/17] code cleaned! --- dashboard/__init__.py | 283 +---------------------------- dashboard/utils/dataCleaner.py | 278 ++++++++++++++++++++++++++++ dashboard/utils/userPreferences.py | 19 +- 3 files changed, 299 insertions(+), 281 deletions(-) diff --git a/dashboard/__init__.py b/dashboard/__init__.py index db6b928..bc34c8b 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -200,35 +200,7 @@ def populate_format_selection(opened, columns, formatting_options): if not opened or not columns: return dmc.Text("Upload a file to enforce formatting!", style={"color": "black", "fontWeight": "bold", "textAlign": "center"}) - formatting_options = json.loads(formatting_options) if formatting_options else None - - children = [] - children.append(UserPreferences.create_regex_instructional_area()) - children.append(dmc.Space(h=20)) - - for col_details in columns: - col_name = col_details['name'] - - # Retrieve the format from the stored formatting if it exists, otherwise set to None - placeholder_value = formatting_options.get(col_name, None) if formatting_options else None - - input_text = dmc.TextInput( - id={'type': 'format-input', 'index': col_name}, - value=placeholder_value, - placeholder="Enter format", - style={'width': '20rem'} - ) - - - children.append( - html.Div( - [html.Label(col_name), input_text], - style={"display": "flex", "justifyContent": "space-between", - "alignItems": "center", "padding": "0.5rem", "borderBottom": "1px solid #000"} - ) - ) - - return children + return UserPreferences.populate_format_selection(opened, columns, formatting_options) ###################### ENFORCE FORMATTING (SUBMIT MODAL) ###################### @callback( @@ -316,32 +288,8 @@ def show_noncomplient_empty_data(n_clicks, columns, data): if columns is None or data is None or n_clicks is None: raise exceptions.PreventUpdate - df = pd.DataFrame.from_dict(data) - non_compliant_rows = set() # To track rows with non-compliant data - - for col in columns: - # Find non-compliant indices and add them to the set - non_compliant_indices = df[col['name']].apply(lambda x: pd.isna(x)) - non_compliant_rows.update(non_compliant_indices[non_compliant_indices].index.tolist()) - - # Filter the dataframe to keep only rows with non-compliant data - df_filtered = df.loc[list(non_compliant_rows)] - - if df_filtered.empty: - notification = dmc.Notification( - title="No empty/corrupt data found!", - id="simple-notify", - color="yellow", - action="show", - message="", - autoClose=3000, - icon=DashIconify(icon="akar-icons:circle-alert") - ) - return no_update, no_update, notification, no_update - - confirm_button = dmc.Button("Confirm Changes", id="btn-confirm-changes", style={"backgroundColor": "#12B886"}) + return DataCleaner.show_noncomplient_empty_data(columns, data) - return df_filtered.to_dict('records'), df_filtered.index.tolist(), [], confirm_button ###################### CLEAN EMPTY/CORRUPT CELLS [CLEANING OPERATION] highlighting ###################### @@ -356,22 +304,7 @@ def style_noncompliant_empty_cells(cache, columns, data): if not cache: raise exceptions.PreventUpdate - df = pd.DataFrame.from_dict(data) - style_data_conditional = [] - - for col in columns: - # Find non-compliant indices - non_compliant_indices = df[col['name']].apply(pd.isna) - non_compliant_rows = non_compliant_indices[non_compliant_indices].index.tolist() - - for idx in non_compliant_rows: - style_data_conditional.append({ - 'if': {'row_index': idx, 'column_id': col['name']}, - 'backgroundColor': '#f87171', # Red background to highlight non-compliant cells - }) - - - return style_data_conditional + return DataCleaner.style_noncompliant_empty_cells(columns, data) @@ -391,52 +324,7 @@ def show_noncompliant_format_data(n_clicks, formatting_store_data, columns, data if columns is None or data is None or n_clicks is None: raise exceptions.PreventUpdate - if formatting_store_data is None: - notification = dmc.Notification( - title="No formatting options found!", - id="simple-notify", - color="yellow", - action="show", - message="", - autoClose=3000, - icon=DashIconify(icon="akar-icons:circle-alert") - ) - return no_update, no_update, notification, no_update - - # Load the stored formatting options - formatting_options = json.loads(formatting_store_data) - df = pd.DataFrame.from_dict(data) - non_compliant_rows = set() # To track rows with non-compliant data - - for col in columns: - col_name = col['name'] - # Ensure the column has a formatting pattern stored - if col_name in formatting_options: - pattern = formatting_options[col_name] - regex = re.compile(pattern) - - # Find non-compliant indices and add them to the set - non_compliant_indices = df[col_name].apply(lambda x: not regex.match(str(x)) if x else False) - non_compliant_rows.update(non_compliant_indices[non_compliant_indices].index.tolist()) - - # Filter the dataframe to keep only rows with non-compliant data - df_filtered = df.loc[list(non_compliant_rows)] - - if df_filtered.empty: - notification = dmc.Notification( - title="No format non-complient data found!", - id="simple-notify", - color="yellow", - action="show", - message="", - autoClose=3000, - icon=DashIconify(icon="akar-icons:circle-alert") - ) - return no_update, no_update, notification, no_update - - confirm_button = dmc.Button("Confirm Changes", id="btn-confirm-changes", style={"backgroundColor": "#12B886"}) - - return df_filtered.to_dict('records'), df_filtered.index.tolist(), [], confirm_button + return DataCleaner.show_noncompliant_format_data(formatting_store_data, columns, data) ###################### CLEAN CELLS FORMATTING [CLEANING OPERATION] highlighting ###################### @@ -452,32 +340,7 @@ def style_noncompliant_format_cells(cache, columns, data, formatting_store_data) if not cache: raise exceptions.PreventUpdate - if formatting_store_data is None: - return no_update - - # Load the stored formatting options - formatting_options = json.loads(formatting_store_data) - df = pd.DataFrame.from_dict(data) - style_data_conditional = [] - - for col in columns: - col_name = col['name'] - # Ensure the column has a formatting pattern stored - if col_name in formatting_options: - pattern = formatting_options[col_name] - regex = re.compile(pattern) - - # Find non-compliant indices and add them to the set - non_compliant_indices = df[col_name].apply(lambda x: not regex.match(str(x)) if x else False) - non_compliant_rows = non_compliant_indices[non_compliant_indices].index.tolist() - - for idx in non_compliant_rows: - style_data_conditional.append({ - 'if': {'row_index': idx, 'column_id': col['name']}, - 'backgroundColor': '#93c5fd', - }) - - return style_data_conditional + return DataCleaner.style_noncompliant_format_cells(columns, data, formatting_store_data) ###################### CHECK CELLS DATATYPE [CLEANING OPERATION] ###################### @@ -495,83 +358,7 @@ def show_noncomplient_dtype_data(n_clicks, columns, data): if columns is None or data is None or n_clicks is None: raise exceptions.PreventUpdate - df = pd.DataFrame.from_dict(data) - non_compliant_rows = set() # To track rows with non-compliant data - - for col in columns: - # Ensure the column has the 'type' key - if 'type' not in col: - continue - - if col['type'] == 'text': - def is_convertible_to_numeric(val): - if val is None: - return False - try: - # Try to convert to float - float(val) - return True - except (TypeError, ValueError): - return False - - # mask = df[col['name']].apply(lambda x: not isinstance(x, str) or is_convertible_to_numeric(x)) - mask = df[col['name']].apply(lambda x: x is not None and (not isinstance(x, str) or is_convertible_to_numeric(x))) - - - - elif col['type'] == 'numeric': - def is_numeric(val): - if val is None: - return False - - # If val is already numeric (float or int) - if isinstance(val, (float, int)): - return True - - # If val is a string, attempt to convert to float after removing hyphens - if isinstance(val, str): - try: - float(val.replace('-', '')) - return True - except (TypeError, ValueError): - return False - return False - - # mask = df[col['name']].apply(lambda x: not is_numeric(x)) - mask = df[col['name']].apply(lambda x: x is not None and (not is_numeric(x))) - - - elif col['type'] == 'datetime': - # mask = df[col['name']].apply(lambda x: not isinstance(x, pd.Timestamp)) - mask = df[col['name']].apply(lambda x: x is not None and (not isinstance(x, pd.Timestamp))) - else: - continue - - # Find non-compliant indices and add them to the set - non_compliant_indices = mask[mask].index.tolist() - for idx in non_compliant_indices: - non_compliant_rows.add(idx) # Add row index to the set - - # Filter the dataframe to keep only rows with non-compliant data - df_filtered = df[df.index.isin(non_compliant_rows)] - # print(df_filtered) - - if df_filtered.empty: - notification = dmc.Notification( - title="No datatype non-complient data found!", - id="simple-notify", - color="yellow", - action="show", - message="", - autoClose=3000, - icon=DashIconify(icon="akar-icons:circle-alert") - ) - return no_update, no_update, notification, no_update - - confirm_button = dmc.Button("Confirm Changes", id="btn-confirm-changes", style={"backgroundColor": "#12B886"}), - - # return df_filtered.to_dict('records'), [] - return df_filtered.to_dict('records'), df_filtered.index.tolist(), [], confirm_button + return DataCleaner.show_noncomplient_dtype_data(columns, data) ###################### CLEAN CELLS DATATYPE [CLEANING OPERATION] highlighting ###################### @@ -586,63 +373,7 @@ def style_noncompliant_dtype_cells(cache, columns, data): if not cache: raise exceptions.PreventUpdate - df = pd.DataFrame.from_dict(data) - style_data_conditional = [] - - for col in columns: - if 'type' not in col: - continue - - if col['type'] == 'text': - def is_convertible_to_numeric(val): - if val is None: - return False - try: - # Try to convert to float - float(val) - return True - except (TypeError, ValueError): - return False - - # mask = df[col['name']].apply(lambda x: not isinstance(x, str) or is_convertible_to_numeric(x)) - mask = df[col['name']].apply(lambda x: x is not None and (not isinstance(x, str) or is_convertible_to_numeric(x))) - color = '#fde047' # Adjusted color for non-string data in a text column - - elif col['type'] == 'numeric': - def is_numeric(val): - if val is None: - return False - - if isinstance(val, (float, int)): - return True - - if isinstance(val, str): - try: - float(val.replace('-', '')) - return True - except (TypeError, ValueError): - return False - return False - - # mask = df[col['name']].apply(lambda x: not is_numeric(x)) - mask = df[col['name']].apply(lambda x: x is not None and (not is_numeric(x))) - color = '#6ee7b7' # Adjusted color for non-numeric data in a numeric column - - elif col['type'] == 'datetime': - # mask = df[col['name']].apply(lambda x: not isinstance(x, pd.Timestamp)) - mask = df[col['name']].apply(lambda x: x is not None and (not isinstance(x, pd.Timestamp))) - color = '#c4b5fd' # Adjusted color for non-datetime data in a datetime column - else: - continue - - non_compliant_indices = mask[mask].index.tolist() - for idx in non_compliant_indices: - style_data_conditional.append({ - 'if': {'row_index': idx, 'column_id': col['name']}, - 'backgroundColor': color, - }) - - return style_data_conditional + return DataCleaner.style_noncompliant_dtype_cells(columns, data) # endregion diff --git a/dashboard/utils/dataCleaner.py b/dashboard/utils/dataCleaner.py index 4693911..1f72e8f 100644 --- a/dashboard/utils/dataCleaner.py +++ b/dashboard/utils/dataCleaner.py @@ -1,5 +1,283 @@ import pandas as pd from dash.exceptions import PreventUpdate +from dash import no_update +import re +import json +import dash_mantine_components as dmc +from dash_iconify import DashIconify + +def show_noncomplient_empty_data(columns, data): + + df = pd.DataFrame.from_dict(data) + non_compliant_rows = set() # To track rows with non-compliant data + + for col in columns: + # Find non-compliant indices and add them to the set + non_compliant_indices = df[col['name']].apply(lambda x: pd.isna(x)) + non_compliant_rows.update(non_compliant_indices[non_compliant_indices].index.tolist()) + + # Filter the dataframe to keep only rows with non-compliant data + df_filtered = df.loc[list(non_compliant_rows)] + + if df_filtered.empty: + notification = dmc.Notification( + title="No empty/corrupt data found!", + id="simple-notify", + color="yellow", + action="show", + message="", + autoClose=3000, + icon=DashIconify(icon="akar-icons:circle-alert") + ) + return no_update, no_update, notification, no_update + + confirm_button = dmc.Button("Confirm Changes", id="btn-confirm-changes", style={"backgroundColor": "#12B886"}) + + return df_filtered.to_dict('records'), df_filtered.index.tolist(), [], confirm_button + + +def style_noncompliant_empty_cells(columns, data): + + df = pd.DataFrame.from_dict(data) + style_data_conditional = [] + + for col in columns: + # Find non-compliant indices + non_compliant_indices = df[col['name']].apply(pd.isna) + non_compliant_rows = non_compliant_indices[non_compliant_indices].index.tolist() + + for idx in non_compliant_rows: + style_data_conditional.append({ + 'if': {'row_index': idx, 'column_id': col['name']}, + 'backgroundColor': '#f87171', # Red background to highlight non-compliant cells + }) + + return style_data_conditional + + +def show_noncompliant_format_data(formatting_store_data, columns, data): + + if formatting_store_data is None: + notification = dmc.Notification( + title="No formatting options found!", + id="simple-notify", + color="yellow", + action="show", + message="", + autoClose=3000, + icon=DashIconify(icon="akar-icons:circle-alert") + ) + return no_update, no_update, notification, no_update + + # Load the stored formatting options + formatting_options = json.loads(formatting_store_data) + df = pd.DataFrame.from_dict(data) + non_compliant_rows = set() # To track rows with non-compliant data + + for col in columns: + col_name = col['name'] + # Ensure the column has a formatting pattern stored + if col_name in formatting_options: + pattern = formatting_options[col_name] + regex = re.compile(pattern) + + # Find non-compliant indices and add them to the set + non_compliant_indices = df[col_name].apply(lambda x: not regex.match(str(x)) if x else False) + non_compliant_rows.update(non_compliant_indices[non_compliant_indices].index.tolist()) + + # Filter the dataframe to keep only rows with non-compliant data + df_filtered = df.loc[list(non_compliant_rows)] + + if df_filtered.empty: + notification = dmc.Notification( + title="No format non-complient data found!", + id="simple-notify", + color="yellow", + action="show", + message="", + autoClose=3000, + icon=DashIconify(icon="akar-icons:circle-alert") + ) + return no_update, no_update, notification, no_update + + confirm_button = dmc.Button("Confirm Changes", id="btn-confirm-changes", style={"backgroundColor": "#12B886"}) + + return df_filtered.to_dict('records'), df_filtered.index.tolist(), [], confirm_button + + +def style_noncompliant_format_cells(columns, data, formatting_store_data): + + if formatting_store_data is None: + return no_update + + # Load the stored formatting options + formatting_options = json.loads(formatting_store_data) + df = pd.DataFrame.from_dict(data) + style_data_conditional = [] + + for col in columns: + col_name = col['name'] + # Ensure the column has a formatting pattern stored + if col_name in formatting_options: + pattern = formatting_options[col_name] + regex = re.compile(pattern) + + # Find non-compliant indices and add them to the set + non_compliant_indices = df[col_name].apply(lambda x: not regex.match(str(x)) if x else False) + non_compliant_rows = non_compliant_indices[non_compliant_indices].index.tolist() + + for idx in non_compliant_rows: + style_data_conditional.append({ + 'if': {'row_index': idx, 'column_id': col['name']}, + 'backgroundColor': '#93c5fd', + }) + + return style_data_conditional + + +def show_noncomplient_dtype_data(columns, data): + df = pd.DataFrame.from_dict(data) + non_compliant_rows = set() # To track rows with non-compliant data + + for col in columns: + # Ensure the column has the 'type' key + if 'type' not in col: + continue + + if col['type'] == 'text': + def is_convertible_to_numeric(val): + if val is None: + return False + try: + # Try to convert to float + float(val) + return True + except (TypeError, ValueError): + return False + + # mask = df[col['name']].apply(lambda x: not isinstance(x, str) or is_convertible_to_numeric(x)) + mask = df[col['name']].apply(lambda x: x is not None and (not isinstance(x, str) or is_convertible_to_numeric(x))) + + + + elif col['type'] == 'numeric': + def is_numeric(val): + if val is None: + return False + + # If val is already numeric (float or int) + if isinstance(val, (float, int)): + return True + + # If val is a string, attempt to convert to float after removing hyphens + if isinstance(val, str): + try: + float(val.replace('-', '')) + return True + except (TypeError, ValueError): + return False + return False + + # mask = df[col['name']].apply(lambda x: not is_numeric(x)) + mask = df[col['name']].apply(lambda x: x is not None and (not is_numeric(x))) + + + elif col['type'] == 'datetime': + # mask = df[col['name']].apply(lambda x: not isinstance(x, pd.Timestamp)) + mask = df[col['name']].apply(lambda x: x is not None and (not isinstance(x, pd.Timestamp))) + else: + continue + + # Find non-compliant indices and add them to the set + non_compliant_indices = mask[mask].index.tolist() + for idx in non_compliant_indices: + non_compliant_rows.add(idx) # Add row index to the set + + # Filter the dataframe to keep only rows with non-compliant data + df_filtered = df[df.index.isin(non_compliant_rows)] + # print(df_filtered) + + if df_filtered.empty: + notification = dmc.Notification( + title="No datatype non-complient data found!", + id="simple-notify", + color="yellow", + action="show", + message="", + autoClose=3000, + icon=DashIconify(icon="akar-icons:circle-alert") + ) + return no_update, no_update, notification, no_update + + confirm_button = dmc.Button("Confirm Changes", id="btn-confirm-changes", style={"backgroundColor": "#12B886"}), + + # return df_filtered.to_dict('records'), [] + return df_filtered.to_dict('records'), df_filtered.index.tolist(), [], confirm_button + +def style_noncompliant_dtype_cells(columns, data): + df = pd.DataFrame.from_dict(data) + style_data_conditional = [] + + for col in columns: + if 'type' not in col: + continue + + if col['type'] == 'text': + def is_convertible_to_numeric(val): + if val is None: + return False + try: + # Try to convert to float + float(val) + return True + except (TypeError, ValueError): + return False + + # mask = df[col['name']].apply(lambda x: not isinstance(x, str) or is_convertible_to_numeric(x)) + mask = df[col['name']].apply(lambda x: x is not None and (not isinstance(x, str) or is_convertible_to_numeric(x))) + color = '#fde047' # Adjusted color for non-string data in a text column + + elif col['type'] == 'numeric': + def is_numeric(val): + if val is None: + return False + + if isinstance(val, (float, int)): + return True + + if isinstance(val, str): + try: + float(val.replace('-', '')) + return True + except (TypeError, ValueError): + return False + return False + + # mask = df[col['name']].apply(lambda x: not is_numeric(x)) + mask = df[col['name']].apply(lambda x: x is not None and (not is_numeric(x))) + color = '#6ee7b7' # Adjusted color for non-numeric data in a numeric column + + elif col['type'] == 'datetime': + # mask = df[col['name']].apply(lambda x: not isinstance(x, pd.Timestamp)) + mask = df[col['name']].apply(lambda x: x is not None and (not isinstance(x, pd.Timestamp))) + color = '#c4b5fd' # Adjusted color for non-datetime data in a datetime column + else: + continue + + non_compliant_indices = mask[mask].index.tolist() + for idx in non_compliant_indices: + style_data_conditional.append({ + 'if': {'row_index': idx, 'column_id': col['name']}, + 'backgroundColor': color, + }) + + return style_data_conditional + + + + + + def cleanDataAuto(data, columns, preferences): diff --git a/dashboard/utils/userPreferences.py b/dashboard/utils/userPreferences.py index 6a89549..982c519 100644 --- a/dashboard/utils/userPreferences.py +++ b/dashboard/utils/userPreferences.py @@ -1,5 +1,6 @@ from dash import html, dcc import dash_mantine_components as dmc +import json from dashboard.utils.parameters import definition_items, regex_table @@ -57,20 +58,28 @@ def populate_datatype_selection(opened, columns): return children -def populate_format_selection(opened, columns): +def populate_format_selection(opened, columns, formatting_options): + + formatting_options = json.loads(formatting_options) if formatting_options else None + children = [] + children.append(create_regex_instructional_area()) + children.append(dmc.Space(h=20)) for col_details in columns: col_name = col_details['name'] - dropdown_value = col_details.get('format', None) - input_text = dcc.Input( + # Retrieve the format from the stored formatting if it exists, otherwise set to None + placeholder_value = formatting_options.get(col_name, None) if formatting_options else None + + input_text = dmc.TextInput( id={'type': 'format-input', 'index': col_name}, - value=dropdown_value, + value=placeholder_value, placeholder="Enter format", - style={'width': '9rem'} + style={'width': '20rem'} ) + children.append( html.Div( [html.Label(col_name), input_text], From bf02c7fada13ddd2e1a4a3a945f744e9fb3e8871 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 27 Nov 2023 12:52:28 -0800 Subject: [PATCH 16/17] need to fix remove duplicates update --- callback_graph.png | Bin 244790 -> 0 bytes dashboard/__init__.py | 8 +++++--- dashboard/assets/data/test.xlsx | Bin 14205 -> 11494 bytes dashboard/utils/dataAnalysis.py | 6 +++--- dashboard/utils/parameters.py | 6 ++++++ 5 files changed, 14 insertions(+), 6 deletions(-) delete mode 100644 callback_graph.png diff --git a/callback_graph.png b/callback_graph.png deleted file mode 100644 index 43945da9d22457979d98ff6d738d985ba4c76efb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244790 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 KNM?%PfAK#+mebw< diff --git a/dashboard/__init__.py b/dashboard/__init__.py index bc34c8b..6f1bb90 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -231,6 +231,7 @@ def update_column_formatting(_, modal_children, columns): ###################### REMOVE DUPLICATE ROWS ###################### @callback( Output('editable-table', 'data'), + Output('initial-table-data', 'data', allow_duplicate=True), Output('notifications-container', 'children', allow_duplicate=True), State('editable-table', 'data'), Input('btn-remove-duplicates', 'n_clicks'), @@ -241,7 +242,8 @@ def remove_duplicate_rows(data, n_clicks): raise exceptions.PreventUpdate df = pd.DataFrame.from_dict(data) - df.drop_duplicates(inplace=True) + # Exclude the 'ID' column when dropping duplicates + df.drop_duplicates(subset=[col for col in df.columns if col != 'ID'], inplace=True) # Count how many rows were removed rows_removed = len(data) - len(df) @@ -256,7 +258,7 @@ def remove_duplicate_rows(data, n_clicks): message="", icon=DashIconify(icon="akar-icons:circle-alert") ) - return no_update, notification + return no_update, no_update, notification else: notification = dmc.Notification( @@ -269,7 +271,7 @@ def remove_duplicate_rows(data, n_clicks): icon=DashIconify(icon="akar-icons:circle-check"), ) - return df.to_dict('records'), notification + return df.to_dict('records'), df.to_dict('records'), notification diff --git a/dashboard/assets/data/test.xlsx b/dashboard/assets/data/test.xlsx index bfbbf7bb38d96786fd813912958b3b3b6ad914b6..4a863a333455a6a0b65d85d1a89d67a9fd20be22 100644 GIT binary patch literal 11494 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 f`03w^|5u)r|%y; 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 U0M+I9?j2abG|+^mu>5ZQ9~L;g>i_@% diff --git a/dashboard/utils/dataAnalysis.py b/dashboard/utils/dataAnalysis.py index b15e658..3e471b4 100644 --- a/dashboard/utils/dataAnalysis.py +++ b/dashboard/utils/dataAnalysis.py @@ -8,19 +8,19 @@ def get_data_analysis(data): empty_corrupt_values = df.isna().sum() num_rows, num_columns = df.shape - num_duplicate_rows = df.duplicated().sum() + # Assuming 'ID' is the name of your unique identifier column + num_duplicate_rows = df.duplicated(subset=[col for col in df.columns if col != 'ID']).sum() if (empty_corrupt_values.sum() != 0): return [ html.Li([ "Data: ", - html.Span(f'{"{:,}".format(df.size)}', style={ + html.Span(f'{"{:,}".format(df.count().sum())}', style={ 'color': '#007BFF', 'fontWeight': 'bold', 'padding': '0 5px', 'borderRadius': '5px' }) - # i want ot get rid of the bulletd points ], style={"listStyleType": "none"}), html.Li([ "Rows: ", diff --git a/dashboard/utils/parameters.py b/dashboard/utils/parameters.py index f83c058..a79d523 100644 --- a/dashboard/utils/parameters.py +++ b/dashboard/utils/parameters.py @@ -111,6 +111,12 @@ html.Td(dmc.Kbd("(a|b)c")), html.Td("Matches 'ac' or 'bc'."), html.Td([dmc.Highlight("'acxyz', ", highlight="ac"), dmc.Highlight("'bcxyz'", highlight="bc")]) + ]), + # \d{4}-\d{2}-\d{2} + html.Tr([ + html.Td(dmc.Kbd(r"\d{4}-\d{2}-\d{2}")), + html.Td("Matches dates in the format YYYY-MM-DD."), + html.Td(dmc.Highlight("'2021-01-01'", highlight="2021-01-01")) ]), html.Tr([ html.Td(dmc.Kbd(r"^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$")), From ed32e5faa3696dfbf9984f953c3bbdd5420493a6 Mon Sep 17 00:00:00 2001 From: mustachemo Date: Tue, 28 Nov 2023 09:44:34 -0800 Subject: [PATCH 17/17] updated readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 139c379..6b680bf 100644 --- a/README.md +++ b/README.md @@ -79,21 +79,21 @@ To set up and run the Data Clean-up Tool, follow these steps: - [x] Add enforcement of types. Say a column shows only numbers, let's say money. Enforce that you can't edit a text into there, only numeric values are allowed (https://dash.plotly.com/datatable/typing) - - [ ] Add a formatting setting that formats columns to a specified prefereance. For example, cost column will show $ sign and number type enforcement along with commas when needed (https://dash.plotly.com/datatable/typing) + - [x] Add a formatting setting that formats columns to a specified prefereance. For example, cost column will show $ sign and number type enforcement along with commas when needed (https://dash.plotly.com/datatable/typing) - [x] Adding or removing columns and rows - [ ] Update parse_content function to include 'xslx, xml, html" and "pdf" if we can (pdf is a bonus feature) - [x] Combine two or more data of the same format into one file - [z] After "Enforcing" dtypes or formatting, those cells are then highlighted (https://dash.plotly.com/datatable/conditional-formatting). We could also use for other use cases when highlighting is required. We should have a legend that says what each higlight color means - [x] dtype highlighting - [x] Highlighting None, NaN, or Empty String Values - - [ ] formatting highlighting + - [x] formatting highlighting - [z] Make legend for filtering operations/syntax (https://dash.plotly.com/datatable/filtering) - [ ] Testing (https://dash.plotly.com/testing) - Bonus Features: - [ ] Make a tab option for graphs (https://dash.plotly.com/dash-core-components/tab) - - [ ] Highlight Changes: Display changed cells in a different color for easier tracking + - [x] Highlight Changes: Display changed cells in a different color for easier tracking - [x] Add loading animation (https://dash.plotly.com/dash-core-components/loading) - [x] Make columns selection through a checkbox (https://dash.plotly.com/datatable/editable) - [ ] Displaying Errors with dash.no_update (https://dash.plotly.com/advanced-callbacks)