diff --git a/assets/controllers/elements/collection_type_controller.js b/assets/controllers/elements/collection_type_controller.js
index 2a110f8d..488c6421 100644
--- a/assets/controllers/elements/collection_type_controller.js
+++ b/assets/controllers/elements/collection_type_controller.js
@@ -26,6 +26,7 @@ export default class extends Controller {
static values = {
deleteMessage: String,
prototype: String,
+ rowsToDelete: Number, //How many rows (including the current one) shall be deleted after the current row
}
static targets = ["target"];
@@ -125,7 +126,17 @@ export default class extends Controller {
const del = () => {
const target = event.target;
//Remove the row element from the table
- target.closest("tr").remove();
+ const current_row = target.closest("tr");
+ for(let i = this.rowsToDeleteValue; i > 1; i--) {
+ let nextSibling = current_row.nextElementSibling;
+ //Ensure that nextSibling is really a tr
+ if (nextSibling && nextSibling.tagName === "TR") {
+ nextSibling.remove();
+ }
+ }
+
+ //Finally delete the current row
+ current_row.remove();
}
if(this.deleteMessageValue) {
diff --git a/src/Form/AdminPages/ProjectAdminForm.php b/src/Form/AdminPages/ProjectAdminForm.php
index fdf53899..4957973e 100644
--- a/src/Form/AdminPages/ProjectAdminForm.php
+++ b/src/Form/AdminPages/ProjectAdminForm.php
@@ -21,6 +21,7 @@
namespace App\Form\AdminPages;
use App\Entity\Base\AbstractNamedDBElement;
+use App\Form\ProjectSystem\ProjectBOMEntryCollectionType;
use App\Form\ProjectSystem\ProjectBOMEntryType;
use App\Form\Type\RichTextEditorType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
@@ -41,16 +42,6 @@ class ProjectAdminForm extends BaseEntityAdminForm
],
]);
- $builder->add('bom_entries', CollectionType::class, [
- 'entry_type' => ProjectBOMEntryType::class,
- 'entry_options' => [
- 'label' => false,
- ],
- 'allow_add' => true,
- 'allow_delete' => true,
- 'by_reference' => false,
- 'reindex_enable' => true,
- 'label' => false,
- ]);
+ $builder->add('bom_entries', ProjectBOMEntryCollectionType::class);
}
}
\ No newline at end of file
diff --git a/src/Form/ProjectSystem/ProjectBOMEntryCollectionType.php b/src/Form/ProjectSystem/ProjectBOMEntryCollectionType.php
new file mode 100644
index 00000000..71c745c7
--- /dev/null
+++ b/src/Form/ProjectSystem/ProjectBOMEntryCollectionType.php
@@ -0,0 +1,35 @@
+setDefaults([
+ 'entry_type' => ProjectBOMEntryType::class,
+ 'entry_options' => [
+ 'label' => false,
+ ],
+ 'allow_add' => true,
+ 'allow_delete' => true,
+ 'by_reference' => false,
+ 'reindex_enable' => true,
+ 'label' => false,
+ ]);
+ }
+
+ public function getBlockPrefix()
+ {
+ return 'project_bom_entry_collection';
+ }
+}
\ No newline at end of file
diff --git a/templates/AdminPages/DeviceAdmin.html.twig b/templates/AdminPages/DeviceAdmin.html.twig
index 869b3d95..1842b0a6 100644
--- a/templates/AdminPages/DeviceAdmin.html.twig
+++ b/templates/AdminPages/DeviceAdmin.html.twig
@@ -23,31 +23,6 @@
{% block additional_panes %}
{% form_theme form.bom_entries with ['Form/collection_types_layout.html.twig'] %}
-
- {% import 'components/collection_type.macro.html.twig' as collection %}
-
-
-
-
- | {# expand button #}
- {% trans %}project.bom.quantity{% endtrans %} |
- {% trans %}project.bom.part{% endtrans %} |
- {% trans %}project.bom.name{% endtrans %} |
- | {# Remove button #}
-
-
-
-
- {% for entry in form.bom_entries %}
- {{ form_widget(entry) }}
- {% endfor %}
-
-
-
-
-
+ {{ form_widget(form.bom_entries) }}
{% endblock %}
\ No newline at end of file
diff --git a/templates/Form/collection_types_layout.html.twig b/templates/Form/collection_types_layout.html.twig
index ccd8bdef..72c91307 100644
--- a/templates/Form/collection_types_layout.html.twig
+++ b/templates/Form/collection_types_layout.html.twig
@@ -1,3 +1,32 @@
+{% block project_bom_entry_collection_widget %}
+ {% import 'components/collection_type.macro.html.twig' as collection %}
+
+
+
+
+ | {# expand button #}
+ {% trans %}project.bom.quantity{% endtrans %} |
+ {% trans %}project.bom.part{% endtrans %} |
+ {% trans %}project.bom.name{% endtrans %} |
+ | {# Remove button #}
+
+
+
+
+ {% for entry in form %}
+ {{ form_widget(entry) }}
+ {% endfor %}
+
+
+
+
+
+
+{% endblock %}
+
{% block project_bom_entry_widget %}
{% set target_id = 'expand_row-' ~ random() %}
diff --git a/templates/components/collection_type.macro.html.twig b/templates/components/collection_type.macro.html.twig
index c97a8c56..5fcc8053 100644
--- a/templates/components/collection_type.macro.html.twig
+++ b/templates/components/collection_type.macro.html.twig
@@ -1,12 +1,14 @@
-{% macro controller(form, deleteMessage) %}
+{% macro controller(form, deleteMessage, rowsToDelete) %}
{% if form.vars.prototype is defined %}
{{ stimulus_controller('elements/collection_type', {
'deleteMessage': deleteMessage|trans,
- 'prototype': form_widget(form.vars.prototype)|e('html_attr')
+ 'prototype': form_widget(form.vars.prototype)|e('html_attr'),
+ 'rowsToDelete': rowsToDelete,
}) }}
{% else %} {# If add_element is disabled/forbidden, prototype is not available #}
{{ stimulus_controller('elements/collection_type', {
'deleteMessage': deleteMessage|trans,
+ 'rowsToDelete': rowsToDelete
}) }}
{% endif %}
{% endmacro %}