Skip to content

Commit 39faa74

Browse files
authored
EditTable fixes (iommirocks#706)
* fixed EdtTable row deleting - removing required and pattern attrs * fixed EditTable row deleting with changed fields' values * fixed comment * fixed comment
1 parent 2e1a7aa commit 39faa74

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

iommi/edit_table.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,9 +329,12 @@ def validate(cells_iterator, form, errors):
329329
if table.edit_errors or table.create_errors:
330330
return None
331331

332+
deleted_pks = set()
332333
if isinstance(table.initial_rows, QuerySet):
333334
prefix = path_join(table.iommi_path, 'pk_delete_')
334-
table.bulk_queryset(prefix=prefix).delete()
335+
qs = table.bulk_queryset(prefix=prefix)
336+
deleted_pks = set(qs.values_list('pk', flat=True))
337+
qs.delete()
335338

336339
def save(cells_iterator, form):
337340
to_save = []
@@ -340,6 +343,8 @@ def save(cells_iterator, form):
340343
continue
341344
instance = cells.row
342345
form.instance = instance
346+
if instance is not None and instance.pk is not None and instance.pk in deleted_pks:
347+
continue
343348
attrs_to_save = []
344349
to_save_in_second_phase = []
345350
for cell in cells.iter_editable_cells():

iommi/edit_table__tests.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ def test_edit_table_post_delete():
397397
def test_edit_table_delete_new_row_and_existing_row():
398398
existing_foo = TFoo.objects.create(a=1, b='existing')
399399
another_foo = TFoo.objects.create(a=2, b='another')
400+
third__foo = TFoo.objects.create(a=3, b='third')
400401

401402
edit_table = EditTable(
402403
auto__model=TFoo,
@@ -423,6 +424,11 @@ def test_edit_table_delete_new_row_and_existing_row():
423424
f'columns/a/{existing_foo.pk}': str(existing_foo.a),
424425
f'columns/b/{existing_foo.pk}': existing_foo.b,
425426

427+
# Mark existing row for deletion, but pass some changes too
428+
f'pk_delete_{third__foo.pk}': '',
429+
f'columns/a/{third__foo.pk}': str(third__foo.a),
430+
f'columns/b/{third__foo.pk}': 'third but changed',
431+
426432
# Data for the other existing row (unchanged)
427433
f'columns/a/{another_foo.pk}': str(another_foo.a),
428434
f'columns/b/{another_foo.pk}': another_foo.b,
@@ -434,6 +440,7 @@ def test_edit_table_delete_new_row_and_existing_row():
434440
assert response.status_code == 302
435441
assert not TFoo.objects.filter(pk=existing_foo.pk).exists()
436442
assert TFoo.objects.filter(pk=another_foo.pk).exists()
443+
assert not TFoo.objects.filter(pk=third__foo.pk).exists()
437444
new_row = TFoo.objects.filter(a=88, b='new row to keep').first()
438445
assert new_row is not None
439446
assert not TFoo.objects.filter(a=99, b='new row to delete').exists()

iommi/static/js/iommi.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ class IommiBase {
439439
}
440440

441441
initEditTableDeleteRowButton() {
442+
// check/uncheck checkbox based on delete button
442443
IommiBase.addLiveEventListener(
443444
'click',
444445
'[data-iommi-edit-table-delete-row-button]',
@@ -455,6 +456,34 @@ class IommiBase {
455456
return false;
456457
}
457458
);
459+
460+
// remove/restore required and pattern
461+
IommiBase.addLiveEventListener(
462+
'change',
463+
'[data-iommi-edit-table-delete-row-checkbox]',
464+
function (event) {
465+
const row = this.closest('[data-iommi-edit-table-row]');
466+
if(this.checked) {
467+
row.querySelectorAll('[required]').forEach((field) => {
468+
field.setAttribute('data-iommi-attr-bak-required', true);
469+
field.removeAttribute('required');
470+
});
471+
row.querySelectorAll('[pattern]').forEach((field) => {
472+
field.setAttribute('data-iommi-attr-bak-pattern', field.getAttribute('pattern'));
473+
field.removeAttribute('pattern');
474+
});
475+
} else {
476+
row.querySelectorAll('[data-iommi-attr-bak-required]').forEach((field) => {
477+
field.setAttribute('required', true);
478+
field.removeAttribute('data-iommi-attr-bak-required');
479+
});
480+
row.querySelectorAll('[data-iommi-attr-bak-pattern]').forEach((field) => {
481+
field.setAttribute('pattern', field.getAttribute('data-iommi-attr-bak-pattern'));
482+
field.removeAttribute('data-iommi-attr-bak-pattern');
483+
});
484+
}
485+
}
486+
);
458487
}
459488

460489
initEditTableAddRowButton() {

0 commit comments

Comments
 (0)