PriceSlot [ {selectedCountry.toUpperCase()} ]

Edit sheet PriceSlot names, descriptions, and product prices.

{#if enabledCountries.length > 0} { if (v) { selectedCountry = v; goto(`/sheet/priceslot/${v}`); } }} > {selectedCountry.toUpperCase()} {#each enabledCountries as country} {country.toUpperCase()} {/each} {/if}
{#if displaySlots.length > 0} {#each displaySlots as slot} {/each} {:else}
{loading ? 'Loading PriceSlot data...' : 'No PriceSlot data loaded'}
{/if}

{currentSlot.slot ? `PriceSlot${selectedSlot}` : 'No PriceSlot'}

{hasChanges ? `${totalChangedCount} changes` : 'No changes'}
updateSlotField('name', event.currentTarget.value)} />
updateSlotField('description', event.currentTarget.value)} />

Reset discards unsaved changes for the selected PriceSlot.

{ productCodeSearch = event.currentTarget.value; productPage = 1; servicePage = 1; }} />
{#if !isServiceSlot && currentSlot.slot} {/if} Showing {isServiceSlot ? pagedServiceRows.length : pagedProducts.length} of {visibleRowCount} filtered / {totalRowCount} {isServiceSlot ? 'service rows' : 'products'} Page {isServiceSlot ? servicePage : productPage} / {isServiceSlot ? servicePageCount : productPageCount}
{#if loading && displaySlots.length === 0}
Loading PriceSlot data...
{:else if $priceSlotsError}
{$priceSlotsError}
{:else if displaySlots.length === 0}
No PriceSlot data from backend.
{:else if currentSlot.slot && !isServiceSlot && currentSlot.products.length === 0}
PriceSlot{currentSlot.slot} data is not loaded yet.
{:else if currentSlot.slot && isServiceSlot && (currentSlot.serviceRows?.length ?? 0) === 0}
PriceSlot{currentSlot.slot} data is not loaded yet.
{:else if isServiceSlot}
{#each serviceHeaders as header} {header} {/each} {#each pagedServiceRows as row, index (`${row.row_index ?? index}-${index}`)} {#each serviceHeaders as header} updateServiceCell(row, index, header, event.currentTarget.value)} /> {/each} {/each} {#if filteredServiceRows.length === 0} No service rows found. {/if}
{:else}
ProductCode ProductName [{selectedCountryLanguage}] ProductNameEng Price {#each pagedProducts as product, index (`${product.product_code}-${product.row_index ?? 'new'}-${index}`)} {@const productNames = getProductNames(product)} updateProductCode(product, index, event.currentTarget.value)} /> {productNames.local} {productNames.english} updateProductPrice(product, index, event.currentTarget.value)} /> {/each} {#if filteredProducts.length === 0} No product code found. {/if}
{/if}
Create PriceSlot Choose how to create a new PriceSlot.
(createSlotNumber = Number(event.currentTarget.value))} />

This creates the Google Sheet/Grist namespace as PriceSlot{createSlotNumber || ''}.

{ if (v === 'from_price' || v === 'blank') { createMode = v; if (v === 'from_price') applyCreateTemplate(); } }} > {createMode === 'from_price' ? 'From base Price with adjustment' : 'Blank (add manually)'} From base Price with adjustment Blank (add manually)
{#if createMode === 'from_price'}
{ if (v) adjustmentMode = v as AdjustmentMode; applyCreateTemplate(); }} > {adjustmentModeLabels[adjustmentMode]} Increase by Percentage (%) Increase by Fixed Amount Decrease by Percentage (%) Decrease by Fixed Amount
{ adjustmentValue = Number(event.currentTarget.value); applyCreateTemplate(); }} />
{/if}
(createName = event.currentTarget.value)} />
(createDescription = event.currentTarget.value)} />
Add ProductCode Enter the product code, name, and price for the new row.