@lancom/shared 0.0.426 → 0.0.428

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.
@@ -0,0 +1,11 @@
1
+ .ClientSettingsTax__wrapper {
2
+ display: flex;
3
+ align-items: center;
4
+ }
5
+
6
+ .ClientSettingsTax__toggle {
7
+ display: flex;
8
+ align-items: center;
9
+ }
10
+
11
+
@@ -0,0 +1,48 @@
1
+ <template>
2
+ <div class="ClientSettingsTax__wrapper">
3
+ <div class="ClientSettingsTax__toggle">
4
+ <toggle-switch
5
+ v-model="inclGST"
6
+ left-label="Ex VAT"
7
+ right-label="Inc VAT" />
8
+ </div>
9
+ </div>
10
+ </template>
11
+
12
+ <script>
13
+ import { mapGetters, mapMutations } from 'vuex';
14
+ import ToggleSwitch from '@lancom/shared/components/common/toggle-switch';
15
+
16
+ export default {
17
+ name: 'ClientSettingsTax',
18
+ components: {
19
+ ToggleSwitch
20
+ },
21
+ props: {
22
+ color: {
23
+ type: String
24
+ }
25
+ },
26
+ computed: {
27
+ ...mapGetters(['taxName']),
28
+ ...mapGetters('product', ['priceIncludeGST']),
29
+ inclGST: {
30
+ get() {
31
+ return this.priceIncludeGST;
32
+ },
33
+ set(value) {
34
+ this.setPriceIncludeGST(value);
35
+ }
36
+ }
37
+ },
38
+ methods: {
39
+ ...mapMutations('product', ['setPriceIncludeGST'])
40
+ }
41
+ };
42
+ </script>
43
+
44
+ <style lang="scss" scoped>
45
+ @import 'client-settings-tax';
46
+ </style>
47
+
48
+
@@ -0,0 +1,123 @@
1
+ <template>
2
+ <div
3
+ class="toggle"
4
+ :class="[{ 'is-on': value, disabled }, sizeClass]"
5
+ role="switch"
6
+ :aria-checked="String(value)"
7
+ @click="toggle">
8
+ <span
9
+ class="label left"
10
+ :class="{ active: !value }">
11
+ {{ leftLabel }}
12
+ </span>
13
+ <div class="track">
14
+ <div class="thumb"></div>
15
+ </div>
16
+ <span
17
+ class="label right"
18
+ :class="{ active: value }">
19
+ {{ rightLabel }}
20
+ </span>
21
+ </div>
22
+ </template>
23
+
24
+ <script>
25
+ export default {
26
+ name: 'ToggleSwitch',
27
+ props: {
28
+ value: {
29
+ type: Boolean,
30
+ default: false
31
+ },
32
+ leftLabel: {
33
+ type: String,
34
+ default: 'Off'
35
+ },
36
+ rightLabel: {
37
+ type: String,
38
+ default: 'On'
39
+ },
40
+ disabled: {
41
+ type: Boolean,
42
+ default: false
43
+ },
44
+ size: {
45
+ type: String,
46
+ default: 'md' // sm | md | lg
47
+ },
48
+ color: {
49
+ type: String,
50
+ default: '#1976d2'
51
+ }
52
+ },
53
+ computed: {
54
+ sizeClass() {
55
+ return `size-${this.size}`;
56
+ }
57
+ },
58
+ methods: {
59
+ toggle() {
60
+ if (this.disabled) {
61
+ return;
62
+ }
63
+ this.$emit('input', !this.value);
64
+ this.$emit('change', !this.value);
65
+ }
66
+ }
67
+ };
68
+ </script>
69
+
70
+ <style scoped>
71
+ .toggle {
72
+ display: inline-flex;
73
+ align-items: center;
74
+ user-select: none;
75
+ cursor: pointer;
76
+ gap: 10px;
77
+ position: relative;
78
+ padding-bottom: 6px;
79
+ }
80
+
81
+ .label {
82
+ font-weight: 600;
83
+ opacity: 0.6;
84
+ transition: opacity 0.15s, color 0.15s;
85
+ }
86
+ .label.active {
87
+ opacity: 1;
88
+ }
89
+
90
+ .track {
91
+ position: relative;
92
+ border-radius: 999px;
93
+ background: #e9eef6;
94
+ transition: background 0.2s ease;
95
+ }
96
+ .thumb {
97
+ position: absolute;
98
+ top: 50%;
99
+ left: 2px;
100
+ transform: translate(0, -50%);
101
+ border-radius: 50%;
102
+ background: #fff;
103
+ transition: left 0.25s ease;
104
+ box-shadow: 0 1px 2px rgba(0,0,0,0.2);
105
+ }
106
+ .is-on .thumb {
107
+ left: calc(100% - 2px - var(--thumb-size));
108
+ }
109
+ .is-on .track {
110
+ background: var(--color, #1976d2);
111
+ }
112
+ .disabled {
113
+ opacity: 0.5;
114
+ cursor: not-allowed;
115
+ }
116
+
117
+ .size-sm .track { width: 36px; height: 18px; }
118
+ .size-sm .thumb { width: 14px; height: 14px; --thumb-size: 14px; }
119
+ .size-md .track { width: 44px; height: 22px; }
120
+ .size-md .thumb { width: 18px; height: 18px; --thumb-size: 18px; }
121
+ .size-lg .track { width: 54px; height: 28px; }
122
+ .size-lg .thumb { width: 24px; height: 24px; --thumb-size: 24px; }
123
+ </style>
@@ -70,10 +70,10 @@ export default {
70
70
  ...mapActions('auth', ['update_user']),
71
71
  createdCustomer({ customer: user, token }) {
72
72
  this.update_user({ user, token });
73
- this.$router.push('/');
73
+ this.$router.push('/customer/orders');
74
74
  },
75
75
  signin() {
76
- this.$router.push('/');
76
+ this.$router.push('/customer/orders');
77
77
  }
78
78
  }
79
79
  };
@@ -66,10 +66,14 @@
66
66
  :key="`${layer.createdAt}-${index}`"
67
67
  :layer="layer"
68
68
  :active="selectedLayer && selectedLayer.createdAt === layer.createdAt"
69
+ :visible-move-up="layer !== group.layers[0]"
70
+ :visible-move-down="layer !== group.layers[group.layers.length - 1]"
69
71
  @select="setSelectedLayer(layer)"
70
72
  @edit="editLayer(layer)"
71
73
  @duplicate="duplicateLayer(layer)"
72
- @remove="removeLayer(layer)">
74
+ @remove="removeLayer(layer)"
75
+ @up="moveUp(layer)"
76
+ @down="moveDown(layer)">
73
77
  </editor-layers-layer>
74
78
  </div>
75
79
  </div>
@@ -166,6 +170,8 @@ export default {
166
170
  'setSelectedLayerField',
167
171
  'addTemplateLayer',
168
172
  'removeTemplateLayer',
173
+ 'moveUpTemplateLayer',
174
+ 'moveDownTemplateLayer',
169
175
  'updateTemplateLayer',
170
176
  'setEditableSide',
171
177
  'setSelectedPrintArea',
@@ -217,6 +223,12 @@ export default {
217
223
  this.removeTemplateLayer(layer);
218
224
  this.setSelectedLayer(null);
219
225
  },
226
+ moveUp(layer) {
227
+ this.moveUpTemplateLayer(layer);
228
+ },
229
+ moveDown(layer) {
230
+ this.moveDownTemplateLayer(layer);
231
+ },
220
232
  closeEditableLayer(invalid) {
221
233
  if (invalid) {
222
234
  this.removeTemplateLayer(this.selectedLayer);
@@ -100,13 +100,31 @@
100
100
  &__edit {
101
101
  width: 100%;
102
102
  }
103
- &__remove {
103
+ &__controls{
104
104
  position: absolute;
105
105
  top: 16px;
106
106
  right: 12px;
107
107
  font-size: 18px;
108
108
  color: #777;
109
109
  cursor: pointer;
110
+ display: flex;
111
+ span {
112
+ position: relative;
113
+ }
114
+ }
115
+ &__up {
116
+ // position: absolute;
117
+ // top: 4px;
118
+ // right: 0;
119
+ display: inline-block;
120
+ transform: rotate(90deg);
121
+ }
122
+ &__down {
123
+ // position: absolute;
124
+ // top: 4px;
125
+ // right: 0;
126
+ display: inline-block;
127
+ transform: rotateZ(-90deg);
110
128
  }
111
129
  &__actions {
112
130
  display: flex;
@@ -137,4 +155,4 @@
137
155
  }
138
156
  }
139
157
  }
140
- }
158
+ }
@@ -3,9 +3,21 @@
3
3
  class="EditorLayersLayer__wrapper"
4
4
  :class="{ active }"
5
5
  @click="$emit('select')">
6
- <i
7
- class="icon-delete EditorLayersLayer__remove"
8
- @click="$emit('remove')"></i>
6
+ <div class="EditorLayersLayer__controls">
7
+ <span v-if="visibleMoveUp">
8
+ <i
9
+ class="icon-arrow-left EditorLayersLayer__up"
10
+ @click="$emit('up')"></i>
11
+ </span>
12
+ <span v-if="visibleMoveDown">
13
+ <i
14
+ class="icon-arrow-left EditorLayersLayer__down"
15
+ @click="$emit('down')"></i>
16
+ </span>
17
+ <i
18
+ class="icon-delete"
19
+ @click="$emit('remove')"></i>
20
+ </div>
9
21
  <div class="EditorLayersLayer__thumb">
10
22
  <i
11
23
  v-if="layerIcon"
@@ -81,12 +93,18 @@ import { number } from '@lancom/shared/assets/js/utils/filters';
81
93
 
82
94
  export default {
83
95
  name: 'EditorLayersLayer',
84
- mixins: [printLayerMixin],
85
96
  filters: { number },
97
+ mixins: [printLayerMixin],
86
98
  props: {
87
99
  active: {
88
100
  type: Boolean,
89
101
  default: false
102
+ },
103
+ visibleMoveUp: {
104
+ type: Boolean
105
+ },
106
+ visibleMoveDown: {
107
+ type: Boolean
90
108
  }
91
109
  },
92
110
  computed: {
@@ -23,8 +23,8 @@ export default {
23
23
  };
24
24
  },
25
25
  methods: {
26
- onSignin(faq) {
27
- this.$router.push('/');
26
+ onSignin() {
27
+ this.$router.push('/customer/orders');
28
28
  }
29
29
  }
30
30
  };
@@ -5,8 +5,8 @@
5
5
  class="Gallery__big">
6
6
  <div class="Gallery__big-image">
7
7
  <img
8
- :src="staticLink(currentImage.large)"
9
- :alt="product.name"
8
+ :src="staticLink(currentImage.extralarge || currentImage.large)"
9
+ :alt="imageAlt(currentImage)"
10
10
  class="Gallery__big-image-src"
11
11
  @mouseenter="startZoom"
12
12
  @mousemove="updateZoomWithThrottle"
@@ -47,14 +47,14 @@
47
47
  preview: !showBigImage
48
48
  }">
49
49
  <img
50
- :src="staticLink(currentImage.large)"
50
+ :src="staticLink(currentImage.extralarge || currentImage.large)"
51
51
  :style="zoomImageStyles"
52
52
  class="Gallery__zoom-image-src" />
53
53
  </div>
54
54
  <div class="Gallery__small">
55
55
  <div
56
56
  v-for="(image, index) in visibleImages"
57
- :key="image.large"
57
+ :key="image.extralarge || image.large"
58
58
  class="Gallery__small-image"
59
59
  :class="{
60
60
  'Gallery__small-image--active': (visibleImagesFrom + index) === activeIndex
@@ -64,7 +64,7 @@
64
64
  @mouseleave="stopZoom">
65
65
  <img
66
66
  :src="staticLink(image.small)"
67
- :alt="product.name"
67
+ :alt="imageAlt(image)"
68
68
  width="65"
69
69
  height="65"
70
70
  class="Gallery__small-image-src" />
@@ -217,6 +217,12 @@ export default {
217
217
  methods: {
218
218
  ...mapActions('product', ['selectColor']),
219
219
  staticLink,
220
+ imageAlt(image) {
221
+ const { name, SKU } = this.product;
222
+ const type = image.types?.find(t => t === 'front' || t === 'back');
223
+ const productName = [image.colorName, type, name].filter(i => !!i).join(' ');
224
+ return [productName, SKU].join(' | ');
225
+ },
220
226
  startPreview(index) {
221
227
  if (!this.isZoomin) {
222
228
  this.startZoom();
@@ -124,7 +124,7 @@ export default (IS_PRODUCT_PRESET_PRINT_PRICING, isEditor = false) => ({
124
124
  return (thumbProductImages.length > 0 ? thumbProductImages : this.images).slice(0, 6);
125
125
  },
126
126
  mainProductImageSrc() {
127
- return this.mainProductImage && staticLink(this.mainProductImage.large);
127
+ return this.mainProductImage && staticLink(this.mainProductImage.extralarge || this.mainProductImage.large);
128
128
  },
129
129
  mainProductImageStyles() {
130
130
  return this.mainProductImageSrc ? { 'background-image': `url(${this.mainProductImageSrc});` } : {};
@@ -326,7 +326,7 @@ export default (IS_PRODUCT_PRESET_PRINT_PRICING, isEditor = false) => ({
326
326
  "gtin13": sp.gtin,
327
327
  "image": [
328
328
  image,
329
- ...galleryImages.map(i => i.large).filter(i => !!i && i !== image)
329
+ ...galleryImages.map(i => i.extralarge || i.large).filter(i => !!i && i !== image)
330
330
  ],
331
331
  "name": name,
332
332
  "description": description,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lancom/shared",
3
- "version": "0.0.426",
3
+ "version": "0.0.428",
4
4
  "description": "lancom common scripts",
5
5
  "author": "e.tokovenko <e.tokovenko@gmail.com>",
6
6
  "repository": {
package/store/product.js CHANGED
@@ -459,6 +459,22 @@ export const mutations = {
459
459
  state.isPrintPricing = false;
460
460
  }
461
461
  },
462
+ moveUpTemplateLayer(state, layer) {
463
+ const index = state.template.layers.findIndex(({ createdAt }) => createdAt === layer.createdAt);
464
+ if (index > 0) {
465
+ const layers = state.template.layers;
466
+ const [layerToMove] = layers.splice(index, 1);
467
+ layers.splice(index - 1, 0, layerToMove);
468
+ }
469
+ },
470
+ moveDownTemplateLayer(state, layer) {
471
+ const index = state.template.layers.findIndex(({ createdAt }) => createdAt === layer.createdAt);
472
+ if (index < state.template.layers.length - 1) {
473
+ const layers = state.template.layers;
474
+ const [layerToMove] = layers.splice(index, 1);
475
+ layers.splice(index + 1, 0, layerToMove);
476
+ }
477
+ },
462
478
  updateTemplateLayer(state, layer) {
463
479
  const index = state.template.layers.findIndex(({ createdAt, _id }) => createdAt === layer.createdAt || (_id && _id === layer._id));
464
480
  Vue.set(state.template.layers, index, layer);