fix: many
This commit is contained in:
@@ -20,7 +20,7 @@ export function Count(): Promise<number> & { cancel(): void } {
|
|||||||
|
|
||||||
export function Create(item: $models.Author): Promise<$models.Author> & { cancel(): void } {
|
export function Create(item: $models.Author): Promise<$models.Author> & { cancel(): void } {
|
||||||
let $resultPromise = $Call.ByID(3684602449, item) as any;
|
let $resultPromise = $Call.ByID(3684602449, item) as any;
|
||||||
let $typingPromise = $resultPromise.then(($result) => {
|
let $typingPromise = $resultPromise.then(($result: any) => {
|
||||||
return $$createType0($result);
|
return $$createType0($result);
|
||||||
}) as any;
|
}) as any;
|
||||||
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
||||||
@@ -34,7 +34,7 @@ export function Delete(id: number): Promise<void> & { cancel(): void } {
|
|||||||
|
|
||||||
export function GetAll(): Promise<($models.Author | null)[]> & { cancel(): void } {
|
export function GetAll(): Promise<($models.Author | null)[]> & { cancel(): void } {
|
||||||
let $resultPromise = $Call.ByID(3248293926) as any;
|
let $resultPromise = $Call.ByID(3248293926) as any;
|
||||||
let $typingPromise = $resultPromise.then(($result) => {
|
let $typingPromise = $resultPromise.then(($result: any) => {
|
||||||
return $$createType2($result);
|
return $$createType2($result);
|
||||||
}) as any;
|
}) as any;
|
||||||
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
||||||
@@ -43,7 +43,7 @@ export function GetAll(): Promise<($models.Author | null)[]> & { cancel(): void
|
|||||||
|
|
||||||
export function GetById(id: number): Promise<$models.Author | null> & { cancel(): void } {
|
export function GetById(id: number): Promise<$models.Author | null> & { cancel(): void } {
|
||||||
let $resultPromise = $Call.ByID(1703016211, id) as any;
|
let $resultPromise = $Call.ByID(1703016211, id) as any;
|
||||||
let $typingPromise = $resultPromise.then(($result) => {
|
let $typingPromise = $resultPromise.then(($result: any) => {
|
||||||
return $$createType1($result);
|
return $$createType1($result);
|
||||||
}) as any;
|
}) as any;
|
||||||
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
||||||
@@ -52,7 +52,7 @@ export function GetById(id: number): Promise<$models.Author | null> & { cancel()
|
|||||||
|
|
||||||
export function Update(item: $models.Author): Promise<$models.Author> & { cancel(): void } {
|
export function Update(item: $models.Author): Promise<$models.Author> & { cancel(): void } {
|
||||||
let $resultPromise = $Call.ByID(2240704960, item) as any;
|
let $resultPromise = $Call.ByID(2240704960, item) as any;
|
||||||
let $typingPromise = $resultPromise.then(($result) => {
|
let $typingPromise = $resultPromise.then(($result: any) => {
|
||||||
return $$createType0($result);
|
return $$createType0($result);
|
||||||
}) as any;
|
}) as any;
|
||||||
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export function Count(): Promise<number> & { cancel(): void } {
|
|||||||
|
|
||||||
export function Create(item: $models.Post): Promise<$models.Post> & { cancel(): void } {
|
export function Create(item: $models.Post): Promise<$models.Post> & { cancel(): void } {
|
||||||
let $resultPromise = $Call.ByID(1443399856, item) as any;
|
let $resultPromise = $Call.ByID(1443399856, item) as any;
|
||||||
let $typingPromise = $resultPromise.then(($result) => {
|
let $typingPromise = $resultPromise.then(($result: any) => {
|
||||||
return $$createType0($result);
|
return $$createType0($result);
|
||||||
}) as any;
|
}) as any;
|
||||||
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
||||||
@@ -39,7 +39,7 @@ export function ExportToExcel(): Promise<void> & { cancel(): void } {
|
|||||||
|
|
||||||
export function GetAll(): Promise<($models.Post | null)[]> & { cancel(): void } {
|
export function GetAll(): Promise<($models.Post | null)[]> & { cancel(): void } {
|
||||||
let $resultPromise = $Call.ByID(65691059) as any;
|
let $resultPromise = $Call.ByID(65691059) as any;
|
||||||
let $typingPromise = $resultPromise.then(($result) => {
|
let $typingPromise = $resultPromise.then(($result: any) => {
|
||||||
return $$createType2($result);
|
return $$createType2($result);
|
||||||
}) as any;
|
}) as any;
|
||||||
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
||||||
@@ -48,7 +48,7 @@ export function GetAll(): Promise<($models.Post | null)[]> & { cancel(): void }
|
|||||||
|
|
||||||
export function GetById(id: number): Promise<$models.Post | null> & { cancel(): void } {
|
export function GetById(id: number): Promise<$models.Post | null> & { cancel(): void } {
|
||||||
let $resultPromise = $Call.ByID(4074736792, id) as any;
|
let $resultPromise = $Call.ByID(4074736792, id) as any;
|
||||||
let $typingPromise = $resultPromise.then(($result) => {
|
let $typingPromise = $resultPromise.then(($result: any) => {
|
||||||
return $$createType1($result);
|
return $$createType1($result);
|
||||||
}) as any;
|
}) as any;
|
||||||
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
||||||
@@ -57,7 +57,7 @@ export function GetById(id: number): Promise<$models.Post | null> & { cancel():
|
|||||||
|
|
||||||
export function Update(item: $models.Post): Promise<$models.Post> & { cancel(): void } {
|
export function Update(item: $models.Post): Promise<$models.Post> & { cancel(): void } {
|
||||||
let $resultPromise = $Call.ByID(137798821, item) as any;
|
let $resultPromise = $Call.ByID(137798821, item) as any;
|
||||||
let $typingPromise = $resultPromise.then(($result) => {
|
let $typingPromise = $resultPromise.then(($result: any) => {
|
||||||
return $$createType0($result);
|
return $$createType0($result);
|
||||||
}) as any;
|
}) as any;
|
||||||
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
$typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import PostScheme from './post/PostScheme.vue';
|
import PostScheme from './post/PostScheme.vue';
|
||||||
import AuthorScheme from "./author/AuthorScheme.vue";
|
import AuthorScheme from "./author/AuthorScheme.vue";
|
||||||
|
import MultiSelect from './components/selects/MultiSelect.vue';
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<main class="w-screen h-screen">
|
<main class="w-screen h-screen">
|
||||||
<PostScheme />
|
<AuthorScheme></AuthorScheme>
|
||||||
<AuthorScheme />
|
|
||||||
</main>
|
</main>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ const service = new Service
|
|||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
(scheme as any).Posts.type!.nested!.values = await postService.readAll()
|
(scheme as any).Posts.type!.nested!.values = await postService.readAll()
|
||||||
console.log(scheme)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const scheme: Scheme<Author> = reactive({
|
const scheme: Scheme<Author> = reactive({
|
||||||
|
entityId: "AuthorId",
|
||||||
Id: {
|
Id: {
|
||||||
hidden: true,
|
hidden: true,
|
||||||
type: {
|
type: {
|
||||||
|
|||||||
15
frontend/src/components/checkboxes/Checkbox.vue
Normal file
15
frontend/src/components/checkboxes/Checkbox.vue
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
defineProps<{
|
||||||
|
checked: boolean
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<input type="checkbox" class="cursor-pointer" :checked />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
input[type="checkbox"] {
|
||||||
|
accent-color: var(--p-primary-color);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
44
frontend/src/components/selects/MultiSelect.vue
Normal file
44
frontend/src/components/selects/MultiSelect.vue
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<script setup lang="ts" generic="T extends IEntity">
|
||||||
|
import { structView } from '../../utils/structs/structs-view.util';
|
||||||
|
import type { IEntity } from '../../types/entity.type';
|
||||||
|
import Checkbox from '../checkboxes/Checkbox.vue';
|
||||||
|
import { onMounted, watch } from 'vue';
|
||||||
|
|
||||||
|
const { entityId } = defineProps<{
|
||||||
|
options: T[]
|
||||||
|
path?: string[]
|
||||||
|
entityId: string
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const selected = defineModel<T[]>({ default: [] })
|
||||||
|
|
||||||
|
const pushOrRemove = (option: T) => {
|
||||||
|
if (selected.value.some(s => s.Id === option.Id)) {
|
||||||
|
selected.value = selected.value.filter(s => s.Id !== option.Id)
|
||||||
|
} else {
|
||||||
|
selected.value.push(option)
|
||||||
|
}
|
||||||
|
setNullIds()
|
||||||
|
}
|
||||||
|
|
||||||
|
const setNullIds = () => {
|
||||||
|
selected.value = selected.value.map(item => {
|
||||||
|
item[entityId] = 0
|
||||||
|
return item
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(setNullIds)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="relative">
|
||||||
|
<p class="flex items-center h-8 p-3">{{ structView(selected, path) }}</p>
|
||||||
|
<ul class="absolute max-h-20 overflow-y-auto bg-white rounded-md p-3 w-full border">
|
||||||
|
<li v-for="option in options" :key="option.Id" class="flex items-center gap-2">
|
||||||
|
<Checkbox :checked="selected.some(item => item.Id == option.Id)" @click="pushOrRemove(option)" />
|
||||||
|
<label :for="option.Id.toString()">{{ structView(option, path) }}</label>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -19,7 +19,7 @@ onMounted(async () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const scheme: Scheme<Post> = reactive({
|
const scheme: Scheme<Post> = reactive({
|
||||||
|
entityId: 'PostId',
|
||||||
Id: {
|
Id: {
|
||||||
hidden: true,
|
hidden: true,
|
||||||
type: {
|
type: {
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
<script setup lang="ts" generic="T extends IEntity">
|
<script setup lang="ts" generic="T extends IEntity">
|
||||||
import { Button, DatePicker, Dialog, InputNumber, InputText, MultiSelect, Select, Textarea, ToggleSwitch } from 'primevue';
|
import { Button, DatePicker, Dialog, InputNumber, InputText, Select, Textarea, ToggleSwitch } from 'primevue';
|
||||||
import type { IEntity } from '../types/entity.type';
|
import type { IEntity } from '../types/entity.type';
|
||||||
import type { Scheme } from '../types/scheme.type';
|
import type { Scheme } from '../types/scheme.type';
|
||||||
import type { IService } from '../types/service.type';
|
import type { IService } from '../types/service.type';
|
||||||
import { manyStructsView } from '../utils/structs/structs-view.util';
|
import { manyStructsView } from '../utils/structs/structs-view.util';
|
||||||
import { type UnwrapRef } from 'vue';
|
import { type UnwrapRef } from 'vue';
|
||||||
import { toDate, toTimestamp } from '../utils/date/converters.util';
|
import { toDate, toTimestamp } from '../utils/date/converters.util';
|
||||||
|
import MultiSelect from '../components/selects/MultiSelect.vue';
|
||||||
|
|
||||||
const showCreate = defineModel<boolean>('show')
|
const showCreate = defineModel<boolean>('show')
|
||||||
const createItem = defineModel<T>('item')
|
const createItem = defineModel<T>('item')
|
||||||
@@ -22,9 +23,9 @@ type Key = keyof T
|
|||||||
const keys = Object.keys(props.scheme) as Key[]
|
const keys = Object.keys(props.scheme) as Key[]
|
||||||
|
|
||||||
const emits = defineEmits<{
|
const emits = defineEmits<{
|
||||||
(e: 'onSave', data: any): void
|
(e: 'onSave', data: T): void
|
||||||
(e: 'onSaveUpdate', data: any): void
|
(e: 'onSaveUpdate', data: T): void
|
||||||
(e: 'onSaveCreate', data: any): void
|
(e: 'onSaveCreate', data: T): void
|
||||||
}>()
|
}>()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -47,14 +48,13 @@ const emits = defineEmits<{
|
|||||||
v-else-if="props.scheme[key].type?.primitive === 'string'" />
|
v-else-if="props.scheme[key].type?.primitive === 'string'" />
|
||||||
<DatePicker class="w-[300px]" :default-value="toDate(createItem![key] as number)" @value-change="v => {
|
<DatePicker class="w-[300px]" :default-value="toDate(createItem![key] as number)" @value-change="v => {
|
||||||
createItem![key] = toTimestamp(v as Date) as any
|
createItem![key] = toTimestamp(v as Date) as any
|
||||||
console.log(createItem![key])
|
|
||||||
}" show-time
|
}" show-time
|
||||||
v-else-if="props.scheme[key].type?.primitive === 'date'" />
|
v-else-if="props.scheme[key].type?.primitive === 'date'" />
|
||||||
<Textarea class="w-[300px]" v-model="<string>createItem![key]"
|
<Textarea class="w-[300px]" v-model="<string>createItem![key]"
|
||||||
v-else-if="props.scheme[key].type?.primitive === 'multiple'" />
|
v-else-if="props.scheme[key].type?.primitive === 'multiple'" />
|
||||||
<ToggleSwitch class="w-[300px]" v-model:model-value="<boolean>createItem![key]"
|
<ToggleSwitch class="w-[300px]" v-model:model-value="<boolean>createItem![key]"
|
||||||
v-else-if="props.scheme[key].type?.primitive === 'boolean'" />
|
v-else-if="props.scheme[key].type?.primitive === 'boolean'" />
|
||||||
<Select v-else-if="props.scheme[key].type?.nested?.values && !props.scheme[key].type?.many"
|
<Select v-else-if="props.scheme[key].type?.nested?.values && !props.scheme[key]?.many"
|
||||||
v-model:model-value="createItem![key]" :options="props.scheme[key].type.nested.values"
|
v-model:model-value="createItem![key]" :options="props.scheme[key].type.nested.values"
|
||||||
:placeholder="`Выберите ${props.scheme[key].russian}`" class="w-[300px]">
|
:placeholder="`Выберите ${props.scheme[key].russian}`" class="w-[300px]">
|
||||||
<template #option="{ option }">
|
<template #option="{ option }">
|
||||||
@@ -64,21 +64,15 @@ const emits = defineEmits<{
|
|||||||
{{ manyStructsView(value, props.scheme[key].type.nested.field) }}
|
{{ manyStructsView(value, props.scheme[key].type.nested.field) }}
|
||||||
</template>
|
</template>
|
||||||
</Select>
|
</Select>
|
||||||
<MultiSelect v-else-if="props.scheme[key].type?.many" v-model:model-value="createItem![key]"
|
<MultiSelect v-else-if="props.scheme[key].type?.nested?.values && props.scheme[key]?.many" class="w-[300px]"
|
||||||
:options="props.scheme[key].type?.nested?.values" class="w-[300px] h-11"
|
v-model="<T[]>createItem![key]" :options="props.scheme[key].type.nested.values"
|
||||||
:placeholder="`Выберите ${props.scheme[key].russian}`">
|
:path="props.scheme[key].type.nested.field" :entity-id="props.scheme.entityId" />
|
||||||
<template #option="{ option }">
|
|
||||||
{{ manyStructsView(option, props.scheme[key]?.type?.nested?.field) }}
|
|
||||||
</template>
|
|
||||||
<template #value="{ value }">
|
|
||||||
{{ manyStructsView(value, props.scheme[key]?.type?.nested?.field) }}
|
|
||||||
</template>
|
|
||||||
</MultiSelect>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<Button severity="success" @click="async () => {
|
<Button severity="success" @click="async () => {
|
||||||
|
console.log(createItem)
|
||||||
if (props.updateMode) {
|
if (props.updateMode) {
|
||||||
await props.service.update(createItem as T)
|
await props.service.update(createItem as T)
|
||||||
await emits('onSaveUpdate', createItem as T)
|
await emits('onSaveUpdate', createItem as T)
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ export interface ISchemeField<T extends IEntity> {
|
|||||||
field: string[]
|
field: string[]
|
||||||
values: T[]
|
values: T[]
|
||||||
}
|
}
|
||||||
many?: boolean
|
|
||||||
}
|
}
|
||||||
|
many?: boolean
|
||||||
russian?: string
|
russian?: string
|
||||||
hidden?: boolean
|
hidden?: boolean
|
||||||
readonly?: boolean
|
readonly?: boolean
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { IEntity } from "./entity.type";
|
import type { IEntity } from "./entity.type";
|
||||||
import type { ISchemeField } from "./scheme-field.type";
|
import type { ISchemeField } from "./scheme-field.type";
|
||||||
|
|
||||||
export type Scheme<T extends IEntity, S extends IEntity=any> = Record<keyof T, ISchemeField<S>>
|
export type Scheme<T extends IEntity, S extends IEntity=any> = { entityId: string } & Record<keyof T, ISchemeField<S>>
|
||||||
@@ -17,7 +17,7 @@ export const getDefaultValues = <T extends IEntity>(scheme: Scheme<T>) => {
|
|||||||
obj[key] = false
|
obj[key] = false
|
||||||
} else if (primitive == 'number') {
|
} else if (primitive == 'number') {
|
||||||
obj[key] = 1
|
obj[key] = 1
|
||||||
} else if (scheme[key].type?.many) {
|
} else if (scheme[key]?.many) {
|
||||||
obj[key] = []
|
obj[key] = []
|
||||||
} else if (scheme[key]?.type?.nested?.values) {
|
} else if (scheme[key]?.type?.nested?.values) {
|
||||||
obj[key] = scheme[key].type.nested.values[0]
|
obj[key] = scheme[key].type.nested.values[0]
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ type Post struct {
|
|||||||
Deadline int64 `ui:"label=Дедлайн"`
|
Deadline int64 `ui:"label=Дедлайн"`
|
||||||
CreatedAt int64 `gorm:"autoCreateTime" ui:"hidden"`
|
CreatedAt int64 `gorm:"autoCreateTime" ui:"hidden"`
|
||||||
AuthorId uint
|
AuthorId uint
|
||||||
Author Author `ui:"label=Автор, data=Author, field=[Name]"`
|
Author Author `ui:"label=Автор, data=Author, field=[Name]" gorm:"constraint:OnUpdate:CASCADE;OnDelete:CASCADE"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Author struct {
|
type Author struct {
|
||||||
Id uint `gorm:"primaryKey" ui:"hidden"`
|
Id uint `gorm:"primaryKey" ui:"hidden"`
|
||||||
Name string `ui:"label=Имя"`
|
Name string `ui:"label=Имя"`
|
||||||
Posts []Post `ui:"label=Посты, data=Post, field=[Text]"`
|
Posts []Post `ui:"label=Посты, data=Post, field=[Text]" gorm:"constraint:OnUpdate:CASCADE;OnDelete:CASCADE"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: correct processing the semicolon (get attention to quotes)
|
// TODO: correct processing the semicolon (get attention to quotes)
|
||||||
|
|||||||
1
nto-cli
1
nto-cli
Submodule nto-cli deleted from c9a3a654dd
Binary file not shown.
Reference in New Issue
Block a user