@lancom/shared 0.0.333 → 0.0.335

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.
@@ -284,6 +284,18 @@ export default {
284
284
  removeUser(id) {
285
285
  return _delete(`admin/user/${id}`);
286
286
  },
287
+ fetchCustomerById(id) {
288
+ return _get(`admin/customer/${id}`);
289
+ },
290
+ saveCustomer(customer) {
291
+ return customer._id ? _put(`admin/customer/${customer._id}`, customer) : _post('admin/customer', customer);
292
+ },
293
+ saveCustomerPassword(customer) {
294
+ return _put(`admin/customer/${customer._id}/password/${customer.passwordResetToken}`, customer);
295
+ },
296
+ removeCustomer(id) {
297
+ return _delete(`admin/customer/${id}`);
298
+ },
287
299
  fetchInventoryHistory(params) {
288
300
  return _get('admin/inventory-history', params);
289
301
  },
@@ -35,6 +35,9 @@ const api = {
35
35
  saveCustomerPassword(customer, shop) {
36
36
  return _patch(`shop/${shop}/customer/${customer._id}/password/${customer.passwordResetToken}`, customer);
37
37
  },
38
+ fetchCustomerOrders(customer, shop) {
39
+ return _get(`shop/${shop}/customer/${customer._id}/orders`);
40
+ },
38
41
  searchProducts(shop, text) {
39
42
  return _get(`shop/${shop}/products/search`, { text });
40
43
  },
@@ -3,6 +3,7 @@ import debounce from 'lodash.debounce';
3
3
 
4
4
  class Breakpoints {
5
5
  screens = {
6
+ mini: 448,
6
7
  sm: 768,
7
8
  md: 1024,
8
9
  lg: 1280,
@@ -28,7 +29,9 @@ class Breakpoints {
28
29
  }
29
30
 
30
31
  getBreakpoint(w) {
31
- if (this.isXs(w)) {
32
+ if (this.isMini(w)) {
33
+ return 'mini';
34
+ } else if (this.isXs(w)) {
32
35
  return 'xs';
33
36
  } else if (this.isSm(w)) {
34
37
  return 'sm';
@@ -43,8 +46,13 @@ class Breakpoints {
43
46
  }
44
47
  }
45
48
 
49
+
50
+ isMini(val) {
51
+ return val < this.screens.mini;
52
+ }
53
+
46
54
  isXs(val) {
47
- return val < this.screens.sm;
55
+ return val >= this.screens.xs && val < this.screens.sm;
48
56
  }
49
57
 
50
58
  isSm(val) {
@@ -133,6 +133,11 @@ body {
133
133
  display: none !important;
134
134
  }
135
135
  }
136
+ .hidden-mini-and-down {
137
+ @media (max-width: $bp-mini-max) {
138
+ display: none !important;
139
+ }
140
+ }
136
141
  .hidden-extra-small {
137
142
  @media (max-width: $bp-extra-small-max) {
138
143
  display: none !important;
@@ -10,3 +10,6 @@ $bp-small-max: 1023px;
10
10
  $bp-small-min: 768px;
11
11
 
12
12
  $bp-extra-small-max: 767px;
13
+ $bp-extra-small-min: 450px;
14
+
15
+ $bp-mini-max: 449px;
@@ -147,11 +147,9 @@
147
147
  <div class="ContactUs__contacts-row">
148
148
  <div class="ContactUs__contacts-entity">
149
149
  <i class="icon-mail-alt ContactUs__contacts-entity-icon"></i>
150
- <a
151
- :href="`mailto:${contacts.email}`"
152
- class="ContactUs__contacts-entity-value">
153
- {{ contacts.email }}
154
- </a>
150
+ <email-link
151
+ :email="contacts.email"
152
+ class="ContactUs__contacts-entity-value" />
155
153
  </div>
156
154
  <div class="ContactUs__contacts-entity">
157
155
  <i class="icon-phone ContactUs__contacts-entity-icon"></i>
@@ -171,9 +169,13 @@
171
169
  import { mapGetters } from 'vuex';
172
170
  import api from '@lancom/shared/assets/js/api';
173
171
  import gtm from '@lancom/shared/assets/js/utils/gtm';
172
+ import EmailLink from '@lancom/shared/components/email_link/email-link';
174
173
 
175
174
  export default {
176
175
  name: 'LancomContactUs',
176
+ components: {
177
+ EmailLink
178
+ },
177
179
  props: {
178
180
  btnClass: {
179
181
  type: String,
@@ -317,7 +317,7 @@ export default {
317
317
  this.$set(this.address, 'state', suburb.state);
318
318
  this.$set(this.address, 'postcode', suburb.postcode);
319
319
  this.$set(this.address, 'city', suburb.locality);
320
- this.$set(this.address, 'country', suburb.country);
320
+ this.$set(this.address, 'country', suburb.country || 'Australia');
321
321
  }
322
322
  },
323
323
  handleSuburbChange(suburb) {
@@ -2,12 +2,12 @@
2
2
  <div
3
3
  class="ProductSideWithPrint__wrapper"
4
4
  :class="{ preview }"
5
+ :style="colorBackground"
5
6
  @click="showImage()">
6
7
  <div
7
8
  class="ProductSideWithPrint__thumb"
8
9
  :style="{
9
- 'background-image': imageBackground,
10
- 'background-color': colorBackground
10
+ 'background-image': imageBackground
11
11
  }"></div>
12
12
  <div
13
13
  v-if="print"
@@ -19,6 +19,7 @@
19
19
  <script>
20
20
  import { getProductCover, getColorImage } from '@lancom/shared/assets/js/utils/colors';
21
21
  import ImageViewer from '@lancom/shared/components/common/image_viewer/image-viewer';
22
+ import { getColorBackgroundStyle } from '@lancom/shared/assets/js/utils/colors';
22
23
 
23
24
  export default {
24
25
  name: 'ProductSideWithPrint',
@@ -75,7 +76,7 @@ export default {
75
76
  return [...this.priviewProducts.reduce(predicate, new Map()).values()];
76
77
  },
77
78
  colorBackground() {
78
- return this.fillBackground && this.product.color.rgb;
79
+ return this.fillBackground && getColorBackgroundStyle(this.product.color);
79
80
  },
80
81
  imageBackground() {
81
82
  return this.image && this.getImageBackground(this.image);
@@ -0,0 +1,113 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ .CustomerMenu {
4
+ &__wrapper {
5
+ position: relative;
6
+ }
7
+ &__inner {
8
+ min-width: 72px;
9
+ width: 33%;
10
+ height: 100%;
11
+ border-radius: 2px;
12
+ box-shadow: $elevation1;
13
+ }
14
+ &__value {
15
+ color: $grey_1;
16
+ text-transform: uppercase;
17
+ flex-grow: 1;
18
+ display: flex;
19
+ align-items: center;
20
+ background-color: rgba(125, 106, 239, 0.07);
21
+ padding: 10px 10px 5px 10px;
22
+ border-radius: 20px;
23
+ &--divider {
24
+ display: block;
25
+ height: 16px;
26
+ width: 1px;
27
+ background-color: rgba(0, 0, 0, 0.14);
28
+ margin: 0 5px;
29
+ }
30
+ span i {
31
+ color: $brand_color_1;
32
+ font-size: 25px;
33
+ }
34
+ span img {
35
+ height: 25px;
36
+ position: relative;
37
+ top: 3px;
38
+ left: 2px;
39
+ }
40
+ }
41
+ &__divider {
42
+ margin-top: 10px;
43
+ margin-bottom: 5px;
44
+ border: 1px solid rgba(0, 0, 0, 0.14);
45
+ width: 100%;
46
+ }
47
+ &__caret {
48
+ color: $grey_5;
49
+ font-size: 18px;
50
+ cursor: pointer;
51
+ }
52
+ &__dropdown {
53
+ position: absolute;
54
+ z-index: 101;
55
+ top: 40px;
56
+ width: 220px;
57
+ margin-top: 20px;
58
+ margin-left: -55px;
59
+ // transform: translateY(-50%);
60
+ padding: 15px;
61
+ box-shadow: 0px 4px 121px 0px rgba(145, 136, 188, 0.34);
62
+ background-color: white;
63
+ border-radius: 12px;
64
+ }
65
+ &__backdrop {
66
+ top: 0;
67
+ right: 0;
68
+ bottom: 0;
69
+ left: 0;
70
+ position: absolute;
71
+ z-index: 100;
72
+ background: red;
73
+
74
+ }
75
+ &__field {
76
+ font-size: 18px;
77
+ font-weight: 600;
78
+ line-height: 26px;
79
+ letter-spacing: -0.025em;
80
+ display: flex;
81
+ justify-content: space-between;
82
+ cursor: pointer;
83
+ padding: 6px;
84
+ align-items: center;
85
+ &--open,
86
+ &--open * {
87
+ pointer-events: none !important;
88
+ }
89
+ > i {
90
+ color: $purple;
91
+ }
92
+ &-item {
93
+ padding: 7px 10px;
94
+ cursor: pointer;
95
+ display: flex;
96
+ align-items: center;
97
+ font-size: 16px;
98
+ color: $purple;
99
+
100
+ &-checked {
101
+ margin-right: 10px;
102
+ margin-top: 2px;
103
+ }
104
+ &-icon {
105
+ margin-right: 10px;
106
+ margin-top: 3px;
107
+ }
108
+ &:hover {
109
+ color: $purple;
110
+ }
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,49 @@
1
+ <template>
2
+ <div class="CustomerMenu__wrapper">
3
+ <div class="CustomerMenu__field">
4
+ <div class="lc_regular16 CustomerMenu__value">
5
+ <btn
6
+ class="ml-10"
7
+ btn-class="black"
8
+ btn-label=" "
9
+ @onclick="isOpen = !isOpen">
10
+ <template #icon-before>
11
+ <i class="icon-user"></i>
12
+ </template>
13
+ <template #icon-after>
14
+ <i class="icon-angle-down"></i>
15
+ </template>
16
+ </btn>
17
+ <span>
18
+ <i class="icon-globe"></i>
19
+ </span>
20
+ </div>
21
+ </div>
22
+ <div
23
+ v-if="isOpen"
24
+ class="CustomerMenu__dropdown">
25
+ <div>
26
+ <a href="/customer/settings" class="CustomerMenu__field-item">Settings</a>
27
+ </div>
28
+ <div>
29
+ <a href="/customer/orders" class="CustomerMenu__field-item">Orders</a>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </template>
34
+
35
+ <script>
36
+ export default {
37
+ name: 'CustomerMenu',
38
+ data() {
39
+ return {
40
+ isOpen: false,
41
+ };
42
+ }
43
+ };
44
+ </script>
45
+
46
+ <style lang="scss">
47
+ @import 'customer-menu';
48
+ </style>
49
+
@@ -0,0 +1,19 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ .CustomerOrders {
4
+ &__wrapper {
5
+ position: relative;
6
+ }
7
+ &__table {
8
+ th {
9
+ font-weight: bold;
10
+ }
11
+ td {
12
+ padding: 15px;
13
+ a {
14
+ color: $purple;
15
+ font-weight: bold;
16
+ }
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,69 @@
1
+ <template>
2
+ <div class="CustomerOrders__wrapper">
3
+ <table class="lc_table bordered CustomerOrders__table">
4
+ <thead class="centered">
5
+ <tr>
6
+ <th>Created At</th>
7
+ <th>Code</th>
8
+ <th>Status</th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
12
+ <tr
13
+ v-for="order of orders"
14
+ :key="order._id">
15
+ <td>{{ order.createdAt | date }}</td>
16
+ <td>
17
+ <a
18
+ :href="`/order/${order.token}`"
19
+ target="_blank">
20
+ {{ order.code }}
21
+ </a>
22
+ </td>
23
+ <td>{{ order.status }}</td>
24
+ </tr>
25
+ </tbody>
26
+ </table>
27
+ </div>
28
+ </template>
29
+
30
+ <script>
31
+ import { mapGetters } from 'vuex';
32
+ import api from '@lancom/shared/assets/js/api';
33
+ import { date } from '@lancom/shared/assets/js/utils/filters';
34
+
35
+
36
+ export default {
37
+ name: 'CustomerOrders',
38
+ filters: {
39
+ date
40
+ },
41
+ props: {
42
+ customer: {
43
+ type: Object,
44
+ required: true
45
+ }
46
+ },
47
+ data() {
48
+ return {
49
+ orders: []
50
+ }
51
+ },
52
+ computed: {
53
+ ...mapGetters(['contacts', 'shop']),
54
+ },
55
+ mounted() {
56
+ this.locadCustomerOrders();
57
+ },
58
+ methods: {
59
+ async locadCustomerOrders() {
60
+ this.orders = await api.fetchCustomerOrders(this.customer, this.shop._id);
61
+ }
62
+ }
63
+ };
64
+ </script>
65
+
66
+ <style lang="scss">
67
+ @import 'customer-orders';
68
+ </style>
69
+
@@ -73,10 +73,10 @@
73
73
  margin-top: 10px;
74
74
  }
75
75
  &__product-image {
76
- width: 100%;
77
76
  text-align: center;
78
- margin: 15px 0;
77
+ margin: 15px auto;
79
78
  height: 300px;
79
+ width: 300px;
80
80
  position: relative;
81
81
  display: none;
82
82
  @media (max-width: $bp-extra-small-max) {
@@ -110,6 +110,7 @@
110
110
  :product="previewPrintProduct"
111
111
  :side="side"
112
112
  :default-preview="false"
113
+ :fill-background="true"
113
114
  size="large" />
114
115
  <div
115
116
  class="EditorProductDetails__product-sides-toggle"
@@ -20,9 +20,13 @@
20
20
  &-container {
21
21
  position: relative;
22
22
  margin: 0 auto;
23
- width: 310px;
24
- height: 370px;
23
+ width: 290px;
24
+ height: 290px;
25
25
  max-width: 100%;
26
+ @media (min-width: $bp-extra-small-min) {
27
+ width: 330px;
28
+ height: 330px;
29
+ }
26
30
  @media (min-width: $bp-small-min) {
27
31
  width: 580px;
28
32
  height: 580px;
@@ -95,20 +99,27 @@
95
99
  margin: 0 auto;
96
100
  max-width: 100%;
97
101
  position: sticky;
98
- bottom: 20px;
102
+ bottom: 0px;
99
103
  background: white;
100
- width: 310px;
104
+ width: 290px;
105
+ @media (min-width: $bp-extra-small-min) {
106
+ width: 370px;
107
+ }
101
108
  @media (min-width: $bp-small-min) {
102
109
  width: 580px;
110
+ bottom: 20px;
103
111
  }
104
112
  @media (min-width: $bp-medium-min) {
105
113
  width: 430px;
114
+ bottom: 20px;
106
115
  }
107
116
  @media (min-width: $bp-large-min) {
108
117
  width: 600px;
118
+ bottom: 20px;
109
119
  }
110
120
  @media (min-width: $bp-extra-large-min) {
111
121
  width: 720px;
122
+ bottom: 20px;
112
123
  }
113
124
 
114
125
  &--bottom {
@@ -253,6 +253,7 @@ export default {
253
253
  },
254
254
  calcWorkspaceSize() {
255
255
  const sizes = {
256
+ mini: 290,
256
257
  xs: 330,
257
258
  sm: 580,
258
259
  md: 430,
@@ -0,0 +1,23 @@
1
+ <template>
2
+ <a ref="link"></a>
3
+ </template>
4
+
5
+ <script>
6
+ export default {
7
+ name: 'EmailLink',
8
+ props: {
9
+ email: {
10
+ type: Array | String,
11
+ required: true
12
+ }
13
+ },
14
+ mounted() {
15
+ if (process.client) {
16
+ const email = (Array.isArray(this.email) ? this.email : [this.email]).join('@');
17
+ const linkEl = this.$refs.link;
18
+ linkEl.href = `mailto:${email}`;
19
+ linkEl.textContent = email;
20
+ }
21
+ }
22
+ };
23
+ </script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lancom/shared",
3
- "version": "0.0.333",
3
+ "version": "0.0.335",
4
4
  "description": "lancom common scripts",
5
5
  "author": "e.tokovenko <e.tokovenko@gmail.com>",
6
6
  "repository": {
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <div class="CustomerCreate__wrapper">
3
+ <div class="lc_h2">Customer Orders</div>
4
+ <customer-orders class="mt-10" :customer="user" />
5
+ </div>
6
+ </template>
7
+
8
+ <script>
9
+ import { mapGetters } from 'vuex';
10
+ import CustomerOrders from '@lancom/shared/components/customer/customer_orders/customer-orders';
11
+
12
+ export default {
13
+ name: 'CustomerOrdersPage',
14
+ components: {
15
+ CustomerOrders
16
+ },
17
+ computed: {
18
+ ...mapGetters('auth', ['user'])
19
+ }
20
+ };
21
+ </script>
22
+
23
+ <style lang="scss" scoped>
24
+ .CustomerCreate {
25
+ &__wrapper {
26
+ padding-top: 30px;
27
+ }
28
+ }
29
+ </style>
package/routes/index.js CHANGED
@@ -109,6 +109,11 @@ module.exports = function(routes, resolve) {
109
109
  path: '/customer/settings',
110
110
  component: resolve('@lancom/shared/pages/customer/settings.vue'),
111
111
  chunkName: 'pages/customer/settings'
112
+ }, {
113
+ name: 'customer-orders',
114
+ path: '/customer/orders',
115
+ component: resolve('@lancom/shared/pages/customer/orders.vue'),
116
+ chunkName: 'pages/customer/orders'
112
117
  }, {
113
118
  name: 'customer-recovery',
114
119
  path: '/customer/recovery',