Skip to content

Commit 1ff09ba

Browse files
committed
fix: json-editor format error rustfs/rustfs#1282
1 parent 0d28ee6 commit 1ff09ba

13 files changed

Lines changed: 95 additions & 31 deletions

File tree

components/json-editor.vue

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,55 @@
1-
<script setup>
1+
<script setup lang="ts">
22
import JsonEditorVue from 'json-editor-vue'
33
import 'vanilla-jsoneditor/themes/jse-theme-dark.css'
44
import { useI18n } from 'vue-i18n'
5+
import { Button } from '@/components/ui/button'
56
// import { createAjvValidator } from 'svelte-jsoneditor'
67
78
// const validator = createAjvValidator({ schema, schemaDefinitions })
89
const { t } = useI18n()
10+
const message = useMessage()
911
const attrs = useAttrs()
1012
const model = defineModel()
1113
12-
watch(
13-
model,
14-
newValue => {
15-
if (typeof newValue !== 'string') return
16-
const trimmed = newValue.trim()
17-
if (!trimmed) return
18-
try {
19-
const formatted = JSON.stringify(JSON.parse(trimmed), null, 2)
20-
if (formatted !== newValue) {
21-
model.value = formatted
22-
}
23-
} catch {
24-
// Swallow parse errors so the editor stays usable while typing
14+
const formatJson = () => {
15+
if (typeof model.value !== 'string') {
16+
message.error(t('Invalid JSON format'))
17+
return
18+
}
19+
20+
const trimmed = model.value.trim()
21+
if (!trimmed) {
22+
message.warning(t('JSON content is empty'))
23+
return
24+
}
25+
26+
try {
27+
const parsed = JSON.parse(trimmed)
28+
const formatted = JSON.stringify(parsed, null, 2)
29+
if (formatted !== model.value) {
30+
model.value = formatted
31+
message.success(t('JSON formatted successfully'))
32+
} else {
33+
message.info(t('JSON is already formatted'))
2534
}
26-
},
27-
{ immediate: true }
28-
)
35+
} catch (error) {
36+
message.error(t('Invalid JSON format'))
37+
}
38+
}
2939
</script>
3040

3141
<template>
3242
<!-- :validator="validator" 验证器 -->
33-
<div class="w-full">
43+
<div class="w-full space-y-2 relative">
44+
<div class="flex justify-end absolute top-1 right-1 z-30">
45+
<Button variant="outline" size="sm" @click="formatJson">
46+
<Icon name="ri:code-s-slash-line" class="size-4" />
47+
<!-- <span>{{ t('Format') }}</span> -->
48+
</Button>
49+
</div>
3450
<JsonEditorVue
3551
v-bind="attrs"
36-
mode="text"
52+
:mode="'text' as any"
3753
v-model="model"
3854
:mainMenuBar="false"
3955
selection="TextSelection"

i18n/locales/de-DE.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,5 +879,9 @@
879879
"Get Notification Config Failed": "Benachrichtigungskonfiguration abrufen fehlgeschlagen",
880880
"empty is indicates permanent validity": "Leer bedeutet dauerhafte Gültigkeit",
881881
"Create user groups to organize permissions": "Benutzergruppen erstellen, um Berechtigungen zu organisieren",
882-
"Filter From This Page": "Von dieser Seite filtern"
882+
"Filter From This Page": "Von dieser Seite filtern",
883+
"Invalid JSON format": "Ungültiges JSON-Format",
884+
"JSON content is empty": "JSON-Inhalt ist leer",
885+
"JSON formatted successfully": "JSON erfolgreich formatiert",
886+
"JSON is already formatted": "JSON ist bereits formatiert"
883887
}

i18n/locales/en-US.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,5 +879,9 @@
879879
"Get Notification Config Failed": "Get Notification Config Failed",
880880
"empty is indicates permanent validity": "empty is indicates permanent validity",
881881
"Create user groups to organize permissions": "Create user groups to organize permissions",
882-
"Filter From This Page": "Filter From This Page"
882+
"Filter From This Page": "Filter From This Page",
883+
"Invalid JSON format": "Invalid JSON format",
884+
"JSON content is empty": "JSON content is empty",
885+
"JSON formatted successfully": "JSON formatted successfully",
886+
"JSON is already formatted": "JSON is already formatted"
883887
}

i18n/locales/es-ES.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,5 +879,9 @@
879879
"Get Notification Config Failed": "Error al Obtener Configuración de Notificación",
880880
"empty is indicates permanent validity": "Vacío indica validez permanente",
881881
"Create user groups to organize permissions": "Cree grupos de usuarios para organizar permisos",
882-
"Filter From This Page": "Filtrar Desde Esta Página"
882+
"Filter From This Page": "Filtrar Desde Esta Página",
883+
"Invalid JSON format": "Formato JSON inválido",
884+
"JSON content is empty": "El contenido JSON está vacío",
885+
"JSON formatted successfully": "JSON formateado exitosamente",
886+
"JSON is already formatted": "JSON ya está formateado"
883887
}

i18n/locales/fr-FR.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,5 +879,9 @@
879879
"Get Notification Config Failed": "Échec de l'obtention de la configuration de notification",
880880
"empty is indicates permanent validity": "vide indique une validité permanente",
881881
"Create user groups to organize permissions": "Créez des groupes d'utilisateurs pour organiser les permissions",
882-
"Filter From This Page": "Filtrer depuis cette page"
882+
"Filter From This Page": "Filtrer depuis cette page",
883+
"Invalid JSON format": "Format JSON invalide",
884+
"JSON content is empty": "Le contenu JSON est vide",
885+
"JSON formatted successfully": "JSON formaté avec succès",
886+
"JSON is already formatted": "JSON est déjà formaté"
883887
}

i18n/locales/id-ID.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,5 +879,9 @@
879879
"Get Notification Config Failed": "Gagal Mengambil Konfigurasi Notifikasi",
880880
"empty is indicates permanent validity": "kosong menandakan validitas permanen",
881881
"Create user groups to organize permissions": "Buat grup pengguna untuk mengatur izin",
882-
"Filter From This Page": "Filter Dari Halaman Ini"
882+
"Filter From This Page": "Filter Dari Halaman Ini",
883+
"Invalid JSON format": "Format JSON tidak valid",
884+
"JSON content is empty": "Konten JSON kosong",
885+
"JSON formatted successfully": "JSON berhasil diformat",
886+
"JSON is already formatted": "JSON sudah diformat"
883887
}

i18n/locales/it-IT.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,5 +879,9 @@
879879
"Get Notification Config Failed": "Recupero configurazione notifica non riuscito",
880880
"empty is indicates permanent validity": "Vuoto indica validità permanente",
881881
"Create user groups to organize permissions": "Crea gruppi utenti per organizzare le autorizzazioni",
882-
"Filter From This Page": "Filtra da questa pagina"
882+
"Filter From This Page": "Filtra da questa pagina",
883+
"Invalid JSON format": "Formato JSON non valido",
884+
"JSON content is empty": "Il contenuto JSON è vuoto",
885+
"JSON formatted successfully": "JSON formattato con successo",
886+
"JSON is already formatted": "JSON è già formattato"
883887
}

i18n/locales/ja-JP.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,5 +879,9 @@
879879
"Get Notification Config Failed": "通知設定の取得に失敗しました",
880880
"empty is indicates permanent validity": "空は永続的な有効性を示します",
881881
"Create user groups to organize permissions": "権限を整理するユーザーグループを作成します",
882-
"Filter From This Page": "このページからフィルター"
882+
"Filter From This Page": "このページからフィルター",
883+
"Invalid JSON format": "無効なJSON形式",
884+
"JSON content is empty": "JSONコンテンツが空です",
885+
"JSON formatted successfully": "JSONのフォーマットが成功しました",
886+
"JSON is already formatted": "JSONは既にフォーマットされています"
883887
}

i18n/locales/ko-KR.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,5 +879,9 @@
879879
"Get Notification Config Failed": "알림 구성 가져오기 실패",
880880
"empty is indicates permanent validity": "비어 있으면 영구 유효성을 나타냅니다",
881881
"Create user groups to organize permissions": "권한을 구성하는 사용자 그룹을 생성하세요",
882-
"Filter From This Page": "이 페이지에서 필터링"
882+
"Filter From This Page": "이 페이지에서 필터링",
883+
"Invalid JSON format": "잘못된 JSON 형식",
884+
"JSON content is empty": "JSON 내용이 비어 있습니다",
885+
"JSON formatted successfully": "JSON 형식화 성공",
886+
"JSON is already formatted": "JSON이 이미 형식화되었습니다"
883887
}

i18n/locales/pt-BR.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,5 +879,9 @@
879879
"Get Notification Config Failed": "Falha ao Obter Configuração de Notificação",
880880
"empty is indicates permanent validity": "Vazio indica validade permanente",
881881
"Create user groups to organize permissions": "Crie grupos de usuários para organizar permissões",
882-
"Filter From This Page": "Filtrar Desta Página"
882+
"Filter From This Page": "Filtrar Desta Página",
883+
"Invalid JSON format": "Formato JSON inválido",
884+
"JSON content is empty": "O conteúdo JSON está vazio",
885+
"JSON formatted successfully": "JSON formatado com sucesso",
886+
"JSON is already formatted": "JSON já está formatado"
883887
}

0 commit comments

Comments
 (0)