@lancom/shared 0.0.430 → 0.0.431

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.
Files changed (46) hide show
  1. package/assets/js/api/index.js +2 -2
  2. package/assets/js/constants/product.js +14 -0
  3. package/assets/scss/_common.scss +9 -1
  4. package/assets/scss/variables/_breakpoints.scss +2 -0
  5. package/components/common/breadcrumbs/breadcrumbs.scss +4 -1
  6. package/components/common/breadcrumbs/breadcrumbs.vue +4 -1
  7. package/components/common/client_settings/client-settings.vue +2 -3
  8. package/components/common/client_settings_tax/client-settings-tax.vue +1 -0
  9. package/components/common/price.vue +1 -2
  10. package/components/common/pricing_discounts_table/pricing-discounts-table.vue +28 -5
  11. package/components/common/product_side_with_print/product-side-with-print.vue +3 -3
  12. package/components/common/stars-mark.vue +21 -9
  13. package/components/common/tabs.vue +17 -3
  14. package/components/editor/editor_colors/editor-colors.scss +79 -0
  15. package/components/editor/editor_colors/editor-colors.vue +90 -0
  16. package/components/editor/editor_layers/editor-layers.vue +11 -6
  17. package/components/editor/editor_workspace/editor-workspace.vue +17 -15
  18. package/components/editor/editor_workspace/editor_workspace_side/editor-workspace-side.vue +2 -9
  19. package/components/product/other_products/other-products.scss +34 -0
  20. package/components/product/other_products/other-products.vue +76 -0
  21. package/components/product/other_products/other_product/other-product.scss +80 -0
  22. package/components/product/other_products/other_product/other-product.vue +59 -0
  23. package/components/product/product.vue +0 -14
  24. package/components/product/product_check_delivery/product-check-delivery.scss +31 -0
  25. package/components/product/product_check_delivery/product-check-delivery.vue +73 -0
  26. package/components/product/product_colors_selector/product-colors-selector.scss +8 -1
  27. package/components/product/product_colors_selector/product-colors-selector.vue +8 -0
  28. package/components/product/product_pricing_tiers/product-pricing-tiers.scss +53 -0
  29. package/components/product/product_pricing_tiers/product-pricing-tiers.vue +40 -0
  30. package/components/product/product_reviews/product-reviews.vue +6 -6
  31. package/components/product/product_stock_status/product-stock-status.scss +28 -0
  32. package/components/product/product_stock_status/product-stock-status.vue +35 -0
  33. package/components/product/related_products/related-products.vue +4 -4
  34. package/components/products/products_attributes/products_attribute/products-attribute.vue +19 -18
  35. package/components/products/products_brands/products-brands.vue +3 -1
  36. package/components/products/products_filters/products-filters.vue +9 -1
  37. package/components/products/products_tags/products-tags.vue +19 -18
  38. package/components/products/products_types/products-types.scss +1 -1
  39. package/layouts/products.vue +153 -432
  40. package/mixins/layouts/products.js +285 -0
  41. package/mixins/product-preview.js +13 -0
  42. package/package.json +1 -1
  43. package/store/index.js +2 -0
  44. package/store/product.js +50 -12
  45. package/components/the_breadcrumbs/the-breadcrumbs.scss +0 -36
  46. package/components/the_breadcrumbs/the-breadcrumbs.vue +0 -78
@@ -0,0 +1,285 @@
1
+ import debounce from 'lodash.debounce';
2
+ import { mapActions, mapGetters, mapMutations } from 'vuex';
3
+ import gtm from '@lancom/shared/assets/js/utils/gtm';
4
+ import metaInfo from '@lancom/shared/mixins/meta-info';
5
+ import { generateProductsLink, generateProductLink } from '@lancom/shared/assets/js/utils/product';
6
+ import { getProductLargeCover, getProductMediumCover } from '@lancom/shared/assets/js/utils/colors';
7
+
8
+ export default {
9
+ mixins: [metaInfo],
10
+ middleware: ['page-info'],
11
+ async fetch() {
12
+ await this.loadProducts();
13
+
14
+ if (this.page === 1) {
15
+ await this.fetchChildrenCategories(this.currentCategory);
16
+ }
17
+
18
+ if (process.server) {
19
+ this.$root.context?.res?.setHeader('Cache-Control', `max-age=${86400}`);;
20
+ }
21
+ },
22
+ computed: {
23
+ ...mapGetters('page', ['routeInfo']),
24
+ ...mapGetters(['notificationBar', 'shop', 'country', 'currency']),
25
+ ...mapGetters('products', ['category', 'childrenCategories', 'categories', 'brands', 'types', 'tags', 'loadError', 'count', 'products', 'minPrice', 'maxPrice', 'page']),
26
+ hasChildrenCategories() {
27
+ return this.childrenCategories.length > 0;
28
+ },
29
+ pageItemCanonical() {
30
+ const page = +this.$route.query.page;
31
+ return `${this.breadcrumbs[this.breadcrumbs.length - 1]?.to}${page > 1 ? `?page=${page}` : ''}`;
32
+ },
33
+ pageItemType() {
34
+ return 'product';
35
+ },
36
+ pageItemImage() {
37
+ const images = this.products?.reduce((images, product) => {
38
+ const image = getProductLargeCover(product, 'front') || getProductMediumCover(product, 'front');
39
+ return image ? [...images, image] : images;
40
+ }, []) || [];
41
+ return images.slice(0, 1);
42
+ },
43
+ currentBrand() {
44
+ return this.findByRouteParam(this.brands, 'brand');
45
+ },
46
+ currentTag() {
47
+ return this.findByRouteParam(this.tags, 'tag');
48
+ },
49
+ currentProductType() {
50
+ return this.findByRouteParam(this.types, 'type');
51
+ },
52
+ currentCategory() {
53
+ return this.category;
54
+ },
55
+ breadcrumbs() {
56
+ const breadcrumbs = [{
57
+ to: '/products',
58
+ text: 'Products'
59
+ }];
60
+ if (this.currentCategory) {
61
+ const categoriesBreadcrumbs = [];
62
+ let category = this.currentCategory;
63
+ console.log('category: ', category);
64
+ while (category) {
65
+ categoriesBreadcrumbs.unshift({
66
+ to: generateProductsLink(this.$route, {
67
+ type: null,
68
+ brand: null,
69
+ tag: null,
70
+ category
71
+ }, true),
72
+ text: category.name
73
+ });
74
+ category = category.parent;
75
+ }
76
+ breadcrumbs.push(...categoriesBreadcrumbs);
77
+ }
78
+ if (this.currentProductType) {
79
+ breadcrumbs.push({
80
+ to: generateProductsLink(this.$route, {
81
+ type: this.currentProductType.alias,
82
+ brand: null,
83
+ tag: null,
84
+ category: null
85
+ }),
86
+ text: this.currentProductType.name
87
+ });
88
+ }
89
+
90
+ if (this.currentTag) {
91
+ breadcrumbs.push({
92
+ to: generateProductsLink(this.$route, {
93
+ type: this.currentProductType?.alias,
94
+ tag: this.currentTag?.alias,
95
+ brand: null,
96
+ category: null
97
+ }),
98
+ text: this.currentTag.name
99
+ });
100
+ }
101
+
102
+ if (this.currentBrand) {
103
+ breadcrumbs.push({
104
+ to: generateProductsLink(this.$route, {
105
+ type: this.currentProductType?.alias,
106
+ tag: this.currentTag?.alias,
107
+ brand: this.currentBrand?.alias,
108
+ category: this.currentCategory?.alias
109
+ }),
110
+ text: this.currentBrand.name
111
+ });
112
+ }
113
+
114
+ return breadcrumbs;
115
+ },
116
+ routeName() {
117
+ if (this.routeInfo && this.routeInfo.textTitle) {
118
+ return this.routeInfo.textTitle;
119
+ }
120
+
121
+ const items = ['Products'];
122
+ if (this.currentCategory) {
123
+ items.push(this.currentCategory.name);
124
+ }
125
+ if (this.currentProductType) {
126
+ items.push(this.currentProductType.name);
127
+ }
128
+ if (this.currentTag) {
129
+ items.push(this.currentTag.name);
130
+ }
131
+ if (this.currentBrand) {
132
+ items.push(this.currentBrand.name);
133
+ }
134
+ return items.join(' / ');
135
+ }
136
+ },
137
+ watch: {
138
+ '$route.params': {
139
+ handler() {
140
+ this.loadProductsWithDebounce();
141
+ },
142
+ deep: true
143
+ },
144
+ '$route.query': {
145
+ handler() {
146
+ this.loadProductsWithDebounce();
147
+ },
148
+ deep: true
149
+ }
150
+ },
151
+ mounted() {
152
+ this.loadState(this.$route.query);
153
+ this.logGtm();
154
+ // setTimeout(() => this.loadProducts(), 3000);
155
+ },
156
+ jsonld() {
157
+ const productsSchema = {
158
+ '@context': 'http://schema.org',
159
+ '@type': 'OfferCatalog',
160
+ name: this.pageTitle,
161
+ numberOfItems: this.count,
162
+ itemListOrder: 'ItemListUnordered',
163
+ itemListElement: this.products?.map(product => {
164
+ const minPrintsPrice = product.minPrintsPrice || 0;
165
+ const minProductPrice = product.isClearance ? product.minPriceWithoutClearance : product.minPrice;
166
+ const minPrice = minProductPrice + minPrintsPrice;
167
+
168
+ const maxPrintsPrice = product.maxPrintsPrice || 0;
169
+ const maxProductPrice = product.isClearance ? product.maxPriceWithoutClearance : product.maxPrice;
170
+ const maxPrice = maxProductPrice + maxPrintsPrice;
171
+
172
+ const schema = {
173
+ '@type': 'Product',
174
+ name: product.name,
175
+ url: `https://${process.env.HOST_NAME}${generateProductLink(product)}`,
176
+ sku: product.SKU,
177
+ offers: {
178
+ '@type': 'AggregateOffer',
179
+ offerCount: 1,
180
+ name: product.name,
181
+ highPrice: maxPrice,
182
+ lowPrice: minPrice,
183
+ priceCurrency: this.currency?.isoCode || 'AUD',
184
+ availability: 'InStock'
185
+ }
186
+ };
187
+ if (product.brand) {
188
+ schema.brand = {
189
+ '@type': 'Organization',
190
+ name: product.brand.name
191
+ };
192
+ }
193
+
194
+ const image = getProductLargeCover(product, 'front') || getProductMediumCover(product, 'front');
195
+ if (image) {
196
+ schema.image = image;
197
+ }
198
+
199
+ return schema;
200
+ }) || []
201
+ };
202
+
203
+ const breadcrumbSchema = {
204
+ '@context': 'https://schema.org',
205
+ '@type': 'BreadcrumbList',
206
+ itemListElement: [
207
+ {
208
+ '@type': 'ListItem',
209
+ position: 1,
210
+ name: 'Home',
211
+ item: `https://${process.env.HOST_NAME}/`
212
+ },
213
+ ...this.breadcrumbs
214
+ .map((b, index) => ({
215
+ '@type': 'ListItem',
216
+ position: index + 2,
217
+ name: b.text,
218
+ item: b.to ? `https://${process.env.HOST_NAME}${b.to}` : undefined
219
+ }))
220
+ ]
221
+ };
222
+
223
+ return [productsSchema, breadcrumbSchema, this.$store.state.shop?.shopSchema].filter(s => !!s);
224
+ },
225
+ methods: {
226
+ ...mapActions([
227
+ 'loadState'
228
+ ]),
229
+ ...mapActions('products', [
230
+ 'fetchProducts',
231
+ 'fetchChildrenCategories'
232
+ ]),
233
+ ...mapMutations('products', [
234
+ 'setPlaceholder'
235
+ ]),
236
+ logGtm() {
237
+ if (process.client) {
238
+ if (this.$route.query.text) {
239
+ gtm.viewSearchResult(this.$route.query.text);
240
+ }
241
+ gtm.viewItemList(this.products, this.currency);
242
+ }
243
+ },
244
+ loadProductsWithDebounce: debounce(function () {
245
+ if (/^\/products/.test(this.$route.path)) {
246
+ this.loadProducts();
247
+ }
248
+
249
+ this.$aside.hide();
250
+ }, 100),
251
+ async loadProducts(placeholder) {
252
+ const params = {
253
+ ...this.$route.params,
254
+ ...this.$route.query,
255
+ country: this.country?._id,
256
+ currency: this.currency?._id,
257
+ placeholder,
258
+ limit: 80
259
+ };
260
+ try {
261
+ await this.fetchProducts({ params, shop: this.shop._id });
262
+ this.setPlaceholder(placeholder);
263
+ setTimeout(() => this.logGtm());
264
+ } catch ({ response }) {
265
+ if (process.server) {
266
+ this.$root.context.res.statusCode = this.loadError?.statusCode || 500;
267
+ }
268
+ }
269
+ },
270
+ findByRouteParam(list, param) {
271
+ return list.find(i => i.alias === this.$route.params[param]);
272
+ },
273
+ fillWithItemData(text = '') {
274
+ text = this.currentBrand ? text.replace(/{{brandName}}/g, this.currentBrand.name) : text;
275
+ text = this.currentProductType ? text.replace(/{{typeName}}/g, this.currentProductType.name) : text;
276
+ text = this.currentTag ? text.replace(/{{tagName}}/g, this.currentTag.name) : text;
277
+ text = this.currentCategory ? text.replace(/{{categoryName}}/g, this.currentCategory.name) : text;
278
+ return text;
279
+ },
280
+ async openAside() {
281
+ const ProductsAside = await import('@/components/products/products_aside/products-aside');
282
+ this.$aside.show(ProductsAside.default);
283
+ }
284
+ }
285
+ };
@@ -115,6 +115,19 @@ const productPreview = {
115
115
  const printsPrice = this.product.maxPrintsPrice || 0;
116
116
  const productPrice = this.product.isClearance ? this.product.maxPriceWithoutClearance : this.product.maxPrice;
117
117
  return productPrice + printsPrice;
118
+ },
119
+ genderIcon() {
120
+ switch (this.product.gender) {
121
+ case 'men':
122
+ return 'icon-men';
123
+ case 'women':
124
+ return 'icon-women';
125
+ case 'unisex':
126
+ return 'icon-unisex';
127
+ case 'toddler':
128
+ case 'child':
129
+ return 'icon-baby';
130
+ }
118
131
  }
119
132
  },
120
133
  mounted() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lancom/shared",
3
- "version": "0.0.430",
3
+ "version": "0.0.431",
4
4
  "description": "lancom common scripts",
5
5
  "author": "e.tokovenko <e.tokovenko@gmail.com>",
6
6
  "repository": {
package/store/index.js CHANGED
@@ -36,6 +36,8 @@ export const getters = {
36
36
  googleClickId: ({ googleClickId }) => googleClickId,
37
37
  payment: ({ payment }) => payment || {},
38
38
  menus: ({ menus }) => menus || [],
39
+ topRightMenu: ({ menus }) => (menus || []).find(({ type }) => type === 'top-right'),
40
+ topLeftMenu: ({ menus }) => (menus || []).find(({ type }) => type === 'top-left'),
39
41
  topMenu: ({ menus }) => (menus || []).find(({ type }) => type === 'top'),
40
42
  footerMenus: ({ menus }) => (menus || []).filter(({ type }) => type === 'footer'),
41
43
  helpMessages: ({ helpMessages }) => helpMessages || {},
package/store/product.js CHANGED
@@ -7,7 +7,8 @@ import { sortSizes } from '@lancom/shared/assets/js/utils/sizes';
7
7
  import { isValidImageTypes, getColorOfDefaultCatalogFrontImage } from '@lancom/shared/assets/js/utils/colors';
8
8
  import { getProductsForCalculatePricing } from '@lancom/shared/assets/js/utils/product';
9
9
  import { filterBigSize } from '@lancom/shared/assets/js/utils/product';
10
- import { sortByName } from '../assets/js/utils/filters';
10
+ import { sortByName } from '@lancom/shared/assets/js/utils/filters';
11
+ import { PRODUCT_STOCK_STATUS } from '@lancom/shared/assets/js/constants/product';
11
12
 
12
13
  export const state = () => ({
13
14
  multipack: null,
@@ -25,6 +26,14 @@ export const state = () => ({
25
26
  width: 500,
26
27
  height: 500
27
28
  },
29
+ editorSizeBreakpoints: {
30
+ mini: 350,
31
+ xs: 400,
32
+ sm: 580,
33
+ md: 430,
34
+ lg: 600,
35
+ xl: 720
36
+ },
28
37
  template: {
29
38
  visibleSteps: false,
30
39
  layers: [],
@@ -65,6 +74,7 @@ export const getters = {
65
74
  productDetails: ({ productDetails }) => productDetails,
66
75
  productDetailsLoaded: ({ productDetails }) => !!productDetails,
67
76
  editorSize: ({ editorSize }) => editorSize,
77
+ editorSizeBreakpoints: ({ editorSizeBreakpoints }) => editorSizeBreakpoints,
68
78
  template: ({ template }) => template,
69
79
  layers: ({ template }) => template.layers || [],
70
80
  banners: ({ banners }) => banners || [],
@@ -160,7 +170,7 @@ export const getters = {
160
170
  printsPrice: ({ productPricing, product }) => {
161
171
  const maxPrintsPrice = +product.maxPrintsPrice || 0;
162
172
  const pricing = (productPricing?.products || {})[product._id];
163
- const price = pricing?.prints?.prints?.reduce((sum , print) => sum + (+print.priceWithoutTax || 0), 0) || maxPrintsPrice;
173
+ const price = pricing?.prints?.prints?.reduce((sum, print) => sum + (+print.priceWithoutTax || 0), 0) || maxPrintsPrice;
164
174
  return price;
165
175
  },
166
176
  offsetWarningVisible: ({ offsetWarningVisible }) => offsetWarningVisible,
@@ -178,6 +188,26 @@ export const getters = {
178
188
  selectedLayer.type === 'art' &&
179
189
  selectedLayer.dpi < 75
180
190
  );
191
+ },
192
+ stockStatus: ({ productDetails }) => {
193
+ if (!productDetails?.simpleProducts?.length) {
194
+ return PRODUCT_STOCK_STATUS.ALL_IN_STOCK;
195
+ }
196
+
197
+ const simpleProducts = productDetails.simpleProducts;
198
+ const totalProducts = simpleProducts.length;
199
+ const inStockProducts = simpleProducts.filter(sp => (sp.quantityStock || 0) > 0).length;
200
+ const stockPercentage = (inStockProducts / totalProducts) * 100;
201
+
202
+ if (stockPercentage === 100) {
203
+ return PRODUCT_STOCK_STATUS.ALL_IN_STOCK;
204
+ } else if (stockPercentage >= 80) {
205
+ return PRODUCT_STOCK_STATUS.MOSTLY_IN_STOCK;
206
+ } else if (stockPercentage > 0) {
207
+ return PRODUCT_STOCK_STATUS.PARTIALLY_IN_STOCK;
208
+ } else {
209
+ return PRODUCT_STOCK_STATUS.NOT_IN_STOCK;
210
+ }
181
211
  }
182
212
  };
183
213
 
@@ -227,10 +257,12 @@ export const actions = {
227
257
  state.availableColors[0];
228
258
  commit('setEditableColor', editableColor);
229
259
 
230
- let images = editableColor ? [
231
- ...(state.product.images || []).filter(image => image.color === editableColor._id),
232
- ...(state.product.images || []).filter(image => image.color !== editableColor._id)
233
- ] : state.product.images;
260
+ let images = editableColor
261
+ ? [
262
+ ...(state.product.images || []).filter(image => image.color === editableColor._id),
263
+ ...(state.product.images || []).filter(image => image.color !== editableColor._id)
264
+ ]
265
+ : state.product.images;
234
266
  const imagesGroups = new Map();
235
267
  images
236
268
  .filter(i => isValidImageTypes(i, ['front', 'back', 'model']))
@@ -251,7 +283,7 @@ export const actions = {
251
283
  const response = await api.fetchPrintTypes(shop);
252
284
  commit('setPrintTypes', response);
253
285
  },
254
- async updatePriceIncludeGST({ commit }, value) {
286
+ updatePriceIncludeGST({ commit }, value) {
255
287
  commit('setPriceIncludeGST', value);
256
288
  },
257
289
  async calculateProductPrice({ state: { template, product, isPrintPricing }, commit, getters }, { shop, country, currency }) {
@@ -324,6 +356,12 @@ export const mutations = {
324
356
  setLoadingProductDetails(state, loadingProductDetails) {
325
357
  state.loadingProductDetails = loadingProductDetails;
326
358
  },
359
+ setEditorSize(state, editorSize) {
360
+ state.editorSize = editorSize;
361
+ },
362
+ setEditorSizeBreakpoints(state, editorSizeBreakpoints) {
363
+ state.editorSizeBreakpoints = editorSizeBreakpoints;
364
+ },
327
365
  setMultipack(state, multipack) {
328
366
  state.multipack = multipack;
329
367
  },
@@ -345,7 +383,7 @@ export const mutations = {
345
383
  setProductDetails(state, simpleProducts) {
346
384
  const { preSetPrints } = state;
347
385
  const [preSetPrint] = preSetPrints || [];
348
- simpleProducts = simpleProducts.filter(sp => !preSetPrint || (preSetPrint.colors || []).includes(sp.color._id) );
386
+ simpleProducts = simpleProducts.filter(sp => !preSetPrint || (preSetPrint.colors || []).includes(sp.color._id));
349
387
  state.productDetails = { simpleProducts };
350
388
  const availableSizes = [];
351
389
  const sizesPerColor = simpleProducts.reduce((map, { color, size }) => {
@@ -443,9 +481,9 @@ export const mutations = {
443
481
  ];
444
482
  state.template = { ...state.template, layers };
445
483
  if (layers.length >= 1) {
446
- // const printType = state.product.printTypes[0];
447
- // state.selectedPrintType = printType;
448
- state.isPrintPricing = true;
484
+ // const printType = state.product.printTypes[0];
485
+ // state.selectedPrintType = printType;
486
+ state.isPrintPricing = true;
449
487
  }
450
488
  },
451
489
  removeTemplateLayer(state, layer) {
@@ -523,7 +561,7 @@ export const mutations = {
523
561
  state.template.simpleProducts.forEach((simpleProduct, index) => {
524
562
  Vue.set(simpleProduct, 'amount', 0);
525
563
  Vue.set(state.template.simpleProducts, index, simpleProduct);
526
- })
564
+ });
527
565
  },
528
566
  setProductPricing(state, price) {
529
567
  state.productPricing = price;
@@ -1,36 +0,0 @@
1
- @import "@/assets/scss/variables";
2
-
3
- .TheBreadcrumbs {
4
- &__wrapper {
5
- position: fixed;
6
- top: $navbar_height;
7
- left: 0;
8
- right: 0;
9
- z-index: 100;
10
- background-color: $grey_3;
11
- color: $grey_1;
12
- transition-property: transform, opacity;
13
- transition-duration: .22s;
14
- transition-timing-function: ease-in-out;
15
- transition-delay: .22s;
16
- @media (max-width: $bp-extra-small-max) {
17
- top: $mobile_navbar_height;
18
- }
19
- }
20
- &__container {
21
- display: flex;
22
- align-items: center;
23
- padding: 20px 0;
24
- }
25
- &__step {
26
- & > * {
27
- color: inherit;
28
- text-decoration: none;
29
- }
30
- & + & {
31
- &:before {
32
- content: '\00a0\002F';
33
- }
34
- }
35
- }
36
- }
@@ -1,78 +0,0 @@
1
- <template>
2
- <transition
3
- appear
4
- name="appear-from-top">
5
- <nav
6
- v-if="crumbs.length"
7
- class="TheBreadcrumbs__wrapper view-transition"
8
- aria-label="breadcrumbs">
9
- <div class="content-inner extra TheBreadcrumbs__container">
10
- <div
11
- v-for="(item, i) in crumbs"
12
- :key="i"
13
- class="TheBreadcrumbs__step lc_regular14"
14
- :class="item.classes">
15
- <a
16
- v-if="item.path"
17
- :href="item.path">
18
- {{ item.name }}
19
- </a>
20
- <span v-else>
21
- {{ item.name }}
22
- </span>
23
- </div>
24
- </div>
25
- </nav>
26
- </transition>
27
- </template>
28
-
29
- <script>
30
-
31
- export default {
32
- name: 'TheBreadcrumbs',
33
- data() {
34
- return {
35
- schema: {
36
- 'brand-tees-slug': [
37
- { name: 'Editor', path: '/' },
38
- { name: 'Product' }
39
- ]
40
- }
41
- };
42
- },
43
- computed: {
44
- crumbs() {
45
- return this.schema[this.$route.name] || [];
46
- // const crumbs = [];
47
- // this.$route.matched.map((item, i, { length }) => {
48
- // const crumb = {};
49
- // crumb.path = item.path;
50
- // crumb.name = 'route.' + (item.name || item.path);
51
-
52
- // // is last item?
53
- // if (i === length - 1) {
54
- // // is param route? .../.../:id
55
- // if (item.regex.keys.length > 0) {
56
- // crumbs.push({
57
- // path: item.path.replace(/\/:[^/:]*$/, ''),
58
- // name: 'route.' + item.name.replace(/-[^-]*$/, '')
59
- // });
60
- // crumb.path = this.$route.path;
61
- // crumb.name = this.$i18n.t('route.' + this.$route.name, [
62
- // crumb.path.match(/[^/]*$/)[0]
63
- // ]);
64
- // }
65
- // crumb.classes = 'is-active';
66
- // }
67
-
68
- // crumbs.push(crumb);
69
- // });
70
- // return crumbs;
71
- }
72
- }
73
- };
74
- </script>
75
-
76
- <style lang="scss" scoped>
77
- @import 'the-breadcrumbs';
78
- </style>