@crm-market/template-shared 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/AddAddress/index.vue +10 -12
- package/components/Cart/index.vue +15 -17
- package/components/ChangePassword/index.vue +11 -13
- package/components/Checkout/index.vue +35 -37
- package/components/Common/DashboardNavigation.vue +11 -13
- package/components/Common/PageBanner.vue +4 -6
- package/components/Common/ProductCard.vue +38 -52
- package/components/Common/Services.vue +10 -12
- package/components/Contact/ContactForm.vue +13 -18
- package/components/Dashboard/index.vue +8 -10
- package/components/EditAddress/index.vue +14 -16
- package/components/EditProfile/index.vue +10 -12
- package/components/ForgotPassword/index.vue +7 -9
- package/components/Layout/Copyright.vue +3 -5
- package/components/Layout/Footer.vue +36 -51
- package/components/Layout/FooterTwo.vue +34 -40
- package/components/Layout/MiddleHeader.vue +12 -11
- package/components/Layout/MiddleHeaderThree.vue +8 -7
- package/components/Layout/MiddleHeaderTwo.vue +10 -9
- package/components/Layout/Navbar.vue +10 -8
- package/components/Layout/NavbarStyleThree.vue +10 -8
- package/components/Layout/NavbarStyleTwo.vue +8 -6
- package/components/Layout/ResponsiveNavbar.vue +40 -38
- package/components/Layout/TopHeader.vue +30 -63
- package/components/Login/index.vue +14 -19
- package/components/MyAccount/index.vue +31 -31
- package/components/OrderDetails/index.vue +16 -18
- package/components/OrderHistory/index.vue +13 -15
- package/components/ProductDetails/index.vue +17 -15
- package/components/Products/RecentlyViewed.vue +12 -14
- package/components/Products/index.vue +20 -18
- package/components/Register/index.vue +14 -19
- package/components/Wishlist/index.vue +12 -14
- package/composables/useCategories.ts +2 -1
- package/composables/useCheckout.ts +2 -2
- package/composables/useI18n.ts +114 -0
- package/composables/useProducts.ts +4 -3
- package/composables/useSiteConfig.ts +2 -1
- package/locales/ar.json +234 -0
- package/locales/en.json +234 -0
- package/locales/ru.json +234 -0
- package/locales/uk.json +234 -0
- package/nuxt.config.ts +3 -0
- package/package.json +6 -4
- package/pages/about-us.vue +2 -1
- package/pages/address.vue +2 -1
- package/pages/cart.vue +2 -1
- package/pages/categories.vue +2 -1
- package/pages/change-password.vue +2 -1
- package/pages/checkout.vue +2 -1
- package/pages/contact.vue +2 -1
- package/pages/dashboard.vue +2 -1
- package/pages/edit-address.vue +2 -1
- package/pages/edit-profile.vue +2 -1
- package/pages/faq.vue +2 -1
- package/pages/forgot-password.vue +2 -1
- package/pages/login.vue +2 -1
- package/pages/my-account.vue +2 -1
- package/pages/order-details.vue +2 -1
- package/pages/order-history.vue +2 -1
- package/pages/privacy-policy.vue +2 -1
- package/pages/product-details.vue +2 -1
- package/pages/products.vue +2 -1
- package/pages/register.vue +2 -1
- package/pages/terms-conditions.vue +2 -1
- package/pages/wishlist.vue +2 -1
- package/plugins/i18n.ts +7 -0
- package/plugins/vuetify.ts +0 -1
- package/utils/api.ts +17 -0
- package/utils/image.ts +2 -2
|
@@ -15,32 +15,29 @@
|
|
|
15
15
|
<div class="col-lg-7">
|
|
16
16
|
<div class="authentication-form">
|
|
17
17
|
<v-tabs v-model="tab" bg-color="white" class="login-tabs">
|
|
18
|
-
<v-tab value="login">
|
|
19
|
-
<v-tab value="register">
|
|
18
|
+
<v-tab value="login">{{ t('auth.login') }}</v-tab>
|
|
19
|
+
<v-tab value="register">{{ t('auth.register') }}</v-tab>
|
|
20
20
|
</v-tabs>
|
|
21
21
|
|
|
22
22
|
<v-card-text>
|
|
23
23
|
<v-tabs-window v-model="tab">
|
|
24
24
|
<v-tabs-window-item value="login">
|
|
25
|
-
<p>
|
|
26
|
-
If you have an account, sign in with your username or
|
|
27
|
-
email address.
|
|
28
|
-
</p>
|
|
25
|
+
<p>{{ t('auth.loginDescription') }}</p>
|
|
29
26
|
<form>
|
|
30
27
|
<div class="form-group mb-4">
|
|
31
|
-
<label class="label">
|
|
28
|
+
<label class="label">{{ t('auth.usernameOrEmail') }} *</label>
|
|
32
29
|
<input
|
|
33
30
|
type="text"
|
|
34
31
|
class="form-control"
|
|
35
|
-
placeholder="
|
|
32
|
+
:placeholder="t('auth.usernameOrEmail')"
|
|
36
33
|
/>
|
|
37
34
|
</div>
|
|
38
35
|
<div class="form-group mb-4">
|
|
39
|
-
<label class="label">
|
|
36
|
+
<label class="label">{{ t('auth.yourPassword') }} *</label>
|
|
40
37
|
<input
|
|
41
38
|
type="password"
|
|
42
39
|
class="form-control"
|
|
43
|
-
placeholder="
|
|
40
|
+
:placeholder="t('auth.yourPassword')"
|
|
44
41
|
/>
|
|
45
42
|
</div>
|
|
46
43
|
<div class="d-flex justify-content-between mb-4">
|
|
@@ -55,11 +52,11 @@
|
|
|
55
52
|
class="form-check-label"
|
|
56
53
|
for="flexCheckDefault"
|
|
57
54
|
>
|
|
58
|
-
|
|
55
|
+
{{ t('auth.remember') }}
|
|
59
56
|
</label>
|
|
60
57
|
</div>
|
|
61
58
|
<NuxtLink to="/forgot-password" class="text-primary">
|
|
62
|
-
|
|
59
|
+
{{ t('auth.lostPassword') }}
|
|
63
60
|
</NuxtLink>
|
|
64
61
|
</div>
|
|
65
62
|
<div class="form-group mb-4">
|
|
@@ -67,50 +64,47 @@
|
|
|
67
64
|
type="submit"
|
|
68
65
|
class="btn btn-warning btn-pill text-white w-100 d-block"
|
|
69
66
|
>
|
|
70
|
-
|
|
67
|
+
{{ t('auth.login') }}
|
|
71
68
|
</button>
|
|
72
69
|
</div>
|
|
73
70
|
<div class="form-group mb-0">
|
|
74
71
|
<p class="text-secondary ms-1 text-primary">
|
|
75
|
-
|
|
72
|
+
{{ t('auth.noAccount') }}
|
|
76
73
|
<NuxtLink
|
|
77
74
|
to="/register"
|
|
78
75
|
class="text-decoration-none text-primary"
|
|
79
76
|
>
|
|
80
|
-
|
|
77
|
+
{{ t('auth.register') }}
|
|
81
78
|
</NuxtLink>
|
|
82
79
|
</p>
|
|
83
80
|
</div>
|
|
84
81
|
</form>
|
|
85
82
|
</v-tabs-window-item>
|
|
86
83
|
<v-tabs-window-item value="register">
|
|
87
|
-
<p>
|
|
88
|
-
If you have an account, sign in with your username or
|
|
89
|
-
email address.
|
|
90
|
-
</p>
|
|
84
|
+
<p>{{ t('auth.loginDescription') }}</p>
|
|
91
85
|
<form>
|
|
92
86
|
<div class="form-group mb-4">
|
|
93
|
-
<label class="label">
|
|
87
|
+
<label class="label">{{ t('auth.username') }} *</label>
|
|
94
88
|
<input
|
|
95
89
|
type="text"
|
|
96
90
|
class="form-control"
|
|
97
|
-
placeholder="
|
|
91
|
+
:placeholder="t('auth.username')"
|
|
98
92
|
/>
|
|
99
93
|
</div>
|
|
100
94
|
<div class="form-group mb-4">
|
|
101
|
-
<label class="label">
|
|
95
|
+
<label class="label">{{ t('auth.email') }} *</label>
|
|
102
96
|
<input
|
|
103
97
|
type="email"
|
|
104
98
|
class="form-control"
|
|
105
|
-
placeholder="
|
|
99
|
+
:placeholder="t('auth.email')"
|
|
106
100
|
/>
|
|
107
101
|
</div>
|
|
108
102
|
<div class="form-group mb-4">
|
|
109
|
-
<label class="label">
|
|
103
|
+
<label class="label">{{ t('auth.password') }} *</label>
|
|
110
104
|
<input
|
|
111
105
|
type="password"
|
|
112
106
|
class="form-control"
|
|
113
|
-
placeholder="
|
|
107
|
+
:placeholder="t('auth.password')"
|
|
114
108
|
/>
|
|
115
109
|
</div>
|
|
116
110
|
<div class="form-group mb-4">
|
|
@@ -118,17 +112,17 @@
|
|
|
118
112
|
type="submit"
|
|
119
113
|
class="btn btn-warning btn-pill text-white w-100 d-block"
|
|
120
114
|
>
|
|
121
|
-
|
|
115
|
+
{{ t('auth.register') }}
|
|
122
116
|
</button>
|
|
123
117
|
</div>
|
|
124
118
|
<div class="form-group mb-0">
|
|
125
119
|
<p class="text-secondary ms-1 text-primary">
|
|
126
|
-
|
|
120
|
+
{{ t('auth.haveAccount') }}
|
|
127
121
|
<NuxtLink
|
|
128
122
|
to="/login"
|
|
129
123
|
class="text-decoration-none text-primary"
|
|
130
124
|
>
|
|
131
|
-
|
|
125
|
+
{{ t('auth.login') }}
|
|
132
126
|
</NuxtLink>
|
|
133
127
|
</p>
|
|
134
128
|
</div>
|
|
@@ -144,11 +138,17 @@
|
|
|
144
138
|
</div>
|
|
145
139
|
</template>
|
|
146
140
|
|
|
147
|
-
<script>
|
|
148
|
-
|
|
141
|
+
<script lang="ts">
|
|
142
|
+
import { defineComponent } from "vue";
|
|
143
|
+
|
|
144
|
+
export default defineComponent({
|
|
149
145
|
name: "MyAccount",
|
|
150
146
|
data: () => ({
|
|
151
147
|
tab: null,
|
|
152
148
|
}),
|
|
153
|
-
|
|
149
|
+
setup() {
|
|
150
|
+
const { t } = useI18n();
|
|
151
|
+
return { t };
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
154
|
</script>
|
|
@@ -9,21 +9,21 @@
|
|
|
9
9
|
<div class="col-lg-8">
|
|
10
10
|
<div class="row">
|
|
11
11
|
<div class="col-lg-6 col-md-6">
|
|
12
|
-
<h3 class="order-details-title">
|
|
12
|
+
<h3 class="order-details-title">{{ t('account.orderDetails') }}</h3>
|
|
13
13
|
<div class="order-details-area">
|
|
14
14
|
<div class="cart-totals">
|
|
15
|
-
<h3>
|
|
16
|
-
<p>
|
|
15
|
+
<h3>{{ t('order.orderNumber') }}: #001</h3>
|
|
16
|
+
<p>{{ t('order.orderCreatedAt') }}: 30 August, 2021</p>
|
|
17
17
|
<NuxtLink to="/order-history" class="read-more">
|
|
18
|
-
|
|
18
|
+
{{ t('order.backHistory') }}
|
|
19
19
|
</NuxtLink>
|
|
20
20
|
<ul>
|
|
21
|
-
<li>
|
|
22
|
-
<li>
|
|
23
|
-
<li>
|
|
24
|
-
<li>
|
|
21
|
+
<li>{{ t('cart.subtotal') }} <span>$240.00</span></li>
|
|
22
|
+
<li>{{ t('cart.shipping') }} <span>$240.00</span></li>
|
|
23
|
+
<li>{{ t('cart.coupon') }} <span>$00.00</span></li>
|
|
24
|
+
<li>{{ t('cart.total') }} <span>$240.00</span></li>
|
|
25
25
|
<li>
|
|
26
|
-
<b>
|
|
26
|
+
<b>{{ t('cart.total') }}</b> <span><b>$240.00</b></span>
|
|
27
27
|
</li>
|
|
28
28
|
</ul>
|
|
29
29
|
</div>
|
|
@@ -32,23 +32,23 @@
|
|
|
32
32
|
|
|
33
33
|
<div class="col-lg-6 col-md-6">
|
|
34
34
|
<div class="billing-address-bar orders-details mb-0">
|
|
35
|
-
<h3>
|
|
35
|
+
<h3>{{ t('account.billingAddress') }}</h3>
|
|
36
36
|
|
|
37
37
|
<ul>
|
|
38
38
|
<li class="p-0">Amanda McCarter</li>
|
|
39
39
|
<li>
|
|
40
|
-
<span>
|
|
40
|
+
<span>{{ t('account.address') }}:</span>
|
|
41
41
|
4 Shady Pines Drive Bowling Green
|
|
42
42
|
</li>
|
|
43
43
|
</ul>
|
|
44
44
|
|
|
45
45
|
<ul>
|
|
46
46
|
<li>
|
|
47
|
-
<span>
|
|
47
|
+
<span>{{ t('account.phone') }}:</span>
|
|
48
48
|
<a href="tel:270-957-9995">270-957-9995</a>
|
|
49
49
|
</li>
|
|
50
50
|
<li>
|
|
51
|
-
<span>
|
|
51
|
+
<span>{{ t('account.email') }}:</span>
|
|
52
52
|
<a href="mailto:contact@tuan.com">contact@tuan.com</a>
|
|
53
53
|
</li>
|
|
54
54
|
</ul>
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
to="/edit-address"
|
|
59
59
|
class="btn btn-warning text-white"
|
|
60
60
|
>
|
|
61
|
-
|
|
61
|
+
{{ t('account.editAddress') }}
|
|
62
62
|
</NuxtLink>
|
|
63
63
|
</div>
|
|
64
64
|
</div>
|
|
@@ -70,8 +70,6 @@
|
|
|
70
70
|
</section>
|
|
71
71
|
</template>
|
|
72
72
|
|
|
73
|
-
<script>
|
|
74
|
-
|
|
75
|
-
name: "OrderDetails",
|
|
76
|
-
};
|
|
73
|
+
<script setup lang="ts">
|
|
74
|
+
const { t } = useI18n();
|
|
77
75
|
</script>
|
|
@@ -8,19 +8,19 @@
|
|
|
8
8
|
|
|
9
9
|
<div class="col-lg-8">
|
|
10
10
|
<div class="cart-area recent-order">
|
|
11
|
-
<h3 class="mb-3">
|
|
11
|
+
<h3 class="mb-3">{{ t('account.orderHistory') }}</h3>
|
|
12
12
|
<form class="cart-controller mb-0">
|
|
13
13
|
<div class="cart-table table-responsive">
|
|
14
14
|
<table class="table table-bordered align-middle">
|
|
15
15
|
<thead>
|
|
16
16
|
<tr>
|
|
17
|
-
<th scope="col">
|
|
18
|
-
<th scope="col">
|
|
17
|
+
<th scope="col">{{ t('order.trash') }}</th>
|
|
18
|
+
<th scope="col">{{ t('product.product') }}</th>
|
|
19
19
|
<th scope="col"></th>
|
|
20
|
-
<th scope="col">
|
|
21
|
-
<th scope="col">
|
|
22
|
-
<th scope="col">
|
|
23
|
-
<th scope="col">
|
|
20
|
+
<th scope="col">{{ t('order.order') }}</th>
|
|
21
|
+
<th scope="col">{{ t('product.quantity') }}</th>
|
|
22
|
+
<th scope="col">{{ t('order.status') }}</th>
|
|
23
|
+
<th scope="col">{{ t('cart.total') }}</th>
|
|
24
24
|
</tr>
|
|
25
25
|
</thead>
|
|
26
26
|
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
</td>
|
|
56
56
|
|
|
57
57
|
<td class="product-subtotal">
|
|
58
|
-
<span class="subtotal-amount">
|
|
58
|
+
<span class="subtotal-amount">{{ t('order.paid') }}</span>
|
|
59
59
|
</td>
|
|
60
60
|
|
|
61
61
|
<td class="product-subtotal">
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
</td>
|
|
95
95
|
|
|
96
96
|
<td class="product-subtotal">
|
|
97
|
-
<span class="subtotal-amount">
|
|
97
|
+
<span class="subtotal-amount">{{ t('order.pending') }}</span>
|
|
98
98
|
</td>
|
|
99
99
|
|
|
100
100
|
<td class="product-subtotal">
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
</td>
|
|
134
134
|
|
|
135
135
|
<td class="product-subtotal">
|
|
136
|
-
<span class="subtotal-amount">
|
|
136
|
+
<span class="subtotal-amount">{{ t('order.failed') }}</span>
|
|
137
137
|
</td>
|
|
138
138
|
|
|
139
139
|
<td class="product-subtotal">
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
</td>
|
|
173
173
|
|
|
174
174
|
<td class="product-subtotal">
|
|
175
|
-
<span class="subtotal-amount">
|
|
175
|
+
<span class="subtotal-amount">{{ t('order.paid') }}</span>
|
|
176
176
|
</td>
|
|
177
177
|
|
|
178
178
|
<td class="product-subtotal">
|
|
@@ -190,8 +190,6 @@
|
|
|
190
190
|
</section>
|
|
191
191
|
</template>
|
|
192
192
|
|
|
193
|
-
<script>
|
|
194
|
-
|
|
195
|
-
name: "OrderHistory",
|
|
196
|
-
};
|
|
193
|
+
<script setup lang="ts">
|
|
194
|
+
const { t } = useI18n();
|
|
197
195
|
</script>
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
<div class="product-details-content">
|
|
45
45
|
<span class="stock">
|
|
46
46
|
<i class="ri-check-line"></i>
|
|
47
|
-
|
|
47
|
+
{{ t('product.inStock') }}
|
|
48
48
|
</span>
|
|
49
49
|
<h3>
|
|
50
50
|
Apple MacBook Pro 16.2" with Liquid Retina XDR Display, M2 Max
|
|
@@ -56,11 +56,11 @@
|
|
|
56
56
|
<i class="flaticon-star"></i>
|
|
57
57
|
<i class="flaticon-star"></i>
|
|
58
58
|
<i class="flaticon-star"></i>
|
|
59
|
-
<span>(5
|
|
59
|
+
<span>(5 {{ t('product.reviews') }})</span>
|
|
60
60
|
</div>
|
|
61
61
|
<h2 class="price">$399 <del>$450</del></h2>
|
|
62
62
|
<div class="d-flex style-select">
|
|
63
|
-
<span>
|
|
63
|
+
<span>{{ t('product.style') }}:</span>
|
|
64
64
|
<h5>{{ typeText }}</h5>
|
|
65
65
|
</div>
|
|
66
66
|
<div class="select-style mb-4">
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
</label>
|
|
83
83
|
</div>
|
|
84
84
|
<div class="d-flex style-select">
|
|
85
|
-
<span>
|
|
85
|
+
<span>{{ t('product.capacity') }}:</span>
|
|
86
86
|
<h5>{{ capacityText }}</h5>
|
|
87
87
|
</div>
|
|
88
88
|
<div class="select-style mb-4">
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
</label>
|
|
106
106
|
</div>
|
|
107
107
|
<div class="d-flex style-select">
|
|
108
|
-
<span>
|
|
108
|
+
<span>{{ t('product.color') }}:</span>
|
|
109
109
|
<h5>{{ colorText }}</h5>
|
|
110
110
|
</div>
|
|
111
111
|
<ul class="d-flex ps-0 mb-0 list-unstyled select-color gap-2 mb-4">
|
|
@@ -124,42 +124,42 @@
|
|
|
124
124
|
<ProductDetailsProductQuantity />
|
|
125
125
|
<button class="btn btn-success text-white rounded-pill">
|
|
126
126
|
<i class="ri-shopping-cart-line"></i>
|
|
127
|
-
<span>
|
|
127
|
+
<span>{{ t('product.addToCart') }}</span>
|
|
128
128
|
</button>
|
|
129
129
|
</div>
|
|
130
130
|
<button class="d-flex align-items-center gap-3 wishlist mb-3">
|
|
131
131
|
<i class="ri-heart-line"></i>
|
|
132
|
-
<span>
|
|
132
|
+
<span>{{ t('product.addToWishlist') }}</span>
|
|
133
133
|
</button>
|
|
134
134
|
<button class="d-flex align-items-center gap-3 wishlist">
|
|
135
135
|
<i class="ri-eye-line"></i>
|
|
136
|
-
<span><span>565
|
|
136
|
+
<span><span>565</span> {{ t('product.viewingProduct') }}</span>
|
|
137
137
|
</button>
|
|
138
138
|
<ul class="services-list ps-0 mb-0 list-unstyled">
|
|
139
139
|
<li class="d-flex align-items-center">
|
|
140
140
|
<i class="ri-check-line"></i>
|
|
141
|
-
<span>
|
|
141
|
+
<span>{{ t('product.freeDelivery') }}</span>
|
|
142
142
|
</li>
|
|
143
143
|
<li class="d-flex align-items-center">
|
|
144
144
|
<i class="ri-check-line"></i>
|
|
145
|
-
<span>
|
|
145
|
+
<span>{{ t('product.moneyBack') }}</span>
|
|
146
146
|
</li>
|
|
147
147
|
<li class="d-flex align-items-center">
|
|
148
148
|
<i class="ri-check-line"></i>
|
|
149
|
-
<span>
|
|
149
|
+
<span>{{ t('product.returnPolicy') }}</span>
|
|
150
150
|
</li>
|
|
151
151
|
</ul>
|
|
152
152
|
<ul class="sku-list ps-0 mb-0 list-unstyled">
|
|
153
153
|
<li class="d-flex align-items-center">
|
|
154
|
-
<span class="title">
|
|
154
|
+
<span class="title">{{ t('product.sku') }}:</span>
|
|
155
155
|
<span class="title2">SMTGS6T45</span>
|
|
156
156
|
</li>
|
|
157
157
|
<li class="d-flex align-items-center">
|
|
158
|
-
<span class="title">
|
|
158
|
+
<span class="title">{{ t('product.category') }}:</span>
|
|
159
159
|
<span class="title2">Computer</span>
|
|
160
160
|
</li>
|
|
161
161
|
<li class="d-flex align-items-center">
|
|
162
|
-
<span class="title">
|
|
162
|
+
<span class="title">{{ t('nav.tags') }}:</span>
|
|
163
163
|
<span class="title2">laptop, macbook, PC</span>
|
|
164
164
|
</li>
|
|
165
165
|
</ul>
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
class="social-link ps-0 mb-0 list-unstyled d-flex gap-2 flex-wrap"
|
|
168
168
|
>
|
|
169
169
|
<li class="d-flex align-items-center me-2">
|
|
170
|
-
<span>
|
|
170
|
+
<span>{{ t('product.share') }}:</span>
|
|
171
171
|
</li>
|
|
172
172
|
<li class="d-flex align-items-center gap-2">
|
|
173
173
|
<a href="https://facebook.com/" target="_blank">
|
|
@@ -210,6 +210,7 @@ export default defineComponent({
|
|
|
210
210
|
tab: null,
|
|
211
211
|
}),
|
|
212
212
|
setup() {
|
|
213
|
+
const { t } = useI18n();
|
|
213
214
|
const typeText = ref("Apple M1 Max Chip");
|
|
214
215
|
const typeActiveButton = ref("first");
|
|
215
216
|
|
|
@@ -250,6 +251,7 @@ export default defineComponent({
|
|
|
250
251
|
};
|
|
251
252
|
|
|
252
253
|
return {
|
|
254
|
+
t,
|
|
253
255
|
typeText,
|
|
254
256
|
typeActiveButton,
|
|
255
257
|
setTypeTextToFirst,
|
|
@@ -56,12 +56,12 @@
|
|
|
56
56
|
>
|
|
57
57
|
<span class="delivery">
|
|
58
58
|
<i class="ri-truck-line"></i>
|
|
59
|
-
|
|
59
|
+
{{ t('product.freeDelivery') }}
|
|
60
60
|
</span>
|
|
61
61
|
<button class="cart-btn">
|
|
62
62
|
<i class="ri-shopping-cart-line"></i>
|
|
63
63
|
<v-tooltip activator="parent" location="top">
|
|
64
|
-
|
|
64
|
+
{{ t('product.addToCart') }}
|
|
65
65
|
</v-tooltip>
|
|
66
66
|
</button>
|
|
67
67
|
</div>
|
|
@@ -112,12 +112,12 @@
|
|
|
112
112
|
>
|
|
113
113
|
<span class="delivery">
|
|
114
114
|
<i class="ri-truck-line"></i>
|
|
115
|
-
|
|
115
|
+
{{ t('product.freeDelivery') }}
|
|
116
116
|
</span>
|
|
117
117
|
<button class="cart-btn">
|
|
118
118
|
<i class="ri-shopping-cart-line"></i>
|
|
119
119
|
<v-tooltip activator="parent" location="top">
|
|
120
|
-
|
|
120
|
+
{{ t('product.addToCart') }}
|
|
121
121
|
</v-tooltip>
|
|
122
122
|
</button>
|
|
123
123
|
</div>
|
|
@@ -168,12 +168,12 @@
|
|
|
168
168
|
>
|
|
169
169
|
<span class="delivery">
|
|
170
170
|
<i class="ri-truck-line"></i>
|
|
171
|
-
|
|
171
|
+
{{ t('product.freeDelivery') }}
|
|
172
172
|
</span>
|
|
173
173
|
<button class="cart-btn">
|
|
174
174
|
<i class="ri-shopping-cart-line"></i>
|
|
175
175
|
<v-tooltip activator="parent" location="top">
|
|
176
|
-
|
|
176
|
+
{{ t('product.addToCart') }}
|
|
177
177
|
</v-tooltip>
|
|
178
178
|
</button>
|
|
179
179
|
</div>
|
|
@@ -224,12 +224,12 @@
|
|
|
224
224
|
>
|
|
225
225
|
<span class="delivery">
|
|
226
226
|
<i class="ri-truck-line"></i>
|
|
227
|
-
|
|
227
|
+
{{ t('product.freeDelivery') }}
|
|
228
228
|
</span>
|
|
229
229
|
<button class="cart-btn">
|
|
230
230
|
<i class="ri-shopping-cart-line"></i>
|
|
231
231
|
<v-tooltip activator="parent" location="top">
|
|
232
|
-
|
|
232
|
+
{{ t('product.addToCart') }}
|
|
233
233
|
</v-tooltip>
|
|
234
234
|
</button>
|
|
235
235
|
</div>
|
|
@@ -280,12 +280,12 @@
|
|
|
280
280
|
>
|
|
281
281
|
<span class="delivery">
|
|
282
282
|
<i class="ri-truck-line"></i>
|
|
283
|
-
|
|
283
|
+
{{ t('product.freeDelivery') }}
|
|
284
284
|
</span>
|
|
285
285
|
<button class="cart-btn">
|
|
286
286
|
<i class="ri-shopping-cart-line"></i>
|
|
287
287
|
<v-tooltip activator="parent" location="top">
|
|
288
|
-
|
|
288
|
+
{{ t('product.addToCart') }}
|
|
289
289
|
</v-tooltip>
|
|
290
290
|
</button>
|
|
291
291
|
</div>
|
|
@@ -297,8 +297,6 @@
|
|
|
297
297
|
</div>
|
|
298
298
|
</template>
|
|
299
299
|
|
|
300
|
-
<script>
|
|
301
|
-
|
|
302
|
-
name: "RecentlyViewed",
|
|
303
|
-
};
|
|
300
|
+
<script setup lang="ts">
|
|
301
|
+
const { t } = useI18n();
|
|
304
302
|
</script>
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<div class="sidebar product-sidebar">
|
|
14
14
|
<!-- Categories filter -->
|
|
15
15
|
<div class="single-sidebar-widget">
|
|
16
|
-
<h3>
|
|
16
|
+
<h3>{{ t('product.filterByCategories') }}</h3>
|
|
17
17
|
<ul class="ps-0 mb-0 list-unstyled filter-selecet">
|
|
18
18
|
<li v-for="category in topLevelCategories" :key="category.id">
|
|
19
19
|
<div class="form-check">
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
</li>
|
|
33
33
|
<li v-if="selectedCategoryId">
|
|
34
34
|
<a href="javascript:void(0)" class="text-primary fs-13" @click="selectedCategoryId = ''">
|
|
35
|
-
|
|
35
|
+
{{ t('product.clearFilter') }}
|
|
36
36
|
</a>
|
|
37
37
|
</li>
|
|
38
38
|
</ul>
|
|
@@ -40,12 +40,12 @@
|
|
|
40
40
|
|
|
41
41
|
<!-- Price filter -->
|
|
42
42
|
<div class="single-sidebar-widget">
|
|
43
|
-
<h3>
|
|
43
|
+
<h3>{{ t('product.priceRange') }}</h3>
|
|
44
44
|
<div class="d-flex gap-2 align-items-center">
|
|
45
45
|
<input
|
|
46
46
|
type="number"
|
|
47
47
|
class="form-control form-control-sm"
|
|
48
|
-
placeholder="
|
|
48
|
+
:placeholder="t('product.min')"
|
|
49
49
|
v-model.number="minPrice"
|
|
50
50
|
min="0"
|
|
51
51
|
/>
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
<input
|
|
54
54
|
type="number"
|
|
55
55
|
class="form-control form-control-sm"
|
|
56
|
-
placeholder="
|
|
56
|
+
:placeholder="t('product.max')"
|
|
57
57
|
v-model.number="maxPrice"
|
|
58
58
|
min="0"
|
|
59
59
|
/>
|
|
@@ -62,18 +62,18 @@
|
|
|
62
62
|
class="btn btn-sm btn-outline-primary mt-2 w-100"
|
|
63
63
|
@click="applyFilters"
|
|
64
64
|
>
|
|
65
|
-
|
|
65
|
+
{{ t('product.apply') }}
|
|
66
66
|
</button>
|
|
67
67
|
</div>
|
|
68
68
|
|
|
69
69
|
<!-- Sort -->
|
|
70
70
|
<div class="single-sidebar-widget">
|
|
71
|
-
<h3>
|
|
71
|
+
<h3>{{ t('product.sortBy') }}</h3>
|
|
72
72
|
<select class="form-select form-select-sm" v-model="sortBy">
|
|
73
|
-
<option value="newest">
|
|
74
|
-
<option value="price-asc">
|
|
75
|
-
<option value="price-desc">
|
|
76
|
-
<option value="name">
|
|
73
|
+
<option value="newest">{{ t('product.newest') }}</option>
|
|
74
|
+
<option value="price-asc">{{ t('product.priceLowHigh') }}</option>
|
|
75
|
+
<option value="price-desc">{{ t('product.priceHighLow') }}</option>
|
|
76
|
+
<option value="name">{{ t('product.nameAZ') }}</option>
|
|
77
77
|
</select>
|
|
78
78
|
</div>
|
|
79
79
|
</div>
|
|
@@ -84,24 +84,24 @@
|
|
|
84
84
|
<!-- Search info -->
|
|
85
85
|
<div class="d-flex align-items-center justify-content-between mb-3" v-if="searchQuery || selectedCategoryId">
|
|
86
86
|
<p class="mb-0 text-muted">
|
|
87
|
-
<span v-if="searchQuery">
|
|
88
|
-
<span v-if="selectedCategoryName"> |
|
|
89
|
-
<span v-if="totalProducts"> | {{ totalProducts }}
|
|
87
|
+
<span v-if="searchQuery">{{ t('nav.search') }}: "{{ searchQuery }}"</span>
|
|
88
|
+
<span v-if="selectedCategoryName"> | {{ t('product.category') }}: {{ selectedCategoryName }}</span>
|
|
89
|
+
<span v-if="totalProducts"> | {{ totalProducts }} {{ t('product.productsFound') }}</span>
|
|
90
90
|
</p>
|
|
91
91
|
<button class="btn btn-sm btn-outline-secondary" @click="clearAllFilters">
|
|
92
|
-
|
|
92
|
+
{{ t('product.clearAll') }}
|
|
93
93
|
</button>
|
|
94
94
|
</div>
|
|
95
95
|
|
|
96
96
|
<!-- Products count and total -->
|
|
97
97
|
<div class="d-flex align-items-center justify-content-between mb-3" v-else>
|
|
98
|
-
<p class="mb-0 text-muted">{{ totalProducts }}
|
|
98
|
+
<p class="mb-0 text-muted">{{ totalProducts }} {{ t('product.productsFound') }}</p>
|
|
99
99
|
</div>
|
|
100
100
|
|
|
101
101
|
<!-- Loading -->
|
|
102
102
|
<div v-if="loading" class="text-center py-5">
|
|
103
103
|
<div class="spinner-border text-primary" role="status">
|
|
104
|
-
<span class="visually-hidden">
|
|
104
|
+
<span class="visually-hidden">{{ t('product.loading') }}</span>
|
|
105
105
|
</div>
|
|
106
106
|
</div>
|
|
107
107
|
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
<!-- No products -->
|
|
120
120
|
<div v-else class="text-center py-5">
|
|
121
121
|
<i class="ri-shopping-bag-line fs-1 text-muted"></i>
|
|
122
|
-
<p class="mt-3 text-muted">
|
|
122
|
+
<p class="mt-3 text-muted">{{ t('product.noProducts') }}</p>
|
|
123
123
|
</div>
|
|
124
124
|
|
|
125
125
|
<!-- Pagination -->
|
|
@@ -161,6 +161,7 @@ import { defineComponent, ref, computed, watch, onMounted } from "vue";
|
|
|
161
161
|
export default defineComponent({
|
|
162
162
|
name: "ProductsIndex",
|
|
163
163
|
setup() {
|
|
164
|
+
const { t } = useI18n();
|
|
164
165
|
const route = useRoute();
|
|
165
166
|
const router = useRouter();
|
|
166
167
|
const { fetchProducts, products, loading } = useProducts();
|
|
@@ -270,6 +271,7 @@ export default defineComponent({
|
|
|
270
271
|
});
|
|
271
272
|
|
|
272
273
|
return {
|
|
274
|
+
t,
|
|
273
275
|
products,
|
|
274
276
|
loading,
|
|
275
277
|
topLevelCategories,
|