Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
19d1848
update order page
ninedev-i May 19, 2026
451ea5c
formatting
ekateluv May 28, 2026
66031ac
Merge branch 'main' into feature/order-page-v2
ekateluv May 28, 2026
df8c520
3000 callback problem
ekateluv Jun 2, 2026
3c15f17
fix api requests
ninedev-i Jun 2, 2026
b4668e5
add fio and phone fields for entity
ekateluv Jun 8, 2026
85d7044
fix img
ekateluv Jun 8, 2026
d7de48d
fix top
ekateluv Jun 8, 2026
ec5b3cf
add payment variants endpoint
ekateluv Jun 9, 2026
f792a6c
try to use cached data
ekateluv Jun 10, 2026
bd4bbea
dadata works
ekateluv Jun 11, 2026
3018bdc
dadata on org search
ekateluv Jun 11, 2026
3353860
send recent address & orgs
ekateluv Jun 11, 2026
c44c33f
fix debounce bug
ekateluv Jun 11, 2026
5c802c5
use cached pvz
ekateluv Jun 12, 2026
f82f47b
Merge branch 'main' into ekateluv
ekateluv Jun 17, 2026
b812bcc
fix formatting
ekateluv Jun 17, 2026
e96af6e
add "disabled" input option
ekateluv Jun 17, 2026
ed94192
fix country reset
ekateluv Jun 17, 2026
8c78c45
better address error handle
ekateluv Jun 17, 2026
034df59
fix autocomplete
ekateluv Jun 17, 2026
f35eeee
add confirm button spinner
ekateluv Jun 19, 2026
aa895a3
Make order page responsive on mobile
ekateluv Jun 19, 2026
47c749c
Wrap read-only order fields to fit long values
ekateluv Jun 19, 2026
5750051
Make city/postcode row full width on desktop
ekateluv Jun 19, 2026
234ccc7
add fixies
ekateluv Jun 23, 2026
5011ab4
Fix order form English pluralization and radio group names
ekateluv Jun 24, 2026
64a85e1
Add phone extension input for CDEK countries on checkout
ekateluv Jun 26, 2026
3a0e3a3
trim unused comment
ekateluv Jun 26, 2026
e1decf1
Merge branch 'main' into ekateluv-order-page-v2
ekateluv Jun 26, 2026
ef78aa6
Use pickup map link from API instead of hardcoded one
ekateluv Jul 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,6 @@ logs
.env
.env.*
!.env.example

# AI
.claude
11 changes: 9 additions & 2 deletions assets/css/fonts.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,20 @@
@font-face {
font-family: 'Plumb';
src: url('/fonts/plumb-bo-webfont.woff2') format('woff2');
font-weight: bold;
font-weight: 700;
font-style: normal;
}

@font-face {
font-family: 'Plumb';
src: url('/fonts/plumb-me-webfont.woff2') format('woff2');
font-weight: 500;
font-style: normal;
}

@font-face {
font-family: 'Plumb';
src: url('/fonts/plumb-re-webfont.woff2') format('woff2');
font-weight: normal;
font-weight: 400;
font-style: normal;
}
3 changes: 3 additions & 0 deletions assets/icons/spinner.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 13 additions & 14 deletions common/constants.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
export enum ArticleType {
WithoutSubCategories,
WithSubCategories,
SubCategory,
WithoutSubCategories,
WithSubCategories,
SubCategory,
}

export enum FilterTypeKeys {
ByCategory = '0',
ByDate = '1',
ByCategory = '0',
ByDate = '1',
}

export const FilterTypeParams = {
[FilterTypeKeys.ByCategory]: 'filter_category',
[FilterTypeKeys.ByDate]: 'filter_date',
}
[FilterTypeKeys.ByCategory]: 'filter_category',
[FilterTypeKeys.ByDate]: 'filter_date',
};

export enum FilterDateKeys {
ASC = '0',
DESC = '1',
ASC = '0',
DESC = '1',
}

export const FilterDateParams = {
[FilterDateKeys.ASC]: 'filter_asc',
[FilterDateKeys.DESC]: 'filter_desc',
}

[FilterDateKeys.ASC]: 'filter_asc',
[FilterDateKeys.DESC]: 'filter_desc',
};
106 changes: 105 additions & 1 deletion common/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
inv_final_assembly: number;
inv_ready_to_assembly: number;
inv_scheduled: number;
},
};
options: ProductOption[];
components: ProductOption[];
use_cases: string[];
Expand All @@ -66,3 +66,107 @@
export type PhotoLink = [string, string, string?, string?];

export type LogoLink = [string, string, string];

export enum DeliveryType {
Courier = 'courier',

Check warning on line 71 in common/types.ts

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

common/types.ts#L71

'Courier' is defined but never used.
Pickup = 'pickup',

Check warning on line 72 in common/types.ts

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

common/types.ts#L72

'Pickup' is defined but never used.
Point = 'point',

Check warning on line 73 in common/types.ts

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

common/types.ts#L73

'Point' is defined but never used.
Taxi = 'todoor',

Check warning on line 74 in common/types.ts

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

common/types.ts#L74

'Taxi' is defined but never used.
}

export const RUSSIA_ID = 643;

export interface AvailableDelivery {
id: string;
type: string;
daysMin: number | null;
daysMax: number | null;
title: string;
address: string | null;
mapUrl: string | null;
price: number;
total: number;
error?: string | null;
}

export interface AvailableDeliveriesInfo{
available: AvailableDelivery[];
freeDelivery: boolean;
}

export interface CustomerData{
individual:{
fio: string;
phone: string;
additional: string;
email: string;
comment: string;
}
entity: {
inn: string;
orgName: string;
address: string;
email: string;
comment: string;
};
payerType: 'individual' | 'entity';
}

export interface RecentAddress {
city: string;
postcode: string;
address: string;
}

export interface RecentOrg {
inn: string;
orgName: string;
address: string;
}

export interface OrderInfo {
payerType: string;
payerData: CustomerData;
deliveryType: string;
deliveryData: Record<string, string>;
paymentType: string;
basketData: Record<string, number>;
countries: Record<number, string>;
cdekCountries: number[];
recentAddresses?: RecentAddress[];
recentOrgs?: RecentOrg[];
}

export interface Tariff {
calendar_max: number;
calendar_min: number;
delivery_date_range: { min: string; max: string };
delivery_mode: number;
delivery_sum: number;
period_max: number;
period_min: number;
tariff_code: number;
tariff_description: string;
tariff_name: string;
}

export interface Destination {
city_code: number;
city: string;
type: string;
postal_code: string;
country_code: string;
region: string;
have_cashless: boolean;
have_cash: boolean;
allowed_cod: boolean;
is_dressing_room: boolean;
code: string;
name: string;
address: string;
work_time: string;
location: [number, number];
weight_min: number;
weight_max: number;
dimensions: any;

Check warning on line 171 in common/types.ts

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

common/types.ts#L171

Unexpected any. Specify a different type.
}
75 changes: 64 additions & 11 deletions components/Button.vue
Original file line number Diff line number Diff line change
@@ -1,20 +1,36 @@
<script setup lang="ts">
withDefaults(defineProps<{ id?: string; label: string; size?: 'default' | 'large' }>(), {
import Spinner from 'assets/icons/spinner.svg';

withDefaults(defineProps<{
id?: string;
label: string;
type?: 'button' | 'submit';
variant: 'primary' | 'secondary';
outlined: boolean;
size?: 'default' | 'large';
isLoading?: boolean;
}>(), {
size: 'default',
variant: 'primary',
type: 'button',
isLoading: false,
});

</script>

<template>
<button
type="button"
:type="type"
class="wb-button"
:class="{
'wb-button-m': size === 'default',
'wb-button-l': size === 'large',
'wb-button-primary': variant === 'primary',
'wb-button-outlined': outlined
}"
:id="id">
{{ label }}
<Spinner v-if="isLoading" class="wb-button-spinner" />
<span :style="isLoading ? { visibility: 'hidden' } : {}">{{ label }}</span>
</button>
</template>

Expand All @@ -24,24 +40,45 @@ withDefaults(defineProps<{ id?: string; label: string; size?: 'default' | 'large
border-radius: 4px;
white-space: nowrap;
position: relative;
min-height: 33px;
min-height: 31px;
display: inline-flex;
cursor: pointer;
user-select: none;
align-items: center;
justify-content: center;
overflow: hidden;
background: var(--primary-color);
color: #fff;
border: 0;
transition: background 0.2s;
transition: background 0.3s, color 0.3s;
font-weight: bold;
outline: none;
line-height: 24px;
}

.wb-button:hover {
background: var(--primary-color-hover);
.wb-button:not(:disabled) {
cursor: pointer;
}

.wb-button:disabled {
filter: opacity(0.5);
}

.wb-button-primary {
background: var(--primary-color);
border: 1px solid var(--primary-color);
color: #fff;
}

.wb-button-primary:hover {
background: var(--primary-color-hover) !important;
color: #fff !important;
}

.wb-button-primary.wb-button-outlined {
background: transparent;
color: var(--primary-color)
}

.wb-button-primary.wb-button-outlined {
background: transparent;
color: var(--primary-color)
}

.wb-button-m {
Expand All @@ -53,4 +90,20 @@ withDefaults(defineProps<{ id?: string; label: string; size?: 'default' | 'large
padding: 12px 24px;
font-size: 18px;
}

.wb-button-spinner {
position: absolute;
width: 22px;
height: 22px;
animation: spin 1s linear infinite;
}

.wb-button-primary .wb-button-spinner {
color: #fff;
}

@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
Loading
Loading