feat(app && tests): refactor
This commit is contained in:
parent
49626cb681
commit
6e6e5311b0
@ -5,6 +5,9 @@ module.exports = {
|
|||||||
],
|
],
|
||||||
rules: {
|
rules: {
|
||||||
"no-multiple-empty-lines": ["error", {max: 2, "maxBOF": 0}],
|
"no-multiple-empty-lines": ["error", {max: 2, "maxBOF": 0}],
|
||||||
|
"vue/component-tags-order": ["error", {
|
||||||
|
"order": [ "script", "template", "style"]
|
||||||
|
}],
|
||||||
"vue/order-in-components": "error",
|
"vue/order-in-components": "error",
|
||||||
"indent": ["error", 2],
|
"indent": ["error", 2],
|
||||||
"no-mixed-spaces-and-tabs": "error",
|
"no-mixed-spaces-and-tabs": "error",
|
||||||
|
|||||||
@ -22,6 +22,18 @@ prehook:
|
|||||||
@chmod +x $(HOOK_PATH)
|
@chmod +x $(HOOK_PATH)
|
||||||
@echo "Pre-push hook set successfully."
|
@echo "Pre-push hook set successfully."
|
||||||
|
|
||||||
|
add:
|
||||||
|
ifeq ($(pack),)
|
||||||
|
$(error mn is not set)
|
||||||
|
endif
|
||||||
|
yarn add "../repo/${pack}/"
|
||||||
|
|
||||||
|
packs_list:
|
||||||
|
cd .. && make packs_list
|
||||||
|
|
||||||
|
list_packs:
|
||||||
|
make packs_list
|
||||||
|
|
||||||
push:
|
push:
|
||||||
ifeq ($(commit),)
|
ifeq ($(commit),)
|
||||||
$(error mn is not set)
|
$(error mn is not set)
|
||||||
|
|||||||
@ -15,7 +15,9 @@
|
|||||||
"lint_fix": "eslint --ext .js, **/*.vue --fix"
|
"lint_fix": "eslint --ext .js, **/*.vue --fix"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"0-tools-eslint": "../repo/0-tools-eslint/",
|
||||||
"1-toolkits-helpers": "../repo/1-toolkits-helpers/",
|
"1-toolkits-helpers": "../repo/1-toolkits-helpers/",
|
||||||
|
"3-class-complex-assistants": "../repo/3-class-complex-assistants/",
|
||||||
"D": "^1.0.0",
|
"D": "^1.0.0",
|
||||||
"axios": "^1.6.2",
|
"axios": "^1.6.2",
|
||||||
"echarts": "^5.4.3",
|
"echarts": "^5.4.3",
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
<script>
|
<script>
|
||||||
import {mapGetters, mapMutations} from 'vuex'
|
import {mapGetters, mapMutations} from 'vuex'
|
||||||
import MenuContainer from "@frames/Menu/MenuContainer.vue"
|
import AppContainer from "@frames/AppContainer/AppContainer.vue"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'App',
|
||||||
components: {
|
components: {
|
||||||
MenuContainer
|
AppContainer
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {}
|
return {}
|
||||||
@ -40,9 +40,9 @@ export default {
|
|||||||
v-if="innerPage"
|
v-if="innerPage"
|
||||||
class="flex min-h-[100vh]"
|
class="flex min-h-[100vh]"
|
||||||
>
|
>
|
||||||
<MenuContainer>
|
<AppContainer>
|
||||||
<router-view />
|
<router-view />
|
||||||
</MenuContainer>
|
</AppContainer>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="outerPage"
|
v-if="outerPage"
|
||||||
|
|||||||
@ -1,53 +0,0 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Modal from '@molecules/Modal/index.vue'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Accordion',
|
|
||||||
components: {
|
|
||||||
Modal,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
isOpen: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
id: {
|
|
||||||
type: String,
|
|
||||||
default: ""
|
|
||||||
},
|
|
||||||
},
|
|
||||||
setup(props, {slots}) {
|
|
||||||
const hasHeader = slots.header != undefined
|
|
||||||
const hasBody = slots.body != undefined
|
|
||||||
return {
|
|
||||||
hasHeader,
|
|
||||||
hasBody
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="relative w-full">
|
|
||||||
<input type="checkbox" :id="id" value="" :checked="isOpen" class="hidden peer" required="">
|
|
||||||
<label :for="id" class="inline-flex items-center justify-between w-full px-5 h-[50px] text-gray-600 bg-white border border-gray-200 rounded-lg cursor-pointer dark:hover:text-gray-300 dark:border-gray-700 peer-checked:border-slate-300 peer-checked:rounded-b-none peer-checked:border-slate-200 hover:text-gray-600 dark:peer-checked:text-gray-300 peer-checked:text-gray-600 hover:bg-gray-50 dark:text-gray-400 dark:bg-gray-800 transition-all">
|
|
||||||
<div v-if="hasHeader"><slot name="header" /></div>
|
|
||||||
</label>
|
|
||||||
<i class="ri-arrow-down-s-line absolute right-[10px] top-[15px] peer-checked:rotate-180 transition-all pointer-events-none"></i>
|
|
||||||
<div v-if="hasBody" class="hidden peer-checked:block transition-all w-full px-5 py-4 text-gray-600 bg-white border border-gray-200 rounded-b-lg cursor-default">
|
|
||||||
<slot name="body" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
</style>
|
|
||||||
@ -1,3 +1,20 @@
|
|||||||
|
<script>
|
||||||
|
import {FwbButton} from "flowbite-vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
FwbButton
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
onClick: {
|
||||||
|
type: Function,
|
||||||
|
default: () => {
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<fwb-button
|
<fwb-button
|
||||||
color="dark"
|
color="dark"
|
||||||
@ -40,20 +57,3 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</fwb-button>
|
</fwb-button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
|
||||||
import {FwbButton} from "flowbite-vue";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
FwbButton
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
onClick: {
|
|
||||||
type: Function,
|
|
||||||
default: () => {
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@ -1,3 +1,20 @@
|
|||||||
|
<script>
|
||||||
|
import {FwbButton} from "flowbite-vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
FwbButton
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
onClick: {
|
||||||
|
type: Function,
|
||||||
|
default: () => {
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<fwb-button
|
<fwb-button
|
||||||
color="dark"
|
color="dark"
|
||||||
@ -22,20 +39,3 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</fwb-button>
|
</fwb-button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
|
||||||
import {FwbButton} from "flowbite-vue";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
FwbButton
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
onClick: {
|
|
||||||
type: Function,
|
|
||||||
default: () => {
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@ -1,3 +1,20 @@
|
|||||||
|
<script>
|
||||||
|
import {FwbButton} from "flowbite-vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
FwbButton
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
onClick: {
|
||||||
|
type: Function,
|
||||||
|
default: () => {
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<fwb-button
|
<fwb-button
|
||||||
color="dark"
|
color="dark"
|
||||||
@ -23,20 +40,3 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</fwb-button>
|
</fwb-button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
|
||||||
import {FwbButton} from "flowbite-vue";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
FwbButton
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
onClick: {
|
|
||||||
type: Function,
|
|
||||||
default: () => {
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@ -1,13 +1,9 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// import Button from "@/components/1_atoms/Button.vue";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DoubleSwitch',
|
name: 'DoubleSwitch',
|
||||||
components: {
|
|
||||||
// Button,
|
|
||||||
},
|
|
||||||
props: {
|
props: {
|
||||||
machine: {
|
machine: {
|
||||||
type: Object,
|
type: Object,
|
||||||
@ -30,32 +26,18 @@ export default {
|
|||||||
default: ''
|
default: ''
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
// isChecked: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
|
|
||||||
},
|
},
|
||||||
inject: ['isChecked'],
|
inject: ['isChecked'],
|
||||||
// watch: {
|
|
||||||
// isChecked: {
|
|
||||||
// handler(newValue, oldValue) {
|
|
||||||
// this.$emit('switched', newValue)
|
|
||||||
// },
|
|
||||||
// deep: true
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
emits: ['switched'],
|
emits: ['switched'],
|
||||||
methods: {
|
methods: {
|
||||||
buttonClass: function(value) {
|
buttonClass: function(value) {
|
||||||
return `border border-slate-400 flex items-center justify-center cursor-pointer rounded transition-all text-xs text-center py-[5px] px-2 ${value}`
|
return `border border-slate-400 flex items-center justify-center cursor-pointer rounded transition-all text-xs text-center py-[5px] px-2 ${value}`
|
||||||
},
|
},
|
||||||
setChecked(e) {
|
setChecked(e) {
|
||||||
// this.isChecked = e.target.checked
|
|
||||||
this.$emit('switched', e.target.checked)
|
this.$emit('switched', e.target.checked)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -63,7 +45,6 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@ -76,7 +57,9 @@ export default {
|
|||||||
@change="setChecked"
|
@change="setChecked"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div :class="`w-11 h-6 rounded-full peer peer-focus:ring-4 peer-focus:ring-${secondColor}-300 dark:peer-focus:ring-${secondColor}-800 dark:bg-${firstColor}-700 peer-checked/checkbox:after:translate-x-full peer-checked/checkbox:after:border-white after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:border-${firstColor}-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-${firstColor}-600`" :style="{background: !isChecked ? firstColor : secondColor}"></div>
|
<div
|
||||||
|
:class="`w-11 h-6 rounded-full peer peer-focus:ring-4 peer-focus:ring-${secondColor}-300 dark:peer-focus:ring-${secondColor}-800 dark:bg-${firstColor}-700 peer-checked/checkbox:after:translate-x-full peer-checked/checkbox:after:border-white after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:border-${firstColor}-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-${firstColor}-600`"
|
||||||
|
:style="{background: !isChecked ? firstColor : secondColor}"></div>
|
||||||
<span class="block peer-checked/checkbox:hidden ml-2 text-sm font-medium text-gray-900 dark:text-gray-300"> {{ firstTitle }}</span>
|
<span class="block peer-checked/checkbox:hidden ml-2 text-sm font-medium text-gray-900 dark:text-gray-300"> {{ firstTitle }}</span>
|
||||||
<span class="hidden peer-checked/checkbox:block ml-2 text-sm font-medium text-gray-900 dark:text-gray-300"> {{ secondTitle }} </span>
|
<span class="hidden peer-checked/checkbox:block ml-2 text-sm font-medium text-gray-900 dark:text-gray-300"> {{ secondTitle }} </span>
|
||||||
</label>
|
</label>
|
||||||
|
|||||||
58
live_monitor_vue/src/components/1_atoms/VAccordion.vue
Normal file
58
live_monitor_vue/src/components/1_atoms/VAccordion.vue
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<script>
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'VAccordion',
|
||||||
|
props: {
|
||||||
|
isOpen: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
id: {
|
||||||
|
type: String,
|
||||||
|
default: ""
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props, {slots}) {
|
||||||
|
const hasHeader = slots.header !== undefined
|
||||||
|
const hasBody = slots.body !== undefined
|
||||||
|
return {
|
||||||
|
hasHeader,
|
||||||
|
hasBody
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="relative w-full">
|
||||||
|
<input
|
||||||
|
:id="id"
|
||||||
|
type="checkbox"
|
||||||
|
value=""
|
||||||
|
:checked="isOpen"
|
||||||
|
class="hidden peer"
|
||||||
|
required=""
|
||||||
|
>
|
||||||
|
<label
|
||||||
|
:for="id"
|
||||||
|
class="inline-flex items-center justify-between w-full px-5 h-[50px] text-gray-600 bg-white border border-gray-200 rounded-lg cursor-pointer dark:hover:text-gray-300 dark:border-gray-700 peer-checked:rounded-b-none peer-checked:border-slate-200 hover:text-gray-600 dark:peer-checked:text-gray-300 peer-checked:text-gray-600 hover:bg-gray-50 dark:text-gray-400 dark:bg-gray-800 transition-all"
|
||||||
|
>
|
||||||
|
<div v-if="hasHeader"><slot name="header" /></div>
|
||||||
|
</label>
|
||||||
|
<i class="ri-arrow-down-s-line absolute right-[10px] top-[15px] peer-checked:rotate-180 transition-all pointer-events-none" />
|
||||||
|
<div
|
||||||
|
v-if="hasBody"
|
||||||
|
class="hidden peer-checked:block transition-all w-full px-5 py-4 text-gray-600 bg-white border border-gray-200 rounded-b-lg cursor-default"
|
||||||
|
>
|
||||||
|
<slot name="body" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
</style>
|
||||||
@ -1,18 +1,7 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<button @click="setSelected()" :type="type" :class="classBtn" class="w-full relative col-span-4 md:col-span-2 items-center justify-center text-center border-solid border-blue-1 z-10 cursor-pointer">
|
|
||||||
<i v-if="classIcon" :class="classIcon" class="text-blue-1"></i>
|
|
||||||
{{ title }}
|
|
||||||
</button>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
name: "VButton",
|
||||||
|
|
||||||
},
|
|
||||||
props: {
|
props: {
|
||||||
onClick: {
|
onClick: {
|
||||||
type: Function,
|
type: Function,
|
||||||
@ -51,3 +40,19 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<button
|
||||||
|
:type="type"
|
||||||
|
:class="classBtn"
|
||||||
|
class="w-full relative col-span-4 md:col-span-2 items-center justify-center text-center border-solid border-blue-1 z-10 cursor-pointer"
|
||||||
|
@click="setSelected()"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
v-if="classIcon"
|
||||||
|
:class="classIcon"
|
||||||
|
class="text-blue-1"
|
||||||
|
/>
|
||||||
|
{{ title }}
|
||||||
|
</button>
|
||||||
|
</template>
|
||||||
@ -1,6 +1,5 @@
|
|||||||
<!-- eslint-disable vue/prop-name-casing -->
|
|
||||||
<script>
|
<script>
|
||||||
import Modal from '../Modal/index.vue'
|
import Modal from '../VModal/VModal.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'ButtonModal',
|
name: 'ButtonModal',
|
||||||
|
|||||||
@ -1,112 +0,0 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { toRefs } from 'vue'
|
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex";
|
|
||||||
import Button from "@/components/1_atoms/Button.vue";
|
|
||||||
import ECharts from '@store/hooks/Echarts';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Chart',
|
|
||||||
components: {
|
|
||||||
Button,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
data: {
|
|
||||||
type: Object,
|
|
||||||
default: () => {}
|
|
||||||
},
|
|
||||||
sizes: {
|
|
||||||
type: Object,
|
|
||||||
default: () => {}
|
|
||||||
},
|
|
||||||
id: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
type: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
maxWidth: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
maxHeight: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
chartStyles: {
|
|
||||||
maxWidth: `${this.maxWidth}`,
|
|
||||||
maxHeight: `${this.maxHeight}`,
|
|
||||||
top: '15px;',
|
|
||||||
padding: '10px',
|
|
||||||
margin: '10px',
|
|
||||||
boxShadow: 'rgb(0 0 0 / 12%) 2px 3px 7px',
|
|
||||||
border: '1px solid rgba(0, 0, 0, 0.15)',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
setup(props) {
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
// ...mapGetters('main', ['activeChartData', 'prevGroupByData', 'activeMenuChartData']),
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
this.$nextTick(function () {
|
|
||||||
const chart = new ECharts(this.id, this.sizes)
|
|
||||||
this.setTypeFunc(this.type, chart, this.data)
|
|
||||||
chart.onClickedBarCharts(this.updateCharts)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
updated () {
|
|
||||||
this.$nextTick(function () {
|
|
||||||
const chart = new ECharts(this.id, this.sizes)
|
|
||||||
this.setTypeFunc(this.type, chart, this.data)
|
|
||||||
chart.onClickedBarCharts(this.updateCharts)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
...mapActions('machines', ['updateCharts']),
|
|
||||||
buttonClass: function(value) {
|
|
||||||
return `border border-slate-400 flex items-center justify-center cursor-pointer rounded transition-all text-xs text-center py-[5px] px-2 ${value}`
|
|
||||||
},
|
|
||||||
setTypeFunc: function(type, chart, data) {
|
|
||||||
switch(type) {
|
|
||||||
case 'pie': return chart.makePieCharts({...data, type: type})
|
|
||||||
case 'mount': return chart.makeBarMountCharts({...data, type: type, height: this.height})
|
|
||||||
case 'mainMl': return chart.makeBarCharts({...data, type: type})
|
|
||||||
case 'default': return chart.makeBarTypesCharts({...data, type: type})
|
|
||||||
case 'types': return chart.makeBarTypesCharts({...data, type: type})
|
|
||||||
case 'without_first_layout': return chart.makeBarTypesCharts({...data, type: type})
|
|
||||||
case 'ml': return chart.makeBarTypesCharts({...data, type: type})
|
|
||||||
case 'packLines': return chart.makeLinesPackCharts({...data, type: type})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div :id="id" class="flex grow justify-center relative overflow-hidden bg-white" :style="chartStyles">
|
|
||||||
</div>
|
|
||||||
<div id="button_close" class="flex absolute h-max top-[50px] right-[45px]">
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
</style>
|
|
||||||
@ -10,12 +10,13 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import ButtonModal from '@molecules/ButtonModal/ButtonModal.vue'
|
import ButtonModal from '@molecules/ButtonModal/ButtonModal.vue'
|
||||||
import Tabulator from "@molecules/Tabulator/index.vue"
|
import Tabulator from "@molecules/VTabulator/VTabulator.vue"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'MachinesModal',
|
name: 'MachinesModal',
|
||||||
components: {ButtonModal, Tabulator},
|
components: {ButtonModal, Tabulator},
|
||||||
data() {
|
data() {
|
||||||
|
return {}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
tabulatorOptions() {
|
tabulatorOptions() {
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Modal from '@molecules/Modal/index.vue'
|
import Modal from '@molecules/VModal/VModal.vue'
|
||||||
import {CoordsMap} from './helpers'
|
import {CoordsMap} from './helpers'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -55,8 +53,6 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Modal
|
<Modal
|
||||||
v-if="open"
|
v-if="open"
|
||||||
@ -64,10 +60,9 @@ export default {
|
|||||||
:isOpen="true"
|
:isOpen="true"
|
||||||
:containerClass="containerClass"
|
:containerClass="containerClass"
|
||||||
>
|
>
|
||||||
|
<div :class="headerClass">
|
||||||
<div :class="headerClass">
|
<slot name="header" />
|
||||||
<slot name="header" />
|
</div>
|
||||||
</div>
|
|
||||||
<slot />
|
<slot />
|
||||||
</Modal>
|
</Modal>
|
||||||
</template>
|
</template>
|
||||||
@ -2,23 +2,20 @@ import Map from 'ol/Map.js';
|
|||||||
import OSM from 'ol/source/OSM.js';
|
import OSM from 'ol/source/OSM.js';
|
||||||
import TileLayer from 'ol/layer/Tile.js';
|
import TileLayer from 'ol/layer/Tile.js';
|
||||||
import View from 'ol/View.js';
|
import View from 'ol/View.js';
|
||||||
import { transform, fromLonLat, toLonLat } from "ol/proj";
|
import { fromLonLat } from "ol/proj";
|
||||||
import Point from "ol/geom/Point";
|
import Point from "ol/geom/Point";
|
||||||
import {Fill, Stroke, Style, Text, Icon} from 'ol/style.js';
|
import {Fill, Stroke, Style, Text, Icon} from 'ol/style.js';
|
||||||
import { Vector as VectorLayer } from "ol/layer";
|
import { Vector as VectorLayer } from "ol/layer";
|
||||||
import { Vector as VectorSource } from "ol/source";
|
import { Vector as VectorSource } from "ol/source";
|
||||||
import Feature from "ol/Feature";
|
import Feature from "ol/Feature";
|
||||||
import Overlay from "ol/Overlay";
|
import Overlay from "ol/Overlay";
|
||||||
import {toStringHDMS} from 'ol/coordinate.js';
|
|
||||||
|
|
||||||
const svg = (color = "black", course) => {
|
const svg = () => {
|
||||||
const screen_width = document.documentElement.clientWidth;
|
const screen_width = document.documentElement.clientWidth;
|
||||||
|
|
||||||
let svg_width = 25;
|
let svg_width = 25;
|
||||||
let svg_height = 45;
|
let svg_height = 45;
|
||||||
|
|
||||||
let text_size = "30px";
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
|
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
|
||||||
navigator.userAgent
|
navigator.userAgent
|
||||||
@ -35,24 +32,24 @@ const svg = (color = "black", course) => {
|
|||||||
const createMap = (elId, zoom, coordinates = [37.619829, 55.752603]) => {
|
const createMap = (elId, zoom, coordinates = [37.619829, 55.752603]) => {
|
||||||
return new Map(
|
return new Map(
|
||||||
{
|
{
|
||||||
target: elId,
|
target: elId,
|
||||||
layers: [
|
layers: [
|
||||||
new TileLayer({
|
new TileLayer({
|
||||||
source: new OSM(),
|
source: new OSM(),
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
view: new View({
|
view: new View({
|
||||||
projection: "EPSG:3857",
|
projection: "EPSG:3857",
|
||||||
center: fromLonLat(coordinates),
|
center: fromLonLat(coordinates),
|
||||||
zoom: zoom,
|
zoom: zoom,
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapFeature = (coord) => {
|
const mapFeature = (coordinate) => {
|
||||||
return new Feature({
|
return new Feature({
|
||||||
geometry: new Point(coord).transform("EPSG:4326", "EPSG:900913"),
|
geometry: new Point(coordinate).transform("EPSG:4326", "EPSG:900913"),
|
||||||
projection: "EPSG:4326",
|
projection: "EPSG:4326",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -88,7 +85,7 @@ const iconStyle = (color, text, course = null) =>
|
|||||||
color: 'white',
|
color: 'white',
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
const labelStyle = (text) => new Style({
|
const labelStyle = (text) => new Style({
|
||||||
text: new Text({
|
text: new Text({
|
||||||
@ -102,17 +99,17 @@ const labelStyle = (text) => new Style({
|
|||||||
|
|
||||||
const addLayerIcon = (map, coordinates, text) => {
|
const addLayerIcon = (map, coordinates, text) => {
|
||||||
return map.addLayer(
|
return map.addLayer(
|
||||||
new VectorLayer({
|
new VectorLayer({
|
||||||
type: "vector_layer",
|
type: "vector_layer",
|
||||||
source: new VectorSource({
|
source: new VectorSource({
|
||||||
features: [iconFeature(coordinates)],
|
features: [iconFeature(coordinates)],
|
||||||
}),
|
}),
|
||||||
style: [
|
style: [
|
||||||
iconStyle("green", text),
|
iconStyle("green", text),
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const addLayer = (map, coordinates, text) => {
|
const addLayer = (map, coordinates, text) => {
|
||||||
return map.addLayer(
|
return map.addLayer(
|
||||||
@ -139,12 +136,12 @@ const setView = (map, zoom, coordinates) => {
|
|||||||
const addLayerWithEmptyCoords = (map, labelText) => {
|
const addLayerWithEmptyCoords = (map, labelText) => {
|
||||||
return map.addLayer(
|
return map.addLayer(
|
||||||
new VectorLayer({
|
new VectorLayer({
|
||||||
type: "vector_layer",
|
type: "vector_layer",
|
||||||
background: 'rgba(0,0,0,0.7)',
|
background: 'rgba(0,0,0,0.7)',
|
||||||
source: new VectorSource({
|
source: new VectorSource({
|
||||||
features: [mapFeature([37.619829, 55.752603])]
|
features: [mapFeature([37.619829, 55.752603])]
|
||||||
}),
|
}),
|
||||||
style: [labelStyle(labelText)]
|
style: [labelStyle(labelText)]
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -168,11 +165,11 @@ const setTooltip = (map, coordinates, machine, tooltip_id, content_id, closer_id
|
|||||||
map.addOverlay(tooltip)
|
map.addOverlay(tooltip)
|
||||||
|
|
||||||
const tooltipContent = new Overlay({
|
const tooltipContent = new Overlay({
|
||||||
position: coordinates,
|
position: coordinates,
|
||||||
positioning: 'center-center',
|
positioning: 'center-center',
|
||||||
element: contentSelector,
|
element: contentSelector,
|
||||||
stopEvent: false,
|
stopEvent: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
map.addOverlay(tooltipContent)
|
map.addOverlay(tooltipContent)
|
||||||
|
|
||||||
@ -208,10 +205,10 @@ const setTooltip = (map, coordinates, machine, tooltip_id, content_id, closer_id
|
|||||||
// const hdms = toLonLat(coordinates)
|
// const hdms = toLonLat(coordinates)
|
||||||
|
|
||||||
// setTimeout(() => {
|
// setTimeout(() => {
|
||||||
container.style.opacity = "1"
|
container.style.opacity = "1"
|
||||||
container.style.display = "flex"
|
container.style.display = "flex"
|
||||||
container.style.minWidth = "max-content"
|
container.style.minWidth = "max-content"
|
||||||
tooltipText.innerHTML = `
|
tooltipText.innerHTML = `
|
||||||
<div class="flex flex-col justify-items-center">
|
<div class="flex flex-col justify-items-center">
|
||||||
<div class="tooltip-title flex text-lg text-blue-500"> ${machine.machine_type} </div>
|
<div class="tooltip-title flex text-lg text-blue-500"> ${machine.machine_type} </div>
|
||||||
<code> ${coordinates} </code>
|
<code> ${coordinates} </code>
|
||||||
@ -223,7 +220,7 @@ const setTooltip = (map, coordinates, machine, tooltip_id, content_id, closer_id
|
|||||||
<div class="tooltip-title flex text-sm"><div class="w-20">Устройство:</div> <div>${machine.device_number}</div> </div>
|
<div class="tooltip-title flex text-sm"><div class="w-20">Устройство:</div> <div>${machine.device_number}</div> </div>
|
||||||
<a class="flex justify-center items-center bg-blue-300 hover:bg-blue-400 text-gray-800 p-1 mt-2 rounded" target="_blank" href="/html/askr_devices/analyze_comm/${machine.imei}"}">Детализация</a>
|
<a class="flex justify-center items-center bg-blue-300 hover:bg-blue-400 text-gray-800 p-1 mt-2 rounded" target="_blank" href="/html/askr_devices/analyze_comm/${machine.imei}"}">Детализация</a>
|
||||||
</div>`
|
</div>`
|
||||||
container.prepend(tooltipText)
|
container.prepend(tooltipText)
|
||||||
// }, 200)
|
// }, 200)
|
||||||
|
|
||||||
tooltip.setPosition(e.coordinate)
|
tooltip.setPosition(e.coordinate)
|
||||||
|
|||||||
102
live_monitor_vue/src/components/2_molecules/VChart/VChart.vue
Normal file
102
live_monitor_vue/src/components/2_molecules/VChart/VChart.vue
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
<script>
|
||||||
|
import {mapActions} from "vuex";
|
||||||
|
import {ECharts} from '@store/hooks/Echarts';
|
||||||
|
export default {
|
||||||
|
name: 'VChart',
|
||||||
|
props: {
|
||||||
|
data: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
},
|
||||||
|
sizes: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
},
|
||||||
|
id: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
height: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
maxWidth: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
maxHeight: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
chartStyles: {
|
||||||
|
maxWidth: `${this.maxWidth}`,
|
||||||
|
maxHeight: `${this.maxHeight}`,
|
||||||
|
top: "15px",
|
||||||
|
padding: "10px",
|
||||||
|
margin: "10px",
|
||||||
|
boxShadow: "rgb(0 0 0 / 12%) 2px 3px 7px",
|
||||||
|
border: "1px solid rgba(0, 0, 0, 0.15)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
// ...mapGetters('main', ['activeChartData', 'prevGroupByData', 'activeMenuChartData']),
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
this.$nextTick(function () {
|
||||||
|
const chart = new ECharts(this.id, this.sizes)
|
||||||
|
this.setTypeFunc(this.type, chart, this.data)
|
||||||
|
chart.onClickedBarCharts(this.updateCharts)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
updated () {
|
||||||
|
this.$nextTick(function () {
|
||||||
|
const chart = new ECharts(this.id, this.sizes)
|
||||||
|
this.setTypeFunc(this.type, chart, this.data)
|
||||||
|
chart.onClickedBarCharts(this.updateCharts)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
...mapActions('layoutMachines', ['updateCharts']),
|
||||||
|
setTypeFunc: function(type, chart, data) {
|
||||||
|
switch(type) {
|
||||||
|
case 'pie': return chart.makePieCharts({...data, type: type})
|
||||||
|
case 'mount': return chart.makeBarMountCharts({...data, type: type, height: this.height})
|
||||||
|
case 'mainMl': return chart.makeBarCharts({...data, type: type})
|
||||||
|
case 'default': return chart.makeBarTypesCharts({...data, type: type})
|
||||||
|
case 'types': return chart.makeBarTypesCharts({...data, type: type})
|
||||||
|
case 'without_first_layout': return chart.makeBarTypesCharts({...data, type: type})
|
||||||
|
case 'ml': return chart.makeBarTypesCharts({...data, type: type})
|
||||||
|
case 'packLines': return chart.makeLinesPackCharts({...data, type: type})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
:id="id"
|
||||||
|
class="flex grow justify-center relative overflow-hidden bg-white"
|
||||||
|
:style="chartStyles"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
id="button_close"
|
||||||
|
class="flex absolute h-max top-[50px] right-[45px]"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
</style>
|
||||||
@ -1,17 +1,9 @@
|
|||||||
<template>
|
|
||||||
<input
|
|
||||||
ref="datepicker"
|
|
||||||
type="text"
|
|
||||||
class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full py-1 pl-2 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 flatpickr-input"
|
|
||||||
>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import flatpickr from "flatpickr";
|
import flatpickr from "flatpickr";
|
||||||
import { Russian } from "flatpickr/dist/l10n/ru";
|
import { Russian } from "flatpickr/dist/l10n/ru";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Datepicker',
|
name: 'VDatepicker',
|
||||||
components: {},
|
components: {},
|
||||||
inject: ['defaultDate'],
|
inject: ['defaultDate'],
|
||||||
props: {
|
props: {
|
||||||
@ -70,3 +62,11 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<input
|
||||||
|
ref="datepicker"
|
||||||
|
type="text"
|
||||||
|
class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full py-1 pl-2 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 flatpickr-input"
|
||||||
|
>
|
||||||
|
</template>
|
||||||
@ -1,3 +1,44 @@
|
|||||||
|
<script>
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'VModal',
|
||||||
|
components: {},
|
||||||
|
props: {
|
||||||
|
isOpen: {
|
||||||
|
default: false,
|
||||||
|
type: Boolean
|
||||||
|
},
|
||||||
|
close: {
|
||||||
|
default: () => null,
|
||||||
|
type: Function
|
||||||
|
},
|
||||||
|
containerClass: {
|
||||||
|
default: "",
|
||||||
|
type: String,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
document.addEventListener("keydown", this.onEsc);
|
||||||
|
},
|
||||||
|
unmounted() {
|
||||||
|
document.removeEventListener("keydown", this.onEsc);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onEsc (e) {
|
||||||
|
if (e.key === "Escape") {
|
||||||
|
this.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
v-if="isOpen"
|
v-if="isOpen"
|
||||||
@ -8,14 +49,14 @@
|
|||||||
id="select_machines_modal"
|
id="select_machines_modal"
|
||||||
class="fixed z-[10000] inset-0"
|
class="fixed z-[10000] inset-0"
|
||||||
>
|
>
|
||||||
<!-- Modal container -->
|
<!-- VModal container -->
|
||||||
<div class="h-screen flex items-center justify-center p-4">
|
<div class="h-screen flex items-center justify-center p-4">
|
||||||
<!-- Overlay -->
|
<!-- Overlay -->
|
||||||
<div
|
<div
|
||||||
class="absolute z-0 inset-0 bg-gray-500 opacity-75"
|
class="absolute z-0 inset-0 bg-gray-500 opacity-75"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
<!-- Modal box -->
|
<!-- VModal box -->
|
||||||
<div
|
<div
|
||||||
class="relative max-h-full overflow-y-auto bg-white rounded-lg shadow-xl "
|
class="relative max-h-full overflow-y-auto bg-white rounded-lg shadow-xl "
|
||||||
role="dialog"
|
role="dialog"
|
||||||
@ -45,43 +86,3 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Modal',
|
|
||||||
components: {},
|
|
||||||
props: {
|
|
||||||
isOpen: {
|
|
||||||
default: false,
|
|
||||||
type: Boolean
|
|
||||||
},
|
|
||||||
close: {
|
|
||||||
default: () => null,
|
|
||||||
type: Function
|
|
||||||
},
|
|
||||||
containerClass: {
|
|
||||||
default: "",
|
|
||||||
type: String,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
document.addEventListener("keydown", this.onEsc);
|
|
||||||
},
|
|
||||||
unmounted() {
|
|
||||||
document.removeEventListener("keydown", this.onEsc);
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
onEsc (e) {
|
|
||||||
if (e.key === "Escape") {
|
|
||||||
this.close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
@ -11,10 +11,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import RawSpinner from './Spinner.vue'
|
import RawSpinner from './VSpinnerSvg.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Spinner',
|
name: 'VSpinner',
|
||||||
components: {RawSpinner},
|
components: {RawSpinner},
|
||||||
props: {
|
props: {
|
||||||
text: {
|
text: {
|
||||||
@ -27,6 +27,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
return {}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
},
|
},
|
||||||
@ -22,7 +22,7 @@
|
|||||||
<script>
|
<script>
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'RawSpinner',
|
name: 'VSpinnerSvg',
|
||||||
components: {},
|
components: {},
|
||||||
props: {
|
props: {
|
||||||
size: {
|
size: {
|
||||||
@ -31,6 +31,7 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
return {}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
},
|
},
|
||||||
@ -11,10 +11,10 @@ import {
|
|||||||
import localization from "./localization";
|
import localization from "./localization";
|
||||||
import { cond, equals, is, mergeAll, sort, T, mergeDeepRight } from "ramda";
|
import { cond, equals, is, mergeAll, sort, T, mergeDeepRight } from "ramda";
|
||||||
import { pipe } from "@helpers/functions";
|
import { pipe } from "@helpers/functions";
|
||||||
import Pagination from "./Pagination.vue";
|
import Pagination from "./VTabulatorPagination.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'VTabulator',
|
||||||
components: {
|
components: {
|
||||||
Pagination
|
Pagination
|
||||||
},
|
},
|
||||||
@ -1,4 +1,4 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
||||||
@ -119,7 +119,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="pagination w-full flex flex-row items-center justify-between gap-3 mt-2 mb-8 xl:mb-0 pb-8 xl:p-2.5 bg-slate-100 border-2 border-solid border-slate-300 rounded-lg flex-col 2xl:flex-row">
|
<div class="pagination w-full flex flex-row items-center justify-between gap-3 mt-2 mb-8 xl:mb-0 pb-8 xl:p-2.5 bg-slate-100 border-2 border-solid border-slate-300 rounded-lg flex-col 2xl:flex-row">
|
||||||
@ -1,4 +1,4 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
||||||
@ -43,7 +43,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
{{ console.log('selectedPackMode', selectedPackMode)
|
{{ console.log('selectedPackMode', selectedPackMode)
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
||||||
import PackViewButton from './Button.vue'
|
import PackViewButton from './Button.vue'
|
||||||
import Spinner from "@molecules/Spinner/index.vue"
|
import Spinner from "@molecules/VSpinner/VSpinner.vue"
|
||||||
import Tabulator from "@molecules/Tabulator/index.vue"
|
import Tabulator from "@molecules/VTabulator/VTabulator.vue"
|
||||||
import { isEmpty } from "ramda";
|
import { isEmpty } from "ramda";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -65,7 +65,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="w-full relative">
|
<div class="w-full relative">
|
||||||
|
|||||||
@ -1,19 +1,21 @@
|
|||||||
<script>
|
<script>
|
||||||
import MenuList from './MenuList.vue'
|
import MenuList from './MenuList.vue'
|
||||||
import MobileMenu from './MobileMenu.vue'
|
import MobileMenu from './MobileMenu.vue'
|
||||||
import LeftPanel from './LeftPanel.vue'
|
import LeftPanel from './AppContainerLeftPanel.vue'
|
||||||
import Breadcrumbs from './Breadcrumbs.vue'
|
import Breadcrumbs from './AppContainerBreadcrumbs.vue'
|
||||||
import RightPanel from './RightPanel.vue'
|
import RightPanel from './RightPanel.vue'
|
||||||
|
import AppContainerHeader from './AppContainerHeader.vue'
|
||||||
import {mapGetters} from 'vuex'
|
import {mapGetters} from 'vuex'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'MenuContainer',
|
name: 'AppContainer',
|
||||||
components: {
|
components: {
|
||||||
MobileMenu,
|
MobileMenu,
|
||||||
MenuList,
|
MenuList,
|
||||||
LeftPanel,
|
LeftPanel,
|
||||||
Breadcrumbs,
|
Breadcrumbs,
|
||||||
RightPanel
|
RightPanel,
|
||||||
|
AppContainerHeader
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
},
|
},
|
||||||
@ -40,7 +42,7 @@ export default {
|
|||||||
current_user=""
|
current_user=""
|
||||||
:menu_list="menuList"
|
:menu_list="menuList"
|
||||||
/>
|
/>
|
||||||
<div class="w-full">
|
<AppContainerHeader>
|
||||||
<div class="flex justify-between items-center">
|
<div class="flex justify-between items-center">
|
||||||
<LeftPanel />
|
<LeftPanel />
|
||||||
<Breadcrumbs
|
<Breadcrumbs
|
||||||
@ -54,7 +56,7 @@ export default {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="sm:hidden flex items-center justify-between" />
|
<div class="sm:hidden flex items-center justify-between" />
|
||||||
</div>
|
</AppContainerHeader>
|
||||||
</div>
|
</div>
|
||||||
<!-- END: TOP BAR -->
|
<!-- END: TOP BAR -->
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
<script>
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "AppContainerHeader",
|
||||||
|
props: {
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {}
|
||||||
|
},
|
||||||
|
computed: {},
|
||||||
|
methods: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="w-full">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@ -1,7 +1,7 @@
|
|||||||
<script>
|
<script>
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'LeftPanel',
|
name: 'AppContainerLeftPanel',
|
||||||
components: {},
|
components: {},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@ -45,7 +45,7 @@ export default {
|
|||||||
linkClass() {
|
linkClass() {
|
||||||
const menuRouterName = this.menu_item.router || ""
|
const menuRouterName = this.menu_item.router || ""
|
||||||
if (menuRouterName === this.routeName)
|
if (menuRouterName === this.routeName)
|
||||||
return `${this._base_class} ${this._base_class}--active`
|
return `${this._base_class} ${this._base_class}--active`
|
||||||
return this._base_class
|
return this._base_class
|
||||||
},
|
},
|
||||||
_type() {
|
_type() {
|
||||||
@ -129,7 +129,7 @@ export default {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- BEGIN: Account Menu -->
|
<!-- BEGIN: Account AppContainer -->
|
||||||
<div class="intro-x dropdown w-[50px] h-[50px] px-3 flex justify-center items-center">
|
<div class="intro-x dropdown w-[50px] h-[50px] px-3 flex justify-center items-center">
|
||||||
<div
|
<div
|
||||||
class="dropdown-toggle rounded-full overflow-hidden shadow-lg image-fit zoom-in scale-110"
|
class="dropdown-toggle rounded-full overflow-hidden shadow-lg image-fit zoom-in scale-110"
|
||||||
@ -169,6 +169,6 @@ export default {
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- END: Account Menu -->
|
<!-- END: Account AppContainer -->
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -1,10 +0,0 @@
|
|||||||
<script setup>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="w-full pl-2 flex items-center h-[40px] border-b border-slate-200">
|
|
||||||
<div>
|
|
||||||
Hi!
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
123
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'App',
|
|
||||||
components: {},
|
|
||||||
data() {
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
@ -1,139 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div
|
|
||||||
class="h-[100vh] z-40 bg-white flex flex-col px-4 pt-8 border-r border-slate-200 transition-all"
|
|
||||||
:class="{'w-[300px]': isOpenMenu, 'w-[70px]': !isOpenMenu}"
|
|
||||||
>
|
|
||||||
<div class="pl-1 flex items-center mb-8 justify-between">
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
aria-hidden="true"
|
|
||||||
role="img"
|
|
||||||
class="iconify iconify--logos"
|
|
||||||
width="31.88"
|
|
||||||
height="32"
|
|
||||||
preserveAspectRatio="xMidYMid meet"
|
|
||||||
viewBox="0 0 256 257"
|
|
||||||
>
|
|
||||||
<defs><linearGradient
|
|
||||||
id="IconifyId1813088fe1fbc01fb466"
|
|
||||||
x1="-.828%"
|
|
||||||
x2="57.636%"
|
|
||||||
y1="7.652%"
|
|
||||||
y2="78.411%"
|
|
||||||
><stop
|
|
||||||
offset="0%"
|
|
||||||
stop-color="#41D1FF"
|
|
||||||
/><stop
|
|
||||||
offset="100%"
|
|
||||||
stop-color="#BD34FE"
|
|
||||||
/></linearGradient><linearGradient
|
|
||||||
id="IconifyId1813088fe1fbc01fb467"
|
|
||||||
x1="43.376%"
|
|
||||||
x2="50.316%"
|
|
||||||
y1="2.242%"
|
|
||||||
y2="89.03%"
|
|
||||||
><stop
|
|
||||||
offset="0%"
|
|
||||||
stop-color="#FFEA83"
|
|
||||||
/><stop
|
|
||||||
offset="8.333%"
|
|
||||||
stop-color="#FFDD35"
|
|
||||||
/><stop
|
|
||||||
offset="100%"
|
|
||||||
stop-color="#FFA800"
|
|
||||||
/></linearGradient></defs><path
|
|
||||||
fill="url(#IconifyId1813088fe1fbc01fb466)"
|
|
||||||
d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"
|
|
||||||
/><path
|
|
||||||
fill="url(#IconifyId1813088fe1fbc01fb467)"
|
|
||||||
d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
<div
|
|
||||||
class="p-1 px-2 rounded-md transition-all cursor-pointer hover:bg-gray-200"
|
|
||||||
:class="{'rotate-90': !isOpenMenu, '-rotate-90': isOpenMenu}"
|
|
||||||
@click="toggleMenu"
|
|
||||||
>
|
|
||||||
<i class="ri-upload-line" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-col">
|
|
||||||
<div
|
|
||||||
v-for="{title, icon, link, type, name} in menu"
|
|
||||||
:key="`${title}${name}`"
|
|
||||||
>
|
|
||||||
<router-link
|
|
||||||
v-if="type === 'link'"
|
|
||||||
class="flex p-2 rounded-md hover:bg-gray-100 flex items-center"
|
|
||||||
:class="{'bg-gray-200': pageName === name}"
|
|
||||||
:to="link"
|
|
||||||
>
|
|
||||||
<i :class="`ri-${icon} text-slate-600 mr-2 `" />
|
|
||||||
<span
|
|
||||||
v-if="isOpenMenu"
|
|
||||||
class="text-slate-700"
|
|
||||||
>{{ title }}</span>
|
|
||||||
</router-link>
|
|
||||||
<div
|
|
||||||
v-if="type === 'line'"
|
|
||||||
class="border-b my-4 border-slate-200"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import {mapGetters, mapMutations} from "vuex";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'App',
|
|
||||||
components: {},
|
|
||||||
data() {
|
|
||||||
const menu = [
|
|
||||||
{
|
|
||||||
title: "Главная",
|
|
||||||
icon: "home-4-line",
|
|
||||||
link: "/",
|
|
||||||
type: "link",
|
|
||||||
name: "main"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Главная1",
|
|
||||||
icon: "home-4-line",
|
|
||||||
link: "/page1",
|
|
||||||
type: "link",
|
|
||||||
name: "page1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Главная2",
|
|
||||||
icon: "home-4-line",
|
|
||||||
link: "/page2",
|
|
||||||
type: "link",
|
|
||||||
name: "page2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Выход",
|
|
||||||
icon: "logout-circle-line",
|
|
||||||
link: "/auth",
|
|
||||||
type: "link",
|
|
||||||
name: ""
|
|
||||||
},
|
|
||||||
]
|
|
||||||
return {
|
|
||||||
menu
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
...mapGetters('layout', ['isOpenMenu']),
|
|
||||||
pageName() {
|
|
||||||
return this.$route.name
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
...mapMutations('layout', ['toggleMenu']),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
@ -221,7 +221,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import ButtonModal from '@molecules/ButtonModal/ButtonModal.vue'
|
import ButtonModal from '@molecules/ButtonModal/ButtonModal.vue'
|
||||||
import Datepicker from "@molecules/Datepicker/index.vue"
|
import Datepicker from "@molecules/VDatepicker/VDatepicker.vue"
|
||||||
import { FwbTextarea } from 'flowbite-vue'
|
import { FwbTextarea } from 'flowbite-vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@ -23,14 +23,14 @@
|
|||||||
class="fixed z-[10000] inset-0 hidden"
|
class="fixed z-[10000] inset-0 hidden"
|
||||||
phx-remove="[["transition",{"time":200,"to":null,"transition":[["fade-out"],[],[]]}]]"
|
phx-remove="[["transition",{"time":200,"to":null,"transition":[["fade-out"],[],[]]}]]"
|
||||||
>
|
>
|
||||||
<!-- Modal container -->
|
<!-- VModal container -->
|
||||||
<div class="h-screen flex items-center justify-center p-4">
|
<div class="h-screen flex items-center justify-center p-4">
|
||||||
<!-- Overlay -->
|
<!-- Overlay -->
|
||||||
<div
|
<div
|
||||||
class="absolute z-0 inset-0 bg-gray-500 opacity-75"
|
class="absolute z-0 inset-0 bg-gray-500 opacity-75"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
<!-- Modal box -->
|
<!-- VModal box -->
|
||||||
<div
|
<div
|
||||||
class="relative max-h-full overflow-y-auto bg-white rounded-lg shadow-xl "
|
class="relative max-h-full overflow-y-auto bg-white rounded-lg shadow-xl "
|
||||||
role="dialog"
|
role="dialog"
|
||||||
|
|||||||
@ -102,10 +102,10 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import ButtonModal from '@molecules/ButtonModal/ButtonModal.vue'
|
import ButtonModal from '@molecules/ButtonModal/ButtonModal.vue'
|
||||||
import Datepicker from "@molecules/Datepicker/index.vue"
|
import Datepicker from "@molecules/VDatepicker/VDatepicker.vue"
|
||||||
import {mapGetters, mapMutations, mapActions} from 'vuex'
|
import {mapGetters, mapMutations, mapActions} from 'vuex'
|
||||||
import Tabulator from "@molecules/Tabulator/index.vue"
|
import Tabulator from "@molecules/VTabulator/VTabulator.vue"
|
||||||
import Spinner from "@molecules/Spinner/index.vue"
|
import Spinner from "@molecules/VSpinner/VSpinner.vue"
|
||||||
import MachinesModal from "@molecules/MachinesModal/MachinesModal.vue"
|
import MachinesModal from "@molecules/MachinesModal/MachinesModal.vue"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="grid grid-cols-12 gap-6 col-span-12 h-full">
|
<div class="grid grid-cols-12 gap-6 col-span-12 h-full">
|
||||||
<form
|
<form
|
||||||
phx-submit="fetch_pack"
|
|
||||||
class="rounded-md bg-light px-4 pt-4 pb-6 gap-2 shadow lg:col-span-4 xl:col-span-3 2xl:col-span-2 col-span-12"
|
class="rounded-md bg-light px-4 pt-4 pb-6 gap-2 shadow lg:col-span-4 xl:col-span-3 2xl:col-span-2 col-span-12"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
>
|
>
|
||||||
@ -80,8 +79,8 @@
|
|||||||
<script>
|
<script>
|
||||||
import ButtonModal from '@molecules/ButtonModal/ButtonModal.vue'
|
import ButtonModal from '@molecules/ButtonModal/ButtonModal.vue'
|
||||||
import {mapGetters, mapMutations, mapActions} from 'vuex'
|
import {mapGetters, mapMutations, mapActions} from 'vuex'
|
||||||
import Tabulator from "@molecules/Tabulator/index.vue"
|
import Tabulator from "@molecules/VTabulator/VTabulator.vue"
|
||||||
import Spinner from "@molecules/Spinner/index.vue"
|
import Spinner from "@molecules/VSpinner/VSpinner.vue"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'LastPacksNum',
|
name: 'LastPacksNum',
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import {mapGetters, mapActions, mapMutations, useStore} from "vuex"
|
import {mapGetters, mapActions, mapMutations, useStore} from "vuex"
|
||||||
import Button from "@/components/1_atoms/Button.vue"
|
import Button from "@atoms/VButton.vue"
|
||||||
import Tabulator from "@molecules/Tabulator/index.vue"
|
import Tabulator from "@molecules/VTabulator/VTabulator.vue"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'AddUsers',
|
name: 'AddUsers',
|
||||||
@ -31,7 +31,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
{{ console.log('adminData', adminData)
|
{{ console.log('adminData', adminData)
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
<script>
|
<script>
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
||||||
import Spinner from "@molecules/Spinner/index.vue"
|
import Spinner from "@molecules/VSpinner/VSpinner.vue"
|
||||||
import {PushAfterTimeout} from '@store/hooks/PushAfterTimeout'
|
import {PushAfterTimeout} from '@store/hooks/PushAfterTimeout'
|
||||||
import Accordion from '@atoms/Accordion.vue'
|
import Accordion from '@atoms/VAccordion.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'FinderPacks',
|
name: 'FinderPacks',
|
||||||
@ -41,7 +41,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="rounded w-full transition-all min-h-[500px] relative">
|
<div class="rounded w-full transition-all min-h-[500px] relative">
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {ref, toRaw, computed} from 'vue'
|
import {ref, toRaw, computed} from 'vue'
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex";
|
import {mapGetters, mapMutations, mapActions, useStore} from "vuex";
|
||||||
import {useRoute, useRouter} from 'vue-router'
|
import {useRoute, useRouter} from 'vue-router'
|
||||||
import Button from "@/components/1_atoms/Button.vue";
|
import Button from "@atoms/VButton.vue";
|
||||||
import DoubleSwitch from "@/components/1_atoms/DoubleSwitch.vue";
|
import DoubleSwitch from "@/components/1_atoms/DoubleSwitch.vue";
|
||||||
import Chart from "@/components/2_molecules/Chart/index.vue";
|
import Chart from "@molecules/VChart/VChart.vue";
|
||||||
import ECharts from '@store/hooks/Echarts';
|
import ECharts from '@store/hooks/Echarts';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -64,7 +64,7 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters('machines', ['selectedSelects', 'selectsData', 'toggleFilter', 'chartsData', 'activeChartData', 'prevGroupByData', 'activeMenuChartData', 'openMenuChart', 'legendFiltersParams']),
|
...mapGetters('layoutMachines', ['selectedSelects', 'selectsData', 'toggleFilter', 'chartsData', 'activeChartData', 'prevGroupByData', 'activeMenuChartData', 'openMenuChart', 'legendFiltersParams']),
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
|
|
||||||
@ -104,7 +104,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="px-2 sm:px-5 pt-1 bg-light">
|
<div class="px-2 sm:px-5 pt-1 bg-light">
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
||||||
import Modal from '@molecules/Modal/index.vue'
|
import Modal from '@molecules/VModal/VModal.vue'
|
||||||
import Accordion from '@atoms/Accordion.vue'
|
import Accordion from '@atoms/VAccordion.vue'
|
||||||
import PackView from '@organisms/PackView/index.vue'
|
import PackView from '@organisms/PackView/index.vue'
|
||||||
import Spinner from "@molecules/Spinner/index.vue"
|
import Spinner from "@molecules/VSpinner/VSpinner.vue"
|
||||||
import {getMachineInfo} from './helpers'
|
import {getMachineInfo} from './helpers'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -69,7 +69,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Modal
|
<Modal
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {ref, toRaw, computed} from 'vue'
|
import {ref, toRaw, computed} from 'vue'
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex";
|
import {mapGetters, mapMutations, mapActions, useStore} from "vuex";
|
||||||
import Button from "@/components/1_atoms/Button.vue";
|
import Button from "@atoms/VButton.vue";
|
||||||
import VueMultiselect from 'vue-multiselect'
|
import VueMultiselect from 'vue-multiselect'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -43,7 +43,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div id="ignore:2Qxwqz" class="pb-1">
|
<div id="ignore:2Qxwqz" class="pb-1">
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import {mapGetters, mapMutations, useStore} from "vuex"
|
import {mapGetters, mapMutations, useStore} from "vuex"
|
||||||
import Tabulator from "@molecules/Tabulator/index.vue"
|
import Tabulator from "@molecules/VTabulator/VTabulator.vue"
|
||||||
import { EventStore } from "@store/hooks/EventStore"
|
import { EventStore } from "@store/hooks/EventStore"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
||||||
import Button from "@/components/1_atoms/Button.vue"
|
import Button from "@atoms/VButton.vue"
|
||||||
import { EventStore } from "@store/hooks/EventStore"
|
import { EventStore } from "@store/hooks/EventStore"
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div id="card" class="pt-3 border w-[23%] min-w-[310px] border-slate-300 rounded transition-all bg-slate-300}">
|
<div id="card" class="pt-3 border w-[23%] min-w-[310px] border-slate-300 rounded transition-all bg-slate-300}">
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {computed} from 'vue'
|
import {computed} from 'vue'
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
import {mapGetters, mapMutations, mapActions, useStore} from "vuex"
|
||||||
import {useRoute, useRouter} from 'vue-router'
|
import {useRoute, useRouter} from 'vue-router'
|
||||||
import Button from "@/components/1_atoms/Button.vue"
|
import Button from "@atoms/VButton.vue"
|
||||||
import VueMultiselect from 'vue-multiselect'
|
import VueMultiselect from 'vue-multiselect'
|
||||||
import Filters from "./Filters.vue"
|
import Filters from "./Filters.vue"
|
||||||
import Machine from "./Machine.vue"
|
import Machine from "./Machine.vue"
|
||||||
import Charts from "./Charts.vue"
|
import Charts from "./Charts.vue"
|
||||||
import HistoryViews from "./HistoryViews.vue"
|
import HistoryViews from "./HistoryViews.vue"
|
||||||
import Table from "./Table.vue"
|
import Table from "./Table.vue"
|
||||||
import MapModal from '@molecules/MapModal/index.vue'
|
import MapModal from '@molecules/MapModal/MapModal.vue'
|
||||||
import DataModal from "./DataModal/DataModal.vue"
|
import DataModal from "./DataModal/DataModal.vue"
|
||||||
import Spinner from "@molecules/Spinner/index.vue"
|
import Spinner from "@molecules/VSpinner/VSpinner.vue"
|
||||||
import {PushAfterTimeout} from '@store/hooks/PushAfterTimeout'
|
import {PushAfterTimeout} from '@store/hooks/PushAfterTimeout'
|
||||||
import {EventStore} from '@store/hooks/EventStore'
|
import {EventStore} from '@store/hooks/EventStore'
|
||||||
|
|
||||||
@ -140,7 +140,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="px-2 sm:px-5 pt-1 bg-light">
|
<div class="px-2 sm:px-5 pt-1 bg-light">
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import {mapGetters, mapActions, mapMutations, useStore} from "vuex"
|
import {mapGetters, mapActions, mapMutations, useStore} from "vuex"
|
||||||
import Tabulator from "@molecules/Tabulator/index.vue"
|
import Tabulator from "@molecules/VTabulator/VTabulator.vue"
|
||||||
import { EventStore } from "@store/hooks/EventStore"
|
import { EventStore } from "@store/hooks/EventStore"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {computed} from 'vue'
|
import {computed} from 'vue'
|
||||||
@ -7,7 +7,7 @@ import {useRoute} from 'vue-router'
|
|||||||
import Machines from "./Machines/Machines.vue";
|
import Machines from "./Machines/Machines.vue";
|
||||||
import FinderPacks from "./FinderPacks/FinderPacks.vue";
|
import FinderPacks from "./FinderPacks/FinderPacks.vue";
|
||||||
import AddUsers from "./AddUsers/AddUsers.vue";
|
import AddUsers from "./AddUsers/AddUsers.vue";
|
||||||
import Button from "@/components/1_atoms/Button.vue";
|
import Button from "@atoms/VButton.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Main',
|
name: 'Main',
|
||||||
@ -65,7 +65,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="col-span-12">
|
<div class="col-span-12">
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Chart from "@/components/2_molecules/Chart/index.vue";
|
import Chart from "@molecules/VChart/VChart.vue";
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -55,7 +55,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
{{ console.log('currentSizes.heigth', maxHeight) }}
|
{{ console.log('currentSizes.heigth', maxHeight) }}
|
||||||
|
|||||||
@ -2,9 +2,9 @@
|
|||||||
import {ref, toRaw, computed} from 'vue'
|
import {ref, toRaw, computed} from 'vue'
|
||||||
import {mapGetters, mapMutations, mapActions, useStore} from "vuex";
|
import {mapGetters, mapMutations, mapActions, useStore} from "vuex";
|
||||||
import {useRoute, useRouter} from 'vue-router'
|
import {useRoute, useRouter} from 'vue-router'
|
||||||
import Datepicker from "@molecules/Datepicker/index.vue"
|
import Datepicker from "@molecules/VDatepicker/VDatepicker.vue"
|
||||||
import Spinner from "@molecules/Spinner/index.vue"
|
import Spinner from "@molecules/VSpinner/VSpinner.vue"
|
||||||
import Tabulator from "@molecules/Tabulator/index.vue"
|
import Tabulator from "@molecules/VTabulator/VTabulator.vue"
|
||||||
import PackChart from './Chart/Chart.vue'
|
import PackChart from './Chart/Chart.vue'
|
||||||
import VueMultiselect from 'vue-multiselect'
|
import VueMultiselect from 'vue-multiselect'
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
@ -124,7 +124,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="grid grid-cols-12 gap-6 col-span-12 h-full">
|
<div class="grid grid-cols-12 gap-6 col-span-12 h-full">
|
||||||
@ -316,14 +316,14 @@ export default {
|
|||||||
class="fixed z-[10000] inset-0 hidden"
|
class="fixed z-[10000] inset-0 hidden"
|
||||||
phx-remove="[["transition",{"time":200,"to":null,"transition":[["fade-out"],[],[]]}]]"
|
phx-remove="[["transition",{"time":200,"to":null,"transition":[["fade-out"],[],[]]}]]"
|
||||||
>
|
>
|
||||||
<!-- Modal container -->
|
<!-- VModal container -->
|
||||||
<div class="h-screen flex items-center justify-center p-4">
|
<div class="h-screen flex items-center justify-center p-4">
|
||||||
<!-- Overlay -->
|
<!-- Overlay -->
|
||||||
<div
|
<div
|
||||||
class="absolute z-0 inset-0 bg-gray-500 opacity-75"
|
class="absolute z-0 inset-0 bg-gray-500 opacity-75"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
<!-- Modal box -->
|
<!-- VModal box -->
|
||||||
<div
|
<div
|
||||||
class="relative max-h-full overflow-y-auto bg-white rounded-lg shadow-xl "
|
class="relative max-h-full overflow-y-auto bg-white rounded-lg shadow-xl "
|
||||||
role="dialog"
|
role="dialog"
|
||||||
@ -370,14 +370,14 @@ export default {
|
|||||||
class="fixed z-[10000] inset-0 hidden"
|
class="fixed z-[10000] inset-0 hidden"
|
||||||
phx-remove="[["transition",{"time":200,"to":null,"transition":[["fade-out"],[],[]]}]]"
|
phx-remove="[["transition",{"time":200,"to":null,"transition":[["fade-out"],[],[]]}]]"
|
||||||
>
|
>
|
||||||
<!-- Modal container -->
|
<!-- VModal container -->
|
||||||
<div class="h-screen flex items-center justify-center p-4">
|
<div class="h-screen flex items-center justify-center p-4">
|
||||||
<!-- Overlay -->
|
<!-- Overlay -->
|
||||||
<div
|
<div
|
||||||
class="absolute z-0 inset-0 bg-gray-500 opacity-75"
|
class="absolute z-0 inset-0 bg-gray-500 opacity-75"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
<!-- Modal box -->
|
<!-- VModal box -->
|
||||||
<div
|
<div
|
||||||
class="relative max-h-full overflow-y-auto bg-white rounded-lg shadow-xl "
|
class="relative max-h-full overflow-y-auto bg-white rounded-lg shadow-xl "
|
||||||
role="dialog"
|
role="dialog"
|
||||||
@ -457,14 +457,14 @@ export default {
|
|||||||
class="fixed z-[10000] inset-0 hidden"
|
class="fixed z-[10000] inset-0 hidden"
|
||||||
phx-remove="[["transition",{"time":200,"to":null,"transition":[["fade-out"],[],[]]}]]"
|
phx-remove="[["transition",{"time":200,"to":null,"transition":[["fade-out"],[],[]]}]]"
|
||||||
>
|
>
|
||||||
<!-- Modal container -->
|
<!-- VModal container -->
|
||||||
<div class="h-screen flex items-center justify-center p-4">
|
<div class="h-screen flex items-center justify-center p-4">
|
||||||
<!-- Overlay -->
|
<!-- Overlay -->
|
||||||
<div
|
<div
|
||||||
class="absolute z-0 inset-0 bg-gray-500 opacity-75"
|
class="absolute z-0 inset-0 bg-gray-500 opacity-75"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
<!-- Modal box -->
|
<!-- VModal box -->
|
||||||
<div
|
<div
|
||||||
class="relative max-h-full overflow-y-auto bg-white rounded-lg shadow-xl "
|
class="relative max-h-full overflow-y-auto bg-white rounded-lg shadow-xl "
|
||||||
role="dialog"
|
role="dialog"
|
||||||
|
|||||||
@ -1,13 +1,7 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
123
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'Diap',
|
||||||
components: {},
|
components: {},
|
||||||
data() {
|
data() {
|
||||||
},
|
},
|
||||||
@ -18,3 +12,9 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
123
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|||||||
@ -1,13 +1,7 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
123
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'News',
|
||||||
components: {},
|
components: {},
|
||||||
data() {
|
data() {
|
||||||
},
|
},
|
||||||
@ -18,3 +12,9 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
123
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|||||||
@ -1,13 +1,7 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
123
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'Packs',
|
||||||
components: {},
|
components: {},
|
||||||
data() {
|
data() {
|
||||||
},
|
},
|
||||||
@ -18,3 +12,9 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
123
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|||||||
@ -1,13 +1,7 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
123
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'ServiceManage',
|
||||||
components: {},
|
components: {},
|
||||||
data() {
|
data() {
|
||||||
},
|
},
|
||||||
@ -18,3 +12,9 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
123
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|||||||
@ -1,105 +0,0 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import {mapActions, useStore} from "vuex"
|
|
||||||
import Spinner from "@molecules/Spinner/index.vue"
|
|
||||||
import { CopyToClipboard } from "@store/hooks/CopyToClipboard"
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Service',
|
|
||||||
components: {
|
|
||||||
Spinner,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
idx: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
},
|
|
||||||
name: {
|
|
||||||
type: String,
|
|
||||||
default: ""
|
|
||||||
},
|
|
||||||
service: {
|
|
||||||
type: Object,
|
|
||||||
default: () => {}
|
|
||||||
},
|
|
||||||
copyed: {
|
|
||||||
type: String,
|
|
||||||
default: "copyed"
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
isCopyed: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
setup (props, {slots}) {
|
|
||||||
const store = useStore()
|
|
||||||
store.dispatch('logger/uploadData', {status: 'info', text: 'Сервис Info'})
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
...mapActions('services', ['uploadServiceData']),
|
|
||||||
isInitParams: function(service) {
|
|
||||||
if (service?.init_params && typeof service?.init_params === 'object') {
|
|
||||||
if (service?.init_params?.service && service?.init_params?.machine_addr) return true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
copyText: function (e) {
|
|
||||||
const id = e.target.getAttribute('id')
|
|
||||||
const text = e.target.getAttribute('copyOnClickText')
|
|
||||||
this.isCopyed = true
|
|
||||||
return new CopyToClipboard('serviceList', text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div :key="idx" style="min-width: 240px" class="h-full overflow-hidden shadow-lg rounded-lg h-auto w-80 my-2 md:w-80 p-4 bg-indigo-50 transition duration-200 ease-in-out transform hover:translate-y-1 hover:shadow-2xl">
|
|
||||||
<div class="w-full flex flex-col h-full justify-center">
|
|
||||||
<div class="flex my-2 justify-between">
|
|
||||||
<span class="font-bold"> {{ service?.title }} </span>
|
|
||||||
<span v-if="service?.is_online || name === 'глобальное хранилище'" class="font-bold text-green-700">доступен</span>
|
|
||||||
<span v-else class="font-bold text-red-800">отключен </span>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="text-gray-700 my-3 flex items-center flex-grow">
|
|
||||||
<div v-if="service?.serviceIp || service?.serviceCode" class="flex flex-col gap-4">
|
|
||||||
<div class="flex flex-col">
|
|
||||||
<span class="italic text-xs font-bold">Детали</span>
|
|
||||||
<span v-if="service?.serviceIp" class="italic text-xs">{{ service?.serviceIp }}</span>
|
|
||||||
<span v-if="service?.serviceCode" class="italic text-xs">{{ service?.serviceCode }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-col">
|
|
||||||
<span class="italic text-xs font-bold">Последний перезапуск(UTC):</span>
|
|
||||||
<span class="italic text-xs">{{ service?.dateStart }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-col">
|
|
||||||
<span class="italic text-xs font-bold">Описание сервиса:</span>
|
|
||||||
<span class="italic text-xs">{{ service?.description || "... нет описания" }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div v-else class="flex flex-col">
|
|
||||||
<span class="italic text-xs font-bold">Описание сервиса:</span>
|
|
||||||
<span class="italic text-xs">Сервис глобального хранилища применяется для условно постоянного хранения данных в кэше</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="mt-2">
|
|
||||||
<span v-if="isInitParams(service)" class="flex justify-between" >
|
|
||||||
<span @click="copyText" :copyOnClickText="`${service?.init_params?.service}:${service?.init_params?.machine_addr}`" :copyed="`${isCopyed ? copyed : ''}`" class="copyText italic text-xs flex cursor-pointer" :id="`service_${service?.init_params?.service}`">
|
|
||||||
<i class="ri-file-copy-2-line text-slate-600 mr-1"></i>
|
|
||||||
{{ service?.serviceLink }}
|
|
||||||
</span>
|
|
||||||
<a :href="`/admin_panel/auth_service?show_service_cache=${name}`" id="selectService" @click="uploadServiceData(service)" class="flex italic text-xs cursor-pointer underline hover:text-gray-500 linear-loader">
|
|
||||||
открыть
|
|
||||||
</a>
|
|
||||||
</span>
|
|
||||||
<div v-else class="italic text-xs">нет доступа к глоб. хранилищу</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
@ -1,10 +1,10 @@
|
|||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {mapGetters, useStore} from "vuex"
|
import {mapGetters, useStore} from "vuex"
|
||||||
import Service from './Service.vue'
|
import Service from './ServicesServiceItem.vue'
|
||||||
import Spinner from "@molecules/Spinner/index.vue"
|
import Spinner from "@molecules/VSpinner/VSpinner.vue"
|
||||||
import Tabulator from "@molecules/Tabulator/index.vue"
|
import Tabulator from "@molecules/VTabulator/VTabulator.vue"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Services',
|
name: 'Services',
|
||||||
@ -41,7 +41,7 @@ export default {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- eslint-disable -->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="col-span-12">
|
<div class="col-span-12">
|
||||||
@ -0,0 +1,148 @@
|
|||||||
|
<script>
|
||||||
|
import {mapActions, useStore} from "vuex"
|
||||||
|
import { CopyToClipboard } from "@store/hooks/CopyToClipboard"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'ServicesServiceItem',
|
||||||
|
props: {
|
||||||
|
idx: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
default: ""
|
||||||
|
},
|
||||||
|
service: {
|
||||||
|
type: {
|
||||||
|
title: String,
|
||||||
|
serviceIp: String,
|
||||||
|
serviceCode: String,
|
||||||
|
dateStart: String,
|
||||||
|
description: String,
|
||||||
|
serviceLink: String,
|
||||||
|
is_online: Boolean,
|
||||||
|
init_params: Object
|
||||||
|
|
||||||
|
},
|
||||||
|
default: () => {}
|
||||||
|
},
|
||||||
|
copyed: {
|
||||||
|
type: String,
|
||||||
|
default: "copyed"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup () {
|
||||||
|
const store = useStore()
|
||||||
|
store.dispatch('logger/uploadData', {status: 'info', text: 'Сервис Info'})
|
||||||
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
isCopyed: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
...mapActions('services', ['uploadServiceData']),
|
||||||
|
isInitParams: function(service) {
|
||||||
|
if (service?.init_params && typeof service?.init_params === 'object') {
|
||||||
|
if (service?.init_params?.service && service?.init_params?.machine_addr) return true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
copyText: function (e) {
|
||||||
|
const text = e.target.getAttribute('copyOnClickText')
|
||||||
|
this.isCopyed = true
|
||||||
|
return new CopyToClipboard('serviceList', text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
:key="idx"
|
||||||
|
style="min-width: 240px"
|
||||||
|
class="h-full overflow-hidden shadow-lg rounded-lg w-80 my-2 md:w-80 p-4 bg-indigo-50 transition duration-200 ease-in-out transform hover:translate-y-1 hover:shadow-2xl"
|
||||||
|
>
|
||||||
|
<div class="w-full flex flex-col h-full justify-center">
|
||||||
|
<div class="flex my-2 justify-between">
|
||||||
|
<span class="font-bold"> {{ service?.title }} </span>
|
||||||
|
<span
|
||||||
|
v-if="service?.is_online || name === 'глобальное хранилище'"
|
||||||
|
class="font-bold text-green-700"
|
||||||
|
>доступен</span>
|
||||||
|
<span
|
||||||
|
v-else
|
||||||
|
class="font-bold text-red-800"
|
||||||
|
>отключен </span>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<div class="text-gray-700 my-3 flex items-center flex-grow">
|
||||||
|
<div
|
||||||
|
v-if="service?.serviceIp || service?.serviceCode"
|
||||||
|
class="flex flex-col gap-4"
|
||||||
|
>
|
||||||
|
<div class="flex flex-col">
|
||||||
|
<span class="italic text-xs font-bold">Детали</span>
|
||||||
|
<span
|
||||||
|
v-if="service?.serviceIp"
|
||||||
|
class="italic text-xs"
|
||||||
|
>{{ service?.serviceIp }}</span>
|
||||||
|
<span
|
||||||
|
v-if="service?.serviceCode"
|
||||||
|
class="italic text-xs"
|
||||||
|
>{{ service?.serviceCode }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col">
|
||||||
|
<span class="italic text-xs font-bold">Последний перезапуск(UTC):</span>
|
||||||
|
<span class="italic text-xs">{{ service?.dateStart }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col">
|
||||||
|
<span class="italic text-xs font-bold">Описание сервиса:</span>
|
||||||
|
<span class="italic text-xs">{{ service?.description || "... нет описания" }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-else
|
||||||
|
class="flex flex-col"
|
||||||
|
>
|
||||||
|
<span class="italic text-xs font-bold">Описание сервиса:</span>
|
||||||
|
<span class="italic text-xs">Сервис глобального хранилища применяется для условно постоянного хранения данных в кэше</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<div class="mt-2">
|
||||||
|
<span
|
||||||
|
v-if="isInitParams(service)"
|
||||||
|
class="flex justify-between"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
:id="`service_${service?.init_params?.service}`"
|
||||||
|
:copyOnClickText="`${service?.init_params?.service}:${service?.init_params?.machine_addr}`"
|
||||||
|
:copyed="`${isCopyed ? copyed : ''}`"
|
||||||
|
class="copyText italic text-xs flex cursor-pointer"
|
||||||
|
@click="copyText"
|
||||||
|
>
|
||||||
|
<i class="ri-file-copy-2-line text-slate-600 mr-1" />
|
||||||
|
{{ service?.serviceLink }}
|
||||||
|
</span>
|
||||||
|
<a
|
||||||
|
id="selectService"
|
||||||
|
:href="`/admin_panel/auth_service?show_service_cache=${name}`"
|
||||||
|
class="flex italic text-xs cursor-pointer underline hover:text-gray-500 linear-loader"
|
||||||
|
@click="uploadServiceData(service)"
|
||||||
|
>
|
||||||
|
открыть
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
<div
|
||||||
|
v-else
|
||||||
|
class="italic text-xs"
|
||||||
|
>
|
||||||
|
нет доступа к глоб. хранилищу
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
21
live_monitor_vue/src/components/ComponentTemplate.vue
Normal file
21
live_monitor_vue/src/components/ComponentTemplate.vue
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<script>
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "ComponentTemplate",
|
||||||
|
props: {
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {}
|
||||||
|
},
|
||||||
|
computed: {},
|
||||||
|
methods: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="">
|
||||||
|
ComponentTemplate
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@ -16,7 +16,7 @@ import News from "@admin_pages/News/index.vue"
|
|||||||
import Machines from "@pages/Main/Machines/Machines.vue"
|
import Machines from "@pages/Main/Machines/Machines.vue"
|
||||||
import FinderPacks from "@pages/Main/FinderPacks/FinderPacks.vue"
|
import FinderPacks from "@pages/Main/FinderPacks/FinderPacks.vue"
|
||||||
import AddUsers from "@pages/Main/AddUsers/AddUsers.vue"
|
import AddUsers from "@pages/Main/AddUsers/AddUsers.vue"
|
||||||
import Services from "@admin_pages/Services/index.vue"
|
import Services from "@admin_pages/Services/Services.vue"
|
||||||
import ServiceManage from "@admin_pages/ServiceManage/index.vue"
|
import ServiceManage from "@admin_pages/ServiceManage/index.vue"
|
||||||
import {get} from "@store/modules/apiHelpers"
|
import {get} from "@store/modules/apiHelpers"
|
||||||
import {cond, T} from 'ramda'
|
import {cond, T} from 'ramda'
|
||||||
|
|||||||
@ -903,4 +903,5 @@ class ECharts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ECharts;
|
export {ECharts}
|
||||||
|
export default ECharts;
|
||||||
@ -1,6 +1,6 @@
|
|||||||
import { toRaw } from 'vue'
|
import { toRaw } from 'vue'
|
||||||
import { Logger } from './helpers'
|
|
||||||
import { loggerInfo } from './StaticData'
|
import { loggerInfo } from './StaticData'
|
||||||
|
import { Logger } from '3-class-complex-assistants'
|
||||||
|
|
||||||
const initState = {
|
const initState = {
|
||||||
isPushToServer: true,
|
isPushToServer: true,
|
||||||
@ -32,7 +32,7 @@ const mutations = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const actions = {
|
const actions = {
|
||||||
uploadData: async ({commit, getters, state}, data) => {
|
uploadData: async ({commit, state}, data) => {
|
||||||
try{
|
try{
|
||||||
|
|
||||||
const callFunc = (text) => (`answerMessage: ${text}`)
|
const callFunc = (text) => (`answerMessage: ${text}`)
|
||||||
@ -42,17 +42,16 @@ const actions = {
|
|||||||
const status = data.status
|
const status = data.status
|
||||||
const text = data.text
|
const text = data.text
|
||||||
const allParams = {...serviceInfo, callFunc, isPushToServer}
|
const allParams = {...serviceInfo, callFunc, isPushToServer}
|
||||||
console.log('allParams', allParams)
|
|
||||||
const logger = new Logger(allParams)
|
const logger = new Logger(allParams)
|
||||||
|
|
||||||
const loggerAnswer = (status) => {
|
const loggerAnswer = (status) => {
|
||||||
const curStatus = status.toLowerCase()
|
const curStatus = status.toLowerCase()
|
||||||
switch (curStatus) {
|
switch (curStatus) {
|
||||||
case 'debug': return logger.debug(text, -1)
|
case 'debug': return logger.debug(text, -1)
|
||||||
case 'info': return logger.info(text, 0)
|
case 'info': return logger.info(text, 0)
|
||||||
case 'warn': return logger.warn(text, 1)
|
case 'warn': return logger.warn(text, 1)
|
||||||
case 'error': return logger.error(text, 2)
|
case 'error': return logger.error(text, 2)
|
||||||
default: return callFunc('Неизвестный статус логгера')
|
default: return callFunc('Неизвестный статус логгера')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,127 +0,0 @@
|
|||||||
import {expect, test, vi} from 'vitest'
|
|
||||||
import {Logger} from './helpers'
|
|
||||||
import { globalServices } from '@store/modules/services/StaticData'
|
|
||||||
// import {loggerInfo} from './StaticData'
|
|
||||||
// import Vue from 'vue'
|
|
||||||
import {createStore, useStore, Vuex} from 'vuex'
|
|
||||||
import {store} from './index.js'
|
|
||||||
import { flushPromises } from '@vue/test-utils'
|
|
||||||
|
|
||||||
// const store = useStore()
|
|
||||||
// store.dispatch('logger/uploadData')
|
|
||||||
|
|
||||||
console.log('store', store.mutations)
|
|
||||||
|
|
||||||
// Vue.use(Vuex)
|
|
||||||
|
|
||||||
const loggerAnswer = store.state.loggerAnswer
|
|
||||||
const loggerInfo = store.state.serviceInfo
|
|
||||||
const setLoggerInfo = store.mutations.setServiceInfo
|
|
||||||
const setLoggerData = store.mutations.setLoggerData
|
|
||||||
const setLoggerAnswer = store.mutations.setLoggerAnswer
|
|
||||||
const uploadData = store.actions.uploadData
|
|
||||||
|
|
||||||
const mockStore = createStore({
|
|
||||||
state: {
|
|
||||||
isPushToServer: true,
|
|
||||||
serviceInfo: loggerInfo,
|
|
||||||
loggerAnswer: loggerAnswer
|
|
||||||
},
|
|
||||||
mutations: {
|
|
||||||
setLoggerAnswer: setLoggerAnswer,
|
|
||||||
},
|
|
||||||
actions: {
|
|
||||||
setUploadData: uploadData,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('mutations', () => {
|
|
||||||
it('Set to empty Service info', () => {
|
|
||||||
const state = { serviceInfo: loggerInfo }
|
|
||||||
setLoggerInfo(state, null)
|
|
||||||
expect(state.serviceInfo).to.equal(null)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('mutations', () => {
|
|
||||||
it('Set logger data', () => {
|
|
||||||
const state = { loggerData: null }
|
|
||||||
setLoggerData(state, loggerInfo)
|
|
||||||
expect(state.loggerData).to.toMatchObject({logger_level: '4'})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('actions', () => {
|
|
||||||
it('Set unknown status to loggerAnswer', async () => {
|
|
||||||
mockStore.dispatch('setUploadData', {status: 'custom', text: 'Test actions'})
|
|
||||||
expect(mockStore.state.loggerAnswer).toEqual('answerMessage: Неизвестный статус логгера')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('actions', () => {
|
|
||||||
it('Verify right status UpperCase Text to loggerAnswer', async () => {
|
|
||||||
mockStore.dispatch('setUploadData', {status: 'Debug', text: 'Test Debug status with UpperCase Text'})
|
|
||||||
expect(mockStore.state.loggerAnswer).toEqual('answerMessage: Test Debug status with UpperCase Text')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
test('empty logger info', () => {
|
|
||||||
const newLogger = new Logger()
|
|
||||||
const loggerDebug = newLogger.debug()
|
|
||||||
const loggerInfo = newLogger.info()
|
|
||||||
const loggerWarn = newLogger.warn()
|
|
||||||
const loggerError = newLogger.error()
|
|
||||||
|
|
||||||
expect(loggerDebug).toBeUndefined()
|
|
||||||
expect(loggerInfo).toBeUndefined()
|
|
||||||
expect(loggerWarn).toBeUndefined()
|
|
||||||
expect(loggerError).toBeUndefined()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('sent logger, empty required params', () => {
|
|
||||||
|
|
||||||
const callback = (text) => console.log('callback', text)
|
|
||||||
|
|
||||||
const allParams = {...loggerInfo, callFunc: callback, isPushToServer: true}
|
|
||||||
|
|
||||||
const newLogger = new Logger(allParams)
|
|
||||||
const loggerWarn = newLogger.warn('', 1)
|
|
||||||
const loggerError = newLogger.error('Test error')
|
|
||||||
|
|
||||||
expect(loggerWarn).toBeUndefined()
|
|
||||||
expect(loggerError).toBeUndefined()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('sent logger, empty callback function', () => {
|
|
||||||
|
|
||||||
const allParams = {...loggerInfo, callFunc: null, isPushToServer: true}
|
|
||||||
|
|
||||||
const newLogger = new Logger(allParams)
|
|
||||||
const loggerDebug = newLogger.debug('Test debug', 0)
|
|
||||||
const loggerInfos = newLogger.info('Test info', 1)
|
|
||||||
const loggerWarn = newLogger.warn('Test warn', 2)
|
|
||||||
const loggerError = newLogger.error('Test error', 3)
|
|
||||||
|
|
||||||
expect(loggerDebug).toBe('Отладочная информация отправлена на сервер')
|
|
||||||
expect(loggerInfos).toBe('Информация отправлена на сервер')
|
|
||||||
expect(loggerWarn).toBe('Предупреждение отправлено на сервер')
|
|
||||||
expect(loggerError).toBe('Ошибка отправлена на сервер')
|
|
||||||
})
|
|
||||||
|
|
||||||
test('sent logger, with callback function', () => {
|
|
||||||
|
|
||||||
const callback = vi.fn((text) => `callback func - ${text}`)
|
|
||||||
|
|
||||||
const allParams = {...loggerInfo, callFunc: callback, isPushToServer: true}
|
|
||||||
|
|
||||||
const newLogger = new Logger(allParams)
|
|
||||||
const loggerDebug = newLogger.debug('Test debug', 1)
|
|
||||||
const loggerInfos = newLogger.info('Test info', 1)
|
|
||||||
const loggerWarn = newLogger.warn('Test warn', 1)
|
|
||||||
const loggerError = newLogger.error('Test error', 1)
|
|
||||||
|
|
||||||
expect(loggerDebug).toBe('callback func - Test debug')
|
|
||||||
expect(loggerInfos).toBe('callback func - Test info')
|
|
||||||
expect(loggerWarn).toBe('callback func - Test warn')
|
|
||||||
expect(loggerError).toBe('callback func - Test error')
|
|
||||||
})
|
|
||||||
@ -2,7 +2,7 @@ import { isEmpty } from "ramda"
|
|||||||
import {globalServices} from './StaticData'
|
import {globalServices} from './StaticData'
|
||||||
import moment from "moment/dist/moment"
|
import moment from "moment/dist/moment"
|
||||||
import ru from "moment/dist/locale/ru"
|
import ru from "moment/dist/locale/ru"
|
||||||
moment.locale("ru", ru)
|
moment.updateLocale("ru", ru)
|
||||||
|
|
||||||
class Services {
|
class Services {
|
||||||
constructor() {
|
constructor() {
|
||||||
@ -44,8 +44,8 @@ class Services {
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const services = globalServices ? globalServices : []
|
const services = globalServices ? globalServices : []
|
||||||
return services
|
return services
|
||||||
}
|
}
|
||||||
|
|
||||||
serviceDetales(services) {
|
serviceDetales(services) {
|
||||||
@ -59,7 +59,7 @@ class Services {
|
|||||||
let serviceCode = ''
|
let serviceCode = ''
|
||||||
if (serviceNameArr?.length > 0) {
|
if (serviceNameArr?.length > 0) {
|
||||||
if (serviceNameArr[serviceNameArr.length - 1].length > 15)
|
if (serviceNameArr[serviceNameArr.length - 1].length > 15)
|
||||||
serviceCode = serviceNameArr[serviceNameArr.length - 1]
|
serviceCode = serviceNameArr[serviceNameArr.length - 1]
|
||||||
serviceIp = serviceNameArr.reduce((acc, el, idx) => {
|
serviceIp = serviceNameArr.reduce((acc, el, idx) => {
|
||||||
const ipIdx = el.indexOf('@')
|
const ipIdx = el.indexOf('@')
|
||||||
if (ipIdx !== -1) {
|
if (ipIdx !== -1) {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import {test, describe, expect} from 'vitest'
|
import {test, describe, expect} from 'vitest'
|
||||||
import { mount} from '@vue/test-utils'
|
import { mount} from '@vue/test-utils'
|
||||||
import Accordion from '@atoms/Accordion.vue';
|
import Accordion from '@atoms/VAccordion.vue';
|
||||||
|
|
||||||
describe('Accordion', () => {
|
describe('Accordion', () => {
|
||||||
test('Accordion mounted', () => {
|
test('Accordion mounted', () => {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import {test, describe, expect} from 'vitest'
|
import {test, describe, expect} from 'vitest'
|
||||||
import { mount} from '@vue/test-utils'
|
import { mount} from '@vue/test-utils'
|
||||||
import Button from '@atoms/Button.vue';
|
import Button from '@atoms/VButton.vue';
|
||||||
|
|
||||||
describe('Accordion', () => {
|
describe('Accordion', () => {
|
||||||
test('Accordion mounted', () => {
|
test('Accordion mounted', () => {
|
||||||
|
|||||||
@ -4,7 +4,12 @@ import DoubleSwitch from '@atoms/DoubleSwitch.vue';
|
|||||||
|
|
||||||
describe('DoubleSwitch', () => {
|
describe('DoubleSwitch', () => {
|
||||||
test('DoubleSwitch mounted', () => {
|
test('DoubleSwitch mounted', () => {
|
||||||
const wrapper = mount(DoubleSwitch)
|
const wrapper = mount(DoubleSwitch, {
|
||||||
|
global: {
|
||||||
|
provide: {
|
||||||
|
isChecked: false
|
||||||
|
}}
|
||||||
|
})
|
||||||
expect(wrapper.exists()).toBe(true)
|
expect(wrapper.exists()).toBe(true)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
import {test, describe, expect} from 'vitest'
|
||||||
|
import { mount} from '@vue/test-utils'
|
||||||
|
import MapModal from '@molecules/MapModal/MapModal.vue';
|
||||||
|
|
||||||
|
describe('MapModal', () => {
|
||||||
|
test('MapModal mounted', () => {
|
||||||
|
const wrapper = mount(MapModal)
|
||||||
|
expect(wrapper.exists()).toBe(true)
|
||||||
|
})
|
||||||
|
})
|
||||||
46
live_monitor_vue/tests/components/2_molecules/VChart.test.js
Normal file
46
live_monitor_vue/tests/components/2_molecules/VChart.test.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import {test, describe, expect, vi} from 'vitest'
|
||||||
|
import { shallowMount } from '@vue/test-utils'
|
||||||
|
import VChart from '@molecules/VChart/VChart.vue';
|
||||||
|
import { createStore } from 'vuex';
|
||||||
|
import { store as layoutMachines } from '@/store/modules/layoutMachines';
|
||||||
|
|
||||||
|
describe('VChart', () => {
|
||||||
|
test('VChart mounted', () => {
|
||||||
|
|
||||||
|
const store = createStore({
|
||||||
|
modules: {
|
||||||
|
layoutMachines
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
vi.mock('@store/hooks/Echarts', () => {
|
||||||
|
|
||||||
|
const html = vi.fn(() => {
|
||||||
|
return {
|
||||||
|
getHtml: () => {
|
||||||
|
return '<div>test</div>'
|
||||||
|
},
|
||||||
|
onClickedBarCharts: vi.fn()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
__esModule: true,
|
||||||
|
ECharts: html
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const wrapper = shallowMount(VChart, {
|
||||||
|
props: {
|
||||||
|
id: "",
|
||||||
|
type: "bar",
|
||||||
|
},
|
||||||
|
global: {
|
||||||
|
mocks: {
|
||||||
|
$store: store
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
expect(wrapper.exists()).toBe(true)
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
import {test, describe, expect, vi} from 'vitest'
|
||||||
|
import { mount} from '@vue/test-utils'
|
||||||
|
import VDatepicker from '@molecules/VDatepicker/VDatepicker.vue';
|
||||||
|
|
||||||
|
describe('VDatepicker', () => {
|
||||||
|
test('VDatepicker mounted', () => {
|
||||||
|
const wrapper = mount(VDatepicker,
|
||||||
|
{
|
||||||
|
global: {
|
||||||
|
provide: {
|
||||||
|
defaultDate: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
expect(wrapper.exists()).toBe(true)
|
||||||
|
})
|
||||||
|
})
|
||||||
10
live_monitor_vue/tests/components/2_molecules/VModal.test.js
Normal file
10
live_monitor_vue/tests/components/2_molecules/VModal.test.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import {test, describe, expect} from 'vitest'
|
||||||
|
import { mount} from '@vue/test-utils'
|
||||||
|
import VModal from '@molecules/VModal/VModal.vue';
|
||||||
|
|
||||||
|
describe('VModal', () => {
|
||||||
|
test('VModal mounted', () => {
|
||||||
|
const wrapper = mount(VModal)
|
||||||
|
expect(wrapper.exists()).toBe(true)
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
import {test, describe, expect} from 'vitest'
|
||||||
|
import { mount} from '@vue/test-utils'
|
||||||
|
import VSpinner from '@molecules/VSpinner/VSpinner.vue';
|
||||||
|
|
||||||
|
describe('VSpinner', () => {
|
||||||
|
test('VSpinner mounted', () => {
|
||||||
|
const wrapper = mount(VSpinner)
|
||||||
|
expect(wrapper.exists()).toBe(true)
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
import {test, describe, expect, vi } from 'vitest'
|
||||||
|
import { mount} from '@vue/test-utils'
|
||||||
|
import VTabulator from '@molecules/VTabulator/VTabulator.vue';
|
||||||
|
|
||||||
|
describe("tests VTabulator component", () => {
|
||||||
|
|
||||||
|
vi.mock('tabulator-tables', () => {
|
||||||
|
|
||||||
|
const tabulator = vi.fn(() => {
|
||||||
|
return {
|
||||||
|
getHtml: () => {
|
||||||
|
return '<div>test</div>'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
__esModule: true,
|
||||||
|
TabulatorFull: tabulator
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
test('exist test of VTabulator', async () => {
|
||||||
|
|
||||||
|
const wrapper = mount(VTabulator, {
|
||||||
|
shallow: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(wrapper.exists()).toBe(true)
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -1,4 +1,5 @@
|
|||||||
import Services from '@admin_pages/Services/index.vue'
|
import {it, describe, expect} from 'vitest'
|
||||||
|
import Services from '@admin_pages/Services/Services.vue'
|
||||||
import { globalServices } from '@store/modules/services/StaticData'
|
import { globalServices } from '@store/modules/services/StaticData'
|
||||||
import { mount } from '@vue/test-utils'
|
import { mount } from '@vue/test-utils'
|
||||||
import {createStore} from 'vuex'
|
import {createStore} from 'vuex'
|
||||||
@ -13,11 +14,11 @@ const store = createStore({
|
|||||||
services: (state) => state.services,
|
services: (state) => state.services,
|
||||||
},
|
},
|
||||||
mutations: {
|
mutations: {
|
||||||
setServices: (state, updval) => state.services = updval,
|
setServices: (state, updateValue) => state.services = updateValue,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("Services", () => {
|
describe("6_admin_pages, page of Services", () => {
|
||||||
it("renders Services, with custom button title", () => {
|
it("renders Services, with custom button title", () => {
|
||||||
const wrapper = mount(Services, {
|
const wrapper = mount(Services, {
|
||||||
global: {
|
global: {
|
||||||
@ -56,6 +57,7 @@ describe("Services", () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
expect(store.state.services.length).toBeGreaterThan(0)
|
expect(store.state.services.length).toBeGreaterThan(0)
|
||||||
|
expect(wrapper.exists()).toBe(true)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -70,5 +72,6 @@ describe("Services", () => {
|
|||||||
store.commit('setServices', [])
|
store.commit('setServices', [])
|
||||||
|
|
||||||
expect(store.state.services.length).toBe(0)
|
expect(store.state.services.length).toBe(0)
|
||||||
|
expect(wrapper.exists()).toBe(true)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -1,40 +1,34 @@
|
|||||||
import Service from '@admin_pages/Services/Service.vue'
|
import {test, describe, expect} from 'vitest'
|
||||||
|
import Service from '@admin_pages/Services/ServicesServiceItem.vue'
|
||||||
import { globalServices } from '@store/modules/services/StaticData'
|
import { globalServices } from '@store/modules/services/StaticData'
|
||||||
|
import { store as logger } from '@/store/modules/logger';
|
||||||
import { mount } from '@vue/test-utils'
|
import { mount } from '@vue/test-utils'
|
||||||
import {createStore} from 'vuex'
|
import {createStore} from 'vuex'
|
||||||
|
|
||||||
const store = createStore({
|
const store = createStore({
|
||||||
state() {
|
modules: {
|
||||||
return {
|
logger,
|
||||||
services: globalServices,
|
services: globalServices,
|
||||||
}
|
|
||||||
},
|
|
||||||
getters: {
|
|
||||||
services: (state) => state.services,
|
|
||||||
},
|
|
||||||
mutations: {
|
|
||||||
setServices: (state, updval) => state.services = updval,
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("Service", () => {
|
describe("6_admin_pages, ServicesServiceItem", () => {
|
||||||
it("renders Service, with set props value", async () => {
|
test("renders Service, with set props value", async () => {
|
||||||
const wrapper = mount(Service, {
|
const wrapper = mount(Service, {
|
||||||
global: {
|
global: {
|
||||||
plugins: [store],
|
plugins: [store],
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
idx: 1,
|
idx: 1,
|
||||||
},
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
await wrapper.setProps({ idx: 3 })
|
await wrapper.setProps({ idx: 3 })
|
||||||
|
|
||||||
expect(wrapper.html()).toContain(3)
|
expect(wrapper.html()).toContain(3)
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
describe("Service", () => {
|
test("renders Service with condition success", async () => {
|
||||||
it("renders Service with condition success", async () => {
|
|
||||||
const wrapper = mount(Service, {
|
const wrapper = mount(Service, {
|
||||||
global: {
|
global: {
|
||||||
plugins: [store],
|
plugins: [store],
|
||||||
@ -48,10 +42,8 @@ describe("Service", () => {
|
|||||||
|
|
||||||
expect(wrapper.html()).toContain('доступен')
|
expect(wrapper.html()).toContain('доступен')
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
describe("Service", () => {
|
test("renders Service with condition not success", async () => {
|
||||||
it("renders Service with condition not success", async () => {
|
|
||||||
const wrapper = mount(Service, {
|
const wrapper = mount(Service, {
|
||||||
global: {
|
global: {
|
||||||
plugins: [store],
|
plugins: [store],
|
||||||
@ -65,10 +57,8 @@ describe("Service", () => {
|
|||||||
|
|
||||||
expect(wrapper.html()).toContain('отключен')
|
expect(wrapper.html()).toContain('отключен')
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
describe("Service", () => {
|
test("renders Service if not service details", async () => {
|
||||||
it("renders Service if not service details", async () => {
|
|
||||||
const wrapper = mount(Service, {
|
const wrapper = mount(Service, {
|
||||||
global: {
|
global: {
|
||||||
plugins: [store],
|
plugins: [store],
|
||||||
@ -80,10 +70,8 @@ describe("Service", () => {
|
|||||||
|
|
||||||
expect(wrapper.html()).toContain('Сервис глобального хранилища применяется для условно постоянного хранения данных в кэше')
|
expect(wrapper.html()).toContain('Сервис глобального хранилища применяется для условно постоянного хранения данных в кэше')
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
describe("Service", () => {
|
test("renders Service with set service details", async () => {
|
||||||
it("renders Service with set service details", async () => {
|
|
||||||
const wrapper = mount(Service, {
|
const wrapper = mount(Service, {
|
||||||
global: {
|
global: {
|
||||||
plugins: [store],
|
plugins: [store],
|
||||||
@ -101,10 +89,8 @@ describe("Service", () => {
|
|||||||
expect(wrapper.html()).toContain('доступен')
|
expect(wrapper.html()).toContain('доступен')
|
||||||
expect(wrapper.html()).toContain('... нет описания')
|
expect(wrapper.html()).toContain('... нет описания')
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
describe("Service", () => {
|
test("renders Service with alert copyText success after click", async () => {
|
||||||
it("renders Service with alert copyText success after click", async () => {
|
|
||||||
const wrapper = mount(Service, {
|
const wrapper = mount(Service, {
|
||||||
global: {
|
global: {
|
||||||
plugins: [store],
|
plugins: [store],
|
||||||
@ -120,3 +106,4 @@ describe("Service", () => {
|
|||||||
expect(wrapper.html()).toContain('copyed')
|
expect(wrapper.html()).toContain('copyed')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -2,9 +2,15 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"0-tools-eslint@../repo/0-tools-eslint/":
|
||||||
|
version "0.0.1"
|
||||||
|
|
||||||
"1-toolkits-helpers@../repo/1-toolkits-helpers/":
|
"1-toolkits-helpers@../repo/1-toolkits-helpers/":
|
||||||
version "0.0.6"
|
version "0.0.6"
|
||||||
|
|
||||||
|
"3-class-complex-assistants@../repo/3-class-complex-assistants/":
|
||||||
|
version "0.0.6"
|
||||||
|
|
||||||
"@aashutoshrathi/word-wrap@^1.2.3":
|
"@aashutoshrathi/word-wrap@^1.2.3":
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
|
resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
|
||||||
|
|||||||
2
repo/0-tools-eslint/.eslintignore
Normal file
2
repo/0-tools-eslint/.eslintignore
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
tsup.config.ts
|
||||||
|
/tests
|
||||||
7
repo/0-tools-eslint/.gitignore
vendored
Normal file
7
repo/0-tools-eslint/.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/node_modules
|
||||||
|
/dist
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.env
|
||||||
|
.DS_Store
|
||||||
8
repo/0-tools-eslint/.npmignore
Normal file
8
repo/0-tools-eslint/.npmignore
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/node_modules
|
||||||
|
/src
|
||||||
|
|
||||||
|
.env
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
tsconfig.json
|
||||||
|
tsup.config.js
|
||||||
41
repo/0-tools-eslint/package.json
Normal file
41
repo/0-tools-eslint/package.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"name": "3-class-complex-assistants",
|
||||||
|
"description": "",
|
||||||
|
"version": "0.0.6",
|
||||||
|
"main": "./dist/index.js",
|
||||||
|
"module": "./dist/index.mjs",
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"scripts": {
|
||||||
|
"test": "vitest",
|
||||||
|
"build": "tsup",
|
||||||
|
"release": "npm run build && npm version patch && npm publish --tag latest",
|
||||||
|
"release_up": "npm version $(semver $npm_package_version -i minor) && npm publish --tag latest",
|
||||||
|
"lint": "eslint . --ext .ts",
|
||||||
|
"lint:fix": "eslint . --ext .ts -- --fix"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.com/niac_vniizht/niac-packs"
|
||||||
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"registry": "https://vniac.ru:4873"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"Logger",
|
||||||
|
"helpers",
|
||||||
|
"utils"
|
||||||
|
],
|
||||||
|
"author": "vbuglov",
|
||||||
|
"license": "ISC",
|
||||||
|
"devDependencies": {
|
||||||
|
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
||||||
|
"@typescript-eslint/parser": "^7.2.0",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"moment": "^2.30.1",
|
||||||
|
"tsup": "^8.0.2",
|
||||||
|
"typescript": "^5.4.2",
|
||||||
|
"typescript-eslint": "^7.2.0",
|
||||||
|
"vite": "^5.1.6",
|
||||||
|
"vitest": "^1.4.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
repo/0-tools-eslint/src/index.ts
Normal file
1
repo/0-tools-eslint/src/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
import jsEslintConfig from './javascript-eslint-config.ts';
|
||||||
19
repo/0-tools-eslint/src/typescript-eslint-config.ts
Normal file
19
repo/0-tools-eslint/src/typescript-eslint-config.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
let tsEslintConfig = {
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin
|
||||||
|
],
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 2022,
|
||||||
|
sourceType: 'module',
|
||||||
|
project: './tsconfig.json',
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
'@typescript-eslint/no-unused-vars': 'off',
|
||||||
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
|
'@typescript-eslint/ban-ts-comment': 'off',
|
||||||
|
"@typescript-eslint/ban-types": 'off',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default tsEslintConfig;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
module.exports = {
|
vueEslintConfig = {
|
||||||
extends: [
|
extends: [
|
||||||
"eslint:recommended",
|
"eslint:recommended",
|
||||||
"plugin:vue/vue3-recommended",
|
"plugin:vue/vue3-recommended",
|
||||||
18
repo/0-tools-eslint/tsconfig.json
Normal file
18
repo/0-tools-eslint/tsconfig.json
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"noImplicitAny": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"strictNullChecks": true,
|
||||||
|
"moduleResolution": "Node10",
|
||||||
|
"module": "CommonJs",
|
||||||
|
"outDir": "dist",
|
||||||
|
"declaration": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"include": ["src"],
|
||||||
|
"exclude": ["node_modules"],
|
||||||
|
"format": ["esm"],
|
||||||
|
"compilerOptions": {
|
||||||
|
"strict": true,
|
||||||
|
"target": "ES2022"
|
||||||
|
}
|
||||||
|
}
|
||||||
11
repo/0-tools-eslint/tsup.config.ts
Normal file
11
repo/0-tools-eslint/tsup.config.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// @ts-nocheck
|
||||||
|
import {defineConfig} from "tsup";
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
format: ["cjs", "esm"],
|
||||||
|
entry: ['src/index.ts'],
|
||||||
|
dts: true,
|
||||||
|
shims: true,
|
||||||
|
skipNodeModulesBundle: true,
|
||||||
|
clean: true,
|
||||||
|
})
|
||||||
Loading…
x
Reference in New Issue
Block a user