import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/ru/functional/Classes/DatetimeRef - Реактивное управление датой и временем'/>

# Класс DatetimeRef

Класс для реактивной работы с датами и временем. Он предоставляет высокоуровневую обертку над утилитой `Datetime`, обеспечивая автоматическую синхронизацию данных о дате с реактивными пропсами Vue и локалями.

## Ключевые особенности

- **Реактивность** — интеграция с Vue `ref` и `computed`. Автоматически отслеживает изменения входных данных и обновляет все связанные компоненты даты.
- **Синхронизация** — внутренняя привязка к классу `Datetime`. Любые манипуляции с датой через базовый объект (`getDatetime()`) мгновенно отражаются в реактивных свойствах.
- **Локализация** — автоматическая поддержка международных форматов даты и времени через `Geo` и `GeoIntl`.
- **Удобные аксессоры** — быстрый доступ к компонентам даты (год, месяц, день и т.д.) через вычисляемые свойства.

## Инициализация

Создает новый экземпляр `DatetimeRef`. Класс автоматически синхронизируется с переданными реактивными данными. Если параметры не переданы, используются значения по умолчанию (текущая дата и локаль).

**Параметры:**
- `date: RefOrNormal<NumberOrStringOrDate>` — дата для инициализации (ISO строка, timestamp, объект `Date` или `ref` на них).
- `type: RefOrNormal<GeoDate> = 'date'` — формат вывода по умолчанию (реактивный или обычный).
- `code: RefOrNormal<string> = Geo.getLocation()` — код локали (реактивный или обычный, например, 'ru-RU').

```typescript
import { DatetimeRef } from '@dxtmisha/functional'
import { ref } from 'vue'

// 1. Инициализация с реактивной строкой
const date = ref('2023-10-27')
const dt = new DatetimeRef(date, 'date', 'ru-RU')

// 2. Текущее время (по умолчанию)
const now = new DatetimeRef()

// 3. С использованием реактивной локали
const locale = ref('en-US')
const dtLocale = new DatetimeRef(new Date(), 'datetime', locale)
```

## Методы и параметры

- `getItem(): Ref<NumberOrStringOrDate>` — Возвращает реактивную ссылку на исходное значение даты, переданное в конструктор.
- `getDate(): Ref<Date>` — Возвращает реактивную ссылку на внутренний объект `Date`. Используется для синхронизации с базовым классом.
- `getDatetime(): Datetime` — Возвращает экземпляр утилиты `Datetime`. Позволяет использовать методы навигации (`moveBy...`, `clone...`), сохраняя реактивность.
- `getHoursType(): ComputedRef<GeoHours>` — Определяет формат времени (12 или 24 часа) на основе текущей локали и настроек.
- `getFirstDayCode(): ComputedRef<GeoFirstDay>` — Возвращает код первого дня недели (0 для воскресенья, 1 для понедельника) согласно локали.
- `getMaxDay(): ComputedRef<number>` — Возвращает количество дней в текущем месяце (с учетом високосных лет).

## Компоненты даты

Эти методы возвращают `ComputedRef`, которые автоматически обновляются при изменении даты:

- `getYear(): ComputedRef<number>` — Возвращает полный год.
- `getMonth(): ComputedRef<number>` — Возвращает месяц (1–12).
- `getDay(): ComputedRef<number>` — Возвращает число месяца (1-31).
- `getHour(): ComputedRef<number>` — Возвращает часы текущей даты.
- `getMinute(): ComputedRef<number>` — Возвращает минуты.
- `getSecond(): ComputedRef<number>` — Возвращает секунды.

## Форматирование

### `locale`

Возвращает строку даты, отформатированную в соответствии с локалью и настройками.

**Параметры:**
- `type: GeoDate` — тип формата ('date', 'time', 'datetime', 'month', 'year' и др.). По умолчанию используется тип из конструктора.
- `styleOptions?: object` — дополнительные опции форматирования `Intl.DateTimeFormat`.

**Возвращает:** `ComputedRef<string>`

### `standard`

Возвращает стандартную ISO-строку даты.

**Параметры:**
- `timeZone: boolean` — включать ли информацию о временной зоне. По умолчанию: `true`.

**Возвращает:** `ComputedRef<string>`
