Elements can now be reordered within the same container by dragging a row above or below another in the left-hand element tree.
38 lines
1.4 KiB
Python
38 lines
1.4 KiB
Python
import db
|
|
|
|
|
|
def reorder_element(slug, screen_id, element_id, target_id, position):
|
|
"""Déplace element_id juste avant ("before") ou juste après ("after")
|
|
target_id, DANS LE MÊME CONTENEUR (les deux doivent avoir le même
|
|
parent_id — sinon on ne touche à rien, pour ne jamais reparenter par
|
|
erreur via le glisser-déposer de l'arborescence). L'ordre est porté par
|
|
z_index, partagé par tous les éléments de l'écran (pas juste les frères
|
|
et sœurs) : on renumérote donc l'écran entier à partir de l'ordre actuel
|
|
(z_index, id) pour rester cohérent partout, pas seulement dans ce
|
|
conteneur."""
|
|
conn = db.connect(slug)
|
|
rows = conn.execute(
|
|
"SELECT id, parent_id FROM _screen_elements WHERE screen_id = ? ORDER BY z_index, id",
|
|
(screen_id,),
|
|
).fetchall()
|
|
by_id = {r["id"]: r["parent_id"] for r in rows}
|
|
if element_id not in by_id or target_id not in by_id:
|
|
conn.close()
|
|
return
|
|
if by_id[element_id] != by_id[target_id]:
|
|
conn.close()
|
|
return
|
|
|
|
order = [r["id"] for r in rows]
|
|
order.remove(element_id)
|
|
target_index = order.index(target_id)
|
|
insert_at = target_index + 1 if position == "after" else target_index
|
|
order.insert(insert_at, element_id)
|
|
|
|
conn.executemany(
|
|
"UPDATE _screen_elements SET z_index = ? WHERE id = ?",
|
|
[(i + 1, eid) for i, eid in enumerate(order)],
|
|
)
|
|
conn.commit()
|
|
conn.close()
|