@ozdao/prometheus-framework 0.2.68 → 0.2.70
Sign up to get free protection for your applications and to get access to all the features.
- package/package.json +1 -1
- package/src/components/ButtonSegmented/ButtonSegmented.vue +78 -0
- package/src/components/Completion/Completion.vue +76 -0
- package/src/components/Feed/Feed.vue +46 -18
- package/src/components/Tab/Tab.vue +11 -30
- package/src/modules/auth/components/pages/Invite.vue +1 -1
- package/src/modules/auth/controllers/auth.controller.js +10 -21
- package/src/modules/backoffice/router/backoffice.js +3 -3
- package/src/modules/events/components/elements/ButtonCheck.vue +15 -15
- package/src/modules/events/components/pages/EditEventTickets.vue +39 -13
- package/src/modules/events/components/pages/Event.vue +1 -2
- package/src/modules/events/controllers/tickets.controller.js +151 -98
- package/src/modules/events/controllers/utils/templateEmail.js +14 -0
- package/src/modules/events/controllers/utils/templateTicket.js +194 -0
- package/src/modules/events/router/events.js +3 -0
- package/src/modules/events/store/tickets.js +2 -2
- package/src/modules/globals/controllers/utils/queryProcessor.js +31 -6
- package/src/modules/globals/utils/mailing.js +19 -12
- package/src/modules/icons/entities/IconEvents.vue +7 -2
- package/src/modules/landing/components/pages/Home.vue +1 -1
- package/src/modules/orders/components/blocks/CardOrder.vue +1 -1
- package/src/modules/orders/components/blocks/CardOrderVar1.vue +97 -0
- package/src/modules/orders/components/pages/{FormOrder.vue → OrderCreate.vue} +20 -11
- package/src/modules/orders/components/pages/{EditOrder.vue → OrderCreateBackoffice.vue} +74 -17
- package/src/modules/orders/components/pages/Orders.vue +181 -70
- package/src/modules/orders/components/pages/Orders_refact.vue +2 -2
- package/src/modules/orders/components/sections/FormClientDetails.vue +24 -26
- package/src/modules/{applications → orders}/components/sections/SubscribeNewsletter.vue +1 -1
- package/src/modules/orders/controllers/orders.controller.js +46 -7
- package/src/modules/orders/models/customer.model.js +31 -0
- package/src/modules/orders/models/order.model.js +8 -13
- package/src/modules/orders/orders.client.js +67 -0
- package/src/modules/orders/orders.server.js +15 -0
- package/src/modules/orders/router/orders.router.js +1 -1
- package/src/modules/orders/store/orders.js +17 -2
- package/src/modules/users/components/pages/Profile.vue +6 -4
- package/src/modules/users/components/sections/ProfileCompletion.vue +30 -15
- package/src/modules/users/controllers/users.controller.js +0 -2
- package/src/modules/users/models/user.model.js +6 -5
- package/src/modules/users/users.server.js +1 -0
- package/src/styles/base/borders.scss +5 -2
- package/src/styles/config.scss +3 -4
- package/src/modules/applications/applications.client.js +0 -1
- package/src/modules/orders/components/blocks/Positions.vue +0 -177
- package/src/modules/users/models/client.model.js +0 -60
- /package/src/modules/{applications → orders}/controllers/applications.controller.js +0 -0
- /package/src/modules/{testimonials → orders}/controllers/testimonials.controller.js +0 -0
- /package/src/modules/{applications → orders}/models/application.model.js +0 -0
- /package/src/modules/{testimonials → orders}/models/testimonial.model.js +0 -0
- /package/src/modules/{applications → orders}/routes/applications.routes.js +0 -0
- /package/src/modules/{testimonials → orders}/routes/testimonials.routes.js +0 -0
- /package/src/modules/{applications → orders}/store/applications.js +0 -0
- /package/src/modules/{testimonials → orders}/store/testimonials.js +0 -0
- /package/src/modules/{payments → wallet}/components/pages/Payments.vue +0 -0
- /package/src/modules/{payments → wallet}/controllers/payments.controller.js +0 -0
- /package/src/modules/{payments → wallet}/controllers/payments.tinkoff.controller.js +0 -0
- /package/src/modules/{payments → wallet}/models/payment.model.js +0 -0
- /package/src/modules/{payments → wallet}/models/payment.tinkoff.model.js +0 -0
- /package/src/modules/{payments → wallet}/routes/payments.routes.js +0 -0
- /package/src/modules/{payments → wallet}/routes/payments.tinkoff.routes.js +0 -0
- /package/src/modules/{payments → wallet}/store/payments.js +0 -0
@@ -1,51 +1,49 @@
|
|
1
1
|
<template>
|
2
2
|
<Block title="Personal Data" class="mn-b-thin">
|
3
3
|
<Field
|
4
|
-
v-model:field="order.
|
4
|
+
v-model:field="order.customer.name"
|
5
5
|
label="Name*"
|
6
6
|
placeholder="Enter your name"
|
7
7
|
class="bg-white pd-medium radius-small mn-b-thin"
|
8
8
|
/>
|
9
|
-
|
10
|
-
<FieldPhone
|
11
|
-
v-model="order.client.phone"
|
12
|
-
@country="(country) => { order.client.number = country }"
|
13
|
-
:inputOptions="{
|
14
|
-
placeholder: 'Enter contact phone number',
|
15
|
-
type: 'tel',
|
16
|
-
}"
|
17
|
-
:defaultCountry="'TH'"
|
18
|
-
:validCharactersOnly="true"
|
19
|
-
:dropdownOptions="{
|
20
|
-
showDialCodeInSelection: true,
|
21
|
-
showFlags: true,
|
22
|
-
showDialCodeInList: true
|
23
|
-
}"
|
24
|
-
mode="national"
|
25
|
-
class="bg-white pd-small radius-small mn-b-thin"
|
26
|
-
/>
|
27
|
-
|
28
|
-
<p class="mn-b-small">
|
29
|
-
Prefer to chat instead of calling? Just drop your messenger info here:
|
30
|
-
</p>
|
31
9
|
|
32
10
|
<div class="flex-nowrap flex">
|
11
|
+
|
33
12
|
<Select
|
34
13
|
:options="[
|
14
|
+
{name: 'Phone', value: 'phone'},
|
35
15
|
{name: 'Telegram', value: 'telegram'},
|
36
16
|
{name: 'WhatsApp', value: 'whatsapp'},
|
37
17
|
{name: 'Line', value: 'line'},
|
38
18
|
]"
|
39
|
-
@update:select="(option) => order.
|
19
|
+
@update:select="(option) => order.customer.messenger.type = option.value"
|
40
20
|
placeholder="Messenger"
|
41
21
|
size="small"
|
42
22
|
class="bg-white pd-medium radius-small mn-r-small"
|
43
23
|
/>
|
44
24
|
|
45
|
-
|
46
|
-
v-model:field="order.
|
25
|
+
<!-- <Field
|
26
|
+
v-model:field="order.customer.messenger.value"
|
47
27
|
placeholder="Enter your contact here"
|
48
28
|
class="bg-white pd-medium radius-small w-100"
|
29
|
+
/> -->
|
30
|
+
|
31
|
+
<FieldPhone
|
32
|
+
v-model="order.customer.phone"
|
33
|
+
@country="(country) => { order.customer.number = country }"
|
34
|
+
:inputOptions="{
|
35
|
+
placeholder: 'Enter contact phone number',
|
36
|
+
type: 'tel',
|
37
|
+
}"
|
38
|
+
:defaultCountry="'TH'"
|
39
|
+
:validCharactersOnly="true"
|
40
|
+
:dropdownOptions="{
|
41
|
+
showDialCodeInSelection: true,
|
42
|
+
showFlags: true,
|
43
|
+
showDialCodeInList: true
|
44
|
+
}"
|
45
|
+
mode="national"
|
46
|
+
class="bg-white pd-small radius-small mn-b-thin"
|
49
47
|
/>
|
50
48
|
</div>
|
51
49
|
</Block>
|
@@ -38,7 +38,7 @@ import { ref } from 'vue'
|
|
38
38
|
import FieldBig from "@pf/src/components/FieldBig/FieldBig.vue";
|
39
39
|
|
40
40
|
import * as globals from '@pf/src/modules/globals/store/globals.js';
|
41
|
-
import * as applications from '@pf/src/modules/
|
41
|
+
import * as applications from '@pf/src/modules/orders/store/applications.js';
|
42
42
|
|
43
43
|
import * as inputsValidation from '@pf/src/modules/middlewares/client/inputs.validation'
|
44
44
|
|
@@ -9,19 +9,21 @@ function formatPositions(positions) {
|
|
9
9
|
function formatOrderMessage(order) {
|
10
10
|
return `
|
11
11
|
🆕 New Order Received!
|
12
|
-
👤
|
13
|
-
💬 Messenger: ${order.
|
12
|
+
👤 Customer: ${order.customer?.name} (${order.customer?.phone?.number ? order.customer?.phone?.number : 'No phone'})
|
13
|
+
💬 Messenger: ${order.customer?.messenger ? order.customer?.messenger?.type + ' ' + order.customer?.messenger?.value : 'None'}
|
14
14
|
🏢 Organization: ${order.organization}
|
15
15
|
📦 Positions:\n${formatPositions(order.positions)}
|
16
16
|
📝 Comment: ${order.comment ? order.comment : 'No comment'}
|
17
|
-
💳 Payment: ${order.payment
|
18
|
-
🚚 Delivery: ${order.delivery
|
17
|
+
💳 Payment: ${order.payment?.type}
|
18
|
+
🚚 Delivery: ${order.delivery?.type} to ${order.delivery?.address}
|
19
19
|
📌 Status: ${order.status}
|
20
|
+
🧑 Agent: ${order.referralCode}
|
20
21
|
`;
|
21
22
|
}
|
22
23
|
|
23
24
|
const controllerFactory = (db) => {
|
24
25
|
const Order = db.order;
|
26
|
+
const Customer = db.customer;
|
25
27
|
|
26
28
|
// Создание заказа
|
27
29
|
const create = async (req, res) => {
|
@@ -38,8 +40,46 @@ const controllerFactory = (db) => {
|
|
38
40
|
comment: ''
|
39
41
|
});
|
40
42
|
|
43
|
+
console.log(req.body)
|
44
|
+
|
41
45
|
try {
|
42
|
-
//
|
46
|
+
// Поиск или создание клиента
|
47
|
+
let searchCriteria = {};
|
48
|
+
|
49
|
+
if (req.body.customer.phone) {
|
50
|
+
searchCriteria.phone = req.body.customer.phone;
|
51
|
+
}
|
52
|
+
|
53
|
+
if (req.body.customer.email) {
|
54
|
+
searchCriteria.email = req.body.customer.email;
|
55
|
+
}
|
56
|
+
|
57
|
+
let customer = await Customer.findOne({ $or: [searchCriteria] });
|
58
|
+
|
59
|
+
if (!customer) {
|
60
|
+
customer = await Customer.create(req.body.customer);
|
61
|
+
}
|
62
|
+
|
63
|
+
// Присвоение идентификатора клиента заказу
|
64
|
+
req.body.customer = {
|
65
|
+
type: 'Customer',
|
66
|
+
target: customer._id
|
67
|
+
}
|
68
|
+
|
69
|
+
if (!req.body.creator?.target) {
|
70
|
+
req.body.creator = {
|
71
|
+
type: 'Customer',
|
72
|
+
target: customer._id
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
} catch (err) {
|
77
|
+
console.log(err);
|
78
|
+
return res.status(500).send({ errorCode: "CLIENT_PROCESSING_FAILED", message: "Error occurred while processing the customer.", error: err });
|
79
|
+
}
|
80
|
+
|
81
|
+
try {
|
82
|
+
const formattedMessage = formatOrderMessage(req.body);
|
43
83
|
console.log(formattedMessage)
|
44
84
|
const messageSent = await sendChatMessageTelegram(process.env.TELEGRAM_BOT_USERS.split(","),formattedMessage)
|
45
85
|
} catch (err) {
|
@@ -56,8 +96,6 @@ const controllerFactory = (db) => {
|
|
56
96
|
};
|
57
97
|
|
58
98
|
const read = async (req, res) => {
|
59
|
-
|
60
|
-
let stages = [];
|
61
99
|
|
62
100
|
stages = [
|
63
101
|
...queryProcessorGlobals.getBasicOptions(
|
@@ -66,6 +104,7 @@ const controllerFactory = (db) => {
|
|
66
104
|
// For creator
|
67
105
|
queryProcessorGlobals.getCreatorUserLookupStage(),
|
68
106
|
queryProcessorGlobals.getCreatorOrganizationLookupStage(),
|
107
|
+
queryProcessorGlobals.getCreatorCustomerLookupStage(),
|
69
108
|
// For owner
|
70
109
|
queryProcessorGlobals.getOwnerUserLookupStage(),
|
71
110
|
queryProcessorGlobals.getOwnerOrganizationLookupStage(),
|
@@ -0,0 +1,31 @@
|
|
1
|
+
const applyOwnershipSchema = require('@pf/src/modules/globals/models/ownership.schema.js');
|
2
|
+
|
3
|
+
module.exports = (db) => {
|
4
|
+
|
5
|
+
const CustomerSchema = new db.mongoose.Schema({
|
6
|
+
// target: {
|
7
|
+
// type: {
|
8
|
+
// type: String,
|
9
|
+
// required: true
|
10
|
+
// },
|
11
|
+
// target: {
|
12
|
+
// type: db.mongoose.Schema.Types.ObjectId,
|
13
|
+
// refPath: 'target.type',
|
14
|
+
// required: true,
|
15
|
+
// },
|
16
|
+
// },
|
17
|
+
referralCode: {
|
18
|
+
type: String
|
19
|
+
}
|
20
|
+
},{
|
21
|
+
timestamps: { currentTime: () => Date.now()
|
22
|
+
}
|
23
|
+
|
24
|
+
});
|
25
|
+
|
26
|
+
// applyOwnershipSchema(CustomerSchema,db);
|
27
|
+
|
28
|
+
const Customer = db.mongoose.model("Customer", CustomerSchema);
|
29
|
+
|
30
|
+
return Customer;
|
31
|
+
}
|
@@ -3,31 +3,26 @@ const applyOwnershipSchema = require('@pf/src/modules/globals/models/ownership.s
|
|
3
3
|
module.exports = (db) => {
|
4
4
|
|
5
5
|
const OrderSchema = new db.mongoose.Schema({
|
6
|
-
|
7
|
-
type: {
|
6
|
+
customer: {
|
7
|
+
type: {
|
8
8
|
type: String,
|
9
|
-
|
9
|
+
required: true
|
10
10
|
},
|
11
11
|
target: {
|
12
12
|
type: db.mongoose.Schema.Types.ObjectId,
|
13
|
-
refPath: '
|
13
|
+
refPath: 'customer.type',
|
14
|
+
required: true,
|
14
15
|
},
|
15
|
-
table: { type: String, trim: true },
|
16
|
-
name: { type: String, trim: true },
|
17
|
-
phone: { type: Object, trim: true },
|
18
|
-
email: { type: String, trim: true },
|
19
|
-
messenger: {
|
20
|
-
type: { type: String, trim: true },
|
21
|
-
value: { type: String, trim: true }
|
22
|
-
}
|
23
16
|
},
|
24
17
|
positions: {
|
25
18
|
type: Array
|
26
19
|
},
|
20
|
+
referralCode: {
|
21
|
+
type: String
|
22
|
+
},
|
27
23
|
status: {
|
28
24
|
type: String
|
29
25
|
},
|
30
|
-
|
31
26
|
status_history: [{
|
32
27
|
status: {
|
33
28
|
type: String,
|
@@ -0,0 +1,67 @@
|
|
1
|
+
// Importing Vue components from the components directory
|
2
|
+
|
3
|
+
import Orders from './components/pages/Orders.vue';
|
4
|
+
import Order from './components/pages/Order.vue';
|
5
|
+
import EditOrder from './components/pages/EditOrder.vue';
|
6
|
+
|
7
|
+
// import Favorites from './components/pages/Favorites.vue';
|
8
|
+
|
9
|
+
// Importing blocks components
|
10
|
+
import CardOrderItem from './components/blocks/CardOrderItem.vue';
|
11
|
+
import CardOrder from './components/blocks/CardOrder.vue';
|
12
|
+
|
13
|
+
import StatusHistory from './components/blocks/StatusHistory.vue';
|
14
|
+
|
15
|
+
import FormOrder from './components/pages/FormOrder.vue';
|
16
|
+
|
17
|
+
// Importing sections components
|
18
|
+
import FormClientDetails from './components/sections/FormClientDetails.vue';
|
19
|
+
import FormPayment from './components/sections/FormPayment.vue';
|
20
|
+
import FormDelivery from './components/sections/FormDelivery.vue';
|
21
|
+
|
22
|
+
import EmptyState from './components/sections/EmptyState.vue';
|
23
|
+
import AskToLogin from './components/sections/AskToLogin.vue';
|
24
|
+
import Succes from './components/sections/Succes.vue';
|
25
|
+
|
26
|
+
// Importing partials components
|
27
|
+
import ShopCart from './components/partials/ShopCart.vue';
|
28
|
+
|
29
|
+
// Importing Vuex store modules from the store directory
|
30
|
+
import * as ordersStore from './store/orders.js';
|
31
|
+
import * as shopcartStore from './store/shopcart.js';
|
32
|
+
|
33
|
+
// Importing Vue Router routes from the router directory
|
34
|
+
import ordersRoutes from './router/orders.router.js';
|
35
|
+
|
36
|
+
// Exporting components, store modules, and routes
|
37
|
+
export {
|
38
|
+
// Pages
|
39
|
+
FormOrder,
|
40
|
+
Order,
|
41
|
+
Orders,
|
42
|
+
EditOrder,
|
43
|
+
// Favorites,
|
44
|
+
|
45
|
+
// Blocks
|
46
|
+
CardOrderItem,
|
47
|
+
CardOrder,
|
48
|
+
StatusHistory,
|
49
|
+
|
50
|
+
// Sections
|
51
|
+
FormClientDetails,
|
52
|
+
AskToLogin,
|
53
|
+
FormDelivery,
|
54
|
+
EmptyState,
|
55
|
+
Succes,
|
56
|
+
FormPayment,
|
57
|
+
|
58
|
+
// Partials
|
59
|
+
ShopCart,
|
60
|
+
|
61
|
+
// Store
|
62
|
+
ordersStore,
|
63
|
+
shopcartStore,
|
64
|
+
|
65
|
+
// Router
|
66
|
+
ordersRoutes
|
67
|
+
};
|
@@ -0,0 +1,15 @@
|
|
1
|
+
// Importing controllers from the controllers directory
|
2
|
+
const ordersController = require('./controllers/orders.controller.js');
|
3
|
+
// Importing routes from the routes directory
|
4
|
+
const ordersRoutes = require('./routes/orders.routes.js');
|
5
|
+
// Models
|
6
|
+
const OrderModel = require('./models/order.model.js');
|
7
|
+
const CustomerModel = require('./models/customer.model.js');
|
8
|
+
|
9
|
+
// Exporting controllers, routes, and models
|
10
|
+
module.exports = {
|
11
|
+
ordersController,
|
12
|
+
ordersRoutes,
|
13
|
+
UserModel,
|
14
|
+
CustomerModel
|
15
|
+
};
|
@@ -19,7 +19,7 @@ const orders = [
|
|
19
19
|
ru: 'Заказ'
|
20
20
|
}
|
21
21
|
},
|
22
|
-
component: () => import(/* webpackChunkName: 'Order' */ '@pf/src/modules/orders/components/pages/
|
22
|
+
component: () => import(/* webpackChunkName: 'Order' */ '@pf/src/modules/orders/components/pages/OrderCreate.vue')
|
23
23
|
},{
|
24
24
|
path: ':order',
|
25
25
|
name: 'Order Status',
|
@@ -22,11 +22,11 @@ const state = reactive({
|
|
22
22
|
},
|
23
23
|
|
24
24
|
creator: {
|
25
|
-
type: '
|
25
|
+
type: 'customer',
|
26
26
|
target: null,
|
27
27
|
},
|
28
28
|
|
29
|
-
|
29
|
+
customer: {
|
30
30
|
name: null,
|
31
31
|
phone: null,
|
32
32
|
messenger: {
|
@@ -122,6 +122,20 @@ const actions = {
|
|
122
122
|
},
|
123
123
|
}
|
124
124
|
|
125
|
+
// const getters = {
|
126
|
+
// getTotal(positions) {
|
127
|
+
//
|
128
|
+
// }
|
129
|
+
// }
|
130
|
+
|
131
|
+
const getters = {
|
132
|
+
getTotal(positions) {
|
133
|
+
return positions.reduce((total, product) => {
|
134
|
+
return total + product.price * product.quantity;
|
135
|
+
}, 0)
|
136
|
+
},
|
137
|
+
}
|
138
|
+
|
125
139
|
function set(eventData, property) {
|
126
140
|
state[property] = eventData
|
127
141
|
}
|
@@ -137,4 +151,5 @@ watch(state, (newState, oldState) => {
|
|
137
151
|
export {
|
138
152
|
state,
|
139
153
|
actions,
|
154
|
+
getters
|
140
155
|
}
|
@@ -15,11 +15,14 @@
|
|
15
15
|
_id="dash"
|
16
16
|
class="pd-b-extra pd-thin w-100"
|
17
17
|
>
|
18
|
-
<
|
18
|
+
<Completion
|
19
19
|
v-if="route.params._id === auth.state.user._id && show"
|
20
20
|
:user="auth.state.user._id"
|
21
21
|
:target="users.state.current"
|
22
22
|
:cta="true"
|
23
|
+
text_cta="Fill Profile"
|
24
|
+
text="Profile completed at"
|
25
|
+
class="mn-b-medium"
|
23
26
|
/>
|
24
27
|
|
25
28
|
<section
|
@@ -157,7 +160,7 @@
|
|
157
160
|
<Menu class="mn-b-regular bg-grey">
|
158
161
|
|
159
162
|
<MenuItem @click="router.push({name: 'User Events', params: {_id: route.params._id}})" class="cursor-pointer">
|
160
|
-
<IconEvents class="i-semi" :icon="true"/>
|
163
|
+
<IconEvents class="i-semi" :icon="true" :fill="'rgb(var(--white))'"/>
|
161
164
|
<span>Events</span>
|
162
165
|
</MenuItem>
|
163
166
|
|
@@ -237,6 +240,7 @@
|
|
237
240
|
import Field from '@pf/src/components/Field/Field.vue'
|
238
241
|
import Button from '@pf/src/components/Button/Button.vue'
|
239
242
|
import Dropdown from "@pf/src/components/Dropdown/Dropdown.vue";
|
243
|
+
import Completion from '@pf/src/components/Completion/Completion.vue'
|
240
244
|
// Mobile Module
|
241
245
|
import Menu from '@pf/src/modules/mobile/components/Menu/Menu.vue'
|
242
246
|
import MenuItem from '@pf/src/modules/mobile/components/Menu/MenuItem.vue'
|
@@ -247,8 +251,6 @@ import FormReport from '@pf/src/modules/reports/components/sections/FormReport.v
|
|
247
251
|
// Community Module
|
248
252
|
import Activity from '@pf/src/modules/community/components/blocks/Activity.vue';
|
249
253
|
import Socials from '@pf/src/modules/organizations/components/blocks/Socials.vue'
|
250
|
-
// Users Module
|
251
|
-
import ProfileCompletion from '@pf/src/modules/users/components/sections/ProfileCompletion.vue'
|
252
254
|
// Icons Module
|
253
255
|
import IconEvents from '@pf/src/modules/icons/entities/IconEvents.vue'
|
254
256
|
import IconGroups from '@pf/src/modules/icons/entities/IconGroups.vue'
|
@@ -1,19 +1,31 @@
|
|
1
1
|
<template>
|
2
2
|
<section class="w-100 mn-b-semi radius-medium pd-medium bg-main t-black">
|
3
|
-
<
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
3
|
+
<div class="mn-b-thin flex-v-center flex-nowrap flex">
|
4
|
+
<h4>
|
5
|
+
{{text}}
|
6
|
+
</h4>
|
7
|
+
|
8
|
+
<h4 class="mn-l-thin uppercase radius-big t-semi t-medium t-white bg-black w-max pd-thin">
|
9
|
+
{{ percentage || completionPercentage }}%
|
10
|
+
</h4>
|
11
|
+
|
12
|
+
<router-link
|
13
|
+
v-if="cta"
|
14
|
+
:to="{
|
15
|
+
name: 'User Edit Profile',
|
16
|
+
params: { _id: user }
|
17
|
+
}"
|
18
|
+
class="mn-l-auto uppercase radius-big t-semi t-medium t-white bg-black w-max pd-thin"
|
19
|
+
>
|
20
|
+
{{text_cta}}
|
21
|
+
</router-link>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class=" w-100 h-2r pos-relative pd-nano bg-black radius-big">
|
25
|
+
<div :style="`width: ${completionPercentage}%`"class="h-100 bg-main mn-b-thin radius-big">
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
|
17
29
|
</section>
|
18
30
|
</template>
|
19
31
|
|
@@ -23,7 +35,10 @@ import { ref, onMounted } from 'vue'
|
|
23
35
|
const { user, cta, target} = defineProps({
|
24
36
|
user: Object,
|
25
37
|
target: Object,
|
26
|
-
cta: Boolean
|
38
|
+
cta: Boolean,
|
39
|
+
percentage: Number,
|
40
|
+
text: String,
|
41
|
+
text_cta: String,
|
27
42
|
})
|
28
43
|
|
29
44
|
const completionPercentage = ref(0)
|
@@ -1,16 +1,17 @@
|
|
1
|
-
module.exports = (
|
1
|
+
module.exports = (db) => {
|
2
2
|
|
3
|
-
const UserSchema = new mongoose.Schema({
|
3
|
+
const UserSchema = new db.mongoose.Schema({
|
4
4
|
username: String,
|
5
5
|
|
6
6
|
phone: String,
|
7
7
|
email: String,
|
8
|
+
|
8
9
|
apple_id: String,
|
9
10
|
password: String,
|
10
11
|
|
11
12
|
status: {
|
12
13
|
type: String,
|
13
|
-
enum: ['active','banned','removed'],
|
14
|
+
enum: ['active','banned','removed','inactive'],
|
14
15
|
default: 'active',
|
15
16
|
required: true,
|
16
17
|
},
|
@@ -54,7 +55,7 @@ module.exports = (mongoose) => {
|
|
54
55
|
|
55
56
|
roles: [
|
56
57
|
{
|
57
|
-
type: mongoose.Schema.Types.ObjectId,
|
58
|
+
type: db.mongoose.Schema.Types.ObjectId,
|
58
59
|
ref: "Role"
|
59
60
|
}
|
60
61
|
]
|
@@ -65,7 +66,7 @@ module.exports = (mongoose) => {
|
|
65
66
|
|
66
67
|
});
|
67
68
|
|
68
|
-
const User = mongoose.model("User", UserSchema);
|
69
|
+
const User = db.mongoose.model("User", UserSchema);
|
69
70
|
|
70
71
|
return User;
|
71
72
|
}
|
@@ -4,6 +4,7 @@ const usersController = require('./controllers/users.controller.js');
|
|
4
4
|
const usersRoutes = require('./routes/users.routes.js');
|
5
5
|
// Models
|
6
6
|
const UserModel = require('./models/user.model.js');
|
7
|
+
const ClientModel = require('./models/client.model.js');
|
7
8
|
|
8
9
|
// Exporting controllers, routes, and models
|
9
10
|
module.exports = {
|
@@ -1,5 +1,7 @@
|
|
1
1
|
body {
|
2
|
-
|
2
|
+
|
3
|
+
|
4
|
+
// Border Clasess
|
3
5
|
.br-1px { border-width: 1px; }
|
4
6
|
.br-2px { border-width: 2px; }
|
5
7
|
/* Border style */
|
@@ -9,6 +11,8 @@ body {
|
|
9
11
|
.br-t { border-top-width: 1px; }
|
10
12
|
.br-r { border-right-width: 1px; }
|
11
13
|
.br-b { border-bottom-width: 1px; }
|
14
|
+
.br-b-2px { border-bottom-width: 2px; }
|
15
|
+
.br-b-3px { border-bottom-width: 3px; }
|
12
16
|
.br-l { border-left-width: 1px; }
|
13
17
|
/* Border colors */
|
14
18
|
.br-black { border-color: rgba(var(--black), 1.00); }
|
@@ -63,7 +67,6 @@ body {
|
|
63
67
|
.br-white-transp-90 { border-color: rgba(var(--white), 0.90); }
|
64
68
|
.br-white-transp-95 { border-color: rgba(var(--white), 0.95); }
|
65
69
|
.br-white-transp-100 { border-color: rgba(var(--white), 1.00); }
|
66
|
-
|
67
70
|
/* Social media brand borders */
|
68
71
|
.br-youtube { border-color: rgba(var(--youtube), 1);; }
|
69
72
|
.br-telegram { border-color: rgba(var(--telegram), 1);; }
|
package/src/styles/config.scss
CHANGED
@@ -52,8 +52,7 @@
|
|
52
52
|
}
|
53
53
|
// Генерация отрицательных классов с модификаторами
|
54
54
|
.#{$class-name}-#{$modifier}-#{$value-key}-negative {
|
55
|
-
#{$css-property}-#{$css-modifier}:
|
56
|
-
// #{$css-property}-#{$css-modifier}: calc(#{$value} * -1);
|
55
|
+
#{$css-property}-#{$css-modifier}: calc(#{$value} * -1);
|
57
56
|
}
|
58
57
|
}
|
59
58
|
}
|
@@ -67,7 +66,7 @@
|
|
67
66
|
////////////////////////////////////////
|
68
67
|
// 1.COLORS VARIABLES
|
69
68
|
///////////////////////////////////////
|
70
|
-
--main:
|
69
|
+
--main: 10,250,125;;
|
71
70
|
@include generate-vars-color('main');
|
72
71
|
--second: 34,102,255;
|
73
72
|
@include generate-vars-color('second');
|
@@ -78,7 +77,7 @@
|
|
78
77
|
--fifth: 255,216,10;
|
79
78
|
@include generate-vars-color('fifth');
|
80
79
|
// Black and white colors
|
81
|
-
--black:
|
80
|
+
--black: 0,0,0;
|
82
81
|
@include generate-vars-color('black');
|
83
82
|
--dark: 36,36,36;
|
84
83
|
@include generate-vars-color('dark');
|
@@ -1 +0,0 @@
|
|
1
|
-
import SubscribeNewsletter from './components/sections/SubscribeNewsletter.vue';
|