diff --git a/administrator/components/com_admin/sql/updates/mysql/6.0.0-2025-09-23.sql b/administrator/components/com_admin/sql/updates/mysql/6.0.0-2025-09-23.sql
new file mode 100644
index 0000000000000..6e81551f3530f
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/mysql/6.0.0-2025-09-23.sql
@@ -0,0 +1,3 @@
+UPDATE `#__update_sites`
+ SET `location` = 'https://update.joomla.org/language/translationlist_6.xml'
+ WHERE `location` = 'https://update.joomla.org/language/translationlist_5.xml';
diff --git a/administrator/components/com_admin/sql/updates/mysql/6.0.0-2025-09-26.sql b/administrator/components/com_admin/sql/updates/mysql/6.0.0-2025-09-26.sql
new file mode 100644
index 0000000000000..9ab43e38ab2b2
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/mysql/6.0.0-2025-09-26.sql
@@ -0,0 +1,32 @@
+-- Update content types for lookup tags
+
+UPDATE `#__content_types`
+SET `content_history_options` = JSON_ARRAY_APPEND(
+ `content_history_options`,
+ '$.displayLookup',
+ JSON_OBJECT(
+ 'sourceColumn', 'tags',
+ 'targetTable', '#__tags',
+ 'targetColumn', 'id',
+ 'displayColumn', 'title'
+ )
+ )
+WHERE `type_alias` IN (
+ 'com_content.article',
+ 'com_contact.contact',
+ 'com_newsfeeds.newsfeed',
+ 'com_content.category',
+ 'com_contact.category',
+ 'com_newsfeeds.category',
+ 'com_banners.category',
+ 'com_users.category'
+ )
+AND NOT JSON_CONTAINS(
+ JSON_EXTRACT(`content_history_options`, '$.displayLookup'),
+ JSON_OBJECT(
+ 'sourceColumn', 'tags',
+ 'targetTable', '#__tags',
+ 'targetColumn', 'id',
+ 'displayColumn', 'title'
+ )
+ );
diff --git a/administrator/components/com_admin/sql/updates/mysql/6.0.0-2025-10-11.sql b/administrator/components/com_admin/sql/updates/mysql/6.0.0-2025-10-11.sql
new file mode 100644
index 0000000000000..18fbe9aaa21a6
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/mysql/6.0.0-2025-10-11.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `#__history`
+ ADD COLUMN `is_current` TINYINT NOT NULL DEFAULT 0 /** CAN FAIL **/;
+ALTER TABLE `#__history`
+ ADD COLUMN `is_legacy` TINYINT NOT NULL DEFAULT 0 /** CAN FAIL **/;
+UPDATE `#__history` SET `is_legacy` = 1;
diff --git a/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-09-23.sql b/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-09-23.sql
new file mode 100644
index 0000000000000..d7f5708ce800c
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-09-23.sql
@@ -0,0 +1,3 @@
+UPDATE "#__update_sites"
+ SET "location" = 'https://update.joomla.org/language/translationlist_6.xml'
+ WHERE "location" = 'https://update.joomla.org/language/translationlist_5.xml';
diff --git a/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-09-26.sql b/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-09-26.sql
new file mode 100644
index 0000000000000..5f91914aa269c
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-09-26.sql
@@ -0,0 +1,33 @@
+-- Update content types for lookup tags
+
+UPDATE "#__content_types"
+SET "content_history_options" = jsonb_set(
+ "content_history_options"::jsonb,
+ '{displayLookup}',
+ "content_history_options"::jsonb->'displayLookup' ||
+ jsonb_build_object(
+ 'sourceColumn', 'tags',
+ 'targetTable', '#__tags',
+ 'targetColumn', 'id',
+ 'displayColumn', 'title'
+ )
+ )
+WHERE "type_alias" IN (
+ 'com_content.article',
+ 'com_contact.contact',
+ 'com_newsfeeds.newsfeed',
+ 'com_content.category',
+ 'com_contact.category',
+ 'com_newsfeeds.category',
+ 'com_banners.category',
+ 'com_users.category'
+ )
+AND NOT EXISTS (
+ SELECT * FROM jsonb_array_elements("content_history_options"::jsonb->'displayLookup')
+ WHERE value = jsonb_build_object(
+ 'sourceColumn', 'tags',
+ 'targetTable', '#__tags',
+ 'targetColumn', 'id',
+ 'displayColumn', 'title'
+ )
+ );
diff --git a/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-10-10.sql b/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-10-10.sql
new file mode 100644
index 0000000000000..c416183248cde
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-10-10.sql
@@ -0,0 +1,2 @@
+-- Remove wrong unique constraint from "#__ucm_content" table
+ALTER TABLE "#__ucm_content" DROP CONSTRAINT "#__ucm_content_idx_type_alias_item_id" /** CAN FAIL **/;
diff --git a/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-10-11.sql b/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-10-11.sql
new file mode 100644
index 0000000000000..db3fae581c1e6
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/postgresql/6.0.0-2025-10-11.sql
@@ -0,0 +1,5 @@
+ALTER TABLE "#__history"
+ ADD COLUMN "is_current" SMALLINT NOT NULL DEFAULT 0 /** CAN FAIL **/;
+ALTER TABLE "#__history"
+ ADD COLUMN "is_legacy" SMALLINT NOT NULL DEFAULT 0 /** CAN FAIL **/;
+UPDATE "#__history" SET "is_legacy" = 1;
diff --git a/administrator/components/com_banners/src/Table/BannerTable.php b/administrator/components/com_banners/src/Table/BannerTable.php
index b49d8de2353be..cbf5998929fea 100644
--- a/administrator/components/com_banners/src/Table/BannerTable.php
+++ b/administrator/components/com_banners/src/Table/BannerTable.php
@@ -15,7 +15,6 @@
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;
-use Joomla\CMS\Versioning\VersionableTableInterface;
use Joomla\Database\DatabaseInterface;
use Joomla\Database\ParameterType;
use Joomla\Event\DispatcherInterface;
@@ -31,7 +30,7 @@
*
* @since 1.5
*/
-class BannerTable extends Table implements VersionableTableInterface
+class BannerTable extends Table
{
/**
* Indicates that columns fully support the NULL value in the database
diff --git a/administrator/components/com_categories/src/Model/CategoryModel.php b/administrator/components/com_categories/src/Model/CategoryModel.php
index e807520e96303..ec48c2cae5781 100644
--- a/administrator/components/com_categories/src/Model/CategoryModel.php
+++ b/administrator/components/com_categories/src/Model/CategoryModel.php
@@ -710,6 +710,12 @@ public function save($data)
$this->setState($this->getName() . '.id', $table->id);
+ /**
+ * Save the version history. We need to call saveHistory method manually because category model does not
+ * call parent::save()
+ */
+ $this->saveHistory($data, $this->typeAlias);
+
if (Factory::getApplication()->getInput()->get('task') == 'editAssociations') {
return $this->redirectToAssociations($data);
}
diff --git a/administrator/components/com_contact/src/Table/ContactTable.php b/administrator/components/com_contact/src/Table/ContactTable.php
index f3b369cdd92d5..c5d1d9c397420 100644
--- a/administrator/components/com_contact/src/Table/ContactTable.php
+++ b/administrator/components/com_contact/src/Table/ContactTable.php
@@ -20,7 +20,6 @@
use Joomla\CMS\Tag\TaggableTableTrait;
use Joomla\CMS\User\CurrentUserInterface;
use Joomla\CMS\User\CurrentUserTrait;
-use Joomla\CMS\Versioning\VersionableTableInterface;
use Joomla\Database\DatabaseInterface;
use Joomla\Event\DispatcherInterface;
use Joomla\String\StringHelper;
@@ -34,7 +33,7 @@
*
* @since 1.0
*/
-class ContactTable extends Table implements VersionableTableInterface, TaggableTableInterface, CurrentUserInterface
+class ContactTable extends Table implements TaggableTableInterface, CurrentUserInterface
{
use TaggableTableTrait;
use CurrentUserTrait;
diff --git a/administrator/components/com_contenthistory/src/Model/HistoryModel.php b/administrator/components/com_contenthistory/src/Model/HistoryModel.php
index 6de7590725b77..60ef3d2c3a905 100644
--- a/administrator/components/com_contenthistory/src/Model/HistoryModel.php
+++ b/administrator/components/com_contenthistory/src/Model/HistoryModel.php
@@ -21,7 +21,6 @@
use Joomla\CMS\Table\ContentHistory;
use Joomla\CMS\Table\ContentType;
use Joomla\CMS\Table\Table;
-use Joomla\CMS\Versioning\VersionableModelInterface;
use Joomla\Database\ParameterType;
use Joomla\Database\QueryInterface;
@@ -306,7 +305,6 @@ protected function populateState($ordering = 'h.save_date', $direction = 'DESC')
$itemId = $input->get('item_id', '', 'string');
$this->setState('item_id', $itemId);
- $this->setState('sha1_hash', $this->getSha1Hash());
// Load the parameters.
$params = ComponentHelper::getParams('com_contenthistory');
@@ -344,6 +342,7 @@ protected function getListQuery()
$db->quoteName('h.sha1_hash'),
$db->quoteName('h.version_data'),
$db->quoteName('h.keep_forever'),
+ $db->quoteName('h.is_current'),
]
)
)
@@ -374,25 +373,27 @@ protected function getListQuery()
*
* @since 3.2
*/
- protected function getSha1Hash()
+ public function getSha1Hash()
{
- $result = false;
- $item_id = Factory::getApplication()->getInput()->getCmd('item_id', '');
-
- [$extension, $type, $id] = explode('.', $item_id);
-
- $app = Factory::getApplication();
-
- $model = $app->bootComponent($extension)->getMVCFactory()->createModel($type, 'Administrator');
+ /**
+ * From Joomla 6, we use is_current field to determine the current version, so no need to calculate sha1 hash
+ * if there is already a current version
+ */
- if ($model instanceof VersionableModelInterface) {
- $item = $model->getItem($id);
- $result = $model->getSha1($item);
+ $items = $this->getItems();
- return $result;
+ foreach ($items as $item) {
+ if ($item->is_current == 1) {
+ return $item->sha1_hash;
+ }
}
// Legacy code for history concept before 6.0.0, deprecated 6.0.0 will be removed with 8.0.0
+ $result = false;
+ $item_id = $this->state->get('item_id', '');
+
+ [$extension, $type, $id] = explode('.', $item_id);
+
Table::addIncludePath(JPATH_ADMINISTRATOR . '/components/' . $extension . '/tables');
$typeTable = $this->getTable('ContentType');
$typeTable->load(['type_alias' => $extension . '.' . $type]);
diff --git a/administrator/components/com_contenthistory/src/View/History/HtmlView.php b/administrator/components/com_contenthistory/src/View/History/HtmlView.php
index 9167863588c04..2c29e9ee77b9d 100644
--- a/administrator/components/com_contenthistory/src/View/History/HtmlView.php
+++ b/administrator/components/com_contenthistory/src/View/History/HtmlView.php
@@ -59,6 +59,13 @@ class HtmlView extends BaseHtmlView
*/
protected $toolbar;
+ /**
+ * The SHA1 hash of the current version of the item being viewed
+ *
+ * @var string
+ */
+ protected $currentVersionHash;
+
/**
* Method to display the view.
*
@@ -74,9 +81,10 @@ public function display($tpl = null)
$model = $this->getModel();
$model->setUseExceptions(true);
- $this->state = $model->getState();
- $this->items = $model->getItems();
- $this->pagination = $model->getPagination();
+ $this->state = $model->getState();
+ $this->items = $model->getItems();
+ $this->pagination = $model->getPagination();
+ $this->currentVersionHash = $model->getSha1Hash();
$this->toolbar = $this->addToolbar();
diff --git a/administrator/components/com_contenthistory/tmpl/compare/compare.php b/administrator/components/com_contenthistory/tmpl/compare/compare.php
index 1498cf2edf02b..fd9812febac91 100644
--- a/administrator/components/com_contenthistory/tmpl/compare/compare.php
+++ b/administrator/components/com_contenthistory/tmpl/compare/compare.php
@@ -68,8 +68,8 @@
-
-
+
+
@@ -79,8 +79,8 @@
|
-
-
+
+
diff --git a/administrator/components/com_contenthistory/tmpl/history/modal.php b/administrator/components/com_contenthistory/tmpl/history/modal.php
index 759607d4cbfd9..64d90c2502168 100644
--- a/administrator/components/com_contenthistory/tmpl/history/modal.php
+++ b/administrator/components/com_contenthistory/tmpl/history/modal.php
@@ -19,7 +19,7 @@
Session::checkToken('get') or die(Text::_('JINVALID_TOKEN'));
-$hash = $this->state->get('sha1_hash');
+$hash = $this->currentVersionHash;
$formUrl = 'index.php?option=com_contenthistory&view=history&layout=modal&tmpl=component&item_id=' . $this->state->get('item_id') . '&' . Session::getFormToken() . '=1';
Text::script('COM_CONTENTHISTORY_BUTTON_SELECT_ONE_VERSION', true);
diff --git a/administrator/components/com_installer/src/Model/LanguagesModel.php b/administrator/components/com_installer/src/Model/LanguagesModel.php
index 2c39a64831aba..039414a0633b2 100644
--- a/administrator/components/com_installer/src/Model/LanguagesModel.php
+++ b/administrator/components/com_installer/src/Model/LanguagesModel.php
@@ -131,7 +131,7 @@ protected function getLanguages()
if (empty($updateSite)) {
Factory::getApplication()->enqueueMessage(Text::_('COM_INSTALLER_MSG_WARNING_NO_LANGUAGES_UPDATESERVER'), 'warning');
- return;
+ return [];
}
try {
@@ -143,7 +143,7 @@ protected function getLanguages()
if ($response === null || $response->getStatusCode() !== 200) {
Factory::getApplication()->enqueueMessage(Text::sprintf('COM_INSTALLER_MSG_ERROR_CANT_CONNECT_TO_UPDATESERVER', $updateSite), 'error');
- return;
+ return [];
}
$updateSiteXML = simplexml_load_string((string) $response->getBody());
@@ -151,7 +151,7 @@ protected function getLanguages()
if (!$updateSiteXML) {
Factory::getApplication()->enqueueMessage(Text::sprintf('COM_INSTALLER_MSG_ERROR_CANT_RETRIEVE_XML', $updateSite), 'error');
- return;
+ return [];
}
$languages = [];
diff --git a/administrator/components/com_tags/src/Model/TagModel.php b/administrator/components/com_tags/src/Model/TagModel.php
index b4e1901670743..f28ed83631870 100644
--- a/administrator/components/com_tags/src/Model/TagModel.php
+++ b/administrator/components/com_tags/src/Model/TagModel.php
@@ -15,6 +15,7 @@
use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Model\AdminModel;
use Joomla\CMS\Plugin\PluginHelper;
+use Joomla\CMS\Versioning\VersionableModelInterface;
use Joomla\CMS\Versioning\VersionableModelTrait;
use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
@@ -28,7 +29,7 @@
*
* @since 3.1
*/
-class TagModel extends AdminModel
+class TagModel extends AdminModel implements VersionableModelInterface
{
use VersionableModelTrait;
@@ -307,6 +308,9 @@ public function save($data)
$this->setState($this->getName() . '.id', $table->id);
$this->setState($this->getName() . '.new', $isNew);
+ // Save version history.
+ $this->saveHistory($data, $context);
+
// Clear the cache
$this->cleanCache();
diff --git a/administrator/components/com_tags/src/Table/TagTable.php b/administrator/components/com_tags/src/Table/TagTable.php
index d130fc92cc0b4..307e0a647c4ac 100644
--- a/administrator/components/com_tags/src/Table/TagTable.php
+++ b/administrator/components/com_tags/src/Table/TagTable.php
@@ -17,7 +17,6 @@
use Joomla\CMS\Table\Nested;
use Joomla\CMS\User\CurrentUserInterface;
use Joomla\CMS\User\CurrentUserTrait;
-use Joomla\CMS\Versioning\VersionableTableInterface;
use Joomla\Database\DatabaseInterface;
use Joomla\Event\DispatcherInterface;
use Joomla\String\StringHelper;
@@ -31,7 +30,7 @@
*
* @since 3.1
*/
-class TagTable extends Nested implements VersionableTableInterface, CurrentUserInterface
+class TagTable extends Nested implements CurrentUserInterface
{
use CurrentUserTrait;
diff --git a/administrator/language/en-GB/com_cpanel.ini b/administrator/language/en-GB/com_cpanel.ini
index 819dc30fd0f70..7d591c800bd23 100644
--- a/administrator/language/en-GB/com_cpanel.ini
+++ b/administrator/language/en-GB/com_cpanel.ini
@@ -30,6 +30,6 @@ COM_CPANEL_MSG_TEXTFILTER3919_TITLE="Updated Text Filter Recommendations"
COM_CPANEL_TITLE_SYSTEM_PANEL="System Panel"
COM_CPANEL_UNPUBLISH_MODULE_ERROR="Error unpublishing the module"
COM_CPANEL_UNPUBLISH_MODULE_SUCCESS="Module unpublished"
-COM_CPANEL_WELCOME_BEGINNERS_MESSAGE=" Community resources are available for new users. "
+COM_CPANEL_WELCOME_BEGINNERS_MESSAGE="Community resources are available for new users. "
COM_CPANEL_WELCOME_BEGINNERS_TITLE="Welcome to Joomla!"
COM_CPANEL_XML_DESCRIPTION="Home Dashboard component"
diff --git a/build/media_source/com_guidedtours/images/6_0/cassiopeiacolors.jpg b/build/media_source/com_guidedtours/images/6_0/cassiopeiacolors.jpg
index e1c78019c0142..ddb7a775e9854 100644
Binary files a/build/media_source/com_guidedtours/images/6_0/cassiopeiacolors.jpg and b/build/media_source/com_guidedtours/images/6_0/cassiopeiacolors.jpg differ
diff --git a/build/media_source/system/js/fields/joomla-field-fancy-select.w-c.es6.js b/build/media_source/system/js/fields/joomla-field-fancy-select.w-c.es6.js
index 1fef73f1530fb..36973a9b0aff2 100644
--- a/build/media_source/system/js/fields/joomla-field-fancy-select.w-c.es6.js
+++ b/build/media_source/system/js/fields/joomla-field-fancy-select.w-c.es6.js
@@ -111,15 +111,6 @@ window.customElements.define('joomla-field-fancy-select', class extends HTMLElem
this.isDisconnected = false;
- // Add placeholder option for multiple mode,
- // Because it not supported as parameter by Choices for |