heading styles
This commit is contained in:
parent
71b914f07f
commit
24705fe8e0
|
@ -58,6 +58,7 @@ INSTALLED_APPS = [
|
||||||
"django.contrib.messages",
|
"django.contrib.messages",
|
||||||
"django.contrib.staticfiles",
|
"django.contrib.staticfiles",
|
||||||
"tmc",
|
"tmc",
|
||||||
|
"djangoviz",
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
|
|
@ -246,6 +246,34 @@ files = [
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
django = ">=4.2"
|
django = ">=4.2"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "djangoviz"
|
||||||
|
version = "0.1.1"
|
||||||
|
description = "A visualization tool."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6.0"
|
||||||
|
files = [
|
||||||
|
{file = "djangoviz-0.1.1-py3-none-any.whl", hash = "sha256:2a5ec1a25d94607c898f9236f0f1c72fbaf83e4ac818e38b205d6976e805ad8d"},
|
||||||
|
{file = "djangoviz-0.1.1.tar.gz", hash = "sha256:028970923d8d65e210dc10ab80a51e3e69169cc06894c45b8b14554f12aec06c"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
django = ">=2.2.0"
|
||||||
|
graphqlclient = ">=0.2.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "graphqlclient"
|
||||||
|
version = "0.2.4"
|
||||||
|
description = "Simple GraphQL client for Python 2.7+"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "graphqlclient-0.2.4.tar.gz", hash = "sha256:b3305f3df88c04839195754d409a49a2dc3adbcba4ebf9133b5663749e1dd92c"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
six = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "h11"
|
name = "h11"
|
||||||
version = "0.14.0"
|
version = "0.14.0"
|
||||||
|
@ -742,4 +770,4 @@ zstd = ["zstandard (>=0.18.0)"]
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.11"
|
python-versions = "^3.11"
|
||||||
content-hash = "55d9caf79405dd626d2ca38e6603af8bd7fbf754a8b86ba7f03a43b03a13b932"
|
content-hash = "e032592fbe04dbdaffbb40512f6dfa13bcd6f0673c9923e79ba0d852205e2c19"
|
||||||
|
|
|
@ -18,6 +18,7 @@ requests = "^2.32.2"
|
||||||
django-cors-headers = "^4.3.1"
|
django-cors-headers = "^4.3.1"
|
||||||
python-telegram-bot = {extras = ["job-queue"], version = "^21.3"}
|
python-telegram-bot = {extras = ["job-queue"], version = "^21.3"}
|
||||||
more-itertools = "^10.3.0"
|
more-itertools = "^10.3.0"
|
||||||
|
djangoviz = "^0.1.1"
|
||||||
|
|
||||||
[tool.poetry.group.dev.dependencies]
|
[tool.poetry.group.dev.dependencies]
|
||||||
taskipy = "^1.12.2"
|
taskipy = "^1.12.2"
|
||||||
|
|
|
@ -3,12 +3,8 @@ from django.db import models
|
||||||
|
|
||||||
class BaseCustomField(models.Model):
|
class BaseCustomField(models.Model):
|
||||||
name = models.CharField(max_length=120, )
|
name = models.CharField(max_length=120, )
|
||||||
text = models.TextField(null=True, blank=True)
|
|
||||||
scan = models.TextField(null=True, blank=True)
|
|
||||||
comment = models.TextField(null=True, blank=True)
|
comment = models.TextField(null=True, blank=True)
|
||||||
Image = models.ImageField(upload_to='images/', blank=True, null=True)
|
|
||||||
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
a[href]:not([class*=text]) {
|
a[href]:not([class*=text]) {
|
||||||
@apply text-primary-500 hover:text-primary-600
|
// @apply text-primary-500 hover:text-primary-600
|
||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
|
@ -24,10 +24,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
@apply col-span-12 flex gap-2 p-2.5;
|
@apply col-span-12 flex gap-2 p-2.5 border-b border-primary-700 bg-gradient-to-l from-primary-700;
|
||||||
|
|
||||||
.logo {
|
.logo {
|
||||||
@apply text-primary text-2xl
|
@apply text-2xl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,6 +38,10 @@
|
||||||
@apply col-span-10
|
@apply col-span-10
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.page-header {
|
||||||
|
@apply border-b border-primary-200 dark:border-primary-950 py-4 bg-gradient-to-l from-primary-200 dark:from-primary-950;
|
||||||
|
}
|
||||||
|
|
||||||
dl {
|
dl {
|
||||||
@apply grid grid-cols-12;
|
@apply grid grid-cols-12;
|
||||||
dt {
|
dt {
|
||||||
|
|
|
@ -3,18 +3,18 @@ const route = useRoute()
|
||||||
|
|
||||||
const links = [
|
const links = [
|
||||||
{
|
{
|
||||||
label: 'Организации',
|
label: 'DEV Связь с 1с',
|
||||||
icon: 'i-heroicons-archive-box',
|
icon: 'i-heroicons-beaker',
|
||||||
to: '/organization'
|
to: '/organization'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'TMC',
|
label: 'Список ТМЦ (шаблоны)',
|
||||||
icon: 'i-heroicons-archive-box',
|
icon: 'i-heroicons-archive-box',
|
||||||
to: '/tmc'
|
to: '/tmc'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Tablr',
|
label: 'Инвентаризации',
|
||||||
icon: 'i-heroicons-archive-box',
|
icon: 'i-heroicons-pencil',
|
||||||
to: '/table'
|
to: '/table'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -2,7 +2,11 @@
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
ssr: false,
|
ssr: false,
|
||||||
devtools: { enabled: true },
|
devtools: { enabled: true },
|
||||||
modules: ["@nuxt/ui", "nuxt-svgo"],
|
modules: [
|
||||||
|
"@nuxt/ui",
|
||||||
|
"nuxt-svgo",
|
||||||
|
"@pinia/nuxt",
|
||||||
|
],
|
||||||
runtimeConfig: {
|
runtimeConfig: {
|
||||||
public: {
|
public: {
|
||||||
apiBase: '/api',
|
apiBase: '/api',
|
||||||
|
|
|
@ -8,8 +8,10 @@
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nuxt/ui": "^2.16.0",
|
"@nuxt/ui": "^2.16.0",
|
||||||
|
"@pinia/nuxt": "^0.5.1",
|
||||||
"nuxt": "^3.11.2",
|
"nuxt": "^3.11.2",
|
||||||
"nuxt-svgo": "^4.0.1",
|
"nuxt-svgo": "^4.0.1",
|
||||||
|
"pinia": "^2.1.7",
|
||||||
"vue": "^3.4.27",
|
"vue": "^3.4.27",
|
||||||
"vue-router": "^4.3.2",
|
"vue-router": "^4.3.2",
|
||||||
"yup": "^1.4.0"
|
"yup": "^1.4.0"
|
||||||
|
@ -2553,6 +2555,18 @@
|
||||||
"node": ">=0.10"
|
"node": ">=0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@pinia/nuxt": {
|
||||||
|
"version": "0.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@pinia/nuxt/-/nuxt-0.5.1.tgz",
|
||||||
|
"integrity": "sha512-6wT6TqY81n+7/x3Yhf0yfaJVKkZU42AGqOR0T3+UvChcaOJhSma7OWPN64v+ptYlznat+fS1VTwNAcbi2lzHnw==",
|
||||||
|
"dependencies": {
|
||||||
|
"@nuxt/kit": "^3.5.0",
|
||||||
|
"pinia": ">=2.1.7"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/posva"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@pkgjs/parseargs": {
|
"node_modules/@pkgjs/parseargs": {
|
||||||
"version": "0.11.0",
|
"version": "0.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
|
||||||
|
@ -8863,6 +8877,56 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/pinia": {
|
||||||
|
"version": "2.1.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz",
|
||||||
|
"integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@vue/devtools-api": "^6.5.0",
|
||||||
|
"vue-demi": ">=0.14.5"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/posva"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@vue/composition-api": "^1.4.0",
|
||||||
|
"typescript": ">=4.4.4",
|
||||||
|
"vue": "^2.6.14 || ^3.3.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@vue/composition-api": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"typescript": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/pinia/node_modules/vue-demi": {
|
||||||
|
"version": "0.14.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
|
||||||
|
"integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"bin": {
|
||||||
|
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||||
|
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/antfu"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@vue/composition-api": "^1.0.0-rc.1",
|
||||||
|
"vue": "^3.0.0-0 || ^2.6.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@vue/composition-api": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/pirates": {
|
"node_modules/pirates": {
|
||||||
"version": "4.0.6",
|
"version": "4.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
|
||||||
|
@ -12119,9 +12183,9 @@
|
||||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||||
},
|
},
|
||||||
"node_modules/ws": {
|
"node_modules/ws": {
|
||||||
"version": "8.17.0",
|
"version": "8.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
|
||||||
"integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==",
|
"integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
},
|
},
|
||||||
|
|
|
@ -11,8 +11,10 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nuxt/ui": "^2.16.0",
|
"@nuxt/ui": "^2.16.0",
|
||||||
|
"@pinia/nuxt": "^0.5.1",
|
||||||
"nuxt": "^3.11.2",
|
"nuxt": "^3.11.2",
|
||||||
"nuxt-svgo": "^4.0.1",
|
"nuxt-svgo": "^4.0.1",
|
||||||
|
"pinia": "^2.1.7",
|
||||||
"vue": "^3.4.27",
|
"vue": "^3.4.27",
|
||||||
"vue-router": "^4.3.2",
|
"vue-router": "^4.3.2",
|
||||||
"yup": "^1.4.0"
|
"yup": "^1.4.0"
|
||||||
|
|
|
@ -1,11 +1,7 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { apiBase } from '~/helpers';
|
|
||||||
const headers = new Headers();
|
|
||||||
headers.append("Content-Type", "application/json");
|
|
||||||
|
|
||||||
const items = ref()
|
const items = ref()
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
const items_data = await $fetch<ApiTypeTmc>(`${apiBase}/tgbot/`, { headers })
|
const items_data = await apiCall<ApiPaged<TgItem>>(`tgbot/`)
|
||||||
items.value = items_data.results
|
items.value = items_data.results
|
||||||
})
|
})
|
||||||
const columns = [
|
const columns = [
|
||||||
|
@ -30,23 +26,28 @@ const columns = [
|
||||||
]
|
]
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<UTable :rows="items" :columns="columns">
|
<div class="col-span-12 page-header">
|
||||||
<template #date-data="{ row }">
|
<h1>Проведенные инвентаризации</h1>
|
||||||
Создано: {{ new Date(row.created_at).toLocaleString('ru-RU') }}<br />
|
</div>
|
||||||
Обновлено: {{ new Date(row.updated_at).toLocaleString('ru-RU') }}
|
<div class="col-span-12">
|
||||||
</template>
|
<UTable :rows="items" :columns="columns">
|
||||||
<template #tmc-data="{ row }">
|
<template #date-data="{ row }">
|
||||||
<template v-for="item in row.tmc">
|
Создано: {{ new Date(row.created_at).toLocaleString('ru-RU') }}<br />
|
||||||
<strong>{{ item.tmc.name }}</strong>
|
Обновлено: {{ new Date(row.updated_at).toLocaleString('ru-RU') }}
|
||||||
<ul>
|
|
||||||
<li v-for="el in item.field">
|
|
||||||
{{ el.field.name }}
|
|
||||||
<GetImage :file_id="el.id" />
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</template>
|
</template>
|
||||||
</template>
|
<template #tmc-data="{ row }">
|
||||||
</UTable>
|
<template v-for="item in row.tmc">
|
||||||
|
<strong>{{ item.tmc.name }}</strong>
|
||||||
|
<ul>
|
||||||
|
<li v-for="el in item.field">
|
||||||
|
{{ el.field.name }}
|
||||||
|
<GetImage :file_id="el.id" />
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</UTable>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|
|
@ -1,22 +1,28 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { apiBase } from '~/helpers';
|
|
||||||
const headers = new Headers();
|
|
||||||
headers.append("Content-Type", "application/json");
|
|
||||||
|
|
||||||
const items = ref()
|
const items = ref()
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
const items_data = await $fetch<ApiTypeTmc>(`${apiBase}/tmc/items/`, { headers })
|
const items_data = await apiCall<ApiPaged<TmcItem>>(`tmc/items/`)
|
||||||
items.value = items_data.results
|
items.value = items_data.results
|
||||||
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<template v-for="item in items">
|
<div class="grid grid-cols-12 gap-4">
|
||||||
<h2>{{ item.name }}</h2>
|
<div class="col-span-12 page-header">
|
||||||
<ul>
|
<h1>Список шаблонов ТМЦ</h1>
|
||||||
<li v-for="child in item.fields">
|
</div>
|
||||||
{{ child.name }}
|
<UCard v-for="item in items" class="col-span-3">
|
||||||
</li>
|
<template #header>
|
||||||
</ul>
|
<div class="prose dark:prose-invert">
|
||||||
</template>
|
<h4>{{ item.name }}</h4>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div class="prose dark:prose-invert text-sm">
|
||||||
|
<p v-for="child in item.fields">
|
||||||
|
<strong>{{ child.name }}</strong><br/>
|
||||||
|
{{ child.comment }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</UCard>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
|
@ -0,0 +1,21 @@
|
||||||
|
interface imagesList {
|
||||||
|
[key: string]: {
|
||||||
|
status: 'idle' | 'pending' | 'success' | 'error',
|
||||||
|
result?: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export const useImagesStore = defineStore('images', {
|
||||||
|
state: () => ({ list: {} as imagesList }),
|
||||||
|
actions: {
|
||||||
|
getImage(name: string) {
|
||||||
|
if (this.list[name]) {
|
||||||
|
return this.list[name].result
|
||||||
|
} else {
|
||||||
|
this.list[name] = {
|
||||||
|
status: 'idle',
|
||||||
|
result: 'https://media.istockphoto.com/id/1490517357/photo/scientists-are-researching-and-analyzing-harmful-contaminants-in-the-laboratory.webp?s=170667a&w=0&k=20&c=Fh4t-P_b-a1QxwyBUzUa0AuLp8FLNyLy4hl4HUm82Ao='
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
|
@ -42,6 +42,13 @@ declare global {
|
||||||
tmc: number[]
|
tmc: number[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ApiPaged<T> = {
|
||||||
|
count: number;
|
||||||
|
next?: any;
|
||||||
|
previous?: any;
|
||||||
|
results: T[]
|
||||||
|
};
|
||||||
|
|
||||||
type ApiTypeTmc = {
|
type ApiTypeTmc = {
|
||||||
count: number;
|
count: number;
|
||||||
next?: any;
|
next?: any;
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
import { apiBase } from '~/helpers';
|
||||||
|
|
||||||
|
export default async function<T> (path: string) {
|
||||||
|
const headers = new Headers();
|
||||||
|
headers.append("Content-Type", "application/json");
|
||||||
|
return await $fetch<T>(`${apiBase}/${path}`, { headers })
|
||||||
|
}
|
Loading…
Reference in New Issue