isMarkdown = $condition; return $this; } public function date(string | Closure | null $format = null, ?string $timezone = null): static { $this->isDate = true; $format ??= Table::$defaultDateDisplayFormat; $this->formatStateUsing(static function (TextColumn $column, $state) use ($format, $timezone): ?string { if (blank($state)) { return null; } return Carbon::parse($state) ->setTimezone($timezone ?? $column->getTimezone()) ->translatedFormat($column->evaluate($format)); }); return $this; } public function dateTime(string | Closure | null $format = null, ?string $timezone = null): static { $this->isDateTime = true; $format ??= Table::$defaultDateTimeDisplayFormat; $this->date($format, $timezone); return $this; } public function since(?string $timezone = null): static { $this->isDateTime = true; $this->formatStateUsing(static function (TextColumn $column, mixed $state) use ($timezone): ?string { if (blank($state)) { return null; } return Carbon::parse($state) ->setTimezone($timezone ?? $column->getTimezone()) ->diffForHumans(); }); return $this; } public function dateTooltip(string | Closure | null $format = null, ?string $timezone = null): static { $format ??= Table::$defaultDateDisplayFormat; $this->tooltip(static function (TextColumn $column, mixed $state) use ($format, $timezone): ?string { if (blank($state)) { return null; } return Carbon::parse($state) ->setTimezone($timezone ?? $column->getTimezone()) ->translatedFormat($column->evaluate($format)); }); return $this; } public function dateTimeTooltip(string | Closure | null $format = null, ?string $timezone = null): static { $format ??= Table::$defaultDateTimeDisplayFormat; $this->dateTooltip($format, $timezone); return $this; } public function timeTooltip(string | Closure | null $format = null, ?string $timezone = null): static { $format ??= Table::$defaultTimeDisplayFormat; $this->dateTooltip($format, $timezone); return $this; } public function sinceTooltip(?string $timezone = null): static { $this->tooltip(static function (TextColumn $column, mixed $state) use ($timezone): ?string { if (blank($state)) { return null; } return Carbon::parse($state) ->setTimezone($timezone ?? $column->getTimezone()) ->diffForHumans(); }); return $this; } public function money(string | Closure | null $currency = null, int $divideBy = 0, string | Closure | null $locale = null): static { $this->isMoney = true; $this->formatStateUsing(static function (TextColumn $column, $state) use ($currency, $divideBy, $locale): ?string { if (blank($state)) { return null; } if (! is_numeric($state)) { return $state; } $currency = $column->evaluate($currency) ?? Table::$defaultCurrency; $locale = $column->evaluate($locale) ?? Table::$defaultNumberLocale ?? config('app.locale'); if ($divideBy) { $state /= $divideBy; } return Number::currency($state, $currency, $locale); }); return $this; } public function numeric(int | Closure | null $decimalPlaces = null, string | Closure | null | ArgumentValue $decimalSeparator = ArgumentValue::Default, string | Closure | null | ArgumentValue $thousandsSeparator = ArgumentValue::Default, int | Closure | null $maxDecimalPlaces = null, string | Closure | null $locale = null): static { $this->isNumeric = true; $this->formatStateUsing(static function (TextColumn $column, $state) use ($decimalPlaces, $decimalSeparator, $locale, $maxDecimalPlaces, $thousandsSeparator): ?string { if (blank($state)) { return null; } if (! is_numeric($state)) { return $state; } $decimalPlaces = $column->evaluate($decimalPlaces); $decimalSeparator = $column->evaluate($decimalSeparator); $thousandsSeparator = $column->evaluate($thousandsSeparator); if ( ($decimalSeparator !== ArgumentValue::Default) || ($thousandsSeparator !== ArgumentValue::Default) ) { return number_format( $state, $decimalPlaces, $decimalSeparator === ArgumentValue::Default ? '.' : $decimalSeparator, $thousandsSeparator === ArgumentValue::Default ? ',' : $thousandsSeparator, ); } $locale = $column->evaluate($locale) ?? Table::$defaultNumberLocale ?? config('app.locale'); return Number::format($state, $decimalPlaces, $column->evaluate($maxDecimalPlaces), locale: $locale); }); return $this; } public function time(string | Closure | null $format = null, ?string $timezone = null): static { $this->isTime = true; $format ??= Table::$defaultTimeDisplayFormat; $this->date($format, $timezone); return $this; } public function timezone(string | Closure | null $timezone): static { $this->timezone = $timezone; return $this; } public function limit(int | Closure | null $length = 100, string | Closure | null $end = '...'): static { $this->characterLimit = $length; $this->characterLimitEnd = $end; return $this; } public function words(int | Closure | null $words = 100, string | Closure | null $end = '...'): static { $this->wordLimit = $words; $this->wordLimitEnd = $end; return $this; } public function prefix(string | Htmlable | Closure | null $prefix): static { $this->prefix = $prefix; return $this; } public function suffix(string | Htmlable | Closure | null $suffix): static { $this->suffix = $suffix; return $this; } public function html(bool | Closure $condition = true): static { $this->isHtml = $condition; return $this; } public function formatStateUsing(?Closure $callback): static { $this->formatStateUsing = $callback; return $this; } public function formatState(mixed $state): mixed { $isHtml = $this->isHtml(); $state = $this->evaluate($this->formatStateUsing ?? $state, [ 'state' => $state, ]); if ($isHtml) { if ($this->isMarkdown()) { $state = Str::markdown($state); } $state = Str::sanitizeHtml($state); } if ($state instanceof Htmlable) { $isHtml = true; $state = $state->toHtml(); } if ($state instanceof LabelInterface) { $state = $state->getLabel(); } if ($characterLimit = $this->getCharacterLimit()) { $state = Str::limit($state, $characterLimit, $this->getCharacterLimitEnd()); } if ($wordLimit = $this->getWordLimit()) { $state = Str::words($state, $wordLimit, $this->getWordLimitEnd()); } $prefix = $this->getPrefix(); $suffix = $this->getSuffix(); if ( (($prefix instanceof Htmlable) || ($suffix instanceof Htmlable)) && (! $isHtml) ) { $isHtml = true; $state = e($state); } if (filled($prefix)) { if ($prefix instanceof Htmlable) { $prefix = $prefix->toHtml(); } elseif ($isHtml) { $prefix = e($prefix); } $state = $prefix . $state; } if (filled($suffix)) { if ($suffix instanceof Htmlable) { $suffix = $suffix->toHtml(); } elseif ($isHtml) { $suffix = e($suffix); } $state = $state . $suffix; } return $isHtml ? new HtmlString($state) : $state; } public function getCharacterLimit(): ?int { return $this->evaluate($this->characterLimit); } public function getCharacterLimitEnd(): ?string { return $this->evaluate($this->characterLimitEnd); } public function getWordLimit(): ?int { return $this->evaluate($this->wordLimit); } public function getWordLimitEnd(): ?string { return $this->evaluate($this->wordLimitEnd); } public function getTimezone(): string { return $this->evaluate($this->timezone) ?? config('app.timezone'); } public function isHtml(): bool { return $this->evaluate($this->isHtml) || $this->isMarkdown(); } public function getPrefix(): string | Htmlable | null { return $this->evaluate($this->prefix); } public function getSuffix(): string | Htmlable | null { return $this->evaluate($this->suffix); } public function isMarkdown(): bool { return (bool) $this->evaluate($this->isMarkdown); } public function isDate(): bool { return $this->isDate; } public function isDateTime(): bool { return $this->isDateTime; } public function isMoney(): bool { return $this->isMoney; } public function isNumeric(): bool { return $this->isNumeric; } public function isTime(): bool { return $this->isTime; } }