@isoftdata/svelte-ecommerce 1.0.0-beta.0 → 1.0.0-beta.1

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,357 +1,333 @@
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?: EbayPolicy[]
28
- ecommerceConditionList: EcommerceCondition[]
29
- partnerConfigurationList: EcommercePartnerConfiguration[]
30
- defaultsChanged: (newDefaults: EcommerceSharedDefaults) => Promise<void>
31
- selectedEcommercePartnerId: number
32
- }
33
-
34
- let {
35
- defaults = $bindable(),
36
- ebayPolicyList,
37
- ecommerceConditionList,
38
- partnerConfigurationList,
39
- defaultsChanged = async (_: EcommerceSharedDefaults) => {},
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<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<string[]>(defaults?.paymentPolicies ?? [])
56
- let returnPolicies = $state<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 editEcommerceConditionDisabled = $state<boolean>(false)
63
- let fulfillmentPolicyList = $derived.by(getFulfillmentPolicyList)
64
- let lengthUnits = $derived.by(getPartnerLengthUnits)
65
- let packageTypes = $derived.by(getPartnerPackageTypes)
66
- let paymentPolicyList = $derived.by(getPaymentPolicyList)
67
- let returnPolicyList = $derived.by(getReturnPolicyList)
68
- let selectedPartnerConfig = $derived.by(getSelectedPartnerConfig)
69
- let showAllOption = $state<boolean>(true)
70
- let weightUnits = $derived.by(getPartnerWeightUnits)
71
-
72
- function getFulfillmentPolicyList(): PolicyRowWithChecked[] {
73
- const policies = ebayPolicyList?.filter(policy => policy.policyType === 'fulfillment') || []
74
- return policies.map(policy => ({
75
- ...policy,
76
- checked: fulfillmentPolicies.includes(policy.policyId),
77
- }))
78
- }
79
- function getPaymentPolicyList(): PolicyRowWithChecked[] {
80
- const policies = ebayPolicyList?.filter(policy => policy.policyType === 'payment') || []
81
- return policies.map(policy => ({
82
- ...policy,
83
- checked: paymentPolicies.includes(policy.policyId),
84
- }))
85
- }
86
- function getReturnPolicyList(): PolicyRowWithChecked[] {
87
- const policies = ebayPolicyList?.filter(policy => policy.policyType === 'return') || []
88
- return policies.map(policy => ({
89
- ...policy,
90
- checked: returnPolicies.includes(policy.policyId),
91
- }))
92
- }
93
- function getPartnerLengthUnits(): string[] {
94
- const partnerName = selectedPartnerConfig.name
95
- if (!partnerName || !(partnerName in ecommercePartnerStaticData)) {
96
- return []
97
- }
98
- return ecommercePartnerStaticData[partnerName as keyof typeof ecommercePartnerStaticData].lengthUnits
99
- }
100
-
101
- function getPartnerPackageTypes(): PackageType[] {
102
- const partnerName = selectedPartnerConfig.name
103
- if (!partnerName || !(partnerName in ecommercePartnerStaticData)) {
104
- return []
105
- }
106
- return ecommercePartnerStaticData[partnerName as keyof typeof ecommercePartnerStaticData].packageTypes
107
- }
108
-
109
- function getPartnerWeightUnits(): string[] {
110
- const partnerName = selectedPartnerConfig.name
111
- if (!partnerName || !(partnerName in ecommercePartnerStaticData)) {
112
- return []
113
- }
114
- return ecommercePartnerStaticData[partnerName as keyof typeof ecommercePartnerStaticData].weightUnits
115
- }
116
-
117
- function getSelectedPartnerConfig(): EcommercePartnerConfiguration {
118
- const matchingPartnerConfig = partnerConfigurationList.find(
119
- row => row.ecommercePartnerId === selectedEcommercePartnerId,
120
- )
121
- if (!matchingPartnerConfig) {
122
- throw new Error('No matching partner config found')
123
- }
124
-
125
- return matchingPartnerConfig
126
- }
127
-
128
- async function handleInputChange() {
129
- // Build the defaults object using current input values
130
- const newDefaults = {
131
- brandMapping: brandMapping || undefined,
132
- conditionDescription: conditionDescription || undefined,
133
- conditionId: conditionId || undefined,
134
- fulfillmentPolicies: fulfillmentPolicies || [],
135
- fulfillmentTimeUnit: fulfillmentTimeUnit || undefined,
136
- fulfillmentTimeValue: fulfillmentTimeValue || undefined,
137
- listingDescriptionTemplate: listingDescriptionTemplate || undefined,
138
- listingDuration: listingDuration || undefined,
139
- listingTitleTemplate: listingTitleTemplate || undefined,
140
- manufacturerPartNumberMapping: manufacturerPartNumberMapping || undefined,
141
- packageType: packageType || undefined,
142
- paymentPolicies: paymentPolicies || [],
143
- returnPolicies: returnPolicies || [],
144
- shippingLengthUnit: shippingLengthUnit || undefined,
145
- shippingWeightUnit: shippingWeightUnit || undefined,
146
- }
147
-
148
- defaults = newDefaults
149
- await defaultsChanged(newDefaults)
150
- }
151
-
152
- function handleFulfillmentPoliciesChange(selectedIds: string[]) {
153
- fulfillmentPolicies = selectedIds
154
- handleInputChange()
155
- }
156
-
157
- function handlePaymentPoliciesChange(selectedIds: string[]) {
158
- paymentPolicies = selectedIds
159
- handleInputChange()
160
- }
161
-
162
- function handleReturnPoliciesChange(selectedIds: string[]) {
163
- returnPolicies = selectedIds
164
- handleInputChange()
165
- }
166
- </script>
167
-
168
- <div class="row">
169
- <div class="col">
170
- <PolicyList
171
- title={translate('configuration.ecommerce.fulfillmentPoliciesTitle', 'Fulfillment Policies')}
172
- policies={fulfillmentPolicyList}
173
- selectedPolicyIds={fulfillmentPolicies}
174
- onSelectionChange={handleFulfillmentPoliciesChange}
175
- />
176
- <PolicyList
177
- title={translate('configuration.ecommerce.paymentPoliciesTitle', 'Payment Policies')}
178
- policies={paymentPolicyList}
179
- selectedPolicyIds={paymentPolicies}
180
- onSelectionChange={handlePaymentPoliciesChange}
181
- />
182
- <PolicyList
183
- title={translate('configuration.ecommerce.returnPoliciesTitle', 'Return Policies')}
184
- policies={returnPolicyList}
185
- selectedPolicyIds={returnPolicies}
186
- onSelectionChange={handleReturnPoliciesChange}
187
- />
188
- </div>
189
- </div>
190
- <div class="row">
191
- <div class="col">
192
- <Input
193
- label={translate('configuration.ecommerce.fulfillmentTime', 'Fulfillment Time')}
194
- maxlength={3}
195
- type="number"
196
- bind:value={fulfillmentTimeValue}
197
- placeholder=""
198
- onchange={handleInputChange}
199
- />
200
-
201
- <Select
202
- id="fulfillment-time-unit"
203
- label={translate('configuration.ecommerce.fulfillmentUnit', 'Fulfillment Unit')}
204
- showEmptyOption={true}
205
- emptyValue={null}
206
- emptyText={translate('configuration.ecommerce.selectUnit', 'Select Unit')}
207
- disabled={false}
208
- required={false}
209
- onchange={handleInputChange}
210
- bind:value={fulfillmentTimeUnit}
211
- >
212
- {#each ecommercePartnerStaticData.ebay.timeUnits as unit}
213
- <option value={unit}>{unit}</option>
214
- {/each}
215
- </Select>
216
- </div>
217
- </div>
218
- <div class="row">
219
- <div class="col">
220
- <Select
221
- id="shipping-length-unit"
222
- label={translate('configuration.ecommerce.lengthUnit', 'Shipping Length Unit')}
223
- showEmptyOption={true}
224
- emptyValue={null}
225
- emptyText={translate('configuration.ecommerce.selectUnit', 'Select Unit')}
226
- disabled={false}
227
- required={false}
228
- onchange={handleInputChange}
229
- bind:value={shippingLengthUnit}
230
- >
231
- {#each lengthUnits as unit}
232
- <option value={unit}>{unit}</option>
233
- {/each}
234
- </Select>
235
- </div>
236
- <div class="col">
237
- <Select
238
- id="shipping-weight-unit"
239
- label={translate('configuration.ecommerce.shippingWeightUnit', 'Shipping Weight Unit')}
240
- showEmptyOption={true}
241
- emptyValue={null}
242
- emptyText={translate('configuration.ecommerce.selectUnit', 'Select Unit')}
243
- disabled={false}
244
- required={false}
245
- onchange={handleInputChange}
246
- bind:value={shippingWeightUnit}
247
- >
248
- {#each weightUnits as unit}
249
- <option value={unit}>{unit}</option>
250
- {/each}
251
- </Select>
252
- </div>
253
- </div>
254
- <div class="row">
255
- <div class="col">
256
- <Select
257
- label={translate('configuration.ecommerce.condition', 'Condition')}
258
- showEmptyOption={showAllOption}
259
- emptyValue={null}
260
- emptyText={translate('configuration.ecommerce.selectCondition', 'Select Condition')}
261
- disabled={editEcommerceConditionDisabled}
262
- bind:value={conditionId}
263
- onchange={handleInputChange}
264
- >
265
- {#each ecommerceConditions as condition}
266
- <option value={condition.ecommerceConditionId}>{condition.name}</option>
267
- {/each}
268
- </Select>
269
- </div>
270
- <div class="col">
271
- <Input
272
- label={translate('configuration.ecommerce.conditionDescription', 'Condition Description')}
273
- maxlength={1000}
274
- bind:value={conditionDescription}
275
- placeholder=""
276
- onchange={handleInputChange}
277
- />
278
- </div>
279
- </div>
280
- <div class="row">
281
- <div class="col">
282
- <Input
283
- label={translate('configuration.ecommerce.brand', 'Brand')}
284
- maxlength={100}
285
- bind:value={brandMapping}
286
- onchange={handleInputChange}
287
- placeholder={'{?PartManufacturer}'}
288
- />
289
- </div>
290
- <div class="col">
291
- <Input
292
- label={translate('configuration.ecommerce.manufacturerPartNumber', 'Manufacturer Part Number')}
293
- maxlength={100}
294
- bind:value={manufacturerPartNumberMapping}
295
- onchange={handleInputChange}
296
- placeholder={'{?PartModel}'}
297
- />
298
- </div>
299
- </div>
300
- <div class="row">
301
- <div class="col">
302
- <Select
303
- label={translate('configuration.ecommerce.packageType', 'Package Type')}
304
- showEmptyOption={showAllOption}
305
- emptyValue={null}
306
- emptyText={translate('configuration.ecommerce.selectDefaultPackage', 'Select Default Package')}
307
- onchange={handleInputChange}
308
- bind:value={packageType}
309
- >
310
- {#each packageTypes as pkg}
311
- <option value={pkg.partnerValue}>{pkg.name}</option>
312
- {/each}
313
- </Select>
314
- </div>
315
- <div class="col">
316
- <Input
317
- label={translate('configuration.ecommerce.listingDuration', 'Listing Duration')}
318
- disabled={true}
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={{
332
- prefix: 'fak',
333
- class: 'fa-isoft-bolt',
334
- }}>{translate('configuration.ecommerce.templateHelp', 'Template Help')}</Button
335
- >
336
- </div>
337
- </div>
338
- <div class="row">
339
- <div class="col">
340
- <Textarea
341
- label={translate('configuration.ecommerce.titleTemplate', 'Title Template')}
342
- onchange={handleInputChange}
343
- rows={10}
344
- bind:value={listingTitleTemplate}
345
- disabled={false}
346
- />
347
- </div>
348
- <div class="col">
349
- <Textarea
350
- label={translate('configuration.ecommerce.descriptionTemplate', 'Description Template')}
351
- onchange={handleInputChange}
352
- rows={10}
353
- bind:value={listingDescriptionTemplate}
354
- disabled={false}
355
- />
356
- </div>
357
- </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
+
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>