رفتن به محتوای اصلی

فارسی

فرم نشانی

استان، شهرِ همان استان، نشانی، پلاک، واحد و کد پستی ده‌رقمی در یک فرم؛ با فهرست بیش از ۱۲۰۰ شهر ایران و نقشه برای انتخاب استان.

npm i @kashi-ui/react @kashi-ui/css
import { AddressForm } from "@kashi-ui/react";

CSS را یک بار در ریشهٔ برنامه وارد کنید: import "@kashi-ui/css"راهنمای نصب

import { AddressForm } from "@kashi-ui/react";
import { EMPTY_ADDRESS, formatAddress, type IranAddress } from "@kashi-ui/persian";

فرم کامل

با انتخاب استان فقط شهرهای همان استان می‌آیند و با عوض شدن استان، شهرِ نامربوط پاک می‌شود. اگر کاربر اول شهر را بنویسد، استان خودکار پر می‌شود. کد پستی هنگام تایپ قالب می‌گیرد و با قواعد کد پستی ایران بررسی می‌شود.

نشانی

اصفهان، کاشان

const [address, setAddress] = useState<IranAddress>(EMPTY_ADDRESS);

<AddressForm value={address} onChange={setAddress} name="shipping" />
<p>{formatAddress(address)}</p>

مقدار فرم یک شیء IranAddress است:

interface IranAddress {
  province: string | null; // «اصفهان»
  city: string | null;     // «کاشان»
  street: string;          // «خیابان امیرکبیر، کوچهٔ ۱۲»
  plaque: string;
  unit: string;
  postalCode: string;      // ده رقم لاتین، «8713714568»
}

formatAddress همین شیء را در یک خط با ارقام فارسی برمی‌گرداند، مثل «اصفهان، کاشان، خیابان امیرکبیر، پلاک ۱۲، واحد ۳، کد پستی ۸۷۱۳۷-۱۴۵۶۸»؛ برای فاکتور، رسید یا صفحهٔ تأیید سفارش.

با نقشه

با map نقشهٔ ایران کنار فیلدها می‌آید و استان را می‌شود روی نقشه هم انتخاب کرد. در عرض کم، نقشه زیر فیلدها می‌رود.

نشانی تحویل
<AddressForm value={address} onChange={setAddress} map legend="نشانی تحویل" />

ارسال با فرم HTML

با name هر فیلد در فرم HTML هم فرستاده می‌شود: name="shipping" می‌شود shipping[province]، shipping[city]، shipping[street]، shipping[plaque]، shipping[unit] و shipping[postalCode]. این همان قالبی است که Laravel و PHP به‌صورت آرایه می‌خوانند. خطاهای اعتبارسنجی سرور را با errors زیر هر فیلد نشان دهید:

<AddressForm name="shipping" errors={{ plaque: "پلاک را بنویسید." }} />

انتخاب شهر

CitySelect جدا هم در دسترس است. با province فقط شهرهای همان استان را نشان می‌دهد و بدون آن همهٔ شهرها را با نام استانشان. جستجو «علی آباد»، «علی‌آباد» و «علیآباد» را یکی می‌داند. شهری که در فهرست نیست (مثلاً شهرهای تازه‌تأسیس) با همان نامی که کاربر نوشته پذیرفته می‌شود؛ برای بستن این امکان allowCustom={false} بدهید.

بدون استان؛ همهٔ شهرها با نام استانشان

شهری انتخاب نشده

<CitySelect value={city} onChange={(city, province) => { setCity(city); setProvince(province); }} />
ویژگی‌ها (props)
نامتوضیح، نوع و پیش‌فرض
value / defaultValue

مقدار فرم

نوع: IranAddress

onChange

با هر تغییر، کل نشانی

نوع: (address: IranAddress) => void

errors

خطای هر فیلد

نوع: Partial<Record<keyof IranAddress, ReactNode>>

name

پیشوند نام فیلدها برای فرم HTML

نوع: string

legend

عنوان گروه فیلدها

نوع: ReactNodeپیش‌فرض «نشانی»

labels

برچسب دلخواه هر فیلد

نوع: Partial<Record<keyof IranAddress, string>>

map

نقشهٔ ایران برای انتخاب استان

نوع: booleanپیش‌فرض false

required

همه اجباری جز واحد

نوع: booleanپیش‌فرض true

disabled

غیرفعال کردن همهٔ فیلدها

نوع: booleanپیش‌فرض false

ابزارهای فهرست شهرها

فهرست شهرها در @kashi-ui/persian است و بدون React هم کار می‌کند:

import { CITIES, getCities, getCityProvinces, formatAddress } from "@kashi-ui/persian";

getCities("قم");             // ["جعفریه", "دستجرد", "سلفچگان", "قاهان", "قم", "قنوات", "کهک"]
getCityProvinces("کاشان");   // ["اصفهان"]
Object.keys(CITIES).length;  // ۳۱ استان

دسترس‌پذیری

  • فیلدها در یک fieldset با legend هستند و صفحه‌خوان نام گروه را همراه هر فیلد می‌خواند.
  • هر فیلد autocomplete استاندارد دارد (street-address، postal-code و …) تا مرورگر نشانی ذخیره‌شده را پیشنهاد دهد.
  • فیلد اختیاری با «اختیاری» مشخص شده، نه فقط با نبود ستاره.
  • استان و شهر با الگوی Combobox در WAI-ARIA کار می‌کنند و نقشه با کلیدهای جهت‌دار.

فهرست ۱۲۷۸ شهر در ۳۱ استان از ویکی‌داده (مالکیت عمومی، CC0) گرفته شده است. شهرهای تازه‌تأسیس ممکن است هنوز در آن نباشند؛ برای همین شهر خارج از فهرست هم پذیرفته می‌شود.

وب کامپوننت

همین کامپوننت بدون React، برای HTML، وردپرس، Vue، Svelte و Angular: <kashi-address-form> در @kashi-ui/elements. فیلدها به‌شکل shipping[province]، shipping[city]، … ارسال می‌شوند.

نصب

بدون ابزار ساخت، این دو خط را در <head> صفحه بگذارید:

CDN
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@kashi-ui/css/dist/kashi.css">
<script type="module" src="https://cdn.jsdelivr.net/npm/@kashi-ui/elements/dist/cdn/kashi-elements.js"></script>

یا با npm، و فقط همین بخش را وارد کنید:

npm
npm i @kashi-ui/elements @kashi-ui/css
import "@kashi-ui/css";
import "@kashi-ui/elements/map.js";

نمونه

<kashi-address-form name="shipping" legend="نشانی تحویل"></kashi-address-form>

ویژگی‌ها

ویژگی‌های وب کامپوننت
نامتوضیح، نوع و پیش‌فرض
name

پیشوند نام فیلدها در فرم

نوع: متن

legend

عنوان گروه فیلدها

نوع: متنپیش‌فرض نشانی

map

نقشهٔ ایران کنار فرم

نوع: بولی

required

همهٔ فیلدها اختیاری

نوع: false

disabled

غیرفعال

نوع: بولی

label-province، label-city، …

برچسب دلخواه هر فیلد

نوع: متن

رویدادها و JavaScript

نامتوضیح
kashi-changedetail: { value: { province, city, street, plaque, unit, postalCode } }
element.valueخواندن و پر کردن نشانی
element.errorsخطای هر فیلد: { plaque: "پلاک را بنویسید." }