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