Skip to content

Commit

Permalink
Merge pull request #56 from maxfordham/selected_keys_issue
Browse files Browse the repository at this point in the history
Selected keys issue
  • Loading branch information
ollyhensby authored Sep 26, 2022
2 parents 09873a7 + ed17637 commit 38d5899
Showing 1 changed file with 50 additions and 54 deletions.
104 changes: 50 additions & 54 deletions src/ipyautoui/custom/editgrid.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,11 @@
# BUG: Reported defects -@jovyan at 9/16/2022, 5:25:13 PM
# the selection when filtered issue is creating a problem.
# -

# TODO: Tasks pending completion -@jovyan at 9/22/2022, 9:25:53 PM
# Can BaseForm inherit autoipywidget.AutoObject directly?


class BaseForm(widgets.VBox):
_value = traitlets.Dict()
_cls_ui = traitlets.Callable(default_value=None, allow_none=True)
Expand All @@ -74,7 +79,6 @@ def __init__(
revert: typing.Callable = lambda: print("REVERT"),
fn_onsave: typing.Callable = lambda: None,
):

self.fn_save = save
self.fn_revert = revert
self.fn_onsave = fn_onsave
Expand Down Expand Up @@ -324,7 +328,6 @@ def is_incremental(li):


class GridWrapper(DataGrid, traitlets.HasTraits):

_value = traitlets.List()

def __init__(
Expand Down Expand Up @@ -451,7 +454,8 @@ def _check_value(self, value: list):
self.li_field_names
):
raise Exception(
f"Schema fields and data fields do not match.\nRejected Columns: {set(columns) ^ set(self.li_field_names)}"
"Schema fields and data fields do not match.\nRejected Columns:"
f" {set(columns) ^ set(self.li_field_names)}"
)

def _set_titles(self, value: list):
Expand Down Expand Up @@ -561,36 +565,28 @@ def di_field_to_titles(self):

@property
def selected_rows(self):
return [{"r1": v["r1"], "r2": v["r2"]} for v in self.selections]
"""Get position of rows selected."""
_selected_rows = set()
for di in self.selections:
r1 = di["r1"]
r2 = di["r2"]
if r1 == r2:
_selected_rows.add(r1)
else:
for i in range(r1, r2 + 1):
_selected_rows.add(i)
return list(_selected_rows)

@property
def selected_obj_id(self):
return self.selected_cell_values[
-1
] # Set to -1 as this as ID is last column. Will break if ID moves column!
def get_selected_data(self):
"""Get the data selected in the table which is returned as a dataframe."""
df_tmp = self.get_visible_data()
return df_tmp.iloc[self.selected_rows]

@property
def selected_keys(self):
self._selected_keys = set()
no_rows_selected = 0
for di in self.selected_rows:
no_rows_selected += di["r2"] - di["r1"] + 1

col_posx = list(self.data.columns).index("Name")

arr_property_name_posx = (np.arange(no_rows_selected) * 3) + col_posx

li_property_names_selected = [
self.selected_cell_values[i] for i in arr_property_name_posx
]

self._selected_keys = {
i
for i, v in enumerate(self.value)
if v["Name"] in li_property_names_selected
}

return self._selected_keys
"""Return the keys of the selected rows."""
return list(self.get_selected_data.index.values)

@property
def li_field_names(self):
Expand Down Expand Up @@ -727,7 +723,6 @@ class RowUiCallables(BaseModel):
# object and the EditGrid object up-to-date. or maybe GridWrapper
# doesn't require a _value trait as it is never used within EditGrid.
class EditGrid(widgets.VBox):

_value = traitlets.List()

def __init__(
Expand Down Expand Up @@ -811,7 +806,7 @@ def _init_controls(self):

def _update_baseform(self, onchange):
if (
len(self.grid.selected_keys) == 1
len(self.grid.selected_rows) == 1
and self.baseform.layout.display == "block"
):
print(self.di_row_value)
Expand Down Expand Up @@ -840,7 +835,6 @@ def _edit(self):
self.baseform.cls_ui = self.ui_edit
try:
self._check_one_row_selected()

if len(self.grid.selected_keys) == 0:
raise ValueError("you must select a row")
self.initial_value = self.di_row_value
Expand All @@ -860,14 +854,13 @@ def _edit(self):

def _copy(self):
try:
selected_rows = self.grid.selected_keys
if selected_rows == set():
if self.grid.selected_keys == set():
self.button_bar.message.value = markdown(
" 👇 _Please select a row from the table!_ "
)
else:
li_values_selected = [
self.value[i] for i in sorted([i for i in selected_rows])
self.value[i] for i in sorted([i for i in self.grid.selected_keys])
]
if self.fn_on_copy is not None:
li_values_selected = self.fn_on_copy(li_values_selected)
Expand All @@ -890,26 +883,20 @@ def _copy(self):
def _delete(self):
try:
self._set_toggle_buttons_to_false()
# Delete from data frame.
self.rows_to_delete = []
if self.grid.selected_rows:
for i in self.grid.selected_rows:
start_row = i["r1"]
end_row = i["r2"]
self.rows_to_delete += [i for i in range(*[start_row, end_row + 1])]
print(f"Row Number: {self.rows_to_delete}")
if self.grid.selected_keys:
print(f"Row Number: {self.grid.selected_keys}")
if self.datahandler is not None:
value = [self.value[i] for i in self.rows_to_delete]
value = [self.value[i] for i in self.grid.selected_keys]
for v in value:
self.datahandler.fn_delete(v)
self._reload_all_data()
else:
self.value = [
value
for i, value in enumerate(self.value)
if i not in self.rows_to_delete
if i not in self.grid.selected_keys
]
# ^ Only set for values NOT in self.rows_to_delete
# ^ Only set for values NOT in self.grid.selected_keys
self.button_bar.message.value = markdown(" 🗑️ _Deleted Row_ ")

else:
Expand All @@ -920,7 +907,7 @@ def _delete(self):
traceback.print_exc()

def _check_one_row_selected(self):
if len(self.grid.selected_keys) > 1:
if len(self.grid.selected_rows) > 1:
raise Exception(
markdown(" 👇 _Please only select ONLY one row from the table!_")
)
Expand Down Expand Up @@ -1003,10 +990,7 @@ def value(self, value):
def di_row_value(self):
try:
self._check_one_row_selected() # Performing checks to see if only one row is selected
self.selected_row = self.grid.selected_rows[0][
"r1"
] # Only one row selected during editing
return self.value[self.selected_row]
return self.value[self.grid.selected_rows[0]]

except Exception as e:
self.button_bar.message.value = markdown(f"_{e}_")
Expand All @@ -1015,8 +999,16 @@ def di_row_value(self):

if __name__ == "__main__":
AUTO_GRID_DEFAULT_VALUE = [
{"string": "important string", "integer": 1, "floater": 3.14,},
{"string": "update", "integer": 4, "floater": 3.12344,},
{
"string": "important string",
"integer": 1,
"floater": 3.14,
},
{
"string": "update",
"integer": 4,
"floater": 3.12344,
},
{"string": "evening", "integer": 5, "floater": 3.14},
{"string": "morning", "integer": 5, "floater": 3.14},
{"string": "number", "integer": 3, "floater": 3.14},
Expand All @@ -1037,7 +1029,8 @@ class TestDataFrameOnly(BaseModel):

if __name__ == "__main__":
description = markdown(
"<b>The Wonderful Edit Grid Application</b><br>Useful for all editing purposes whatever they may be 👍"
"<b>The Wonderful Edit Grid Application</b><br>Useful for all editing purposes"
" whatever they may be 👍"
)
editgrid = EditGrid(
schema=TestDataFrameOnly, description=description, ui_add=None, ui_edit=AutoUi
Expand All @@ -1061,10 +1054,13 @@ class TestDataFrame(BaseModel):

if __name__ == "__main__":
description = markdown(
"<b>The Wonderful Edit Grid Application</b><br>Useful for all editing purposes whatever they may be 👍"
"<b>The Wonderful Edit Grid Application</b><br>Useful for all editing purposes"
" whatever they may be 👍"
)
editgrid = EditGrid(
schema=TestDataFrame, description=description, ui_add=None, ui_edit=AutoUi
)
editgrid.value = AUTO_GRID_DEFAULT_VALUE
display(editgrid)


0 comments on commit 38d5899

Please sign in to comment.