@things-factory/product-ui 4.1.40 → 4.3.0-alpha.0

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.
@@ -2,7 +2,7 @@ import '@things-factory/form-ui'
2
2
  import '@things-factory/grist-ui'
3
3
 
4
4
  import gql from 'graphql-tag'
5
- import { css, html, LitElement } from 'lit-element'
5
+ import { css, html, LitElement } from 'lit'
6
6
 
7
7
  import { i18next, localize } from '@things-factory/i18n-base'
8
8
  import { client, gqlContext } from '@things-factory/shell'
@@ -2,7 +2,7 @@ import '@things-factory/form-ui'
2
2
  import '@things-factory/grist-ui'
3
3
 
4
4
  import gql from 'graphql-tag'
5
- import { css, html, LitElement } from 'lit-element'
5
+ import { css, html, LitElement } from 'lit'
6
6
 
7
7
  import { i18next, localize } from '@things-factory/i18n-base'
8
8
  import { client, CustomAlert, gqlContext } from '@things-factory/shell'
@@ -3,7 +3,7 @@ import '@things-factory/form-ui'
3
3
  import '@things-factory/grist-ui'
4
4
 
5
5
  import gql from 'graphql-tag'
6
- import { css, html } from 'lit-element'
6
+ import { css, html } from 'lit'
7
7
 
8
8
  import { getCodeByName } from '@things-factory/code-base'
9
9
  import { i18next, localize } from '@things-factory/i18n-base'
@@ -2,7 +2,7 @@ import '@things-factory/form-ui'
2
2
  import '@things-factory/grist-ui'
3
3
 
4
4
  import gql from 'graphql-tag'
5
- import { css, html, LitElement } from 'lit-element'
5
+ import { css, html, LitElement } from 'lit'
6
6
 
7
7
  import { i18next, localize } from '@things-factory/i18n-base'
8
8
  import { client, CustomAlert, gqlContext } from '@things-factory/shell'
@@ -337,7 +337,7 @@ class ProductCombinationSettingsPopup extends localize(i18next)(LitElement) {
337
337
  let patches = this.productCombinationSettingGrist.dirtyData.records.map(record => {
338
338
  const qty = record.qty
339
339
  if (!qty || qty <= 0 || !Number.isSafeInteger(qty)) {
340
- throw new Error(i18next.t('text.invalid_qty_for_item_number_x', { state: {x: record.__seq__} }))
340
+ throw new Error(i18next.t('text.invalid_qty_for_item_number_x', { state: { x: record.__seq__ } }))
341
341
  }
342
342
  return {
343
343
  // only existing product combination will have id
@@ -3,7 +3,7 @@ import '@things-factory/grist-ui'
3
3
  import './product-combination-settings-popup'
4
4
 
5
5
  import gql from 'graphql-tag'
6
- import { css, html, LitElement } from 'lit-element'
6
+ import { css, html, LitElement } from 'lit'
7
7
 
8
8
  import { i18next, localize } from '@things-factory/i18n-base'
9
9
  import { client, CustomAlert, gqlContext } from '@things-factory/shell'
@@ -3,7 +3,10 @@ import '@things-factory/grist-ui'
3
3
  import './product-combinations-popup'
4
4
 
5
5
  import gql from 'graphql-tag'
6
- import { css, html, LitElement } from 'lit-element'
6
+ import { css, html, LitElement } from 'lit'
7
+ import isEmpty from 'lodash-es/isEmpty'
8
+ import isNaN from 'lodash-es/isNaN'
9
+ import isNumber from 'lodash-es/isNumber'
7
10
 
8
11
  import { getCodeByName } from '@things-factory/code-base'
9
12
  import { i18next, localize } from '@things-factory/i18n-base'
@@ -12,8 +15,6 @@ import { client, CustomAlert, gqlContext } from '@things-factory/shell'
12
15
  import { ScrollbarStyles } from '@things-factory/styles'
13
16
  import { isMobileDevice } from '@things-factory/utils'
14
17
 
15
- const _ = require('lodash')
16
-
17
18
  export class ProductDetailsPopup extends localize(i18next)(LitElement) {
18
19
  static get styles() {
19
20
  return [
@@ -568,20 +569,20 @@ export class ProductDetailsPopup extends localize(i18next)(LitElement) {
568
569
  let data = this.dataGrist._data.records.map(itm => {
569
570
  itm.error = false
570
571
 
571
- if (_.isEmpty(itm.gtin) || '') {
572
+ if (isEmpty(itm.gtin) || '') {
572
573
  itm.error = true
573
574
  if (!errors.find(err => err.type == 'gtin')) errors.push({ type: 'gtin', value: 'GTIN is required' })
574
575
  }
575
- if (_.isEmpty(itm.packingType) || '') {
576
+ if (isEmpty(itm.packingType) || '') {
576
577
  itm.error = true
577
578
  if (!errors.find(err => err.type == 'packingType'))
578
579
  errors.push({ type: 'packingType', value: 'Packing type is required' })
579
580
  }
580
- if (_.isEmpty(itm.uom) || '') {
581
+ if (isEmpty(itm.uom) || '') {
581
582
  itm.error = true
582
583
  if (!errors.find(err => err.type == 'uom')) errors.push({ type: 'uom', value: 'UOM is required' })
583
584
  }
584
- if (!_.isNumber(itm.uomValue) || _.isNaN(itm.uomValue) || '') {
585
+ if (!isNumber(itm.uomValue) || isNaN(itm.uomValue) || '') {
585
586
  itm.error = true
586
587
  if (!errors.find(err => err.type == 'uomValue'))
587
588
  errors.push({ type: 'uomValue', value: 'UOM Value is required' })
@@ -639,7 +640,7 @@ export class ProductDetailsPopup extends localize(i18next)(LitElement) {
639
640
  ...this.dataGrist._data,
640
641
  records: this._updateRowOption(
641
642
  this.dataGrist._data.records.map((record, idx) => {
642
- if (!_.isEmpty(record.childProductDetail) && record.childProductDetail == before) {
643
+ if (!isEmpty(record.childProductDetail) && record.childProductDetail == before) {
643
644
  record.childProductDetail = after
644
645
  }
645
646
  return record
@@ -649,7 +650,7 @@ export class ProductDetailsPopup extends localize(i18next)(LitElement) {
649
650
 
650
651
  break
651
652
  case 'uomValue':
652
- if (_.isNaN(after)) {
653
+ if (isNaN(after)) {
653
654
  updatedRecords.records[row].uomValue = 1
654
655
  }
655
656
  break
@@ -704,7 +705,7 @@ export class ProductDetailsPopup extends localize(i18next)(LitElement) {
704
705
  value: ''
705
706
  },
706
707
  ...data
707
- .filter(child => child.gtin != itm.gtin && !_.isEmpty(child.gtin))
708
+ .filter(child => child.gtin != itm.gtin && !isEmpty(child.gtin))
708
709
  .map(x => {
709
710
  const rowOption = {
710
711
  display: x.gtin,
@@ -2,18 +2,17 @@ import '@things-factory/form-ui'
2
2
  import '@things-factory/grist-ui'
3
3
  import './product-details-popup'
4
4
 
5
- import gql from 'graphql-tag'
6
- import { css, html } from 'lit-element'
5
+ import { CommonButtonStyles, ScrollbarStyles } from '@things-factory/styles'
6
+ import { CustomAlert, PageView, client, gqlContext } from '@things-factory/shell'
7
+ import { css, html } from 'lit'
8
+ import { i18next, localize } from '@things-factory/i18n-base'
7
9
 
10
+ import { PICKING_STRATEGIES } from './constants/picking-strategy'
8
11
  import { getCodeByName } from '@things-factory/code-base'
9
- import { i18next, localize } from '@things-factory/i18n-base'
12
+ import gql from 'graphql-tag'
13
+ import { isMobileDevice } from '@things-factory/utils'
10
14
  import { openImportPopUp } from '@things-factory/import-ui'
11
15
  import { openPopup } from '@things-factory/layout-base'
12
- import { client, CustomAlert, gqlContext, PageView } from '@things-factory/shell'
13
- import { CommonButtonStyles, ScrollbarStyles } from '@things-factory/styles'
14
- import { isMobileDevice } from '@things-factory/utils'
15
-
16
- import { PICKING_STRATEGIES } from './constants/picking-strategy'
17
16
 
18
17
  class ProductList extends localize(i18next)(PageView) {
19
18
  static get properties() {
@@ -6,7 +6,7 @@ import { client, CustomAlert, gqlContext } from '@things-factory/shell'
6
6
  import { ScrollbarStyles } from '@things-factory/styles'
7
7
  import { isMobileDevice } from '@things-factory/utils'
8
8
  import gql from 'graphql-tag'
9
- import { css, html, LitElement } from 'lit-element'
9
+ import { css, html, LitElement } from 'lit'
10
10
 
11
11
  export class ProductSetLinkPopup extends localize(i18next)(LitElement) {
12
12
  static get styles() {
@@ -8,7 +8,7 @@ import { client, CustomAlert, gqlContext, PageView } from '@things-factory/shell
8
8
  import { ScrollbarStyles, CommonButtonStyles } from '@things-factory/styles'
9
9
  import { isMobileDevice } from '@things-factory/utils'
10
10
  import gql from 'graphql-tag'
11
- import { css, html } from 'lit-element'
11
+ import { css, html } from 'lit'
12
12
  import './product-set-link-popup'
13
13
 
14
14
  class ProductSetList extends localize(i18next)(PageView) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/product-ui",
3
- "version": "4.1.40",
3
+ "version": "4.3.0-alpha.0",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -24,13 +24,13 @@
24
24
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
25
25
  },
26
26
  "dependencies": {
27
- "@things-factory/form-ui": "^4.1.40",
28
- "@things-factory/grist-ui": "^4.1.40",
29
- "@things-factory/i18n-base": "^4.1.40",
30
- "@things-factory/import-ui": "^4.1.40",
31
- "@things-factory/layout-base": "^4.1.40",
32
- "@things-factory/product-base": "^4.1.40",
33
- "@things-factory/shell": "^4.1.40"
27
+ "@things-factory/form-ui": "^4.3.0-alpha.0",
28
+ "@things-factory/grist-ui": "^4.3.0-alpha.0",
29
+ "@things-factory/i18n-base": "^4.3.0-alpha.0",
30
+ "@things-factory/import-ui": "^4.3.0-alpha.0",
31
+ "@things-factory/layout-base": "^4.3.0-alpha.0",
32
+ "@things-factory/product-base": "^4.3.0-alpha.0",
33
+ "@things-factory/shell": "^4.3.0-alpha.0"
34
34
  },
35
- "gitHead": "060b5c664e80a6fcba09598f2c7ceffe067e02bf"
35
+ "gitHead": "6467d1b2a5b2f8abb1bc3982e4651a5742ad4043"
36
36
  }
@@ -62,6 +62,11 @@
62
62
  "field.weight_unit": "weight unit",
63
63
  "field.weight": "weight",
64
64
  "field.width": "width",
65
+ "label.fefo": "FEFO",
66
+ "label.fmfo": "FMFO",
67
+ "label.fifo": "FIFO",
68
+ "label.lifo": "LIFO",
69
+ "label.location": "location",
65
70
  "text.data_import_successfully": "data import successfully",
66
71
  "text.data_restore_successfully": "data restore successfully",
67
72
  "text.invalid_bundle_qty_for_item_number": "invalid bundle qty for item number",
@@ -1,18 +1,11 @@
1
1
  {
2
2
  "field.picking_strategy": "[ko]picking strategy",
3
- "field.require_serial_number_scanning": "[ko]require serial number scanning",
4
- "field.packing_size": "[ko]packing size",
5
- "field.deleted": "[ko]deleted",
6
- "button.restore": "[ko]restore",
7
- "text.there_is_nothing_to_restore": "[ko]there is nothing to restore",
8
- "text.data_restore_successfully": "[ko]data restore successfully",
9
- "text.invalid_bundle_qty_for_item_number": "[ko] invalid bundle qty for item number",
10
- "text.invalid_qty_for_item_number_x": "[ko] invalid qty for item #{state.x}",
11
3
  "button.add_new_product": "[ko]add new product",
12
4
  "button.back": "[ko]back",
13
5
  "button.cancel": "[ko]cancel",
14
6
  "button.delete": "[ko]delete",
15
7
  "button.link_product": "[ko]link product",
8
+ "button.restore": "[ko]restore",
16
9
  "button.save": "[ko]save",
17
10
  "button.sync_data": "[ko]sync data",
18
11
  "field.aux_unit": "[ko]aux unit",
@@ -20,7 +13,7 @@
20
13
  "field.brand_sku": "[ko]brand sku",
21
14
  "field.buffer_qty": "[ko]buffer qty",
22
15
  "field.case_depth": "[ko]case depth",
23
- "field.case_gross_weight": "c[ko]ase gross weight",
16
+ "field.case_gross_weight": "[ko]case gross weight",
24
17
  "field.case_gtin": "[ko]case GTIN",
25
18
  "field.case_height": "[ko]case height",
26
19
  "field.case_volume": "[ko]case volume",
@@ -30,13 +23,13 @@
30
23
  "field.child_product_ref": "[ko]child product ref",
31
24
  "field.child_qty": "[ko]child qty",
32
25
  "field.cogs_account_code": "[ko]COGS account code",
33
- "field.combination": "[ko] combination",
26
+ "field.combination": "[ko]combination",
27
+ "field.deleted": "[ko]deleted",
34
28
  "field.density": "[ko]density",
35
29
  "field.depth": "[ko]depth",
36
30
  "field.description": "[ko]description",
37
31
  "field.expiration_period": "[ko]expiration Period",
38
32
  "field.gross_weight": "g[ko]ross weight",
39
- "field.nett_weight": "n[ko]ett weight",
40
33
  "field.gtin": "[ko]GTIN",
41
34
  "field.height": "[ko]height",
42
35
  "field.inventory_account_code": "[ko]inventory account code",
@@ -45,11 +38,14 @@
45
38
  "field.min_qty": "[ko]min qty",
46
39
  "field.movement": "[ko]movement",
47
40
  "field.name": "[ko]name",
41
+ "field.nett_weight": "n[ko]ett weight",
42
+ "field.packing_size": "[ko]packing size",
48
43
  "field.packing_type": "[ko]packing type",
49
44
  "field.product_info": "[ko]product info",
50
45
  "field.product_ref": "[ko]product ref",
51
46
  "field.product_set_info": "[ko]product set info",
52
- "field.ref_code": "[ko] ref code",
47
+ "field.ref_code": "[ko]ref code",
48
+ "field.require_serial_number_scanning": "[ko]require serial number scanning",
53
49
  "field.required_checking_expiry": "[ko]required checking expiry",
54
50
  "field.require_serial_number_scanning_inbound": "[ko] require serial number scanning inbound",
55
51
  "field.require_serial_number_scanning_outbound": "[ko] require serial number scanning outbound",
@@ -65,11 +61,20 @@
65
61
  "field.weight_unit": "[ko]weight unit",
66
62
  "field.weight": "[ko]weight",
67
63
  "field.width": "[ko]width",
68
- "title.linked_products": "[ko] linked products",
64
+ "label.fefo": "[ko]FEFO",
65
+ "label.fmfo": "[ko]FMFO",
66
+ "label.fifo": "[ko]FIFO",
67
+ "label.lifo": "[ko]LIFO",
68
+ "label.location": "[ko]location",
69
+ "text.data_restore_successfully": "[ko]data restore successfully",
70
+ "text.invalid_bundle_qty_for_item_number": "[ko]invalid bundle qty for item number",
71
+ "text.invalid_qty_for_item_number_x": "[ko]invalid qty for item #{state.x}",
72
+ "text.there_is_nothing_to_restore": "[ko]there is nothing to restore",
73
+ "title.combination_sets": "[ko]combination sets",
74
+ "title.combination": "[ko]combination",
75
+ "title.linked_products": "[ko]linked products",
69
76
  "title.product_bundle_setting": "[ko]product bundle setting",
70
77
  "title.product_bundle": "[ko]product bundle",
71
78
  "title.product_set": "[ko]product set",
72
- "title.product": "[ko]product",
73
- "title.combination": "[ko] combination",
74
- "title.combination_sets": "[ko] combination sets"
79
+ "title.product": "[ko]product"
75
80
  }
@@ -1,18 +1,11 @@
1
1
  {
2
2
  "field.picking_strategy": "[ms]picking strategy",
3
- "field.require_serial_number_scanning": "[ms]require serial number scanning",
4
- "field.packing_size": "[ms]packing size",
5
- "field.deleted": "[ms]deleted",
6
- "button.restore": "[ms]restore",
7
- "text.there_is_nothing_to_restore": "[ms]there is nothing to restore",
8
- "text.data_restore_successfully": "[ms]data restore successfully",
9
- "text.invalid_bundle_qty_for_item_number": "[ms] invalid bundle qty for item number",
10
- "text.invalid_qty_for_item_number_x": "[ms] invalid qty for item #{state.x}",
11
3
  "button.add_new_product": "[ms]add new product",
12
4
  "button.back": "[ms]back",
13
5
  "button.cancel": "[ms]cancel",
14
6
  "button.delete": "[ms]delete",
15
7
  "button.link_product": "[ms]link product",
8
+ "button.restore": "[ms]restore",
16
9
  "button.save": "[ms]save",
17
10
  "button.sync_data": "[ms]sync data",
18
11
  "field.aux_unit": "[ms]aux unit",
@@ -31,12 +24,12 @@
31
24
  "field.child_qty": "[ms]child qty",
32
25
  "field.cogs_account_code": "[ms]COGS account code",
33
26
  "field.combination": "[ms] combination",
27
+ "field.deleted": "[ms]deleted",
34
28
  "field.density": "[ms]density",
35
29
  "field.depth": "[ms]depth",
36
30
  "field.description": "[ms]description",
37
31
  "field.expiration_period": "[ms]expiration Period",
38
32
  "field.gross_weight": "g[ms]ross weight",
39
- "field.nett_weight": "n[ms]ett weight",
40
33
  "field.gtin": "[ms]GTIN",
41
34
  "field.height": "[ms]height",
42
35
  "field.inventory_account_code": "[ms]inventory account code",
@@ -45,11 +38,14 @@
45
38
  "field.min_qty": "[ms]min qty",
46
39
  "field.movement": "[ms]movement",
47
40
  "field.name": "[ms]name",
41
+ "field.nett_weight": "n[ms]ett weight",
42
+ "field.packing_size": "[ms]packing size",
48
43
  "field.packing_type": "[ms]packing type",
49
44
  "field.product_info": "[ms]product info",
50
45
  "field.product_ref": "[ms]product ref",
51
46
  "field.product_set_info": "[ms]product set info",
52
47
  "field.ref_code": "[ms]ref code",
48
+ "field.require_serial_number_scanning": "[ms]require serial number scanning",
53
49
  "field.required_checking_expiry": "[ms]required checking expiry",
54
50
  "field.require_serial_number_scanning_inbound": "[ms]require serial number scanning inbound",
55
51
  "field.require_serial_number_scanning_outbound": "[ms]require serial number scanning outbound",
@@ -65,11 +61,20 @@
65
61
  "field.weight_unit": "[ms]weight unit",
66
62
  "field.weight": "[ms]weight",
67
63
  "field.width": "[ms]width",
64
+ "label.fefo": "[ms]FEFO",
65
+ "label.fmfo": "[ms]FMFO",
66
+ "label.fifo": "[ms]FIFO",
67
+ "label.lifo": "[ms]LIFO",
68
+ "label.location": "[ms]location",
69
+ "text.data_restore_successfully": "[ms]data restore successfully",
70
+ "text.invalid_bundle_qty_for_item_number": "[ms] invalid bundle qty for item number",
71
+ "text.invalid_qty_for_item_number_x": "[ms] invalid qty for item #{state.x}",
72
+ "text.there_is_nothing_to_restore": "[ms]there is nothing to restore",
73
+ "title.combination_sets": "[ms] combination sets",
74
+ "title.combination": "[ms] combination",
68
75
  "title.linked_products": "[ms] linked products",
69
76
  "title.product_bundle_setting": "[ms]product bundle setting",
70
77
  "title.product_bundle": "[ms]product bundle",
71
78
  "title.product_set": "[ms]product set",
72
- "title.product": "[ms]product",
73
- "title.combination": "[ms] combination",
74
- "title.combination_sets": "[ms] combination sets"
79
+ "title.product": "[ms]product"
75
80
  }
@@ -1,22 +1,13 @@
1
1
  {
2
2
  "field.picking_strategy": "[zh]picking strategy",
3
- "field.require_serial_number_scanning": "[zh]require serial number scanning",
4
- "button.restore": "[zh]restore",
5
- "text.there_is_nothing_to_restore": "[zh]there is nothing to restore",
6
- "text.data_restore_successfully": "[zh]data restore successfully",
7
- "text.invalid_bundle_qty_for_item_number": "[zh] invalid bundle qty for item number",
8
- "text.invalid_qty_for_item_number_x": "[zh] invalid qty for item #{state.x}",
9
-
10
3
  "button.add_new_product": "[zh]add new product",
11
4
  "button.back": "[zh]back",
12
5
  "button.cancel": "[zh]cancel",
13
6
  "button.delete": "[zh]delete",
14
7
  "button.link_product": "[zh]link product",
8
+ "button.restore": "[zh]restore",
15
9
  "button.save": "[zh]save",
16
10
  "button.sync_data": "[zh]sync data",
17
-
18
- "field.packing_size": "[zh]packing size",
19
- "field.deleted": "[zh]deleted",
20
11
  "field.aux_unit": "[zh]aux unit",
21
12
  "field.aux_value": "[zh]aux value",
22
13
  "field.brand_sku": "[zh]brand sku",
@@ -33,12 +24,12 @@
33
24
  "field.child_qty": "[zh]child qty",
34
25
  "field.cogs_account_code": "[zh]COGS account code",
35
26
  "field.combination": "[zh] combination",
27
+ "field.deleted": "[zh]deleted",
36
28
  "field.density": "[zh]density",
37
29
  "field.depth": "[zh]depth",
38
30
  "field.description": "[zh]description",
39
31
  "field.expiration_period": "[zh]expiration Period",
40
32
  "field.gross_weight": "[zh]gross weight",
41
- "field.nett_weight": "[zh]nett weight",
42
33
  "field.gtin": "[zh]GTIN",
43
34
  "field.height": "[zh]height",
44
35
  "field.inventory_account_code": "[zh]inventory account code",
@@ -47,11 +38,14 @@
47
38
  "field.min_qty": "[zh]min qty",
48
39
  "field.movement": "[zh]movement",
49
40
  "field.name": "[zh]name",
41
+ "field.nett_weight": "[zh]nett weight",
42
+ "field.packing_size": "[zh]packing size",
50
43
  "field.packing_type": "[zh]packing type",
51
44
  "field.product_info": "[zh]product info",
52
45
  "field.product_ref": "[zh]product ref",
53
46
  "field.product_set_info": "[zh]product set info",
54
47
  "field.ref_code": "[zh]ref code",
48
+ "field.require_serial_number_scanning": "[zh]require serial number scanning",
55
49
  "field.required_checking_expiry": "[zh]required checking expiry",
56
50
  "field.require_serial_number_scanning_inbound": "[zh]require serial number scanning inbound",
57
51
  "field.require_serial_number_scanning_outbound": "[zh]require serial number scanning outbound",
@@ -67,11 +61,20 @@
67
61
  "field.weight_unit": "[zh]weight unit",
68
62
  "field.weight": "[zh]weight",
69
63
  "field.width": "[zh]width",
64
+ "label.fefo": "[ms]FEFO",
65
+ "label.fmfo": "[ms]FMFO",
66
+ "label.fifo": "[ms]FIFO",
67
+ "label.lifo": "[ms]LIFO",
68
+ "label.location": "[ms]location",
69
+ "text.data_restore_successfully": "[zh]data restore successfully",
70
+ "text.invalid_bundle_qty_for_item_number": "[zh] invalid bundle qty for item number",
71
+ "text.invalid_qty_for_item_number_x": "[zh] invalid qty for item #{state.x}",
72
+ "text.there_is_nothing_to_restore": "[zh]there is nothing to restore",
73
+ "title.combination_sets": "[zh] combination sets",
74
+ "title.combination": "[zh] combination",
70
75
  "title.linked_products": "[zh] linked products",
71
76
  "title.product_bundle_setting": "[zh]product bundle setting",
72
77
  "title.product_bundle": "[zh]product bundle",
73
78
  "title.product_set": "[zh]product set",
74
- "title.product": "[zh]product",
75
- "title.combination": "[zh] combination",
76
- "title.combination_sets": "[zh] combination sets"
79
+ "title.product": "[zh]product"
77
80
  }