Merge branch 'master' into dev
This commit is contained in:
commit
a63d44e856
@ -39,10 +39,9 @@ prehook:
|
|||||||
@echo "Pre-push hook set successfully."
|
@echo "Pre-push hook set successfully."
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
push:
|
push:
|
||||||
ifeq ($(commit),)
|
ifeq ($(commit),)
|
||||||
$(error mn is not set)
|
$(error mn is not set)
|
||||||
endif
|
endif
|
||||||
make prehook
|
make prehook
|
||||||
git add . && git commit -m "feat($(commit)):" && GIT_SSL_NO_VERIFY=true git push
|
git add . && git commit -m "$(commit)" && git push
|
||||||
@ -1,5 +1,4 @@
|
|||||||
<script>
|
<script>
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'App',
|
||||||
}
|
}
|
||||||
|
|||||||
95
users-manage/src/adapters/adapterOfServices/Services.js
Normal file
95
users-manage/src/adapters/adapterOfServices/Services.js
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
import {get, post, put, remove} from './apiHelpers.js'
|
||||||
|
import {convertList, convertObject} from '@helpers/adapter/adapter.js'
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
id: "id",
|
||||||
|
created_at: "created_at",
|
||||||
|
updated_at: "updated_at",
|
||||||
|
deleted_at: "deleted_at",
|
||||||
|
name: "name",
|
||||||
|
port: "port",
|
||||||
|
proxy_ip: "proxy_ip",
|
||||||
|
internet_uri: "internet_uri",
|
||||||
|
description: "description",
|
||||||
|
is_online: "is_online",
|
||||||
|
site_ip: "device_ip",
|
||||||
|
}
|
||||||
|
|
||||||
|
class Services {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} apiAddr - path to service
|
||||||
|
*/
|
||||||
|
|
||||||
|
constructor(apiAddr) {
|
||||||
|
this.apiAddr = apiAddr
|
||||||
|
this.config = config
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Array<Object>} res.data - all services
|
||||||
|
*/
|
||||||
|
|
||||||
|
async getServices() {
|
||||||
|
const res = await get(`${this.apiAddr}/servers`)
|
||||||
|
return convertList(res.data, {config: this.config})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {Object} payload - add new service
|
||||||
|
* @returns {Object} newService - added new service
|
||||||
|
*/
|
||||||
|
|
||||||
|
async createService(payload) {
|
||||||
|
let newService = []
|
||||||
|
const updatedPort = parseFloat(payload.port)
|
||||||
|
const updatedService = {...convertObject(payload, {config: this.config}), port: updatedPort}
|
||||||
|
await post(`${this.apiAddr}/servers`, updatedService).then(res => {
|
||||||
|
newService = convertObject(res.value, {config: this.config})
|
||||||
|
}).catch(err => {
|
||||||
|
console.log('err', err)
|
||||||
|
})
|
||||||
|
return newService
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {Object} payload - edit params in selected service
|
||||||
|
* @returns {Object} resService - updated service with edited params
|
||||||
|
*/
|
||||||
|
|
||||||
|
async updateService(payload) {
|
||||||
|
let resService = []
|
||||||
|
const updatedPort = parseFloat(payload.port)
|
||||||
|
const updatedService = {...convertObject(payload, {config: this.config}), port: updatedPort}
|
||||||
|
if (payload.id) {
|
||||||
|
await put(`${this.apiAddr}/servers`, updatedService, payload.id).then(res => {
|
||||||
|
resService = convertObject(res.value, {config: this.config})
|
||||||
|
}).catch(err => {
|
||||||
|
console.log('err', err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return resService
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {Number} id - id selected service for remove
|
||||||
|
* @returns {Number} deletedServiceId - id removed service
|
||||||
|
*/
|
||||||
|
|
||||||
|
async deleteService(id) {
|
||||||
|
let deletedServiceId = null
|
||||||
|
await remove(`${this.apiAddr}/servers`, id).then((res) => {
|
||||||
|
deletedServiceId = res.id
|
||||||
|
}).catch(err => {
|
||||||
|
console.log('err', err)
|
||||||
|
})
|
||||||
|
return deletedServiceId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Services
|
||||||
39
users-manage/src/adapters/adapterOfServices/apiHelpers.js
Normal file
39
users-manage/src/adapters/adapterOfServices/apiHelpers.js
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
const post = async (path, data, onError) => {
|
||||||
|
return await axios.post(path, data)
|
||||||
|
.then(r => r.data)
|
||||||
|
.catch(error => {
|
||||||
|
onError && onError(error)
|
||||||
|
console.error('Error post request:', error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const get = async (path) => {
|
||||||
|
return await axios.get(path)
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Error get request:', error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const put = async (path, data, id, onError) => {
|
||||||
|
return await axios.put(`${path}/${id}`, data)
|
||||||
|
.then(r => r.data)
|
||||||
|
.catch(error => {
|
||||||
|
onError && onError(error)
|
||||||
|
console.error('Error put request:', error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const remove = async (path, id, onError) => {
|
||||||
|
return await axios.delete(`${path}/${id}`)
|
||||||
|
.then(r => r.data)
|
||||||
|
.catch(error => {
|
||||||
|
onError && onError(error)
|
||||||
|
console.error('Error delete request:', error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export {get, post, put, remove}
|
||||||
28
users-manage/src/adapters/adapterOfUsers/StaticData.js
Normal file
28
users-manage/src/adapters/adapterOfUsers/StaticData.js
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
const devUsersList = [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"first_name": "Leanne",
|
||||||
|
"last_name": "Graham",
|
||||||
|
"email": "test@mail.ru",
|
||||||
|
"role": "admin",
|
||||||
|
"is_active": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"first_name": "Leanne",
|
||||||
|
"last_name": "Graham",
|
||||||
|
"email": "test@mail.ru",
|
||||||
|
"role": "admin",
|
||||||
|
"is_active": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"first_name": "Leanne",
|
||||||
|
"last_name": "Graham",
|
||||||
|
"email": "test@mail.ru",
|
||||||
|
"role": "admin",
|
||||||
|
"is_active": true
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export {devUsersList}
|
||||||
206
users-manage/src/adapters/adapterOfUsers/Users.js
Normal file
206
users-manage/src/adapters/adapterOfUsers/Users.js
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
import {get, post, put, remove} from './apiHelpers.js'
|
||||||
|
import {convertList} from '@helpers/adapter/adapter.js'
|
||||||
|
import {devUsersList} from './StaticData.js'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Интерфейс пользователя
|
||||||
|
* @typedef {Object} User
|
||||||
|
* @param {Number} id
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Users {
|
||||||
|
/**
|
||||||
|
* Класс управления роутерами
|
||||||
|
* @param {String} apiAddr - path to service
|
||||||
|
* @param {Object | undefined} adapter_config - oldKey: newKey
|
||||||
|
* @param {Object | undefined} params - Конфиг настроек
|
||||||
|
* @param {'prod' | 'test'} params.mode - Конфиг настроек
|
||||||
|
*/
|
||||||
|
constructor(apiAddr, adapter_config = {}, params = {mode: 'prod'}) {
|
||||||
|
this.apiAddr = apiAddr
|
||||||
|
this.config = adapter_config
|
||||||
|
this.mode = params.mode
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {Object} params - Конфиг настроек
|
||||||
|
* @param {'prod' | 'dev'} params.mode - Конфиг настроек
|
||||||
|
* @returns {Promise<*[]> | *[]}
|
||||||
|
*/
|
||||||
|
async getUsers(params) {
|
||||||
|
if (params.mode === "dev") {
|
||||||
|
return devUsersList
|
||||||
|
}
|
||||||
|
let res = await get(`${this.apiAddr}/users`)
|
||||||
|
let updatedUsers = convertList(res.data, {config: this.config})
|
||||||
|
return updatedUsers
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {Number} id - Сервис id, если id не указан, отображается список всех роутеров
|
||||||
|
* @param {'dev' | 'prod'} mode - Сервис id, если id не указан, отображается список всех роутеров
|
||||||
|
* @returns {Promise<*[]>}
|
||||||
|
*/
|
||||||
|
async getUsersBySiteId(id, mode) {
|
||||||
|
if (mode === "dev") {
|
||||||
|
return devUsersList
|
||||||
|
}
|
||||||
|
let res = await get(`${this.apiAddr}/users/by_server/${id}`)
|
||||||
|
let updatedUsers = convertList(res.data, {config: this.config})
|
||||||
|
return updatedUsers
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {User} userData
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
async createUser(userData) {
|
||||||
|
const newUser = await post(`${this.apiAddr}/users`, userData)
|
||||||
|
return newUser
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {User} userData
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
async updateUser(userData) {
|
||||||
|
const updatedUserData = {...userData}
|
||||||
|
delete updatedUserData.id
|
||||||
|
const newUser = await put(`${this.apiAddr}/users/${userData.id}`, updatedUserData)
|
||||||
|
return newUser
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {Number} userId - Сервис id, если id не указан, отображается список всех роутеров
|
||||||
|
* @returns {Promise<*[]>}
|
||||||
|
*/
|
||||||
|
async removeUser(userId) {
|
||||||
|
const removedUser = await remove(`${this.apiAddr}/users/${userId}`)
|
||||||
|
return removedUser
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Функция запускает список запросов к апишке и логает ответы
|
||||||
|
* @returns {Promise<String>}
|
||||||
|
*/
|
||||||
|
async test() {
|
||||||
|
console.log("_______START TEST_______")
|
||||||
|
|
||||||
|
const allUsers = await this.getUsers()
|
||||||
|
console.log("allUsers", allUsers)
|
||||||
|
const serverUser = await this.getUserById(1)
|
||||||
|
console.log("getUserById 1", serverUser)
|
||||||
|
const newUser = await this.createUser({
|
||||||
|
"server_id": 1,
|
||||||
|
"path": "/",
|
||||||
|
"role": 1,
|
||||||
|
"description": "tests swagger",
|
||||||
|
"deepness": 6,
|
||||||
|
"order": 0,
|
||||||
|
"is_cb_on": true,
|
||||||
|
"cb_request_limit": 100,
|
||||||
|
"cb_min_requests": 100,
|
||||||
|
"cb_error_threshold_percentage": 0.35,
|
||||||
|
"cb_interval_duration": 2000000,
|
||||||
|
"cb_open_state_timeout": 1000000
|
||||||
|
})
|
||||||
|
console.log("newUser", newUser)
|
||||||
|
const updatedUser = await this.updateUser({
|
||||||
|
"path": "/updated_path/",
|
||||||
|
"description": "updated_description",
|
||||||
|
"id": newUser.id
|
||||||
|
})
|
||||||
|
console.log("updatedUser", updatedUser)
|
||||||
|
const removedUser = await this.removeUser(newUser.id)
|
||||||
|
console.log("removedUser", removedUser)
|
||||||
|
|
||||||
|
const newUser1 = await this.createUser({
|
||||||
|
"server_id": 1,
|
||||||
|
"path": "/",
|
||||||
|
"role": 1,
|
||||||
|
"description": "tests swagger",
|
||||||
|
"deepness": 6,
|
||||||
|
"order": 0,
|
||||||
|
"is_cb_on": true,
|
||||||
|
"cb_request_limit": 100,
|
||||||
|
"cb_min_requests": 100,
|
||||||
|
"cb_error_threshold_percentage": 0.35,
|
||||||
|
"cb_interval_duration": 2000000,
|
||||||
|
"cb_open_state_timeout": 1000000
|
||||||
|
})
|
||||||
|
const newUser2 = await this.createUser({
|
||||||
|
"server_id": 1,
|
||||||
|
"path": "/",
|
||||||
|
"role": 1,
|
||||||
|
"description": "tests swagger",
|
||||||
|
"deepness": 6,
|
||||||
|
"order": 0,
|
||||||
|
"is_cb_on": true,
|
||||||
|
"cb_request_limit": 100,
|
||||||
|
"cb_min_requests": 100,
|
||||||
|
"cb_error_threshold_percentage": 0.35,
|
||||||
|
"cb_interval_duration": 2000000,
|
||||||
|
"cb_open_state_timeout": 1000000
|
||||||
|
})
|
||||||
|
const newUser3 = await this.createUser({
|
||||||
|
"server_id": 1,
|
||||||
|
"path": "/",
|
||||||
|
"role": 1,
|
||||||
|
"description": "tests swagger",
|
||||||
|
"deepness": 6,
|
||||||
|
"order": 0,
|
||||||
|
"is_cb_on": true,
|
||||||
|
"cb_request_limit": 100,
|
||||||
|
"cb_min_requests": 100,
|
||||||
|
"cb_error_threshold_percentage": 0.35,
|
||||||
|
"cb_interval_duration": 2000000,
|
||||||
|
"cb_open_state_timeout": 1000000
|
||||||
|
})
|
||||||
|
|
||||||
|
const actions = [
|
||||||
|
{
|
||||||
|
...newUser1,
|
||||||
|
action: "update",
|
||||||
|
"path": "/updated_path2/",
|
||||||
|
"description": "updated_description2",
|
||||||
|
}, {
|
||||||
|
...newUser2,
|
||||||
|
action: "update",
|
||||||
|
"path": "/updated_path3/",
|
||||||
|
"description": "updated_description3",
|
||||||
|
}, {
|
||||||
|
...newUser3,
|
||||||
|
action: "remove"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
action: "create",
|
||||||
|
"server_id": 1,
|
||||||
|
"path": "/lalalala/lalalal",
|
||||||
|
"role": 1,
|
||||||
|
"description": "new_route_created",
|
||||||
|
"deepness": 6,
|
||||||
|
"order": 0,
|
||||||
|
"is_cb_on": true,
|
||||||
|
"cb_request_limit": 100,
|
||||||
|
"cb_min_requests": 100,
|
||||||
|
"cb_error_threshold_percentage": 0.35,
|
||||||
|
"cb_interval_duration": 2000000,
|
||||||
|
"cb_open_state_timeout": 1000000
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const mutationsList = await this.updateGroupUsers(actions)
|
||||||
|
console.log("mutationsList", mutationsList)
|
||||||
|
console.log("________END TEST________")
|
||||||
|
|
||||||
|
return "ok"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Users
|
||||||
39
users-manage/src/adapters/adapterOfUsers/apiHelpers.js
Normal file
39
users-manage/src/adapters/adapterOfUsers/apiHelpers.js
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
const post = async (path, data, onError) => {
|
||||||
|
return await axios.post(path, data)
|
||||||
|
.then(r => r.data)
|
||||||
|
.catch(error => {
|
||||||
|
onError && onError(error)
|
||||||
|
console.error('Error post request:', error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const get = async (path) => {
|
||||||
|
return await axios.get(path)
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Error get request:', error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const put = async (path, data, id, onError) => {
|
||||||
|
return await axios.put(`${path}/${id}`, data)
|
||||||
|
.then(r => r.data)
|
||||||
|
.catch(error => {
|
||||||
|
onError && onError(error)
|
||||||
|
console.error('Error put request:', error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const remove = async (path, id, onError) => {
|
||||||
|
return await axios.delete(`${path}/${id}`)
|
||||||
|
.then(r => r.data)
|
||||||
|
.catch(error => {
|
||||||
|
onError && onError(error)
|
||||||
|
console.error('Error delete request:', error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export {get, post, put, remove}
|
||||||
@ -11,9 +11,8 @@ import {
|
|||||||
|
|
||||||
import {TabulatorFull as Tabulator} from 'tabulator-tables';
|
import {TabulatorFull as Tabulator} from 'tabulator-tables';
|
||||||
|
|
||||||
|
|
||||||
import localization from "./localization";
|
|
||||||
import { is, sort, mergeDeepRight } from "ramda";
|
import { is, sort, mergeDeepRight } from "ramda";
|
||||||
|
import localization from "./localization";
|
||||||
import Pagination from "./VTabulatorPagination.vue";
|
import Pagination from "./VTabulatorPagination.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@ -181,13 +181,14 @@ const link = (col) => ({
|
|||||||
const render = (col) => ({
|
const render = (col) => ({
|
||||||
...col,
|
...col,
|
||||||
formatter: (cell, _, onRendered) => {
|
formatter: (cell, _, onRendered) => {
|
||||||
|
|
||||||
onRendered(function () {
|
onRendered(function () {
|
||||||
if (`${col.render}`.includes("{{") && `${col.render}`.includes("}}")) {
|
if (`${col.render}`.includes("{{") && `${col.render}`.includes("}}")) {
|
||||||
let record = cell.getRow().getData();
|
let record = cell.getRow().getData();
|
||||||
cell.getElement().innerHTML = Handlebars.compile(col.render)(
|
cell.getElement().innerHTML = Handlebars.compile(col.render)(
|
||||||
{...record, __record__: record}
|
{...record, __record__: record}
|
||||||
);
|
);
|
||||||
|
} else if (typeof col.render === "function") {
|
||||||
|
cell.getElement().innerHTML = col.render(cell.getRow().getData(), cell.getRow());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -213,6 +214,7 @@ let sorter = (a, b) => {
|
|||||||
const prepCol = (col) =>
|
const prepCol = (col) =>
|
||||||
cond([
|
cond([
|
||||||
[() => is(String, col.render), () => render(col)],
|
[() => is(String, col.render), () => render(col)],
|
||||||
|
[() => is(Function, col.render), () => render(col)],
|
||||||
[equals("link"), () => link(col)],
|
[equals("link"), () => link(col)],
|
||||||
[T, always(col)],
|
[T, always(col)],
|
||||||
])(col.mode);
|
])(col.mode);
|
||||||
|
|||||||
@ -40,7 +40,7 @@ export default {
|
|||||||
:class="`${gridCols}`"
|
:class="`${gridCols}`"
|
||||||
>
|
>
|
||||||
<ModuleContainer>
|
<ModuleContainer>
|
||||||
<ManagerTitle>
|
<ManagerTitle class="mb-4">
|
||||||
<template #title>
|
<template #title>
|
||||||
<span>Список пользователей</span>
|
<span>Список пользователей</span>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -1,10 +1,20 @@
|
|||||||
<script>
|
<script>
|
||||||
// import VTabulator from '@molecules/Tabulator/VTabulator.vue';
|
import VTabulator from '@molecules/Tabulator/VTabulator.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'UsersManagerUsersTable',
|
name: 'UsersManagerUsersTable',
|
||||||
components: {},
|
components: {VTabulator},
|
||||||
|
props: {
|
||||||
|
usersList: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
|
const editItem = (item) => this.editItem(item);
|
||||||
|
|
||||||
|
const deleteItem = (item) => this.deleteItem(item);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
@ -14,33 +24,49 @@ export default {
|
|||||||
sorter: "number",
|
sorter: "number",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: "name",
|
field: "first_name",
|
||||||
title: "Name",
|
title: "First Name",
|
||||||
width: 200,
|
width: 150,
|
||||||
sorter: "string",
|
sorter: "string",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: "age",
|
field: "last_name",
|
||||||
title: "Age",
|
title: "Last Name",
|
||||||
width: 100,
|
width: 150,
|
||||||
sorter: "number",
|
sorter: "string",
|
||||||
},
|
},
|
||||||
],
|
{
|
||||||
dataSource: [{
|
field: "role",
|
||||||
id: 1,
|
title: "Role",
|
||||||
name: "Adnrew",
|
width: 150,
|
||||||
age: 15
|
sorter: "string",
|
||||||
}, {
|
},
|
||||||
id: 2,
|
{
|
||||||
name: "Micheal",
|
title: "Actions",
|
||||||
age: 22
|
formatter: (cell) => {
|
||||||
}, {
|
return `<button @click="editItem(${cell.getRow().getIndex()})">Edit</button>
|
||||||
id: 3,
|
<button @click="deleteItem(${cell.getRow().getIndex()})">Delete</button>`;
|
||||||
name: "Sara",
|
},
|
||||||
age: 32
|
cellClick: function(e, cell) {
|
||||||
}]
|
// Handle the click event and call Vue methods
|
||||||
|
const action = e.target.textContent.toLowerCase();
|
||||||
|
if (action === 'edit') {
|
||||||
|
editItem(cell.getRow().getData());
|
||||||
|
} else if (action === 'delete') {
|
||||||
|
deleteItem(cell.getRow().getData());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
}],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
editItem(item) {
|
||||||
|
console.log('Edit item:', item);
|
||||||
|
},
|
||||||
|
deleteItem(item) {
|
||||||
|
console.log('Delete item:', item);
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -49,7 +75,10 @@ export default {
|
|||||||
class="flex flex-col max-h-[70vh] mb-14"
|
class="flex flex-col max-h-[70vh] mb-14"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
users table
|
<VTabulator
|
||||||
|
:dataSource="usersList"
|
||||||
|
:columns="columns"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -1,12 +1,39 @@
|
|||||||
<script>
|
<script>
|
||||||
|
import {mapActions, mapGetters} from 'vuex'
|
||||||
|
import {useStore} from '@store/index.js'
|
||||||
|
|
||||||
|
import AdapterOfServices from '@adapters/adapterOfServices/Services'
|
||||||
|
import AdapterOfUsers from '@adapters/adapterOfUsers/Users'
|
||||||
|
import ServiceOfUsers from '@services/serviceOfUsers/Users.js'
|
||||||
|
import ServiceOfServices from '@services/serviceOfServices/Services.js'
|
||||||
|
import CaseOfUsersInService from '@useCases/CaseOfUsersInService.js'
|
||||||
|
|
||||||
import PageHeader from "@atoms/AppPageHeader.vue"
|
import PageHeader from "@atoms/AppPageHeader.vue"
|
||||||
import SiteList from "@organisms/SiteList/SiteList.vue"
|
import SiteList from "@organisms/SiteList/SiteList.vue"
|
||||||
import SiteManager from "@organisms/UsersManager/UsersManager.vue"
|
import SiteManager from "@organisms/UsersManager/UsersManager.vue"
|
||||||
import {mapActions, mapGetters} from 'vuex'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'SitesManagerPage',
|
name: 'SitesManagerPage',
|
||||||
components: {SiteManager, SiteList, PageHeader},
|
components: {SiteManager, SiteList, PageHeader},
|
||||||
|
setup() {
|
||||||
|
const url = import.meta.env.VITE_API_URL
|
||||||
|
|
||||||
|
const adapterOfServices = new AdapterOfServices(url)
|
||||||
|
const adapterOfUsers = new AdapterOfUsers(url)
|
||||||
|
|
||||||
|
const store = useStore()
|
||||||
|
|
||||||
|
const serviceOfUsers = new ServiceOfUsers(adapterOfUsers, store)
|
||||||
|
const serviceOfServices = new ServiceOfServices(adapterOfServices, store)
|
||||||
|
|
||||||
|
const caseOfUsersInService = new CaseOfUsersInService(serviceOfUsers, serviceOfServices)
|
||||||
|
|
||||||
|
return {serviceOfUsers, serviceOfServices, caseOfUsersInService}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
}
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters('services', ["sites", "routes", "newRoute", "selectedSiteState"]),
|
...mapGetters('services', ["sites", "routes", "newRoute", "selectedSiteState"]),
|
||||||
},
|
},
|
||||||
@ -28,7 +55,13 @@ export default {
|
|||||||
<template>
|
<template>
|
||||||
<div class="p-6">
|
<div class="p-6">
|
||||||
<PageHeader class="me-2 mb-6" />
|
<PageHeader class="me-2 mb-6" />
|
||||||
<SiteList :selectSite="selectSite" />
|
<SiteList
|
||||||
<SiteManager v-if="selectedSiteState === 'active'" />
|
:serviceOfUsers="serviceOfServices"
|
||||||
|
:caseOfUsersInService="caseOfUsersInService"
|
||||||
|
/>
|
||||||
|
<SiteManager
|
||||||
|
v-if="selectedSiteState === 'active'"
|
||||||
|
:serviceOfUsers="serviceOfUsers"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -8,6 +8,14 @@ import {devUsersList} from './StaticData.js'
|
|||||||
* @param {Number} id
|
* @param {Number} id
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const adapter_config = {
|
||||||
|
id: 'id',
|
||||||
|
first_name: 'first_name',
|
||||||
|
last_name: 'last_name',
|
||||||
|
email: 'email',
|
||||||
|
role: 'role',
|
||||||
|
is_active: 'is_active'
|
||||||
|
}
|
||||||
class Users {
|
class Users {
|
||||||
/**
|
/**
|
||||||
* Класс управления роутерами
|
* Класс управления роутерами
|
||||||
@ -16,7 +24,7 @@ class Users {
|
|||||||
* @param {Object | undefined} params - Конфиг настроек
|
* @param {Object | undefined} params - Конфиг настроек
|
||||||
* @param {'prod' | 'test'} params.mode - Конфиг настроек
|
* @param {'prod' | 'test'} params.mode - Конфиг настроек
|
||||||
*/
|
*/
|
||||||
constructor(apiAddr, adapter_config = {}, params = {mode: 'prod'}) {
|
constructor(apiAddr, params = {mode: 'prod'}) {
|
||||||
this.apiAddr = apiAddr
|
this.apiAddr = apiAddr
|
||||||
this.config = adapter_config
|
this.config = adapter_config
|
||||||
this.mode = params.mode
|
this.mode = params.mode
|
||||||
|
|||||||
14
users-manage/src/services/serviceOfServices/Services.js
Normal file
14
users-manage/src/services/serviceOfServices/Services.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
class ServiceOfServices {
|
||||||
|
constructor(adapterOfServices, store) {
|
||||||
|
this.adapterOfServices = adapterOfServices
|
||||||
|
this.store = store
|
||||||
|
}
|
||||||
|
|
||||||
|
async fetchServicesList() {
|
||||||
|
const services = await this.adapterOfServices.getServices()
|
||||||
|
this.store.dispatch('services/saveServices', services)
|
||||||
|
return services
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ServiceOfServices
|
||||||
6
users-manage/src/services/serviceOfUsers/Users.js
Normal file
6
users-manage/src/services/serviceOfUsers/Users.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
class UsersOfServices {
|
||||||
|
constructor() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default UsersOfServices
|
||||||
@ -1,14 +1,7 @@
|
|||||||
import Users from '@helpers/Users/Users.js';
|
import Users from '@helpers/Users/Users.js';
|
||||||
|
|
||||||
const path = import.meta.env.VITE_API_ADDR
|
const path = import.meta.env.VITE_API_ADDR
|
||||||
const UsersService = new Users(path, {
|
const UsersService = new Users(path)
|
||||||
id: 'id',
|
|
||||||
first_name: 'first_name',
|
|
||||||
last_name: 'last_name',
|
|
||||||
email: 'email',
|
|
||||||
role: 'role',
|
|
||||||
is_active: 'is_active'
|
|
||||||
})
|
|
||||||
|
|
||||||
const initState = {
|
const initState = {
|
||||||
usersList: [],
|
usersList: [],
|
||||||
@ -36,7 +29,7 @@ const actions = {
|
|||||||
commit('setComponentState', 'active')
|
commit('setComponentState', 'active')
|
||||||
},
|
},
|
||||||
resetStore: ({state}) => {
|
resetStore: ({state}) => {
|
||||||
Object.entries(initState).forEach(([k,v]) => {
|
Object.entries(initState).forEach(([k, v]) => {
|
||||||
state[k] = v
|
state[k] = v
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|||||||
9
users-manage/src/useCases/CaseOfUsersInService.js
Normal file
9
users-manage/src/useCases/CaseOfUsersInService.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
class UsersInService {
|
||||||
|
constructor(serviceOfUsers, serviceOfServices) {
|
||||||
|
this.serviceOfUsers = serviceOfUsers
|
||||||
|
this.serviceOfServices = serviceOfServices
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export default UsersInService
|
||||||
11
users-manage/tests/adapters/Services.test.js
Normal file
11
users-manage/tests/adapters/Services.test.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import {describe, expect, test} from "vitest";
|
||||||
|
import AdapterOfServices from '@adapters/adapterOfServices/Services'
|
||||||
|
|
||||||
|
|
||||||
|
describe('tests for AdapterOfServices', () => {
|
||||||
|
test('init', () => {
|
||||||
|
const adapterOfServices = new AdapterOfServices('http://localhost:8080', {})
|
||||||
|
|
||||||
|
expect(adapterOfServices).toBeDefined()
|
||||||
|
})
|
||||||
|
})
|
||||||
11
users-manage/tests/adapters/Users.test.js
Normal file
11
users-manage/tests/adapters/Users.test.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import {describe, expect, test} from "vitest";
|
||||||
|
import AdapterOfUsers from '@adapters/adapterOfUsers/Users'
|
||||||
|
|
||||||
|
|
||||||
|
describe('test for AdapterOfUsers', () => {
|
||||||
|
test('init', () => {
|
||||||
|
const adapterOfUsers = new AdapterOfUsers('http://localhost:8080')
|
||||||
|
|
||||||
|
expect(adapterOfUsers).toBeDefined()
|
||||||
|
})
|
||||||
|
})
|
||||||
66
users-manage/tests/services/serviceOfServices.test.js
Normal file
66
users-manage/tests/services/serviceOfServices.test.js
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
import {describe, expect, test, beforeEach} from "vitest";
|
||||||
|
import ServiceOfServices from '@services/serviceOfServices/Services.js'
|
||||||
|
import {createStore} from 'vuex'
|
||||||
|
|
||||||
|
class AdapterOfServices {
|
||||||
|
constructor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
async getServices() {
|
||||||
|
return [{id: 1, name: 'service1'}, {id: 2, name: 'service2'}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const services = {
|
||||||
|
namespaced: true,
|
||||||
|
state: {
|
||||||
|
servicesList: [],
|
||||||
|
},
|
||||||
|
mutations: {
|
||||||
|
setServicesList(state, services) {
|
||||||
|
state.servicesList = services
|
||||||
|
},
|
||||||
|
},
|
||||||
|
getters: {
|
||||||
|
servicesList: state => {
|
||||||
|
return state.servicesList
|
||||||
|
}
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
resetStore({state}) {
|
||||||
|
state.servicesList = []
|
||||||
|
},
|
||||||
|
saveServices({commit}, services) {
|
||||||
|
commit('setServicesList', services)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('tests for ServiceOfServices', () => {
|
||||||
|
const adapterOfServices = new AdapterOfServices()
|
||||||
|
|
||||||
|
const store = createStore({
|
||||||
|
modules: {
|
||||||
|
services,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
beforeEach( async() => {
|
||||||
|
await store.dispatch('services/resetStore')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('init', () => {
|
||||||
|
const serviceOfServices = new ServiceOfServices(adapterOfServices, store)
|
||||||
|
|
||||||
|
expect(serviceOfServices).toBeDefined()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test of fetchServicesList', async () => {
|
||||||
|
const serviceOfServices = new ServiceOfServices(adapterOfServices, store)
|
||||||
|
|
||||||
|
await serviceOfServices.fetchServicesList()
|
||||||
|
const usersList = store.getters['services/servicesList']
|
||||||
|
|
||||||
|
expect(usersList).toEqual([{id: 1, name: 'service1'}, {id: 2, name: 'service2'}])
|
||||||
|
})
|
||||||
|
})
|
||||||
18
users-manage/tests/services/serviceOfUsers.test.js
Normal file
18
users-manage/tests/services/serviceOfUsers.test.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import {describe, expect, test} from "vitest";
|
||||||
|
import ServiceOfUsers from '@services/serviceOfUsers/Users.js'
|
||||||
|
|
||||||
|
class AdapterOfUsers {
|
||||||
|
constructor() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('test for ServiceOfUsers', () => {
|
||||||
|
test('init', () => {
|
||||||
|
const adapterOfUsers = new AdapterOfUsers()
|
||||||
|
|
||||||
|
const serviceOfUsers = new ServiceOfUsers(adapterOfUsers)
|
||||||
|
|
||||||
|
expect(serviceOfUsers).toBeDefined()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
106
users-manage/tests/useCases/CaseOfUsersInService.test.js
Normal file
106
users-manage/tests/useCases/CaseOfUsersInService.test.js
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
import {describe, expect, test, beforeEach} from "vitest";
|
||||||
|
import CaseOfUsersInService from '@useCases/CaseOfUsersInService.js'
|
||||||
|
import {createStore} from 'vuex'
|
||||||
|
|
||||||
|
class ServiceOfUsers {
|
||||||
|
constructor(adapter, store) {
|
||||||
|
this.adapter = adapter
|
||||||
|
this.store = store
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ServiceOfServices {
|
||||||
|
constructor(adapter, store) {
|
||||||
|
this.adapter = adapter
|
||||||
|
this.store = store
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AdapterOfUsers {
|
||||||
|
constructor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
async getUsersListByServiceId(serviceId) {
|
||||||
|
return [{id: 1, name: 'user1'}, {id: 2, name: 'user2'}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AdapterOfServices {
|
||||||
|
constructor() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('tests for caseOfUsersInService', () => {
|
||||||
|
const store = createStore({
|
||||||
|
modules: {
|
||||||
|
services: {
|
||||||
|
namespaced: true,
|
||||||
|
state: {
|
||||||
|
services: [],
|
||||||
|
},
|
||||||
|
mutations: {
|
||||||
|
setServices(state, services) {
|
||||||
|
state.services = services
|
||||||
|
},
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
resetStore({state}) {
|
||||||
|
state.services = []
|
||||||
|
},
|
||||||
|
saveServices({commit}, services) {
|
||||||
|
commit('setServices', services)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
users: {
|
||||||
|
namespaced: true,
|
||||||
|
state: {
|
||||||
|
siteUsersList: [],
|
||||||
|
},
|
||||||
|
mutations: {
|
||||||
|
setSiteUsersList(state, users) {
|
||||||
|
state.users = users
|
||||||
|
},
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
resetStore({state}) {
|
||||||
|
state.siteUsersList = []
|
||||||
|
},
|
||||||
|
saveUsers({commit}, users) {
|
||||||
|
commit('setSiteUsersList', users)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const adapterOfUsers = new AdapterOfUsers()
|
||||||
|
const adapterOfServices = new AdapterOfServices()
|
||||||
|
|
||||||
|
const serviceOfUsers = new ServiceOfUsers(adapterOfUsers, store)
|
||||||
|
const serviceOfServices = new ServiceOfServices(adapterOfServices, store)
|
||||||
|
|
||||||
|
beforeEach( async() => {
|
||||||
|
await store.dispatch('services/resetStore')
|
||||||
|
await store.dispatch('users/resetStore')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('init', () => {
|
||||||
|
const caseOfUsersInService = new CaseOfUsersInService(serviceOfUsers, serviceOfServices)
|
||||||
|
|
||||||
|
expect(caseOfUsersInService).toBeDefined()
|
||||||
|
})
|
||||||
|
|
||||||
|
// test('selectServiceAndFetchRoutes', async () => {
|
||||||
|
// const caseOfUsersInService = new CaseOfUsersInService(serviceOfUsers, serviceOfServices)
|
||||||
|
//
|
||||||
|
// await caseOfUsersInService.selectServiceAndFetchRoutes(1)
|
||||||
|
//
|
||||||
|
// const selectedService = store.getters['services/selectedService']
|
||||||
|
// const usersList = store.getters['users/siteUsersList']
|
||||||
|
//
|
||||||
|
// expect(selectedService).toEqual({id: 1, name: 'service1'})
|
||||||
|
// expect(usersList).toEqual([{id: 1, name: 'user1'}, {id: 2, name: 'user2'}])
|
||||||
|
// })
|
||||||
|
})
|
||||||
@ -12,5 +12,3 @@ describe("tests AppPageHeader component", () => {
|
|||||||
expect(wrapper.exists()).toBe(true)
|
expect(wrapper.exists()).toBe(true)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@ describe("tests VTabulator component", () => {
|
|||||||
|
|
||||||
vi.mock('tabulator-tables', () => {
|
vi.mock('tabulator-tables', () => {
|
||||||
|
|
||||||
const Tabulator = vi.fn(() => {
|
const tabulator = vi.fn(() => {
|
||||||
return {
|
return {
|
||||||
getHtml: () => {
|
getHtml: () => {
|
||||||
return '<div>test</div>'
|
return '<div>test</div>'
|
||||||
@ -17,7 +17,7 @@ describe("tests VTabulator component", () => {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
__esModule: true,
|
__esModule: true,
|
||||||
TabulatorFull: Tabulator
|
TabulatorFull: tabulator
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -17,6 +17,13 @@ describe("tests SitesManagerPage component mounted with vuex", () => {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
vi.mock('tabulator-tables', () => {
|
||||||
|
const mockTabulator = vi.fn().mockImplementation(() => ({
|
||||||
|
// Mock implementation details
|
||||||
|
}));
|
||||||
|
return { TabulatorFull: mockTabulator }; // Adjust based on what you're trying to mock
|
||||||
|
});
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
store.dispatch('users/resetStore')
|
store.dispatch('users/resetStore')
|
||||||
store.dispatch('services/resetStore')
|
store.dispatch('services/resetStore')
|
||||||
@ -47,12 +54,13 @@ describe("tests SitesManagerPage component mounted with vuex", () => {
|
|||||||
|
|
||||||
test('test UsersManager mounted with vuex', async () => {
|
test('test UsersManager mounted with vuex', async () => {
|
||||||
const wrapper = mount(UsersManager, {
|
const wrapper = mount(UsersManager, {
|
||||||
shallow: true,
|
|
||||||
global: {
|
global: {
|
||||||
plugins: [store]
|
plugins: [store]
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
console.log(wrapper.html())
|
||||||
|
|
||||||
const componentState = wrapper.vm.componentState
|
const componentState = wrapper.vm.componentState
|
||||||
const gridCols = wrapper.vm.gridCols
|
const gridCols = wrapper.vm.gridCols
|
||||||
expect(componentState).toBe('view')
|
expect(componentState).toBe('view')
|
||||||
|
|||||||
@ -8,7 +8,8 @@ import axios from "axios";
|
|||||||
|
|
||||||
vi.mock('axios')
|
vi.mock('axios')
|
||||||
|
|
||||||
describe("tests SitesManagerPage component mounted with vuex", () => {
|
|
||||||
|
describe("tests App mounted with vuex", () => {
|
||||||
const store = createStore({
|
const store = createStore({
|
||||||
plugins: [],
|
plugins: [],
|
||||||
modules: {
|
modules: {
|
||||||
@ -32,7 +33,6 @@ describe("tests SitesManagerPage component mounted with vuex", () => {
|
|||||||
data: mockData,
|
data: mockData,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
test('tests App mounted with vuex', async () => {
|
test('tests App mounted with vuex', async () => {
|
||||||
const wrapper = mount(Sites, {
|
const wrapper = mount(Sites, {
|
||||||
shallow: true,
|
shallow: true,
|
||||||
|
|||||||
@ -16,6 +16,9 @@ export default defineConfig({
|
|||||||
'@organisms': fileURLToPath(new URL('./src/components/3_organisms', import.meta.url)),
|
'@organisms': fileURLToPath(new URL('./src/components/3_organisms', import.meta.url)),
|
||||||
'@pages': fileURLToPath(new URL('./src/components/5_pages', import.meta.url)),
|
'@pages': fileURLToPath(new URL('./src/components/5_pages', import.meta.url)),
|
||||||
'@router': fileURLToPath(new URL('/src/router/index.js', import.meta.url)),
|
'@router': fileURLToPath(new URL('/src/router/index.js', import.meta.url)),
|
||||||
|
'@adapters': fileURLToPath(new URL('/src/adapters', import.meta.url)),
|
||||||
|
'@services': fileURLToPath(new URL('/src/services', import.meta.url)),
|
||||||
|
'@useCases': fileURLToPath(new URL('/src/useCases', import.meta.url)),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
test: {
|
test: {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user