From d86adedd8b3a31015d086ea8bd74b307933c9cd9 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Sun, 5 Jan 2025 21:52:14 +0100 Subject: [PATCH] adjust bulk creation --- backend/service/client.go | 18 ++++++++++++++++++ frontend/src/layouts/modals/Client.vue | 3 ++- frontend/src/layouts/modals/ClientBulk.vue | 8 +++++--- frontend/src/locales/en.ts | 2 +- frontend/src/locales/fa.ts | 2 +- frontend/src/locales/ru.ts | 2 +- frontend/src/locales/vi.ts | 2 +- frontend/src/locales/zhcn.ts | 2 +- frontend/src/locales/zhtw.ts | 2 +- frontend/src/views/Clients.vue | 20 ++++++++++++++++---- 10 files changed, 47 insertions(+), 14 deletions(-) diff --git a/backend/service/client.go b/backend/service/client.go index 317ff74..da2bc44 100644 --- a/backend/service/client.go +++ b/backend/service/client.go @@ -48,6 +48,24 @@ func (s *ClientService) Save(tx *gorm.DB, act string, data json.RawMessage, host if err != nil { return nil, err } + case "addbulk": + var clients []*model.Client + err = json.Unmarshal(data, &clients) + if err != nil { + return nil, err + } + err = json.Unmarshal(clients[0].Inbounds, &inboundIds) + if err != nil { + return nil, err + } + err = s.updateLinksWithFixedInbounds(tx, clients, inboundIds, hostname) + if err != nil { + return nil, err + } + err = tx.Save(clients).Error + if err != nil { + return nil, err + } case "del": var id uint err = json.Unmarshal(data, &id) diff --git a/frontend/src/layouts/modals/Client.vue b/frontend/src/layouts/modals/Client.vue index 0ccd734..1bf1e7a 100644 --- a/frontend/src/layouts/modals/Client.vue +++ b/frontend/src/layouts/modals/Client.vue @@ -74,6 +74,7 @@ v-model="clientInbounds" :items="inboundTags" :label="$t('client.inboundTags')" + :return-object="false" multiple chips hide-details @@ -236,7 +237,7 @@ export default { computed: { clientInbounds: { get() { return this.client.inbounds.length>0 ? this.client.inbounds : [] }, - set(v:any[]) { this.client.inbounds = v.length == 0 ? [] : v.map(i => i.value) } + set(v:number[]) { this.client.inbounds = v.length == 0 ? [] : v } }, expDate: { get() { return this.client.expiry}, diff --git a/frontend/src/layouts/modals/ClientBulk.vue b/frontend/src/layouts/modals/ClientBulk.vue index 4f305dc..1fdfc93 100644 --- a/frontend/src/layouts/modals/ClientBulk.vue +++ b/frontend/src/layouts/modals/ClientBulk.vue @@ -2,7 +2,7 @@ - {{ $t('bulk.add') }} + {{ $t('actions.addbulk') }} @@ -53,6 +53,7 @@ v-model="bulkData.clientInbounds" :items="inboundTags" :label="$t('client.inboundTags')" + :return-object="false" multiple chips hide-details @@ -60,6 +61,7 @@ +
{{ bulkData }}
@@ -133,6 +135,7 @@ export default { push.error(i18n.global.t('error.dplData')) return } + this.clients = [] this.loading = true for(let i=0;i - + @@ -535,8 +535,20 @@ const closeBulk = () => { addBulkModal.value = false } -const saveBulk = async (bulkClients: Client[], clientInbounds: number[]) => { - clients.value.push(...bulkClients) - closeBulk() +const saveBulk = async (bulkClients: Client[]) => { + // Check duplicate name + const oldNames = new Set(clients.value.map(c => c.name)) + const newNames = new Set(bulkClients.map(c => c.name)) + const allNames = new Set([...clients.value.map(c => c.name), ...bulkClients.map(c => c.name)]) + if (newNames.size != bulkClients.length || oldNames.size + newNames.size != allNames.size) { + push.error({ + message: i18n.global.t('error.dplData') + ": " + i18n.global.t('client.name') + }) + return + } + + // save data + const success = await Data().save("clients", "addbulk", bulkClients) + if (success) closeBulk() } \ No newline at end of file