Skip to content

Commit d5ef5f8

Browse files
committed
feat(party): kazakhstan parties suggestions
1 parent 09a5652 commit d5ef5f8

File tree

6 files changed

+209
-6
lines changed

6 files changed

+209
-6
lines changed

packages/example/src/App.tsx

+27-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import React, { useState } from 'react';
22
import './App.css';
33
import 'react-dadata/src/react-dadata.css';
4-
import { AddressSuggestions, PartyBelarusSuggestions, PartySuggestions } from '../../react-dadata/src';
4+
import {
5+
AddressSuggestions,
6+
PartyBelarusSuggestions,
7+
PartyKazakhstanSuggestions,
8+
PartySuggestions,
9+
} from '../../react-dadata/src';
510

611
const DADATA_TOKEN = '3c2e964517d7358776e07d7d699cc2b0626dac54';
712

@@ -10,7 +15,9 @@ function App() {
1015
return <div className="App">Пожалуйста, установите ваш API токен для DaData в `example/src/App.tsx:5`</div>;
1116
}
1217

13-
const [suggestionsType, setSuggestionsType] = useState<'address' | 'party_russia' | 'party_belarus'>('address');
18+
const [suggestionsType, setSuggestionsType] = useState<
19+
'address' | 'party_russia' | 'party_belarus' | 'party_kazakhstan'
20+
>('address');
1421

1522
return (
1623
<div className="App">
@@ -48,6 +55,17 @@ function App() {
4855
/>
4956
<label htmlFor="suggestionsType-party_belarus">Компании в Беларуси 🇧🇾</label>
5057
</div>
58+
<div>
59+
<input
60+
id="suggestionsType-party_kazakhstan"
61+
type="radio"
62+
name="suggestionsType"
63+
value="party_kazakhstan"
64+
checked={suggestionsType === 'party_kazakhstan'}
65+
onChange={() => setSuggestionsType('party_kazakhstan')}
66+
/>
67+
<label htmlFor="suggestionsType-party_kazakhstan">Компании в Казахстане 🇰🇿</label>
68+
</div>
5169
</div>
5270
{suggestionsType === 'address' && (
5371
<AddressSuggestions token={DADATA_TOKEN} inputProps={{ placeholder: 'Введите адрес...' }} selectOnBlur />
@@ -66,6 +84,13 @@ function App() {
6684
selectOnBlur
6785
/>
6886
)}
87+
{suggestionsType === 'party_kazakhstan' && (
88+
<PartyKazakhstanSuggestions
89+
token={DADATA_TOKEN}
90+
inputProps={{ placeholder: '🇰🇿 Введите название компании, БИН' }}
91+
selectOnBlur
92+
/>
93+
)}
6994
</div>
7095
);
7196
}

packages/react-dadata/readme.md

+20-2
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ const [value, setValue] = useState();
177177
<PartySuggestions token="API_KEY" value={value} onChange={setValue} />;
178178
```
179179

180-
#### Дополнительные параметры для компонента организаций
180+
#### Дополнительные параметры для компонента организаций в России
181181

182182
| Свойство | Обязательный | Тип | Описание |
183183
|----------------------|--------------|-----------|----------------------------------------------------------------|
@@ -198,13 +198,31 @@ const [value, setValue] = useState();
198198
<PartyBelarusSuggestions token="API_KEY" value={value} onChange={setValue} />;
199199
```
200200

201-
#### Дополнительные параметры для компонента организаций
201+
#### Дополнительные параметры для компонента организаций в Беларуси
202202

203203
| Свойство | Обязательный | Тип | Описание |
204204
|----------------------|--------------|-----------|----------------------------------------------------------------|
205205
| filterStatus | Нет | `DaDataPartyBelarusStatus[]` | Фильтр по статусу организации, параметр status в запросе |
206206
| filterType | Нет | `DaDataPartyType[]` | Фильтр по типу организации, параметр type в запросе |
207207

208+
### Организации в Казахстане 🇰🇿
209+
210+
```jsx
211+
import { PartyKazakhstanSuggestions } from 'react-dadata';
212+
import 'react-dadata/dist/react-dadata.css';
213+
214+
const [value, setValue] = useState();
215+
216+
<PartyKazakhstanSuggestions token="API_KEY" value={value} onChange={setValue} />;
217+
```
218+
219+
#### Дополнительные параметры для компонента организаций в Казахстане
220+
221+
| Свойство | Обязательный | Тип | Описание |
222+
|----------------------|--------------|-----------|----------------------------------------------------------------|
223+
| filterType | Нет | `DaDataPartyKazakhstanType[]` | Фильтр по типу организации, параметр type в запросе |
224+
225+
208226
### Банки
209227

210228
```jsx

packages/react-dadata/src/index.tsx

+12
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,18 @@ import type {
2323
DaDataSuggestion,
2424
} from './types';
2525
import { PartyBelarusSuggestions } from './variants/party_belarus/party-belarus';
26+
import { PartyKazakhstanSuggestions } from './variants/party_kazakhstan/party-kazakhstan';
27+
import type {
28+
DaDataPartyKazakhstan,
29+
DaDataPartyKazakhstanStatus,
30+
DaDataPartyKazakhstanType,
31+
} from './variants/party_kazakhstan/party-kazakhstan-types';
2632

2733
type DaDataAddressSuggestion = DaDataSuggestion<DaDataAddress>;
2834
type DaDataPartySuggestion = DaDataSuggestion<DaDataParty>;
2935
type DaDataPartyRussiaSuggestion = DaDataSuggestion<DaDataPartyRussia>;
3036
type DaDataPartyBelarusSuggestion = DaDataSuggestion<DaDataPartyBelarus>;
37+
type DaDataPartyKazakhstanSuggestion = DaDataSuggestion<DaDataPartyKazakhstan>;
3138
type DaDataBankSuggestion = DaDataSuggestion<DaDataBank>;
3239
type DaDataFioSuggestion = DaDataSuggestion<DaDataFio>;
3340
type DaDataEmailSuggestion = DaDataSuggestion<DaDataEmail>;
@@ -37,6 +44,7 @@ export {
3744
AddressSuggestions,
3845
PartySuggestions,
3946
PartyBelarusSuggestions,
47+
PartyKazakhstanSuggestions,
4048
BankSuggestions,
4149
FioSuggestions,
4250
EmailSuggestions,
@@ -46,6 +54,7 @@ export {
4654
type DaDataPartySuggestion,
4755
type DaDataPartyRussiaSuggestion,
4856
type DaDataPartyBelarusSuggestion,
57+
type DaDataPartyKazakhstanSuggestion,
4958
type DaDataAddressBounds,
5059
type DaDataPartyType,
5160
type DaDataPartyRussia,
@@ -54,6 +63,9 @@ export {
5463
type DaDataPartyStatus,
5564
type DaDataPartyBelarus,
5665
type DaDataPartyBelarusStatus,
66+
type DaDataPartyKazakhstan,
67+
type DaDataPartyKazakhstanStatus,
68+
type DaDataPartyKazakhstanType,
5769
type DaDataBank,
5870
type DaDataBankStatus,
5971
type DaDataBankType,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* Типы для подсказок по компаниям в Казахстане 🇰🇿
3+
*/
4+
5+
export type DaDataPartyKazakhstanStatus = 'ACTIVE' | 'INACTIVE' | 'LIQUIDATING' | 'LIQUIDATED' | 'SUSPENDED';
6+
7+
export type DaDataPartyKazakhstanType =
8+
| 'LEGAL'
9+
| 'BRANCH'
10+
| 'INDIVIDUAL'
11+
| 'INDIVIDUAL_JOINT_VENTURE'
12+
| 'FOREIGN_BRANCH';
13+
14+
export interface DaDataPartyKazakhstan {
15+
bin: string;
16+
registration_date: string;
17+
status: DaDataPartyKazakhstanStatus;
18+
type: DaDataPartyKazakhstanType;
19+
name_ru: string;
20+
name_kz: string;
21+
fio: string;
22+
kato: string;
23+
address_ru: string;
24+
address_kz: string;
25+
address_settlement_ru: string;
26+
address_settlement_kz: string;
27+
address_local: string;
28+
oked: string;
29+
oked_name_ru: string;
30+
oked_name_kz: string;
31+
krp: string;
32+
krp_name_ru: string;
33+
krp_name_kz: string;
34+
kse: string;
35+
kse_name_ru: string;
36+
kse_name_kz: string;
37+
kfs: string;
38+
kfs_name_ru: string;
39+
kfs_name_kz: string;
40+
}
41+
42+
type DaDataPartyKazakhstanRequestFilterItem = { type: DaDataPartyKazakhstanType };
43+
44+
export interface DaDataPartyKazakhstanRequestPayload extends Record<string, unknown> {
45+
query: string;
46+
count: number;
47+
filters?: DaDataPartyKazakhstanRequestFilterItem[];
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import React, { type ReactNode } from 'react';
2+
import { type BaseProps, BaseSuggestions } from '../../BaseSuggestions';
3+
import { HighlightWords } from '../../HighlightWords';
4+
import type { DaDataSuggestion } from '../../types';
5+
import type {
6+
DaDataPartyKazakhstan,
7+
DaDataPartyKazakhstanRequestPayload,
8+
DaDataPartyKazakhstanType,
9+
} from './party-kazakhstan-types';
10+
11+
interface Props extends BaseProps<DaDataPartyKazakhstan> {
12+
filterType?: DaDataPartyKazakhstanType[];
13+
}
14+
15+
export class PartyKazakhstanSuggestions extends BaseSuggestions<
16+
DaDataPartyKazakhstan,
17+
Props,
18+
DaDataPartyKazakhstanRequestPayload
19+
> {
20+
loadSuggestionsUrl = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/party_kz';
21+
22+
/**
23+
* Структура запроса для подсказок по организациям в Казахстане 🇰🇿
24+
* @see https://dadata.ru/api/suggest/party_kz/
25+
*/
26+
getLoadSuggestionsData = () => {
27+
const { count, filterType } = this.props;
28+
const { query } = this.state;
29+
30+
const requestPayload: DaDataPartyKazakhstanRequestPayload = {
31+
query,
32+
count: count || 10,
33+
filters: [],
34+
};
35+
36+
// Ограничение по типу организации
37+
if (filterType) {
38+
for (let i = 0; i < filterType.length; i++) {
39+
requestPayload.filters?.push({
40+
type: filterType[i],
41+
});
42+
}
43+
}
44+
45+
return requestPayload;
46+
};
47+
48+
// В России ИНН допускает коллизии, и там существует свойство hid
49+
// В Беларуси такого свойства нет, поэтому используем БИН + name_kz + registration_date
50+
protected getSuggestionKey = (suggestion: DaDataSuggestion<DaDataPartyKazakhstan>): string =>
51+
suggestion.data.bin + suggestion.data.name_kz + suggestion.data.registration_date;
52+
53+
protected renderOption = (suggestion: DaDataSuggestion<DaDataPartyKazakhstan>): ReactNode => {
54+
const { renderOption, highlightClassName } = this.props;
55+
const { query } = this.state;
56+
57+
return renderOption ? (
58+
renderOption(suggestion, query)
59+
) : (
60+
<div>
61+
<div className={suggestion.data.status === 'LIQUIDATED' ? 'react-dadata__suggestion--line-through' : undefined}>
62+
<HighlightWords
63+
highlightClassName={highlightClassName || 'react-dadata--highlighted'}
64+
words={this.getHighlightWords()}
65+
text={suggestion.value}
66+
/>
67+
</div>
68+
<div className="react-dadata__suggestion-subtitle">
69+
{suggestion.data.address_ru && (
70+
<div className="react-dadata__suggestion-subtitle-item">
71+
<HighlightWords
72+
highlightClassName={highlightClassName || 'react-dadata--highlighted'}
73+
words={this.getHighlightWords()}
74+
text={suggestion.data.address_ru}
75+
/>
76+
</div>
77+
)}
78+
</div>
79+
</div>
80+
);
81+
};
82+
}

readme.md

+20-2
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ const [value, setValue] = useState();
177177
<PartySuggestions token="API_KEY" value={value} onChange={setValue} />;
178178
```
179179

180-
#### Дополнительные параметры для компонента организаций
180+
#### Дополнительные параметры для компонента организаций в России
181181

182182
| Свойство | Обязательный | Тип | Описание |
183183
|----------------------|--------------|-----------|----------------------------------------------------------------|
@@ -198,13 +198,31 @@ const [value, setValue] = useState();
198198
<PartyBelarusSuggestions token="API_KEY" value={value} onChange={setValue} />;
199199
```
200200

201-
#### Дополнительные параметры для компонента организаций
201+
#### Дополнительные параметры для компонента организаций в Беларуси
202202

203203
| Свойство | Обязательный | Тип | Описание |
204204
|----------------------|--------------|-----------|----------------------------------------------------------------|
205205
| filterStatus | Нет | `DaDataPartyBelarusStatus[]` | Фильтр по статусу организации, параметр status в запросе |
206206
| filterType | Нет | `DaDataPartyType[]` | Фильтр по типу организации, параметр type в запросе |
207207

208+
### Организации в Казахстане 🇰🇿
209+
210+
```jsx
211+
import { PartyKazakhstanSuggestions } from 'react-dadata';
212+
import 'react-dadata/dist/react-dadata.css';
213+
214+
const [value, setValue] = useState();
215+
216+
<PartyKazakhstanSuggestions token="API_KEY" value={value} onChange={setValue} />;
217+
```
218+
219+
#### Дополнительные параметры для компонента организаций в Казахстане
220+
221+
| Свойство | Обязательный | Тип | Описание |
222+
|----------------------|--------------|-----------|----------------------------------------------------------------|
223+
| filterType | Нет | `DaDataPartyKazakhstanType[]` | Фильтр по типу организации, параметр type в запросе |
224+
225+
208226
### Банки
209227

210228
```jsx

0 commit comments

Comments
 (0)