diff --git a/config.d.ts b/config.d.ts index ed04fd9f..f702c57b 100644 --- a/config.d.ts +++ b/config.d.ts @@ -16,7 +16,12 @@ declare var DochubVsCodeExt: { mode: string, request_type: string, server: string - } + }; + env: { // Переменные среды для IDE режима + DOCHUB_IDE_GITLAB_URL?: string, // gitlab сервер для режима IDE + DOCHUB_IDE_BITBUCKET_URL?: string, // bitbacket сервер для режима IDE + DOCHUB_IDE_PERSONAL_TOKEN?: string, // персональный токен для gitlab/bitbacket + }; } }; @@ -24,6 +29,7 @@ declare var DochubVsCodeExt: { declare var DocHubIDEACodeExt: { rootManifest: string, // Корневой манифест (с чего начинается загрузка) settings: { + [x: string]: {}; isEnterprise: boolean, // Признак использования фронта в плагине как Enterprise портала enterpriseServer?: string, render: { @@ -31,7 +37,12 @@ declare var DocHubIDEACodeExt: { mode: string, // Режим рендера ELK / Smetana / GraphVis request_type: string, // Тип запросов к сервер рендеринга POST / GET server: string // Сервер рендеринга - } + }; + env: { // Переменные среды для IDE режима + DOCHUB_IDE_GITLAB_URL?: string, // gitlab сервер для режима IDE + DOCHUB_IDE_BITBUCKET_URL?: string, // bitbacket сервер для режима IDE + DOCHUB_IDE_PERSONAL_TOKEN?: string, // персональный токен для gitlab/bitbacket + }; } }; diff --git a/package-lock.json b/package-lock.json index d0aca8e1..de85c1c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,9 @@ "monaco-editor": "0.34.1", "mustache": "4.2.0", "semver": "7.5.4", + "stream": "^0.0.2", "swagger-ui": "3.52.5", + "timers": "^0.1.1", "uuid": "8.3.2", "vis-network": "9.1.2", "vue": "2.7.14", @@ -35,6 +37,7 @@ "vue-router": "3.6.5", "vuetify": "2.6.14", "vuex": "3.6.2", + "xml2js": "0.6.2", "yaml": "1.10.2" }, "devDependencies": { @@ -21440,6 +21443,19 @@ "xml2js": "^0.4.5" } }, + "node_modules/parse-bmfont-xml/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/parse-conflict-json": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz", @@ -24229,8 +24245,7 @@ "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/saxes": { "version": "5.0.1", @@ -26714,6 +26729,11 @@ "node": ">=0.10.0" } }, + "node_modules/timers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/timers/-/timers-0.1.1.tgz", + "integrity": "sha512-pkJC8uIP/gxDHxNQUBUbjHyl6oZfT+ofn7tbaHW+CFIUjI+Q2MBbHcx1JSBQfhDaTcO9bNg328q0i7Vk5PismQ==" + }, "node_modules/timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -29429,10 +29449,9 @@ "dev": true }, "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -29445,7 +29464,6 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -47536,6 +47554,18 @@ "requires": { "xml-parse-from-string": "^1.0.0", "xml2js": "^0.4.5" + }, + "dependencies": { + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + } } }, "parse-conflict-json": { @@ -49619,8 +49649,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { "version": "5.0.1", @@ -51586,6 +51615,11 @@ "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "dev": true }, + "timers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/timers/-/timers-0.1.1.tgz", + "integrity": "sha512-pkJC8uIP/gxDHxNQUBUbjHyl6oZfT+ofn7tbaHW+CFIUjI+Q2MBbHcx1JSBQfhDaTcO9bNg328q0i7Vk5PismQ==" + }, "timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -53649,10 +53683,9 @@ "dev": true }, "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -53661,8 +53694,7 @@ "xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, "xmlchars": { "version": "2.2.0", diff --git a/package.json b/package.json index 220d8c19..647ac1d1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dochubcore", "version": "1.0.6", - "main": "/dist/dochub.js", + "main": "src/backend/main.mjs", "files": [ "/dist" ], @@ -44,7 +44,9 @@ "monaco-editor": "0.34.1", "mustache": "4.2.0", "semver": "7.5.4", + "stream": "0.0.2", "swagger-ui": "3.52.5", + "timers": "0.1.1", "uuid": "8.3.2", "vis-network": "9.1.2", "vue": "2.7.14", @@ -54,6 +56,7 @@ "vue-router": "3.6.5", "vuetify": "2.6.14", "vuex": "3.6.2", + "xml2js": "0.6.2", "yaml": "1.10.2" }, "devDependencies": { @@ -85,6 +88,7 @@ "jest-environment-jsdom": "29.4.1", "jest-test-gen": "1.4.3", "nodemon": "2.0.20", + "object-hash": "3.0.0", "postcss-loader": "2.1.6", "raw-loader": "4.0.2", "redis": "4.6.10", @@ -99,8 +103,7 @@ "vue-template-compiler": "2.7.14", "webpack-bundle-analyzer": "4.8.0", "webpack-pwa-manifest": "4.3.0", - "yo": "4.3.0", - "object-hash": "3.0.0" + "yo": "4.3.0" }, "overrides": { "es5-ext": "0.10.53" diff --git a/public/documentation/dochub.yaml b/public/documentation/dochub.yaml new file mode 100755 index 00000000..ceaf759f --- /dev/null +++ b/public/documentation/dochub.yaml @@ -0,0 +1,5 @@ +$package: + dochub-doc: + version: 3.0.0 +imports: + - root.yaml \ No newline at end of file diff --git a/public/documentation/docs/manual/config/deployment.md b/public/documentation/docs/manual/config/deployment.md index 13caec58..666a90a2 100644 --- a/public/documentation/docs/manual/config/deployment.md +++ b/public/documentation/docs/manual/config/deployment.md @@ -18,6 +18,14 @@ DocHub поддерживает следующие режимы разверты Вам также поможет статья ["Архитектура рядом с кодом"](https://habr.com/ru/post/659595/). +### Переменные среды + +* **DOCHUB_IDE_GITLAB_URL** - Адрес Gitlab сервера для интеграции с ним (например, https://gitlab.com/); +* **DOCHUB_IDE_BITBUCKET_URL** - Адрес Bitbucket сервера для интеграции с ним (например, https://bitbucket.org/); +* **DOCHUB_IDE_PERSONAL_TOKEN** - Персональный токен, необходимый для доступа к системе управления версиями. Выпускается самой системой (Gitlab/Bitbucket). + +Переменные среды могут быть переопределены через пользовательский интерфейс в настройках плагина. + ### Преимущества 1. Развертывание буквально за 2 минуты; 2. Встраивание в инструмент производства (IDE); diff --git a/public/documentation/docs/manual/docs/bpmn.md b/public/documentation/docs/manual/docs/bpmn.md index 3c53d536..179779a1 100644 --- a/public/documentation/docs/manual/docs/bpmn.md +++ b/public/documentation/docs/manual/docs/bpmn.md @@ -87,5 +87,38 @@ ![Редактирование BPM диаграмм в IDEA](https://youtu.be/qQzsHuYxNzg) +## Анализ процессов +DocHub может обращаться к описанию процессов в XML формате аналогично YAML и JSON. Для этого необходимо указать XML +файл как источник данных. Например, рассмотрим анализ процесса: +![BPMN](@document/dochub.example.bpmn.full) + +Выявим реестр задач определенных в процессе и выразим его в таблице: + +```yaml +docs: + ... + dochub.example.bpmn.analyse: + origin: examples/pizza-collaboration.xml # Указываем источником оригинальных данных XML файл + source: > # Обрабатываем XML + ( + [$."semantic:definitions"."semantic:process"."semantic:task"."$"] + ) + type: table # Тип документа "таблица" + headers: # Заголовки таблицы + - value: id + text: Идентификатор + sortable: true + align: left + width: 20% + - value: name + text: Название задачи + sortable: true + align: left + ... +``` + +Результат: + +![BPMN](@document/dochub.example.bpmn.analyse) \ No newline at end of file diff --git a/public/documentation/docs/manual/docs/examples/bpmn.xml b/public/documentation/docs/manual/docs/examples/bpmn.xml index b2bba32c..9133cc56 100644 --- a/public/documentation/docs/manual/docs/examples/bpmn.xml +++ b/public/documentation/docs/manual/docs/examples/bpmn.xml @@ -41,4 +41,4 @@ - \ No newline at end of file + diff --git a/public/documentation/docs/manual/docs/markdown.md b/public/documentation/docs/manual/docs/markdown.md index 9017b3d8..32ef2325 100644 --- a/public/documentation/docs/manual/docs/markdown.md +++ b/public/documentation/docs/manual/docs/markdown.md @@ -1,9 +1,14 @@ # Markdown -В Markdown документах включена поддержка HTML. Добавлены специальные теги DocHub, которые позволяют -заметно расширить функциональность: +Облегчённый язык разметки, созданный с целью обозначения форматирования в простом тексте, +с максимальным сохранением его читаемости человеком, и пригодный для машинного +преобразования в языки для продвинутых публикаций. -## Навигационные якоря +## Расширенные возможности + +Добавлены специальные теги DocHub, которые позволяют заметно расширить функциональность: + +### Навигационные якоря Позволяет создавать именованные якоря для "коротких" ссылок внутри документа. Например, код: ``` ![](@anchor/markdown) @@ -13,7 +18,7 @@ [Пример короткой ссылки](#markdown) ``` -## Изображения +### Изображения Поддерживается встраивание изображений. Например: ``` @@ -22,7 +27,7 @@ ![Кот](examples/cat.jpg) -## Ссылки на объекты DocHub +### Ссылки на объекты DocHub Добавляет ссылку на архитектурный объект. Пример для ссылки на документ: ``` [Swagger контракт](/docs/dochub.example.swgr) @@ -41,7 +46,7 @@ [Компонент gitlab](/architect/components/dochub.gitlab) -## Встраиваемые объекты DocHub +### Встраиваемые объекты DocHub Интегрирует в документ архитектурный объект. Например: ``` ![Компонент архитектуры](@component/dochub.front) @@ -66,4 +71,33 @@ Через "/" указывается идентификатор объекта. +## Использование HTML +По умолчанию в markdown отключены HTML тэги. Это сделано для исключения встраивания потенциально опасного +произвольного кода. Для включения поддержки HTML, используйте переменную окружения VUE_APP_DOCHUB_MARKDOWN_HTML +в режиме портала. + +``` +VUE_APP_DOCHUB_MARKDOWN_HTML=on +``` + +Подробнее [здесь](https://github.com/RabotaRu/DocHub/blob/master/example.env). + +Для включения поддержки HTML в плагинах, потребуется установить переменную DOCHUB_IDE_MARKDOWN_HTML на рабочей станции. + +Для linux: + +``` +export DOCHUB_IDE_MARKDOWN_HTML=on +``` + +Для windows: +``` +set DOCHUB_IDE_MARKDOWN_HTML=on +``` + +**ВНИМАНИЕ:** Поддержка HTML не является стандартом markdown. Высока вероятность столкнуться с различными +проблемами при его использовании. Не рекомендуется использование HTML в Markdown. + + + diff --git a/public/documentation/docs/manual/docs/root.yaml b/public/documentation/docs/manual/docs/root.yaml index ace28468..a6c9b365 100644 --- a/public/documentation/docs/manual/docs/root.yaml +++ b/public/documentation/docs/manual/docs/root.yaml @@ -399,10 +399,28 @@ docs: location: DocHub/Руководство/Документы/BPMN/Простой пример type: bpmnjs source: examples/bpmn.xml - dochub.example.bpmn_full: + dochub.example.bpmn.full: location: DocHub/Руководство/Документы/BPMN/Расширенный пример type: bpmnjs source: examples/pizza-collaboration.xml + dochub.example.bpmn.analyse: + origin: examples/pizza-collaboration.xml # Указываем источником оригинальных данных XML файл + source: > # Обрабатываем XML + ( + [$."semantic:definitions".*."semantic:task"."$"] + ) + type: table # Тип документа "таблица" + headers: # Заголовки таблицы + - value: id + text: Идентификатор + sortable: true + align: left + width: 20% + - value: name + text: Название задачи + sortable: true + align: left + # ***************************************** # Шаблоны # ***************************************** @@ -475,4 +493,4 @@ docs: }] } ) - template: examples/openapi_template.json + template: examples/openapi_template.json \ No newline at end of file diff --git a/public/documentation/root.yaml b/public/documentation/root.yaml index 5d9cea29..2261232d 100755 --- a/public/documentation/root.yaml +++ b/public/documentation/root.yaml @@ -4,4 +4,3 @@ imports: - docs/root.yaml - arch/root.yaml - entities/root.yaml -testkey: 14 diff --git a/src/backend/helpers/request.mjs b/src/backend/helpers/request.mjs index 56180c5c..59554aef 100644 --- a/src/backend/helpers/request.mjs +++ b/src/backend/helpers/request.mjs @@ -6,6 +6,7 @@ import uriTool from './uri.mjs'; import gitlab from './gitlab.mjs'; import bitbucket from './bitbucket.mjs'; import logger from '../utils/logger.mjs'; +import xml from '../../global/helpers/xmlparser.mjs'; const REQUEST_TAG = 'request'; @@ -28,6 +29,8 @@ axios.interceptors.response.use( response.data = JSON.parse(response.data); else if ((url.indexOf('.yaml/raw') >= 0) || url.endsWith('.yaml')) response.data = yaml.parse(response.data); + else if ((url.indexOf('.xml/raw') >= 0) || url.endsWith('.xml')) + response.data = xml.parse(response.data); } } return response; @@ -40,14 +43,20 @@ function isAvailablePath(path) { return path.startsWith(`${$paths.file_storage}/`); } +const CONTENT_TYPE_YAML = 'application/x-yaml'; +const CONTENT_TYPE_JSON = 'application/json'; +const CONTENT_TYPE_XML = 'application/xhtml+xml'; + // Определяет тип контента function getContentType(url) { let contentType = null; const uri = url.split('?')[0]; if (uri.endsWith('.yaml') || uri.endsWith('.yml') || (uri.indexOf('.yaml/raw') >= 0) || (uri.indexOf('.yml/raw') >= 0)) { - contentType = 'application/x-yaml'; + contentType = CONTENT_TYPE_YAML; } else if (uri.endsWith('.json') || (uri.indexOf('.json/raw') >= 0)) { - contentType = 'application/json'; + contentType = CONTENT_TYPE_JSON; + } else if (uri.endsWith('.xml') || (uri.indexOf('.xml/raw') >= 0)) { + contentType = CONTENT_TYPE_XML; } return contentType; } @@ -79,11 +88,13 @@ async function request(url, baseURI, response) { const result = { data: fs.readFileSync(fileName, { encoding: 'utf8', flag: 'r' }) }; - if (contentType === 'application/x-yaml') { + if (contentType === CONTENT_TYPE_YAML) { result.data = yaml.parse(result.data); - } else if (contentType === 'application/json') { + } else if (contentType === CONTENT_TYPE_JSON) { result.data = JSON.parse(result.data); - } + } else if (contentType === CONTENT_TYPE_XML) { + result.data = xml.parse(result.data); + } return result; } } // Если запрос по http / https diff --git a/src/backend/storage/cache.mjs b/src/backend/storage/cache.mjs index fb897cc5..bbd804ea 100644 --- a/src/backend/storage/cache.mjs +++ b/src/backend/storage/cache.mjs @@ -158,7 +158,7 @@ export default Object.assign(prototype, { // Подключаем документацию, если нужно if ((process.env.VUE_APP_DOCHUB_APPEND_DOCHUB_DOCS || 'y').toLowerCase() === 'y') { - content.imports.push('/documentation/root.yaml'); + content.imports.push('/documentation/dochub.yaml'); } // Подключаем корневой манифест, если есть diff --git a/src/frontend/components/Docs/DocAsyncApi.vue b/src/frontend/components/Docs/DocAsyncApi.vue index ff33e6da..05445a3a 100644 --- a/src/frontend/components/Docs/DocAsyncApi.vue +++ b/src/frontend/components/Docs/DocAsyncApi.vue @@ -12,6 +12,7 @@ import { getAsyncApiContext } from '@front/helpers/misc'; export default { + name: 'DocAsyncApi', mixins: [DocMixin], methods: { renderRefSection(res) { diff --git a/src/frontend/components/Docs/DocContextMenu.vue b/src/frontend/components/Docs/DocContextMenu.vue index 3d696a4e..83f09cf8 100644 --- a/src/frontend/components/Docs/DocContextMenu.vue +++ b/src/frontend/components/Docs/DocContextMenu.vue @@ -23,6 +23,7 @@ + + diff --git a/src/frontend/components/Entities/Entity.vue b/src/frontend/components/Entities/Entity.vue index 799eac0f..f6b1c25f 100644 --- a/src/frontend/components/Entities/Entity.vue +++ b/src/frontend/components/Entities/Entity.vue @@ -51,8 +51,8 @@ profileLoaded: false, menu: { show: false, - x : 0, - y : 0 + x: 0, + y: 0 }, minHeight: null }; @@ -99,6 +99,9 @@ }, entityPath() { return `/entities/${this.entity}`; + }, + manifest() { + return this.$store.state.manifest; } }, watch: { @@ -109,7 +112,7 @@ this.reloadProfile(); }, manifest() { - this.reloadProfile(); + !this.refresher && this.reloadProfile().then(() => this.$nextTick(this.refreshPres)); }, currentPresentation() { this.reloadProfile(); @@ -124,22 +127,26 @@ }, // Перезагружает профиль сущности reloadProfile() { - if (this.refresher) clearTimeout(this.refresher); - this.profileLoaded = false; - this.refresher = setTimeout(() =>{ - this.switchedPresentation = null; - const dateLakeId = this.makeDataLakeID(this.entityPath); - query.expression(dateLakeId).evaluate() - .then((data) => { - // Проверяем, что результат запроса не устарел - if (dateLakeId === this.makeDataLakeID(this.entityPath)) { - this.profile = data; - this.profileLoaded = true; - } - }) - .catch((e) => this.error = e) - .finally(() => this.refresher = null); - } ,100); + return new Promise((success, reject) => { + if (this.refresher) clearTimeout(this.refresher); + this.profileLoaded = false; + this.refresher = setTimeout(() => { + this.switchedPresentation = null; + const dateLakeId = this.makeDataLakeID(this.entityPath); + query.expression(dateLakeId).evaluate() + .then((data) => { + // Проверяем, что результат запроса не устарел + if (dateLakeId === this.makeDataLakeID(this.entityPath)) { + this.profile = data; + this.profileLoaded = true; + success(data); + } + }) + .catch((e) => { this.error = e; reject(e); }) + .finally(() => this.refresher = null); + }, 100); + + }); }, // Принудительное обновление представления refreshPres() { @@ -177,11 +184,11 @@ } else { // Иначе переключаем презентацию this.switchedPresentation = presentation; /* - this.$router.push({ - path: `/entities/${this.entity}/${presentation}`, - query: this.$route.query - }); - */ + this.$router.push({ + path: `/entities/${this.entity}/${presentation}`, + query: this.$route.query + }); + */ this.refreshPres(); } } diff --git a/src/frontend/components/Entities/EntityUpload.js b/src/frontend/components/Entities/EntityUpload.js index 7e6aa6f1..a570ad93 100644 --- a/src/frontend/components/Entities/EntityUpload.js +++ b/src/frontend/components/Entities/EntityUpload.js @@ -33,8 +33,8 @@ export const uploadDocument = function(profile, path, params) { const provider = datasets(); return new Promise((success, reject) => { if (profile.template) { - const baseURI = uriTool.getBaseURIOfPath(path); - requests.request(profile.template, baseURI).then(({ data }) => { + const baseURI = uriTool.getBaseURIOfPath(`${path}/template`); + requests.request(profile.template, baseURI, { raw: true }).then(({ data }) => { let content = data; provider.releaseData(path, params) .then((dataset) => { diff --git a/src/frontend/components/Layouts/Header.vue b/src/frontend/components/Layouts/Header.vue index 6e334b4e..ecaefe14 100644 --- a/src/frontend/components/Layouts/Header.vue +++ b/src/frontend/components/Layouts/Header.vue @@ -76,6 +76,14 @@ get() { return this.$store.state.isPrintVersion; } + }, + isFullScreenMode: { + set(value) { + this.$store.commit('setFullScreenMode', value); + }, + get() { + return this.$store.state.isFullScreenMode; + } } }, methods: { diff --git a/src/frontend/components/Schema/DHSchema/DHSchema.vue b/src/frontend/components/Schema/DHSchema/DHSchema.vue index f4bcbc7d..85209ab1 100644 --- a/src/frontend/components/Schema/DHSchema/DHSchema.vue +++ b/src/frontend/components/Schema/DHSchema/DHSchema.vue @@ -186,7 +186,7 @@ }; worker.postMessage({ queryID, - params + params: JSON.parse(JSON.stringify(params)) }); } }); @@ -218,6 +218,11 @@ }, mixins: [ DHSchemaAnimationMixin, DHSchemaExcalidrawMixin, ZoomAndPan], props: { + // Толщина линии дорожки + fullScreen: { + type: Boolean, + default: false + }, // Варнинги генерации диаграммы warnings: { type: Array, @@ -317,6 +322,12 @@ isFirefox() { return navigator.userAgent.toLowerCase().indexOf('firefox') > -1; }, + limitHeight() { + return this.fullScreen ? screen.height : null; + }, + limitWidth() { + return this.fullScreen ? screen.width : null; + }, lineWidthLimit() { return +this.data.config?.lineWidthLimit || 20; }, @@ -380,9 +391,15 @@ } }, watch: { + fullScreen() { + this.$nextTick(() => this.rebuildViewBox()); + }, data() { this.$nextTick(() => this.rebuildPresentation()); }, + '$store.state.isFullScreenMode'() { + this.$nextTick(() => this.rebuildPresentation()); + }, 'selected.nodes'(value) { this.$emit('selected-nodes', value); }, @@ -554,13 +571,13 @@ // Перестроить viewbox rebuildViewBox() { const width = this.presentation.valueBox?.dx - this.presentation.valueBox.x; - let height = Math.max(this.presentation.valueBox.dy - this.presentation.valueBox.y, 100); + let height = Math.max(this.presentation.valueBox.dy - this.presentation.valueBox.y, this.limitHeight || 100); const clientWidth = this.$el?.clientWidth || 0; const titleWidth = this.$el?.querySelector('#title')?.clientWidth || 0; this.landscape.viewBox.titleX = this.presentation.valueBox.x + (this.presentation.valueBox?.dx - this.presentation.valueBox.x)/2 - titleWidth/2; - this.landscape.viewBox.top = this.presentation.valueBox.y - 48; + this.landscape.viewBox.top = this.presentation.valueBox.y - (height - this.presentation.valueBox.dy + this.presentation.valueBox.y)/2; if (this.animation.information) { this.landscape.viewBox.top -= 64; @@ -597,6 +614,7 @@ distance, this.landscape.symbols, availableWidth, + this.limitHeight, this.debug ) .then((presentation) => { diff --git a/src/frontend/components/Schema/PlantUML.vue b/src/frontend/components/Schema/PlantUML.vue index 29a5c2a7..79e20433 100644 --- a/src/frontend/components/Schema/PlantUML.vue +++ b/src/frontend/components/Schema/PlantUML.vue @@ -1,5 +1,5 @@