diff --git a/frontend/src/pages/clients/ClientFormModal.vue b/frontend/src/pages/clients/ClientFormModal.vue
index fca8a8ab..725e3521 100644
--- a/frontend/src/pages/clients/ClientFormModal.vue
+++ b/frontend/src/pages/clients/ClientFormModal.vue
@@ -128,7 +128,16 @@ async function onSubmit() {
try {
let msg;
if (isEdit.value) {
- msg = await props.save(clientPayload, { isEdit: true, id: props.client.id });
+ const original = new Set(props.attachedIds || []);
+ const next = new Set(form.inboundIds || []);
+ const toAttach = [...next].filter((id) => !original.has(id));
+ const toDetach = [...original].filter((id) => !next.has(id));
+ msg = await props.save(clientPayload, {
+ isEdit: true,
+ id: props.client.id,
+ attach: toAttach,
+ detach: toDetach,
+ });
} else {
msg = await props.save(
{ client: clientPayload, inboundIds: form.inboundIds },
@@ -215,7 +224,8 @@ async function onSubmit() {
-
+
diff --git a/frontend/src/pages/clients/ClientsPage.vue b/frontend/src/pages/clients/ClientsPage.vue
index 8569056e..1b221ae7 100644
--- a/frontend/src/pages/clients/ClientsPage.vue
+++ b/frontend/src/pages/clients/ClientsPage.vue
@@ -32,6 +32,8 @@ const {
create,
update,
remove,
+ attach,
+ detach,
resetTraffic,
} = useClients();
@@ -125,10 +127,21 @@ function onShowQr(row) {
}
async function onSave(payload, meta) {
- if (meta?.isEdit) {
- return update(meta.id, payload);
+ if (!meta?.isEdit) {
+ return create(payload);
}
- return create(payload);
+ const id = meta.id;
+ const updateMsg = await update(id, payload);
+ if (!updateMsg?.success) return updateMsg;
+ if (Array.isArray(meta.attach) && meta.attach.length > 0) {
+ const r = await attach(id, meta.attach);
+ if (!r?.success) return r;
+ }
+ if (Array.isArray(meta.detach) && meta.detach.length > 0) {
+ const r = await detach(id, meta.detach);
+ if (!r?.success) return r;
+ }
+ return updateMsg;
}
function trafficLabel(row) {