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