diff --git a/CHANGELOG-WIP.md b/CHANGELOG-WIP.md index 43b6e57aad7..f48898fbd5c 100644 --- a/CHANGELOG-WIP.md +++ b/CHANGELOG-WIP.md @@ -90,6 +90,7 @@ - `craft\helpers\Cp::elementIndexHtml()` now supports passing `defaultSort` in the `$config` array, when `sources` is `null`. ([#16236](https://github.com/craftcms/cms/discussions/16236)) - `craft\models\Site` now implements `craft\base\Chippable`. - `craft\services\Revisions::createRevision()` no longer creates the revision if an `EVENT_BEFORE_CREATE_REVISION` event handler sets `$event->handled` to `true` and at least one revision already exists for the element. ([#16260](https://github.com/craftcms/cms/discussions/16260)) +- Elements’ `defineCardAttributes()` methods can now return a `placeholder` value set to a callable. - Deprecated `craft\fields\Color::$presets`. ([#16249](https://github.com/craftcms/cms/pull/16249)) - Deprecated `craft\fields\Link::$showTargetField`. - `_includes/forms/autosuggest.twig` now supports a `suggestTemplates` variable. diff --git a/src/base/Element.php b/src/base/Element.php index ec06af27a8d..40034176c9b 100644 --- a/src/base/Element.php +++ b/src/base/Element.php @@ -1571,19 +1571,19 @@ protected static function defineCardAttributes(): array $attributes = [ 'dateCreated' => [ 'label' => Craft::t('app', 'Date Created'), - 'placeholder' => (new \DateTime())->sub(new \DateInterval('P16D')), + 'placeholder' => fn() => (new \DateTime())->sub(new \DateInterval('P16D')), ], 'dateUpdated' => [ 'label' => Craft::t('app', 'Date Updated'), - 'placeholder' => (new \DateTime())->sub(new \DateInterval('P15D')), + 'placeholder' => fn() => (new \DateTime())->sub(new \DateInterval('P15D')), ], 'id' => [ 'label' => Craft::t('app', 'ID'), - 'placeholder' => 4321, + 'placeholder' => fn() => 4321, ], 'uid' => [ 'label' => Craft::t('app', 'UID'), - 'placeholder' => 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', + 'placeholder' => fn() => 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', ], ]; @@ -1592,15 +1592,15 @@ protected static function defineCardAttributes(): array 'link' => [ 'label' => Craft::t('app', 'Link'), 'icon' => 'world', - 'placeholder' => ElementHelper::linkAttributeHtml('#'), + 'placeholder' => fn() => ElementHelper::linkAttributeHtml('#'), ], 'slug' => [ 'label' => Craft::t('app', 'Slug'), - 'placeholder' => Craft::t('app', 'Slug'), + 'placeholder' => fn() => Craft::t('app', 'Slug'), ], 'uri' => [ 'label' => Craft::t('app', 'URI'), - 'placeholder' => ElementHelper::uriAttributeHtml(Craft::t('app', 'link/to/something'), '#'), + 'placeholder' => fn() => ElementHelper::uriAttributeHtml(Craft::t('app', 'link/to/something'), '#'), ], ]); } @@ -1615,7 +1615,10 @@ public static function attributePreviewHtml(array $attribute): mixed { return match ($attribute['value']) { 'link', 'uri' => $attribute['placeholder'], - default => ElementHelper::attributeHtml($attribute['placeholder'] ?? $attribute['label']), + default => ElementHelper::attributeHtml(is_callable($attribute['placeholder'] ?? null) + ? $attribute['placeholder']() + : $attribute['placeholder'] ?? $attribute['label'] + ), }; } diff --git a/src/elements/Asset.php b/src/elements/Asset.php index f45b35702bf..e7e2a4a6738 100644 --- a/src/elements/Asset.php +++ b/src/elements/Asset.php @@ -665,45 +665,45 @@ protected static function defineCardAttributes(): array ], 'filename' => [ 'label' => Craft::t('app', 'Filename'), - 'placeholder' => Craft::t('app', 'placeholder') . '.png', + 'placeholder' => fn() => Craft::t('app', 'placeholder') . '.png', ], 'size' => [ 'label' => Craft::t('app', 'File Size'), - 'placeholder' => '2KB', + 'placeholder' => fn() => '2KB', ], 'kind' => [ 'label' => Craft::t('app', 'File Kind'), - 'placeholder' => Craft::t('app', 'Image'), + 'placeholder' => fn() => Craft::t('app', 'Image'), ], 'imageSize' => [ 'label' => Craft::t('app', 'Dimensions'), - 'placeholder' => '700x500', + 'placeholder' => fn() => '700x500', ], 'width' => [ 'label' => Craft::t('app', 'Image Width'), - 'placeholder' => '700px', + 'placeholder' => fn() => '700px', ], 'height' => [ 'label' => Craft::t('app', 'Image Height'), - 'placeholder' => '500px', + 'placeholder' => fn() => '500px', ], 'location' => [ 'label' => Craft::t('app', 'Location'), - 'placeholder' => Craft::t('app', 'Volume'), + 'placeholder' => fn() => Craft::t('app', 'Volume'), ], 'link' => [ 'label' => Craft::t('app', 'Link'), 'icon' => 'world', - 'placeholder' => ElementHelper::linkAttributeHtml(null), + 'placeholder' => fn() => ElementHelper::linkAttributeHtml(null), ], 'dateModified' => [ 'label' => Craft::t('app', 'File Modified Date'), - 'placeholder' => (new \DateTime())->sub(new \DateInterval('P14D')), + 'placeholder' => fn() => (new \DateTime())->sub(new \DateInterval('P14D')), ], 'uploader' => [ 'label' => Craft::t('app', 'Uploaded By'), - 'placeholder' => ($uploader = Craft::$app->getUser()->getIdentity()) ? Cp::elementChipHtml($uploader) : '', + 'placeholder' => fn() => ($uploader = Craft::$app->getUser()->getIdentity()) ? Cp::elementChipHtml($uploader) : '', ], ]); diff --git a/src/elements/Category.php b/src/elements/Category.php index a1276195f2f..bdfd1829625 100644 --- a/src/elements/Category.php +++ b/src/elements/Category.php @@ -344,7 +344,7 @@ protected static function defineCardAttributes(): array return array_merge(parent::defineCardAttributes(), [ 'parent' => [ 'label' => Craft::t('app', 'Parent'), - 'placeholder' => Html::tag( + 'placeholder' => fn() => Html::tag( 'span', Craft::t('app', 'Parent {type} Title', ['type' => self::displayName()]), ['class' => 'card-placeholder'], diff --git a/src/elements/Entry.php b/src/elements/Entry.php index 9a8b6100476..c68853b96a1 100644 --- a/src/elements/Entry.php +++ b/src/elements/Entry.php @@ -637,19 +637,19 @@ protected static function defineCardAttributes(): array $attributes = array_merge(parent::defineCardAttributes(), [ 'section' => [ 'label' => Craft::t('app', 'Section'), - 'placeholder' => Craft::t('app', 'Section'), + 'placeholder' => fn() => Craft::t('app', 'Section'), ], 'type' => [ 'label' => Craft::t('app', 'Entry Type'), - 'placeholder' => Craft::t('app', 'Entry Type'), + 'placeholder' => fn() => Craft::t('app', 'Entry Type'), ], 'authors' => [ 'label' => Craft::t('app', 'Authors'), - 'placeholder' => $currentUser ? Cp::elementChipHtml($currentUser) : '', + 'placeholder' => fn() => $currentUser ? Cp::elementChipHtml($currentUser) : '', ], 'parent' => [ 'label' => Craft::t('app', 'Parent'), - 'placeholder' => Html::tag( + 'placeholder' => fn() => Html::tag( 'span', Craft::t('app', 'Parent {type} Title', ['type' => self::displayName()]), ['class' => 'card-placeholder'], @@ -657,23 +657,23 @@ protected static function defineCardAttributes(): array ], 'postDate' => [ 'label' => Craft::t('app', 'Post Date'), - 'placeholder' => (new \DateTime())->sub(new \DateInterval('P15D')), + 'placeholder' => fn() => (new \DateTime())->sub(new \DateInterval('P15D')), ], 'expiryDate' => [ 'label' => Craft::t('app', 'Expiry Date'), - 'placeholder' => (new \DateTime())->add(new \DateInterval('P15D')), + 'placeholder' => fn() => (new \DateTime())->add(new \DateInterval('P15D')), ], 'revisionNotes' => [ 'label' => Craft::t('app', 'Revision Notes'), - 'placeholder' => Craft::t('app', 'Revision Notes'), + 'placeholder' => fn() => Craft::t('app', 'Revision Notes'), ], 'revisionCreator' => [ 'label' => Craft::t('app', 'Last Edited By'), - 'placeholder' => $currentUser ? Cp::elementChipHtml($currentUser) : '', + 'placeholder' => fn() => $currentUser ? Cp::elementChipHtml($currentUser) : '', ], 'drafts' => [ 'label' => Craft::t('app', 'Drafts'), - 'placeholder' => Html::tag( + 'placeholder' => fn() => Html::tag( 'span', Craft::t('app', 'Draft {num}', ['num' => 1]), ['class' => 'card-placeholder'], diff --git a/src/elements/User.php b/src/elements/User.php index 4e3f3c8e988..0806c3a982c 100644 --- a/src/elements/User.php +++ b/src/elements/User.php @@ -511,39 +511,39 @@ protected static function defineCardAttributes(): array return array_merge(parent::defineCardAttributes(), [ 'email' => [ 'label' => Craft::t('app', 'Email'), - 'placeholder' => 'test@example.com', + 'placeholder' => fn() => 'test@example.com', ], 'username' => [ 'label' => Craft::t('app', 'Username'), - 'placeholder' => Craft::t('app', 'Username'), + 'placeholder' => fn() => Craft::t('app', 'Username'), ], 'firstName' => [ 'label' => Craft::t('app', 'First Name'), - 'placeholder' => Craft::t('app', 'First Name'), + 'placeholder' => fn() => Craft::t('app', 'First Name'), ], 'lastName' => [ 'label' => Craft::t('app', 'Last Name'), - 'placeholder' => Craft::t('app', 'Last Name'), + 'placeholder' => fn() => Craft::t('app', 'Last Name'), ], 'groups' => [ 'label' => Craft::t('app', 'Groups'), - 'placeholder' => Craft::t('app', 'Group Name'), + 'placeholder' => fn() => Craft::t('app', 'Group Name'), ], 'affiliatedSite' => [ 'label' => Craft::t('app', 'Affiliated Site'), - 'placeholder' => Craft::t('app', 'Site Name'), + 'placeholder' => fn() => Craft::t('app', 'Site Name'), ], 'preferredLanguage' => [ 'label' => Craft::t('app', 'Preferred Language'), - 'placeholder' => $i18n->getLocaleById('en')->getDisplayName(Craft::$app->language), + 'placeholder' => fn() => $i18n->getLocaleById('en')->getDisplayName(Craft::$app->language), ], 'preferredLocale' => [ 'label' => Craft::t('app', 'Preferred Locale'), - 'placeholder' => $i18n->getLocaleById('en-US')->getDisplayName(Craft::$app->language), + 'placeholder' => fn() => $i18n->getLocaleById('en-US')->getDisplayName(Craft::$app->language), ], 'isCredentialed' => [ 'label' => Craft::t('app', 'Credentialed'), - 'placeholder' => Template::raw(Cp::statusLabelHtml([ + 'placeholder' => fn() => Template::raw(Cp::statusLabelHtml([ 'color' => Color::Teal, 'label' => Craft::t('app', 'Credentialed'), 'icon' => 'check', @@ -551,7 +551,7 @@ protected static function defineCardAttributes(): array ], 'lastLoginDate' => [ 'label' => Craft::t('app', 'Last Login'), - 'placeholder' => (new \DateTime())->sub(new \DateInterval('P14D')), + 'placeholder' => fn() => (new \DateTime())->sub(new \DateInterval('P14D')), ], ]); } diff --git a/src/helpers/Cp.php b/src/helpers/Cp.php index b89dadf2520..5014dd4d4ee 100644 --- a/src/helpers/Cp.php +++ b/src/helpers/Cp.php @@ -2651,7 +2651,11 @@ public static function cardPreviewHtml(FieldLayout $fieldLayout, array $cardElem } elseif ($cardElement instanceof BaseField) { $previewHtml .= Html::tag('div', $cardElement->previewPlaceholderHtml(null, null)); } else { - $previewHtml .= Html::tag('div', $elementType::attributePreviewHtml($cardElement)); + $html = $elementType::attributePreviewHtml($cardElement); + if (is_callable($html)) { + $html = $html(); + } + $previewHtml .= Html::tag('div', $html); } }