@@ -20,7 +20,6 @@ jobs:
|
|||||||
node-version: '22'
|
node-version: '22'
|
||||||
- name: Clean install dependencies and build
|
- name: Clean install dependencies and build
|
||||||
run: |
|
run: |
|
||||||
cd apps/frontend
|
|
||||||
npm ci
|
npm ci
|
||||||
npm run build-only -- --emptyOutDir --outDir /www/hereconnect.condev.ru/build-${{env.GITHUB_SHA}}/
|
npm run build-only --workspace=apps/frontend -- --emptyOutDir --outDir /www/hereconnect.condev.ru/build-${{env.GITHUB_SHA}}/
|
||||||
mv /www/hereconnect.condev.ru/current /www/hereconnect.condev.ru/old && mv /www/hereconnect.condev.ru/build-${{env.GITHUB_SHA}} /www/hereconnect.condev.ru/current && rm -rf /www/hereconnect.condev.ru/old
|
mv /www/hereconnect.condev.ru/current /www/hereconnect.condev.ru/old && mv /www/hereconnect.condev.ru/build-${{env.GITHUB_SHA}} /www/hereconnect.condev.ru/current && rm -rf /www/hereconnect.condev.ru/old
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
Этот репозиторий содержит код для платформы, предоставляющей возможность создания и использования QR-кодов для взаимодействия между пользователями. Репозиторий организован как монорепозиторий для упрощения управления проектом.
|
Этот репозиторий содержит код для платформы, предоставляющей возможность создания и использования QR-кодов для взаимодействия между пользователями. Репозиторий организован как монорепозиторий для упрощения управления проектом.
|
||||||
|
|
||||||
|
# Тестовый стенд:
|
||||||
|
[https://hereconnect.condev.ru/](https://hereconnect.condev.ru/) автоматически собирается с ветки main
|
||||||
|
|
||||||
|
|
||||||
## Структура репозитория
|
## Структура репозитория
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
|
|||||||
@@ -62,6 +62,3 @@ npm run test:e2e -- --debug
|
|||||||
```sh
|
```sh
|
||||||
npm run lint
|
npm run lint
|
||||||
```
|
```
|
||||||
|
|
||||||
# Demo
|
|
||||||
Open [https://hereconnect.condev.ru/](https://hereconnect.condev.ru/) to see latest build from main branch
|
|
||||||
|
|||||||
Vendored
-22
@@ -9,47 +9,25 @@ declare module 'vue' {
|
|||||||
export interface GlobalComponents {
|
export interface GlobalComponents {
|
||||||
Button: typeof import('primevue/button')['default']
|
Button: typeof import('primevue/button')['default']
|
||||||
Card: typeof import('primevue/card')['default']
|
Card: typeof import('primevue/card')['default']
|
||||||
Chat: typeof import('./src/components/ChatComponent.vue')['default']
|
|
||||||
ChatComponent: typeof import('./src/components/ChatComponent.vue')['default']
|
ChatComponent: typeof import('./src/components/ChatComponent.vue')['default']
|
||||||
Checkbox: typeof import('primevue/checkbox')['default']
|
Checkbox: typeof import('primevue/checkbox')['default']
|
||||||
ContactInfo: typeof import('./src/components/read/ReadContactInfo.vue')['default']
|
|
||||||
CreateActionsSection: typeof import('./src/components/create/CreateActionsSection.vue')['default']
|
CreateActionsSection: typeof import('./src/components/create/CreateActionsSection.vue')['default']
|
||||||
CreateDeliverySection: typeof import('./src/components/create/CreateMessageDeliveryMethodSection.vue')['default']
|
|
||||||
CreateMessageDeliveryMethodSection: typeof import('./src/components/create/CreateMessageDeliveryMethodSection.vue')['default']
|
CreateMessageDeliveryMethodSection: typeof import('./src/components/create/CreateMessageDeliveryMethodSection.vue')['default']
|
||||||
CreateMessagesSection: typeof import('./src/components/create/CreatePredefinedMessagesSection.vue')['default']
|
|
||||||
CreateNameSection: typeof import('./src/components/create/CreateNameSection.vue')['default']
|
|
||||||
CreatePlacementSection: typeof import('./src/components/create/CreatePlacementSection.vue')['default']
|
CreatePlacementSection: typeof import('./src/components/create/CreatePlacementSection.vue')['default']
|
||||||
CreatePredefinedMessagesSection: typeof import('./src/components/create/CreatePredefinedMessagesSection.vue')['default']
|
CreatePredefinedMessagesSection: typeof import('./src/components/create/CreatePredefinedMessagesSection.vue')['default']
|
||||||
CreateReadySection: typeof import('./src/components/create/CreateReadySection.vue')['default']
|
|
||||||
CreateSection: typeof import('./src/components/create/CreateSection.vue')['default']
|
CreateSection: typeof import('./src/components/create/CreateSection.vue')['default']
|
||||||
CreateSectionManager: typeof import('./src/components/create/CreateSectionManager.vue')['default']
|
CreateSectionManager: typeof import('./src/components/create/CreateSectionManager.vue')['default']
|
||||||
CreateSummarySection: typeof import('./src/components/create/CreateSummarySection.vue')['default']
|
CreateSummarySection: typeof import('./src/components/create/CreateSummarySection.vue')['default']
|
||||||
DownloadImageButton: typeof import('./src/components/manage/DownloadImageButton.vue')['default']
|
DownloadImageButton: typeof import('./src/components/manage/DownloadImageButton.vue')['default']
|
||||||
DownloadPng: typeof import('./src/components/manage/DownloadImageButton.vue')['default']
|
|
||||||
Dropdown: typeof import('primevue/dropdown')['default']
|
|
||||||
ExamplesSection: typeof import('./src/components/TheWelcome/ExamplesSection.vue')['default']
|
ExamplesSection: typeof import('./src/components/TheWelcome/ExamplesSection.vue')['default']
|
||||||
HelloWorld: typeof import('./src/components/HelloWorld.vue')['default']
|
|
||||||
IconCommunity: typeof import('./src/components/icons/IconCommunity.vue')['default']
|
|
||||||
IconDocumentation: typeof import('./src/components/icons/IconDocumentation.vue')['default']
|
|
||||||
IconEcosystem: typeof import('./src/components/icons/IconEcosystem.vue')['default']
|
|
||||||
IconSupport: typeof import('./src/components/icons/IconSupport.vue')['default']
|
|
||||||
IconTooling: typeof import('./src/components/icons/IconTooling.vue')['default']
|
|
||||||
InputText: typeof import('primevue/inputtext')['default']
|
InputText: typeof import('primevue/inputtext')['default']
|
||||||
ManagePlacementInstructions: typeof import('./src/components/manage/ManagePlacementInstructions.vue')['default']
|
ManagePlacementInstructions: typeof import('./src/components/manage/ManagePlacementInstructions.vue')['default']
|
||||||
MessageSender: typeof import('./src/components/read/ReadMessageSender.vue')['default']
|
|
||||||
PlacementInstructions: typeof import('./src/components/manage/ManagePlacementInstructions.vue')['default']
|
|
||||||
QRCodeReadySection: typeof import('./src/components/create/CreateReadySection.vue')['default']
|
|
||||||
QueryRender: typeof import('./src/components/QueryRender.vue')['default']
|
QueryRender: typeof import('./src/components/QueryRender.vue')['default']
|
||||||
RadioButton: typeof import('primevue/radiobutton')['default']
|
RadioButton: typeof import('primevue/radiobutton')['default']
|
||||||
ReadContactInfo: typeof import('./src/components/read/ReadContactInfo.vue')['default']
|
ReadContactInfo: typeof import('./src/components/read/ReadContactInfo.vue')['default']
|
||||||
ReadMessageSender: typeof import('./src/components/read/ReadMessageSender.vue')['default']
|
ReadMessageSender: typeof import('./src/components/read/ReadMessageSender.vue')['default']
|
||||||
RouterLink: typeof import('vue-router')['RouterLink']
|
RouterLink: typeof import('vue-router')['RouterLink']
|
||||||
RouterView: typeof import('vue-router')['RouterView']
|
RouterView: typeof import('vue-router')['RouterView']
|
||||||
Select: typeof import('primevue/select')['default']
|
|
||||||
SelectActions: typeof import('./src/components/create/SelectActions.vue')['default']
|
|
||||||
SelecteActions: typeof import('./src/components/create/SelecteActions.vue')['default']
|
|
||||||
SelectPlacement: typeof import('./src/components/create/SelectPlacement.vue')['default']
|
|
||||||
TheWelcome: typeof import('./src/components/TheWelcome/TheWelcome.vue')['default']
|
TheWelcome: typeof import('./src/components/TheWelcome/TheWelcome.vue')['default']
|
||||||
WelcomeItem: typeof import('./src/components/WelcomeItem.vue')['default']
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
-8167
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,7 @@ const { data, error, refetch, isSuccess, isError, isLoading } = query
|
|||||||
<slot v-if="isSuccess" name="default" :data="data! as R" />
|
<slot v-if="isSuccess" name="default" :data="data! as R" />
|
||||||
<slot v-else-if="isLoading" name="loading"><p class="text-gray-500">Загрузка данных...</p></slot>
|
<slot v-else-if="isLoading" name="loading"><p class="text-gray-500">Загрузка данных...</p></slot>
|
||||||
<slot v-else-if="isError" name="error" :error="error as E" :reload="refetch">
|
<slot v-else-if="isError" name="error" :error="error as E" :reload="refetch">
|
||||||
Ошибка загрузки данных: {{ error && 'message' in error ? error.message : error }}
|
Ошибка загрузки данных:
|
||||||
|
{{ error && typeof error === 'object' && 'message' in error ? error.message : error }}
|
||||||
</slot>
|
</slot>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
import { describe, it, expect } from 'vitest'
|
|
||||||
|
|
||||||
import { mount } from '@vue/test-utils'
|
|
||||||
import HelloWorld from '../HelloWorld.vue'
|
|
||||||
|
|
||||||
describe('HelloWorld', () => {
|
|
||||||
it('renders properly', () => {
|
|
||||||
const wrapper = mount(HelloWorld, { props: { msg: 'Hello Vitest' } })
|
|
||||||
expect(wrapper.text()).toContain('Hello Vitest')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@@ -29,7 +29,7 @@ import { type QRCodeDocument } from '@/types/DBDocumentTypes'
|
|||||||
import { deliveryOptions } from '@/constants/deliveryOptions'
|
import { deliveryOptions } from '@/constants/deliveryOptions'
|
||||||
|
|
||||||
const emit = defineEmits(['nextStep'])
|
const emit = defineEmits(['nextStep'])
|
||||||
const model = defineModel<QRCodeDocument['messageDeliveryMethod']>()
|
const model = defineModel<null | QRCodeDocument['messageDeliveryMethod']>()
|
||||||
|
|
||||||
// Локальное состояние для уведомления
|
// Локальное состояние для уведомления
|
||||||
const telegramNotice = ref(false)
|
const telegramNotice = ref(false)
|
||||||
|
|||||||
@@ -19,7 +19,8 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { qrCodePlacements } from '@/constants/qrCodePlacements'
|
import { qrCodePlacements } from '@/constants/qrCodePlacements'
|
||||||
const selectedPlacement = defineModel<string>()
|
import type { QRCodeDocument } from '@/types/DBDocumentTypes'
|
||||||
|
const selectedPlacement = defineModel<null | QRCodeDocument['placement']>()
|
||||||
|
|
||||||
defineEmits(['nextStep'])
|
defineEmits(['nextStep'])
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ import { type QRCodeDocument } from '@/types/DBDocumentTypes'
|
|||||||
import { defaultMessages } from '@/constants/defaultMessages'
|
import { defaultMessages } from '@/constants/defaultMessages'
|
||||||
|
|
||||||
// Пропсы
|
// Пропсы
|
||||||
const props = defineProps<{ placement: QRCodeDocument['placement'] }>()
|
const props = defineProps<{ placement: null | QRCodeDocument['placement'] }>()
|
||||||
const messagesRef = useTemplateRef<HTMLDivElement[]>('messagesRef')
|
const messagesRef = useTemplateRef<HTMLDivElement[]>('messagesRef')
|
||||||
|
|
||||||
// Локальное хранилище сообщений
|
// Локальное хранилище сообщений
|
||||||
@@ -55,7 +55,7 @@ watch(
|
|||||||
messages.value.length === 0 ||
|
messages.value.length === 0 ||
|
||||||
JSON.stringify(messages.value) === JSON.stringify(prevDefaultMessages)
|
JSON.stringify(messages.value) === JSON.stringify(prevDefaultMessages)
|
||||||
if (isMessagesDefault) {
|
if (isMessagesDefault) {
|
||||||
messages.value = [...(defaultMessages[newPlacement] || [])]
|
messages.value = [...(defaultMessages[newPlacement!] || [])]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ immediate: true },
|
{ immediate: true },
|
||||||
|
|||||||
@@ -16,7 +16,11 @@ watch(
|
|||||||
() => sectionRef.value && props.isNextActiveSection,
|
() => sectionRef.value && props.isNextActiveSection,
|
||||||
(isNextActiveSection) => {
|
(isNextActiveSection) => {
|
||||||
if (isNextActiveSection) {
|
if (isNextActiveSection) {
|
||||||
sectionRef.value?.querySelector('input[type="text"]')?.focus()
|
const input = sectionRef.value?.querySelector('input[type="text"]')
|
||||||
|
if (input instanceof HTMLInputElement) {
|
||||||
|
input.focus()
|
||||||
|
}
|
||||||
|
|
||||||
sectionRef.value?.scrollIntoView({ behavior: 'smooth' })
|
sectionRef.value?.scrollIntoView({ behavior: 'smooth' })
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #messages>
|
<template #messages>
|
||||||
<CreatePredefinedMessagesSection :placement="placement" v-model="messages" />
|
<CreatePredefinedMessagesSection :placement v-model="messages" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #summary>
|
<template #summary>
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||||
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
|
"include": ["./components.d.ts", "env.d.ts", "src/**/*", "src/**/*.vue"],
|
||||||
"exclude": ["src/**/__tests__/*"],
|
"exclude": ["src/**/__tests__/*"],
|
||||||
|
"files": ["./components.d.ts"],
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"composite": true,
|
"composite": true,
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"files": ["./components.d.ts"],
|
"files": [],
|
||||||
"references": [
|
"references": [
|
||||||
{
|
{
|
||||||
"path": "./tsconfig.node.json"
|
"path": "./tsconfig.node.json"
|
||||||
|
|||||||
Reference in New Issue
Block a user