@isoftdata/svelte-ecommerce 1.0.0-beta.3 → 1.0.0-beta.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.
@@ -1,333 +1,384 @@
1
- <script lang="ts">
2
- import type { i18n } from 'i18next'
3
-
4
- import { getContext } from 'svelte'
5
- import Input from '@isoftdata/svelte-input'
6
- import Select from '@isoftdata/svelte-select'
7
- import Button from '@isoftdata/svelte-button'
8
- import Textarea from '@isoftdata/svelte-textarea'
9
- import { translate as defaultTranslate } from '@isoftdata/utility-string'
10
-
11
- const { t: translate } = getContext<i18n>('i18next') || { t: defaultTranslate }
12
-
13
- import { ecommercePartnerStaticData } from './data/index.js'
14
- import PolicyList from './PolicyList.svelte'
15
-
16
- import type {
17
- EbayPolicy,
18
- EcommerceCondition,
19
- EcommercePartnerConfiguration,
20
- EcommerceSharedDefaults,
21
- PolicyRowWithChecked,
22
- } from './utils.js'
23
- import type { PackageType } from './data/types.js'
24
-
25
- interface Props {
26
- defaults?: EcommerceSharedDefaults
27
- ebayPolicyList?: Array<EbayPolicy>
28
- ecommerceConditionList: Array<EcommerceCondition>
29
- partnerConfigurationList: Array<EcommercePartnerConfiguration>
30
- defaultsChanged?: (() => Promise<void>) | undefined
31
- selectedEcommercePartnerId: number
32
- }
33
-
34
- let {
35
- defaults = $bindable(),
36
- ebayPolicyList,
37
- ecommerceConditionList,
38
- partnerConfigurationList,
39
- defaultsChanged,
40
- selectedEcommercePartnerId,
41
- }: Props = $props()
42
-
43
- // State variables for all form inputs - initialize from defaults prop if provided
44
- let brandMapping = $state<string>(defaults?.brandMapping ?? '')
45
- let conditionDescription = $state<string>(defaults?.conditionDescription ?? '')
46
- let conditionId = $state<number | null>(defaults?.conditionId ?? null)
47
- let fulfillmentPolicies = $state<Array<string>>(defaults?.fulfillmentPolicies ?? [])
48
- let listingDescriptionTemplate = $state<string>(defaults?.listingDescriptionTemplate ?? '')
49
- let listingDuration = $state<string>(defaults?.listingDuration ?? '')
50
- let listingTitleTemplate = $state<string>(defaults?.listingTitleTemplate ?? '')
51
- let fulfillmentTimeValue = $state<number | null>(defaults?.fulfillmentTimeValue ?? null)
52
- let fulfillmentTimeUnit = $state<string | null>(defaults?.fulfillmentTimeUnit ?? null)
53
- let manufacturerPartNumberMapping = $state<string>(defaults?.manufacturerPartNumberMapping ?? '')
54
- let packageType = $state<string | null>(defaults?.packageType ?? null)
55
- let paymentPolicies = $state<Array<string>>(defaults?.paymentPolicies ?? [])
56
- let returnPolicies = $state<Array<string>>(defaults?.returnPolicies ?? [])
57
- let shippingLengthUnit = $state<string | null>(defaults?.shippingLengthUnit ?? null)
58
- let shippingWeightUnit = $state<string | null>(defaults?.shippingWeightUnit ?? null)
59
-
60
- // Computed properties for UI state
61
- let ecommerceConditions = $derived(ecommerceConditionList) // TODO: why'd I do this?
62
- let fulfillmentPolicyList = $derived.by(getFulfillmentPolicyList)
63
- let lengthUnits = $derived.by(getPartnerLengthUnits)
64
- let packageTypes = $derived.by(getPartnerPackageTypes)
65
- let paymentPolicyList = $derived.by(getPaymentPolicyList)
66
- let returnPolicyList = $derived.by(getReturnPolicyList)
67
- let selectedPartnerConfig = $derived.by(getSelectedPartnerConfig)
68
- let weightUnits = $derived.by(getPartnerWeightUnits)
69
-
70
- function getFulfillmentPolicyList(): Array<PolicyRowWithChecked> {
71
- const policies = ebayPolicyList?.filter(policy => policy.policyType === 'fulfillment') || []
72
- const fulfillmentPolicySet = new Set(fulfillmentPolicies)
73
- return policies.map(policy => ({
74
- ...policy,
75
- checked: fulfillmentPolicySet.has(policy.policyId),
76
- }))
77
- }
78
- function getPaymentPolicyList(): Array<PolicyRowWithChecked> {
79
- const policies = ebayPolicyList?.filter(policy => policy.policyType === 'payment') || []
80
- const paymentPolicySet = new Set(paymentPolicies)
81
- return policies.map(policy => ({
82
- ...policy,
83
- checked: paymentPolicySet.has(policy.policyId),
84
- }))
85
- }
86
- function getReturnPolicyList(): Array<PolicyRowWithChecked> {
87
- const policies = ebayPolicyList?.filter(policy => policy.policyType === 'return') || []
88
- const returnPolicySet = new Set(returnPolicies)
89
- return policies.map(policy => ({
90
- ...policy,
91
- checked: returnPolicySet.has(policy.policyId),
92
- }))
93
- }
94
- function getPartnerLengthUnits(): Array<string> {
95
- const config = getSelectedPartnerConfig()
96
- const partnerName = config.name
97
- if (!partnerName || !(partnerName in ecommercePartnerStaticData)) {
98
- return []
99
- }
100
- return ecommercePartnerStaticData[partnerName as keyof typeof ecommercePartnerStaticData].lengthUnits
101
- }
102
-
103
- function getPartnerPackageTypes(): Array<PackageType> {
104
- const config = getSelectedPartnerConfig()
105
- const partnerName = config.name
106
- if (!partnerName || !(partnerName in ecommercePartnerStaticData)) {
107
- return []
108
- }
109
- return ecommercePartnerStaticData[partnerName as keyof typeof ecommercePartnerStaticData].packageTypes
110
- }
111
-
112
- function getPartnerWeightUnits(): Array<string> {
113
- const config = getSelectedPartnerConfig()
114
- const partnerName = config.name
115
- if (!partnerName || !(partnerName in ecommercePartnerStaticData)) {
116
- return []
117
- }
118
- return ecommercePartnerStaticData[partnerName as keyof typeof ecommercePartnerStaticData].weightUnits
119
- }
120
-
121
- function getSelectedPartnerConfig(): EcommercePartnerConfiguration {
122
- const matchingPartnerConfig = partnerConfigurationList.find(
123
- row => row.ecommercePartnerId === selectedEcommercePartnerId,
124
- )
125
- if (!matchingPartnerConfig) {
126
- throw new Error('No matching partner config found')
127
- }
128
-
129
- return matchingPartnerConfig
130
- }
131
-
132
- async function handleInputChange() {
133
- // Build the defaults object using current input values
134
- const newDefaults = {
135
- brandMapping: brandMapping || undefined,
136
- conditionDescription: conditionDescription || undefined,
137
- conditionId: conditionId || undefined,
138
- fulfillmentPolicies: fulfillmentPolicies || [],
139
- fulfillmentTimeUnit: fulfillmentTimeUnit || undefined,
140
- fulfillmentTimeValue: fulfillmentTimeValue || undefined,
141
- listingDescriptionTemplate: listingDescriptionTemplate || undefined,
142
- listingDuration: listingDuration || undefined,
143
- listingTitleTemplate: listingTitleTemplate || undefined,
144
- manufacturerPartNumberMapping: manufacturerPartNumberMapping || undefined,
145
- packageType: packageType || undefined,
146
- paymentPolicies: paymentPolicies || [],
147
- returnPolicies: returnPolicies || [],
148
- shippingLengthUnit: shippingLengthUnit || undefined,
149
- shippingWeightUnit: shippingWeightUnit || undefined,
150
- }
151
-
152
- defaults = newDefaults
153
- await defaultsChanged?.()
154
- }
155
-
156
- function handleFulfillmentPoliciesChange(selectedIds: Array<string>) {
157
- fulfillmentPolicies = selectedIds
158
- handleInputChange()
159
- }
160
-
161
- function handlePaymentPoliciesChange(selectedIds: Array<string>) {
162
- paymentPolicies = selectedIds
163
- handleInputChange()
164
- }
165
-
166
- function handleReturnPoliciesChange(selectedIds: Array<string>) {
167
- returnPolicies = selectedIds
168
- handleInputChange()
169
- }
170
- </script>
171
-
172
- <div class="row">
173
- <div class="col">
174
- <PolicyList
175
- title={translate('configuration.ecommerce.fulfillmentPoliciesTitle', 'Fulfillment Policies')}
176
- policies={fulfillmentPolicyList}
177
- selectedPolicyIds={fulfillmentPolicies}
178
- onSelectionChange={handleFulfillmentPoliciesChange}
179
- />
180
- <PolicyList
181
- title={translate('configuration.ecommerce.paymentPoliciesTitle', 'Payment Policies')}
182
- policies={paymentPolicyList}
183
- selectedPolicyIds={paymentPolicies}
184
- onSelectionChange={handlePaymentPoliciesChange}
185
- />
186
- <PolicyList
187
- title={translate('configuration.ecommerce.returnPoliciesTitle', 'Return Policies')}
188
- policies={returnPolicyList}
189
- selectedPolicyIds={returnPolicies}
190
- onSelectionChange={handleReturnPoliciesChange}
191
- />
192
- </div>
193
- </div>
194
- <div class="row">
195
- <div class="col">
196
- <Input
197
- label={translate('configuration.ecommerce.fulfillmentTime', 'Fulfillment Time')}
198
- maxlength={3}
199
- type="number"
200
- bind:value={fulfillmentTimeValue}
201
- onchange={handleInputChange}
202
- />
203
-
204
- <Select
205
- label={translate('configuration.ecommerce.fulfillmentUnit', 'Fulfillment Unit')}
206
- emptyText="-- {translate('configuration.ecommerce.selectUnit', 'Select Unit')} --"
207
- onchange={handleInputChange}
208
- bind:value={fulfillmentTimeUnit}
209
- >
210
- {#each ecommercePartnerStaticData.ebay.timeUnits as unit}
211
- <option value={unit}>{unit}</option>
212
- {/each}
213
- </Select>
214
- </div>
215
- </div>
216
- <div class="row">
217
- <div class="col">
218
- <Select
219
- label={translate('configuration.ecommerce.lengthUnit', 'Shipping Length Unit')}
220
- emptyText="-- {translate('configuration.ecommerce.selectUnit', 'Select Unit')} --"
221
- onchange={handleInputChange}
222
- bind:value={shippingLengthUnit}
223
- >
224
- {#each lengthUnits as unit}
225
- <option value={unit}>{unit}</option>
226
- {/each}
227
- </Select>
228
- </div>
229
- <div class="col">
230
- <Select
231
- label={translate('configuration.ecommerce.shippingWeightUnit', 'Shipping Weight Unit')}
232
- emptyText="-- {translate('configuration.ecommerce.selectUnit', 'Select Unit')} --"
233
- onchange={handleInputChange}
234
- bind:value={shippingWeightUnit}
235
- >
236
- {#each weightUnits as unit}
237
- <option value={unit}>{unit}</option>
238
- {/each}
239
- </Select>
240
- </div>
241
- </div>
242
- <div class="row">
243
- <div class="col">
244
- <Select
245
- label={translate('configuration.ecommerce.condition', 'Condition')}
246
- emptyText="-- {translate('configuration.ecommerce.selectCondition', 'Select Condition')} --"
247
- bind:value={conditionId}
248
- onchange={handleInputChange}
249
- >
250
- {#each ecommerceConditions as condition}
251
- <option value={condition.ecommerceConditionId}>{condition.name}</option>
252
- {/each}
253
- </Select>
254
- </div>
255
- <div class="col">
256
- <Input
257
- label={translate('configuration.ecommerce.conditionDescription', 'Condition Description')}
258
- maxlength={1000}
259
- bind:value={conditionDescription}
260
- onchange={handleInputChange}
261
- />
262
- </div>
263
- </div>
264
- <div class="row">
265
- <div class="col">
266
- <Input
267
- label={translate('configuration.ecommerce.brand', 'Brand')}
268
- maxlength={100}
269
- bind:value={brandMapping}
270
- onchange={handleInputChange}
271
- placeholder={'{?PartManufacturer}'}
272
- />
273
- </div>
274
- <div class="col">
275
- <Input
276
- label={translate('configuration.ecommerce.manufacturerPartNumber', 'Manufacturer Part Number')}
277
- maxlength={100}
278
- bind:value={manufacturerPartNumberMapping}
279
- onchange={handleInputChange}
280
- placeholder={'{?PartModel}'}
281
- />
282
- </div>
283
- </div>
284
- <div class="row">
285
- <div class="col">
286
- <Select
287
- label={translate('configuration.ecommerce.packageType', 'Package Type')}
288
- emptyText="-- {translate('configuration.ecommerce.selectDefaultPackage', 'Select Default Package')} --"
289
- onchange={handleInputChange}
290
- bind:value={packageType}
291
- >
292
- {#each packageTypes as pkg}
293
- <option value={pkg.partnerValue}>{pkg.name}</option>
294
- {/each}
295
- </Select>
296
- </div>
297
- <div class="col">
298
- <Input
299
- label={translate('configuration.ecommerce.listingDuration', 'Listing Duration')}
300
- bind:value={listingDuration}
301
- onchange={handleInputChange}
302
- />
303
- </div>
304
- </div>
305
- <div class="row">
306
- <div class="col mt-3">
307
- <Button
308
- outline
309
- size="sm"
310
- href="https://wikido.isoftdata.com//index.php?title=Ebay_templates"
311
- target="htp_chromium_popout"
312
- icon="question-circle">{translate('configuration.ecommerce.templateHelp', 'Template Help')}</Button
313
- >
314
- </div>
315
- </div>
316
- <div class="row">
317
- <div class="col">
318
- <Textarea
319
- label={translate('configuration.ecommerce.titleTemplate', 'Title Template')}
320
- onchange={handleInputChange}
321
- rows={10}
322
- bind:value={listingTitleTemplate}
323
- />
324
- </div>
325
- <div class="col">
326
- <Textarea
327
- label={translate('configuration.ecommerce.descriptionTemplate', 'Description Template')}
328
- onchange={handleInputChange}
329
- rows={10}
330
- bind:value={listingDescriptionTemplate}
331
- />
332
- </div>
333
- </div>
1
+ <script lang="ts">
2
+ import type { i18n } from 'i18next'
3
+
4
+ import { getContext } from 'svelte'
5
+ import Input from '@isoftdata/svelte-input'
6
+ import Select from '@isoftdata/svelte-select'
7
+ import Button from '@isoftdata/svelte-button'
8
+ import Textarea from '@isoftdata/svelte-textarea'
9
+ import { translate as defaultTranslate } from '@isoftdata/utility-string'
10
+ import toTitleCase from 'to-title-case'
11
+ import camelCase from 'camelcase'
12
+ import Fieldset from '@isoftdata/svelte-fieldset'
13
+
14
+ const { t: translate } = getContext<i18n>('i18next') || { t: defaultTranslate }
15
+
16
+ import { ecommercePartnerStaticData } from './data/index.js'
17
+ import PolicyList from './PolicyList.svelte'
18
+
19
+ import type {
20
+ EbayPolicy,
21
+ EcommerceCondition,
22
+ EcommercePartnerConfiguration,
23
+ EcommerceSharedDefaults,
24
+ PolicyRowWithChecked,
25
+ } from './utils.js'
26
+ import type { PackageType } from './data/types.js'
27
+
28
+ interface Props {
29
+ defaults?: EcommerceSharedDefaults
30
+ ebayPolicyList?: Array<EbayPolicy>
31
+ ecommerceConditionList: Array<EcommerceCondition>
32
+ partnerConfigurationList: Array<EcommercePartnerConfiguration>
33
+ defaultsChanged?: (() => Promise<void>) | undefined
34
+ selectedEcommercePartnerId: number
35
+ }
36
+
37
+ let {
38
+ defaults = $bindable(),
39
+ ebayPolicyList,
40
+ ecommerceConditionList,
41
+ partnerConfigurationList,
42
+ defaultsChanged,
43
+ selectedEcommercePartnerId,
44
+ }: Props = $props()
45
+
46
+ const priceLevels = ['Retail', 'Wholesale', 'Cost', 'List']
47
+ // State variables for all form inputs - initialize from defaults prop if provided
48
+ let brandMapping = $state<string>(defaults?.brandMapping ?? '')
49
+ let conditionDescription = $state<string>(defaults?.conditionDescription ?? '')
50
+ let conditionId = $state<number | null>(defaults?.conditionId ?? null)
51
+ let fulfillmentPolicies = $state<Array<string>>(defaults?.fulfillmentPolicies ?? [])
52
+ let listingDescriptionTemplate = $state<string>(defaults?.listingDescriptionTemplate ?? '')
53
+ let listingDuration = $state<string>(defaults?.listingDuration ?? 'GTC')
54
+ let listingTitleTemplate = $state<string>(defaults?.listingTitleTemplate ?? '')
55
+ let fulfillmentTimeValue = $state<number | null>(defaults?.fulfillmentTimeValue ?? null)
56
+ let fulfillmentTimeUnit = $state<string | null>(defaults?.fulfillmentTimeUnit ?? null)
57
+ let manufacturerPartNumberMapping = $state<string>(defaults?.manufacturerPartNumberMapping ?? '')
58
+ let packageType = $state<string | null>(defaults?.packageType ?? null)
59
+ let paymentPolicies = $state<Array<string>>(defaults?.paymentPolicies ?? [])
60
+ let defaultPriceType = $state<string | null>(defaults?.defaultPriceType ?? null)
61
+ let pricingModifier = $state<number>(defaults?.pricingModifier ?? 100)
62
+ let returnPolicies = $state<Array<string>>(defaults?.returnPolicies ?? [])
63
+ let shippingLengthUnit = $state<string | null>(defaults?.shippingLengthUnit ?? null)
64
+ let shippingWeightUnit = $state<string | null>(defaults?.shippingWeightUnit ?? null)
65
+
66
+ // Computed properties for UI state
67
+ let ecommerceConditions = $derived(ecommerceConditionList) // TODO: why'd I do this?
68
+ let fulfillmentPolicyList = $derived.by(getFulfillmentPolicyList)
69
+ let lengthUnits = $derived.by(getPartnerLengthUnits)
70
+ let packageTypes = $derived.by(getPartnerPackageTypes)
71
+ let paymentPolicyList = $derived.by(getPaymentPolicyList)
72
+ let returnPolicyList = $derived.by(getReturnPolicyList)
73
+ let selectedPartnerConfig = $derived.by(getSelectedPartnerConfig)
74
+ let weightUnits = $derived.by(getPartnerWeightUnits)
75
+
76
+ function getFulfillmentPolicyList(): Array<PolicyRowWithChecked> {
77
+ const policies = ebayPolicyList?.filter(policy => policy.policyType === 'fulfillment') || []
78
+ const fulfillmentPolicySet = new Set(fulfillmentPolicies)
79
+ return policies.map(policy => ({
80
+ ...policy,
81
+ checked: fulfillmentPolicySet.has(policy.policyId),
82
+ }))
83
+ }
84
+ function getPaymentPolicyList(): Array<PolicyRowWithChecked> {
85
+ const policies = ebayPolicyList?.filter(policy => policy.policyType === 'payment') || []
86
+ const paymentPolicySet = new Set(paymentPolicies)
87
+ return policies.map(policy => ({
88
+ ...policy,
89
+ checked: paymentPolicySet.has(policy.policyId),
90
+ }))
91
+ }
92
+ function getReturnPolicyList(): Array<PolicyRowWithChecked> {
93
+ const policies = ebayPolicyList?.filter(policy => policy.policyType === 'return') || []
94
+ const returnPolicySet = new Set(returnPolicies)
95
+ return policies.map(policy => ({
96
+ ...policy,
97
+ checked: returnPolicySet.has(policy.policyId),
98
+ }))
99
+ }
100
+ function getPartnerLengthUnits(): Array<string> {
101
+ const config = getSelectedPartnerConfig()
102
+ const partnerName = config.name
103
+ if (!partnerName || !(partnerName in ecommercePartnerStaticData)) {
104
+ return []
105
+ }
106
+ return ecommercePartnerStaticData[partnerName as keyof typeof ecommercePartnerStaticData].lengthUnits
107
+ }
108
+
109
+ function getPartnerPackageTypes(): Array<PackageType> {
110
+ const config = getSelectedPartnerConfig()
111
+ const partnerName = config.name
112
+ if (!partnerName || !(partnerName in ecommercePartnerStaticData)) {
113
+ return []
114
+ }
115
+ return ecommercePartnerStaticData[partnerName as keyof typeof ecommercePartnerStaticData].packageTypes
116
+ }
117
+
118
+ function getPartnerWeightUnits(): Array<string> {
119
+ const config = getSelectedPartnerConfig()
120
+ const partnerName = config.name
121
+ if (!partnerName || !(partnerName in ecommercePartnerStaticData)) {
122
+ return []
123
+ }
124
+ return ecommercePartnerStaticData[partnerName as keyof typeof ecommercePartnerStaticData].weightUnits
125
+ }
126
+
127
+ function getSelectedPartnerConfig(): EcommercePartnerConfiguration {
128
+ const matchingPartnerConfig = partnerConfigurationList.find(
129
+ row => row.ecommercePartnerId === selectedEcommercePartnerId,
130
+ )
131
+ if (!matchingPartnerConfig) {
132
+ throw new Error('No matching partner config found')
133
+ }
134
+
135
+ return matchingPartnerConfig
136
+ }
137
+
138
+ async function handleInputChange() {
139
+ // Build the defaults object using current input values
140
+ const newDefaults = {
141
+ brandMapping: brandMapping || undefined,
142
+ conditionDescription: conditionDescription || undefined,
143
+ conditionId: conditionId || undefined,
144
+ fulfillmentPolicies: fulfillmentPolicies || [],
145
+ fulfillmentTimeUnit: fulfillmentTimeUnit || undefined,
146
+ fulfillmentTimeValue: fulfillmentTimeValue || undefined,
147
+ listingDescriptionTemplate: listingDescriptionTemplate || undefined,
148
+ listingDuration: listingDuration || undefined,
149
+ listingTitleTemplate: listingTitleTemplate || undefined,
150
+ manufacturerPartNumberMapping: manufacturerPartNumberMapping || undefined,
151
+ packageType: packageType || undefined,
152
+ paymentPolicies: paymentPolicies || [],
153
+ defaultPriceType: defaultPriceType || 'Retail',
154
+ pricingModifier: pricingModifier,
155
+ returnPolicies: returnPolicies || [],
156
+ shippingLengthUnit: shippingLengthUnit || undefined,
157
+ shippingWeightUnit: shippingWeightUnit || undefined,
158
+ }
159
+
160
+ defaults = newDefaults
161
+ await defaultsChanged?.()
162
+ }
163
+
164
+ function handleFulfillmentPoliciesChange(selectedIds: Array<string>) {
165
+ fulfillmentPolicies = selectedIds
166
+ handleInputChange()
167
+ }
168
+
169
+ function handlePaymentPoliciesChange(selectedIds: Array<string>) {
170
+ paymentPolicies = selectedIds
171
+ handleInputChange()
172
+ }
173
+
174
+ function handleReturnPoliciesChange(selectedIds: Array<string>) {
175
+ returnPolicies = selectedIds
176
+ handleInputChange()
177
+ }
178
+ </script>
179
+
180
+ <div class="row">
181
+ <div class="col">
182
+ <PolicyList
183
+ title={translate('configuration.ecommerce.fulfillmentPoliciesTitle', 'Fulfillment Policies')}
184
+ policies={fulfillmentPolicyList}
185
+ selectedPolicyIds={fulfillmentPolicies}
186
+ onSelectionChange={handleFulfillmentPoliciesChange}
187
+ />
188
+ <PolicyList
189
+ title={translate('configuration.ecommerce.paymentPoliciesTitle', 'Payment Policies')}
190
+ policies={paymentPolicyList}
191
+ selectedPolicyIds={paymentPolicies}
192
+ onSelectionChange={handlePaymentPoliciesChange}
193
+ />
194
+ <PolicyList
195
+ title={translate('configuration.ecommerce.returnPoliciesTitle', 'Return Policies')}
196
+ policies={returnPolicyList}
197
+ selectedPolicyIds={returnPolicies}
198
+ onSelectionChange={handleReturnPoliciesChange}
199
+ />
200
+ </div>
201
+ </div>
202
+ <Fieldset label={translate('configuration.ecommerce.fulfillmentTimeFieldset', 'Fulfillment Time')}>
203
+ <div class="row">
204
+ <div class="col-3">
205
+ <Input
206
+ label={translate('common:time', 'Time')}
207
+ maxlength={3}
208
+ type="number"
209
+ bind:value={fulfillmentTimeValue}
210
+ onchange={handleInputChange}
211
+ />
212
+ </div>
213
+ <div class="col-9">
214
+ <Select
215
+ label={translate('common:unit', 'Unit')}
216
+ emptyText="-- {translate('configuration.ecommerce.selectUnit', 'Select Unit')} --"
217
+ onchange={handleInputChange}
218
+ bind:value={fulfillmentTimeUnit}
219
+ >
220
+ {#each ecommercePartnerStaticData.ebay.timeUnits as unit}
221
+ <option value={unit}
222
+ >{translate(`configuration.ecommerce.timeUnits.${camelCase(unit)}`, toTitleCase(unit))}</option
223
+ >
224
+ {/each}
225
+ </Select>
226
+ </div>
227
+ </div>
228
+ </Fieldset>
229
+
230
+ <Fieldset
231
+ label={translate('configuration.ecommerce.shippingUnits', 'Shipping Units')}
232
+ class="mt-3 mb-3"
233
+ >
234
+ <div class="row">
235
+ <div class="col">
236
+ <Select
237
+ label={translate('common:length', 'Length')}
238
+ emptyText="-- {translate('configuration.ecommerce.selectUnit', 'Select Unit')} --"
239
+ onchange={handleInputChange}
240
+ bind:value={shippingLengthUnit}
241
+ >
242
+ {#each lengthUnits as unit}
243
+ <option value={unit}
244
+ >{translate(`configuration.ecommerce.lengthUnits.${camelCase(unit)}`, toTitleCase(unit))}</option
245
+ >
246
+ {/each}
247
+ </Select>
248
+ </div>
249
+ <div class="col">
250
+ <Select
251
+ label={translate('common:weight', 'Weight')}
252
+ emptyText="-- {translate('configuration.ecommerce.selectUnit', 'Select Unit')} --"
253
+ onchange={handleInputChange}
254
+ bind:value={shippingWeightUnit}
255
+ >
256
+ {#each weightUnits as unit}
257
+ <option value={unit}
258
+ >{translate(`configuration.ecommerce.weightUnits.${camelCase(unit)}`, toTitleCase(unit))}</option
259
+ >
260
+ {/each}
261
+ </Select>
262
+ </div>
263
+ </div>
264
+ </Fieldset>
265
+
266
+ <div class="row">
267
+ <div class="col">
268
+ <Select
269
+ label={translate('configuration.ecommerce.condition', 'Condition')}
270
+ emptyText="-- {translate('configuration.ecommerce.selectCondition', 'Select Condition')} --"
271
+ bind:value={conditionId}
272
+ onchange={handleInputChange}
273
+ >
274
+ {#each ecommerceConditions as condition}
275
+ <option value={condition.ecommerceConditionId}>{condition.name}</option>
276
+ {/each}
277
+ </Select>
278
+ </div>
279
+ <div class="col">
280
+ <Input
281
+ label={translate('configuration.ecommerce.conditionDescription', 'Condition Description')}
282
+ maxlength={1000}
283
+ bind:value={conditionDescription}
284
+ onchange={handleInputChange}
285
+ />
286
+ </div>
287
+ </div>
288
+ <div class="row">
289
+ <div class="col">
290
+ <Input
291
+ label={translate('configuration.ecommerce.brand', 'Brand')}
292
+ maxlength={100}
293
+ bind:value={brandMapping}
294
+ onchange={handleInputChange}
295
+ placeholder={'{?PartManufacturer}'}
296
+ />
297
+ </div>
298
+ <div class="col">
299
+ <Input
300
+ label={translate('configuration.ecommerce.manufacturerPartNumber', 'Manufacturer Part Number')}
301
+ maxlength={100}
302
+ bind:value={manufacturerPartNumberMapping}
303
+ onchange={handleInputChange}
304
+ placeholder={'{?PartModel}'}
305
+ />
306
+ </div>
307
+ </div>
308
+ <div class="row">
309
+ <div class="col">
310
+ <Select
311
+ label={translate('configuration.ecommerce.packageType', 'Package Type')}
312
+ emptyText="-- {translate('configuration.ecommerce.selectDefaultPackage', 'Select Default Package')} --"
313
+ onchange={handleInputChange}
314
+ bind:value={packageType}
315
+ >
316
+ {#each packageTypes as pkg}
317
+ <option value={pkg.partnerValue}>{pkg.name}</option>
318
+ {/each}
319
+ </Select>
320
+ </div>
321
+ <div class="col">
322
+ <Input
323
+ label={translate('configuration.ecommerce.listingDuration', 'Listing Duration')}
324
+ bind:value={listingDuration}
325
+ onchange={handleInputChange}
326
+ disabled={true}
327
+ />
328
+ </div>
329
+ </div>
330
+ <div class="row">
331
+ <div class="col mt-3">
332
+ <Select
333
+ label={translate('configuration.ecommerce.defaultPrice', 'Default Price')}
334
+ showEmptyOption={false}
335
+ onchange={handleInputChange}
336
+ bind:value={defaultPriceType}
337
+ >
338
+ {#each priceLevels as priceLevel}
339
+ <option value={priceLevel}>{priceLevel}</option>
340
+ {/each}
341
+ </Select>
342
+ </div>
343
+ <div class="col mt-3">
344
+ <Input
345
+ label={translate('configuration.ecommerce.percentOfPrice', 'Percent of Price')}
346
+ type="number"
347
+ inputmode="numeric"
348
+ step="any"
349
+ placeholder="%"
350
+ min="0"
351
+ onchange={handleInputChange}
352
+ bind:value={pricingModifier}
353
+ />
354
+ </div>
355
+ </div>
356
+ <div class="row">
357
+ <div class="col mt-3">
358
+ <Button
359
+ outline
360
+ size="sm"
361
+ href="https://wikido.isoftdata.com//index.php?title=Ebay_templates"
362
+ target="htp_chromium_popout"
363
+ icon="question-circle">{translate('configuration.ecommerce.templateHelp', 'Template Help')}</Button
364
+ >
365
+ </div>
366
+ </div>
367
+ <div class="row">
368
+ <div class="col">
369
+ <Textarea
370
+ label={translate('configuration.ecommerce.titleTemplate', 'Title Template')}
371
+ onchange={handleInputChange}
372
+ rows={10}
373
+ bind:value={listingTitleTemplate}
374
+ />
375
+ </div>
376
+ <div class="col">
377
+ <Textarea
378
+ label={translate('configuration.ecommerce.descriptionTemplate', 'Description Template')}
379
+ onchange={handleInputChange}
380
+ rows={10}
381
+ bind:value={listingDescriptionTemplate}
382
+ />
383
+ </div>
384
+ </div>