From 7733065c2fbe1b5da4fdbf651039f7329d559e25 Mon Sep 17 00:00:00 2001 From: "korolev.artem14" Date: Sat, 26 Apr 2025 19:44:12 +0300 Subject: [PATCH 1/3] =?UTF-8?q?MVP=20-=20=D0=9A=D0=BE=D0=BD=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=20=D0=B4=D0=BB=D1=8F=20JSO?= =?UTF-8?q?Nata-=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/components/JSONata/DevTool.vue | 58 +- .../components/JSONata/QueryBuilder.vue | 1829 +++++++++++++++++ .../components/JSONata/QueryBuilderPage.vue | 124 ++ src/frontend/router/routes.js | 9 + src/global/jsonata/queries.mjs | 7 + 5 files changed, 2026 insertions(+), 1 deletion(-) create mode 100644 src/frontend/components/JSONata/QueryBuilder.vue create mode 100644 src/frontend/components/JSONata/QueryBuilderPage.vue diff --git a/src/frontend/components/JSONata/DevTool.vue b/src/frontend/components/JSONata/DevTool.vue index d3971011..997604d7 100644 --- a/src/frontend/components/JSONata/DevTool.vue +++ b/src/frontend/components/JSONata/DevTool.vue @@ -46,6 +46,12 @@ v-model="autoExec" /> Автовыполнение + + + mdi-tools + + Конструктор запросов + @@ -81,6 +87,25 @@ + + + + + + mdi-close + + Конструктор запросов + + + + @@ -125,6 +150,7 @@ import editor from './JSONataEditor.vue'; import result from './JSONResult.vue'; + import queryBuilder from './QueryBuilder.vue'; import {Base64URLToUTF8} from '@front/helpers/strings'; const COOKIE_NAME_QUERY = 'json-dev-tool-query'; @@ -134,7 +160,8 @@ name: 'JSONataDevTool', components: { editor, - result + result, + queryBuilder }, props: { jsonataSource: { @@ -155,6 +182,7 @@ origin: null, // Выбранный базовый источник origins: [], // Список доступных источников данных isOriginAvailable: !env.isBackendMode(), // Определяет доступен ли выбор origin + showQueryBuilder: false, // Показывать ли конструктор запросов logHeaders: [ { text: 'Таймлайн', @@ -205,6 +233,12 @@ }, jsonataSource(value) { this.loadJsonataQuery(value); + }, + showQueryBuilder(newVal) { + // Если компонент QueryBuilder существует, вызываем resetState при открытии + if (newVal && this.$refs.queryBuilder && typeof this.$refs.queryBuilder.resetState === 'function') { + this.$refs.queryBuilder.resetState(); + } } }, mounted() { @@ -297,6 +331,24 @@ } else this.doExecute(); }, force ? 10 : 500); } + }, + // Обработчик запроса из конструктора запросов + handleQueryFromBuilder(generatedQuery) { + this.query = generatedQuery; + this.$refs.editor.model.setValue(generatedQuery); + // Сбрасываем состояние конструктора после успешной генерации запроса + if (this.$refs.queryBuilder && typeof this.$refs.queryBuilder.resetState === 'function') { + this.$refs.queryBuilder.resetState(); + } + this.showQueryBuilder = false; + this.onExecute(); + }, + closeQueryBuilder() { + // Сбрасываем состояние конструктора перед закрытием + if (this.$refs.queryBuilder && typeof this.$refs.queryBuilder.resetState === 'function') { + this.$refs.queryBuilder.resetState(); + } + this.showQueryBuilder = false; } } }; @@ -430,4 +482,8 @@ min-width: fit-content; } +.dialog-modal { + z-index: 1000 !important; +} + diff --git a/src/frontend/components/JSONata/QueryBuilder.vue b/src/frontend/components/JSONata/QueryBuilder.vue new file mode 100644 index 00000000..0b94e71e --- /dev/null +++ b/src/frontend/components/JSONata/QueryBuilder.vue @@ -0,0 +1,1829 @@ + + + + + diff --git a/src/frontend/components/JSONata/QueryBuilderPage.vue b/src/frontend/components/JSONata/QueryBuilderPage.vue new file mode 100644 index 00000000..45fa2d33 --- /dev/null +++ b/src/frontend/components/JSONata/QueryBuilderPage.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/frontend/router/routes.js b/src/frontend/router/routes.js index d68d2224..1cae2297 100644 --- a/src/frontend/router/routes.js +++ b/src/frontend/router/routes.js @@ -43,6 +43,7 @@ import Technology from '@front/components/Techradar/Technology'; import Problems from '@front/components/Problems/Problems'; import Empty from '@front/components/Controls/Empty'; import DevTool from '@front/components/JSONata/DevTool'; +import QueryBuilderPage from '@front/components/JSONata/QueryBuilderPage'; import Entity from '@front/components/Entities/Entity'; import SSOError from '@front/components/sso/SSOError'; import oidcClient from '@front/auth/oidc-client'; @@ -183,6 +184,14 @@ const routes = [ path: '/sso/error', component: SSOError }, + { + name: 'QueryBuilder', + path: '/query-builder', + component: QueryBuilderPage, + meta: { + standalone: true + } + }, { name: 'Empty', path: '*', diff --git a/src/global/jsonata/queries.mjs b/src/global/jsonata/queries.mjs index 99fb87a8..2619505d 100644 --- a/src/global/jsonata/queries.mjs +++ b/src/global/jsonata/queries.mjs @@ -101,6 +101,13 @@ const queries = { "icon": 'chrome_reader_mode', "location": "devtool", "order": $defOrder + }, + { + "title": 'Конструктор JSONata', + "route": '/query-builder', + "icon": 'mdi-tools', + "location": "query-builder", + "order": $defOrder } ]) ) From e8d41af57058ba57328711c8abddf684ed7b583c Mon Sep 17 00:00:00 2001 From: "korolev.artem14" Date: Sat, 26 Apr 2025 20:07:24 +0300 Subject: [PATCH 2/3] =?UTF-8?q?MVP2=20-=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B8=D0=BD=D1=82=D1=80=D1=84=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 16 ++++ package.json | 1 + src/frontend/components/JSONata/DevTool.vue | 63 ++++++++------ .../components/JSONata/QueryBuilder.vue | 86 +++++++++++++------ .../components/JSONata/QueryBuilderPage.vue | 75 +++++++++------- 5 files changed, 159 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef9f6409..4654dde2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "vue": "2.7.14", "vue-async-computed": "3.9.0", "vue-cookie": "1.1.4", + "vue-json-pretty": "^1.9.0", "vue-markdown": "2.2.4", "vue-router": "3.6.5", "vuetify": "2.6.14", @@ -28772,6 +28773,16 @@ "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", "dev": true }, + "node_modules/vue-json-pretty": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/vue-json-pretty/-/vue-json-pretty-1.9.0.tgz", + "integrity": "sha512-9ZcU6IV39n1fBJjzkYEs5eMU4Y3aQKONGzOntwTYm5Uy+Jvc/NKZQdEkPF6WV5M3ZLZK1xNr7weNP4sBGnTlJQ==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0", + "npm": ">= 5.0.0" + } + }, "node_modules/vue-loader": { "version": "13.7.3", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.7.3.tgz", @@ -53256,6 +53267,11 @@ "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", "dev": true }, + "vue-json-pretty": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/vue-json-pretty/-/vue-json-pretty-1.9.0.tgz", + "integrity": "sha512-9ZcU6IV39n1fBJjzkYEs5eMU4Y3aQKONGzOntwTYm5Uy+Jvc/NKZQdEkPF6WV5M3ZLZK1xNr7weNP4sBGnTlJQ==" + }, "vue-loader": { "version": "13.7.3", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.7.3.tgz", diff --git a/package.json b/package.json index c05a4605..8e008376 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "vue": "2.7.14", "vue-async-computed": "3.9.0", "vue-cookie": "1.1.4", + "vue-json-pretty": "^1.9.0", "vue-markdown": "2.2.4", "vue-router": "3.6.5", "vuetify": "2.6.14", diff --git a/src/frontend/components/JSONata/DevTool.vue b/src/frontend/components/JSONata/DevTool.vue index 997604d7..063f52fa 100644 --- a/src/frontend/components/JSONata/DevTool.vue +++ b/src/frontend/components/JSONata/DevTool.vue @@ -1,6 +1,21 @@ @@ -344,10 +340,6 @@ this.onExecute(); }, closeQueryBuilder() { - // Сбрасываем состояние конструктора перед закрытием - if (this.$refs.queryBuilder && typeof this.$refs.queryBuilder.resetState === 'function') { - this.$refs.queryBuilder.resetState(); - } this.showQueryBuilder = false; } } @@ -482,8 +474,29 @@ min-width: fit-content; } +/* Стили для полноэкранного режима конструктора запросов */ +.query-builder-fullscreen { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 10; + background-color: white; + display: flex; + flex-direction: column; +} + +/* Убираем стили для модального диалога, так как он больше не используется */ .dialog-modal { - z-index: 1000 !important; + display: none; /* или полностью удалите этот класс */ +} + +/* Стили для кнопки закрытия */ +.close-button { + margin: 8px; + background-color: rgba(255, 255, 255, 0.8) !important; + z-index: 20; } diff --git a/src/frontend/components/JSONata/QueryBuilder.vue b/src/frontend/components/JSONata/QueryBuilder.vue index 0b94e71e..b92894a6 100644 --- a/src/frontend/components/JSONata/QueryBuilder.vue +++ b/src/frontend/components/JSONata/QueryBuilder.vue @@ -498,33 +498,34 @@ - - - - Сгенерированный запрос - - - mdi-content-copy - - - -
{{ generatedQuery }}
-
- - - - Закрыть - - -
-
+ +
+
+ + + Сгенерированный запрос + + + mdi-content-copy + + + +
{{ generatedQuery }}
+
+ + + + Закрыть + + +
+
+
diff --git a/src/frontend/components/JSONata/QueryBuilderPage.vue b/src/frontend/components/JSONata/QueryBuilderPage.vue index 45fa2d33..facd9791 100644 --- a/src/frontend/components/JSONata/QueryBuilderPage.vue +++ b/src/frontend/components/JSONata/QueryBuilderPage.vue @@ -1,6 +1,36 @@