diff --git a/CHANGELOG.md b/CHANGELOG.md index a9c9eb5e9..bc2d25ce5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ -# v5.1.1-alpha4 +# v5.1.1-alpha5 -- Add all needed Powers to the release package, to speed-up the build of the demo component. +- Refactor initialization flow to accommodate future scalability and integration with all designated areas. +- Refactor the Creator Builders class. +- Refactor the FieldString and FieldXML classes. # v5.1.1-alpha @@ -14,7 +16,8 @@ - Adds new country related tables and fields to the Demo Component. - Resolves the Database Updating issue in the compiler. #1212,#1209 - Adds the Component Commands Plugin to the CLI for Import of spreadsheet data-sets. -- Add edit and create options to the ModalSelect Field (in Joomla 5) +- Add edit and create options to the ModalSelect Field (in Joomla 5) +- Add all needed Powers to the release package, to speed-up the build of the demo component. # v5.1.0 diff --git a/ComponentbuilderInstallerScript.php b/ComponentbuilderInstallerScript.php index 1857256c0..280cb1605 100644 --- a/ComponentbuilderInstallerScript.php +++ b/ComponentbuilderInstallerScript.php @@ -1516,7 +1516,7 @@ class Com_ComponentbuilderInstallerScript implements InstallerScriptInterface // Fix the assets table rules column size. - $this->setDatabaseAssetsRulesFix(95520, "MEDIUMTEXT"); + $this->setDatabaseAssetsRulesFix(98560, "MEDIUMTEXT"); // Install the global extension params. $this->setExtensionsParams( '{"autorName":"Llewellyn van der Merwe","autorEmail":"joomla@vdm.io","subform_layouts":{"subform_layouts0":{"view_field":"default","layout":"repeatablejcbjfive"}},"editor":"none","manage_jcb_package_directories":"2","set_browser_storage":"1","storage_time_to_live":"global","super_powers_documentation":"0","powers_repository":"0","super_powers_repositories":"0","builder_gif_size":"480-272","compiler_plugin":["componentbuilderactionlogcompiler","componentbuilderfieldorderingcompiler","componentbuilderheaderscompiler","componentbuilderpowersautoloadercompiler","componentbuilderprivacycompiler"],"add_menu_prefix":"1","menu_prefix":"»","namespace_prefix":"JCB","minify":"0","language":"en-GB","percentagelanguageadd":"30","assets_table_fix":"2","compiler_field_builder_type":"2","field_name_builder":"2","type_name_builder":"2","import_guid_only":"1","export_language_strings":"1","cronjob_backup_type":"1","cronjob_backup_server":"0","backup_package_name":"JCB_Backup_[YEAR]_[MONTH]_[DAY]","export_company":"Vast Development Method","export_owner":"Llewellyn van der Merwe","export_email":"joomla@vdm.io","export_website":"https://dev.vdm.io/","export_license":"GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html","export_copyright":"Copyright (C) 2015. All Rights Reserved","check_in":"-1 day","save_history":"1","history_limit":"10","add_jquery_framework":"1","uikit_load":"1","uikit_min":"","uikit_style":""}' @@ -3292,7 +3292,7 @@ class Com_ComponentbuilderInstallerScript implements InstallerScriptInterface echo '
-

Upgrade to Version 5.1.1-alpha4 Was Successful! Let us know if anything is not working as expected.

'; +

Upgrade to Version 5.1.1-alpha5 Was Successful! Let us know if anything is not working as expected.

'; // Add/Update component in the action logs extensions table. $this->setActionLogsExtensions(); diff --git a/README.md b/README.md index 784bb8dac..69d386ceb 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ The Component Builder for [Joomla](https://extensions.joomla.org/extension/compo Whether you're a seasoned [Joomla](https://extensions.joomla.org/extension/component-builder/) developer, or have just started, Component Builder will save you lots of time and money. A real must have! -You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (5.1.1-alpha4) with **ALL** its features and **ALL** concepts totally open-source and free! +You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (5.1.1-alpha5) with **ALL** its features and **ALL** concepts totally open-source and free! > Watch Quick Build of a Hello World component in [JCB on Youtube](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45) @@ -144,14 +144,14 @@ TODO + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 30th March, 2025 -+ *Version*: 5.1.1-alpha4 ++ *Last Build*: 13th May, 2025 ++ *Version*: 5.1.1-alpha5 + *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved. + *License*: GNU General Public License version 2 or later; see LICENSE.txt -+ *Line count*: **979081** -+ *Field count*: **2098** -+ *File count*: **6625** -+ *Folder count*: **645** ++ *Line count*: **1032893** ++ *Field count*: **2099** ++ *File count*: **7002** ++ *Folder count*: **678** > This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com). > Developed by [Llewellyn van der Merwe](mailto:joomla@vdm.io) diff --git a/admin/README.txt b/admin/README.txt index 784bb8dac..69d386ceb 100644 --- a/admin/README.txt +++ b/admin/README.txt @@ -9,7 +9,7 @@ The Component Builder for [Joomla](https://extensions.joomla.org/extension/compo Whether you're a seasoned [Joomla](https://extensions.joomla.org/extension/component-builder/) developer, or have just started, Component Builder will save you lots of time and money. A real must have! -You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (5.1.1-alpha4) with **ALL** its features and **ALL** concepts totally open-source and free! +You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (5.1.1-alpha5) with **ALL** its features and **ALL** concepts totally open-source and free! > Watch Quick Build of a Hello World component in [JCB on Youtube](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45) @@ -144,14 +144,14 @@ TODO + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 30th March, 2025 -+ *Version*: 5.1.1-alpha4 ++ *Last Build*: 13th May, 2025 ++ *Version*: 5.1.1-alpha5 + *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved. + *License*: GNU General Public License version 2 or later; see LICENSE.txt -+ *Line count*: **979081** -+ *Field count*: **2098** -+ *File count*: **6625** -+ *Folder count*: **645** ++ *Line count*: **1032893** ++ *Field count*: **2099** ++ *File count*: **7002** ++ *Folder count*: **678** > This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com). > Developed by [Llewellyn van der Merwe](mailto:joomla@vdm.io) diff --git a/admin/access.xml b/admin/access.xml index ae3451105..5c4881b40 100644 --- a/admin/access.xml +++ b/admin/access.xml @@ -13,6 +13,9 @@ + + + @@ -230,13 +233,17 @@ - + + + - + + + @@ -249,6 +256,9 @@ + + + @@ -260,6 +270,9 @@ + + + @@ -284,13 +297,6 @@ - - - - - - - @@ -302,6 +308,9 @@ + + + @@ -419,7 +428,9 @@ - + + + @@ -455,7 +466,9 @@ - + + + @@ -497,6 +510,7 @@ + @@ -509,14 +523,17 @@ - + + + - - + + + @@ -530,7 +547,9 @@ - + + + diff --git a/admin/assets/css/get_snippets.css b/admin/assets/css/initialization_selection.css similarity index 68% rename from admin/assets/css/get_snippets.css rename to admin/assets/css/initialization_selection.css index 2731fc5aa..4ac292920 100644 --- a/admin/assets/css/get_snippets.css +++ b/admin/assets/css/initialization_selection.css @@ -10,4 +10,14 @@ /* CSS Document */ - +html.dark .no-select, +html.dark .no-select td { + color: #515151; + cursor: not-allowed; +} + +html.light .no-select, +html.light .no-select td { + color: #999; + cursor: not-allowed; +} diff --git a/admin/assets/images/import.gif b/admin/assets/images/import.gif deleted file mode 100644 index 10bcb8569..000000000 Binary files a/admin/assets/images/import.gif and /dev/null differ diff --git a/admin/assets/js/get_snippets.js b/admin/assets/js/get_snippets.js deleted file mode 100644 index a810ae982..000000000 --- a/admin/assets/js/get_snippets.js +++ /dev/null @@ -1,540 +0,0 @@ -/** - * @package Joomla.Component.Builder - * - * @created 30th April, 2015 - * @author Llewellyn van der Merwe - * @git Joomla Component Builder - * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. - * @license GNU General Public License version 2 or later; see LICENSE.txt - */ - -/* JS Document */ - -// start the moment the document is ready -jQuery(document).ready(function () { - // just get the available libraries - getLibraries(snippetsPath); -}); - -// add an ajax call tracker -var ajaxcall = null; -var fromLocal = false; - -jQuery(document).ready(function(){ - jQuery('body').on('click','.getreaction',function(){ - // Ajax request - var btn = jQuery(this); - btn.prop('disabled', true); - setTimeout(function(){ - btn.prop('disabled', false); - }, 3000); - var type = btn.data('type'); - if ('getLibraries' === type) { - getLibraries(snippetsPath); - } else if ('getSnippets' === type) { - var name = btn.data('name'); - getSnippets(snippetsPath, name); - } else if ('all' === type) { - var status = btn.data('status'); - bulkSnippetGithub(status); - } else if ('bulk' === type) { - checkBulkSnippetGithub(); - } else if ('get' === type) { - var path = btn.data('path'); - var status = btn.data('status'); - setSnippetGithub(path, status); - } else { - var path = btn.data('path'); - getSnippetModal(path, type); - } - }); -}); - -// load every thing once ready -jQuery(document).ajaxStop(function () { - if (0 === jQuery.active) { - //do something special - if ('snippets' === ajaxcall) { - setTimeout( function() { - jQuery('#snippets-github').html('

'+Joomla.JText._('COM_COMPONENTBUILDER_JCB_COMMUNITY_SNIPPETS')+'

'); - jQuery('#snippets-display').show(); - jQuery('#snippets-grid').trigger('display.uk.check'); - jQuery('#loading').hide(); - }, 1000); - } - } -}); - -// get the libraries -function getLibraries(path) { - var _paths = jQuery.jStorage.get('JCB-Snippets-Paths', null); - // always hide the snippets display - jQuery('#snippets-display').hide(); - // always reset the grid - jQuery('#libraries-grid').html(''); - // set the ajax scope - ajaxcall = 'libraries'; - if (_paths) { - buildLibraries(_paths); - } else { - jQuery.get(path) - .done(function(paths) { - // load only this library paths - jQuery.jStorage.set('JCB-Snippets-Paths', paths, {TTL: expire}); - buildLibraries(paths); - }) - .error(function(jqXHR, textStatus, errorThrown) { - jQuery('#snippets-github').html(returnError); - }); - } -} - -// build the ibraries object -function buildLibraries(paths) { - var _temp = jQuery.jStorage.get('JCB-Libraries', null); - if (_temp) { - setLibraries(_temp); - } else { - var temp = {}; - jQuery.each(paths.tree, function(key,value) { - if (value.path.match(".json$")) { - var libraryName = value.path.split(/ -(.+)/)[0]; - libraryName = libraryName.trim() - temp[libraryName] = libraryName; - } - }); - // load only this library paths - jQuery.jStorage.set('JCB-Libraries', temp, {TTL: expire}); - setLibraries(temp); - } -} - -// set the libraries -function setLibraries(names) { - // now load the library buttons - jQuery.each(names, function(value) { - setLibrary(value); - }); - setTimeout( function() { - jQuery('#snippets-github').html('

'+Joomla.JText._('COM_COMPONENTBUILDER_AVAILABLE_LIBRARIES')+'

'); - jQuery('#libraries-display').show(); - jQuery('#libraries-grid').trigger('display.uk.check'); - }, 1000); -} - -// set the snippets -function setLibrary(name) { - // get useful ID - var keyID = getKeyID(name); - // build the library display - var html = '
'; - html += '
'; - html += '

' + name + '

'; - html += '
'; - // set the data buttons - html += setLibraryButtons(name); - // close the box panel - html += '
'; - html += '
'; - // now we have the library - jQuery('#libraries-grid').append(html); -} - -function setLibraryButtons(name) { - return ''; -} - -// get the snippets -function getSnippets(path, libraryName) { - jQuery('#loading').show(); - // get local values if set - var _paths = jQuery.jStorage.get('JCB-Snippets-Paths', null); - // always reset the grid - jQuery('#snippets-grid').html(''); - // always hide libraries - jQuery('#libraries-display').hide(); - // set the ajax scope - ajaxcall = 'snippets'; - fromLocal = false; - if (_paths) { - setSnippets(_paths, libraryName); - jQuery('#snippets-github').html('

'+Joomla.JText._('COM_COMPONENTBUILDER_JCB_COMMUNITY_SNIPPETS')+'

'); - } else { - jQuery.get(path) - .done(function(paths) { - // load only this library paths - jQuery.jStorage.set('JCB-Snippets-Paths', paths, {TTL: expire}); - setSnippets(paths, libraryName); - }) - .error(function(jqXHR, textStatus, errorThrown) { - jQuery('#snippets-github').html(returnError); - }); - } - // only use if loading localy - if (fromLocal) { - jQuery('#snippets-display').show(); - jQuery('#snippets-grid').trigger('display.uk.check'); - jQuery('#loading').hide(); - } -} - -// set the snippets -function setSnippets(paths, libraryName) { - // set the ajax scope - ajaxcall = 'snippets'; - jQuery.each(paths.tree, function(key,value) { - if (value.path.match(".json$") && value.path.match("^"+libraryName)) { - var _snippet = jQuery.jStorage.get(value.path, null); - if (_snippet) { - setSnippet(_snippet, value.path); - fromLocal = true; - } else { - jQuery.get(snippetPath+value.path) - .done(function(snippet) { - // convert the string to json.object - snippet = jQuery.parseJSON(snippet); - jQuery.jStorage.set(value.path, snippet, {TTL: expire}); - setSnippet(snippet, value.path); - }) - .error(function(jqXHR, textStatus, errorThrown) { - // we could do more - }); - } - } - }); -} - -// set the snippets -function setSnippet(snippet, key) { - // get useful ID - var keyID = getKeyID(key); - // get the status - var status = getSnippetStatus(snippet, key); - // add to bulk updater - if ('equal' !== status) { - bulkItems[status].push(key); - } - // build the snippet display - var html = '
'; - html += '
'; - html += '
'; - html += '

' + snippet.library+ ' - (' + snippet.type + ') ' + snippet.name + '

'; - html += snippet.heading + '
'; - // set the data buttons - html += setDataButtons(snippet, key, status); - // set the snippet ref button - html += setRefButtons(snippet, key, status, keyID); - // set the contributor buttons - html += setContributorButtons(snippet, key); - // close the box panel - html += '
'; - html += '
'; - // now we have the snippet - jQuery('#snippets-grid').append(html); -} - -// set the snippet status -function getSnippetStatus(snippet, key) { - // check if JCB already has this snippet - if(local_snippets.hasOwnProperty(key)){ - // first get local time stamp - var local_created = strtotime(local_snippets[key].created); - var local_modified = strtotime(local_snippets[key].modified); - // now get github time stamps - var created = strtotime(snippet.created); - var modified = strtotime(snippet.modified); - // work out the status - if (local_created == created) { - if (local_modified == modified) { - return 'equal'; - } else if (local_modified > modified) { - return 'ahead'; - } else if (local_modified < modified) { - return 'behind'; - } - } - return 'diverged'; - } - return 'new'; -} - -function setDataButtons(snippet, key, status) { - var html = '
'; - html += ''; - html += ''; - html += ''; - html += '
'; - // return data buttons - return html; -} - -function setRefButtons(snippet, key, status, keyID) { - var html = ''; - // set the update button - html += '
'; - if ('equal' !== status) { - if ('new' === status) { - var tooltip = Joomla.JText._('COM_COMPONENTBUILDER_GET_THE_SNIPPET_FROM_GITHUB_AND_INSTALL_IT_LOCALLY'); - } else { - var tooltip = Joomla.JText._('COM_COMPONENTBUILDER_GET_THE_SNIPPET_FROM_GITHUB_AND_UPDATE_THE_LOCAL_VERSION'); - } - html += ''; - } else { - html += ''; - } - html += '
'; - // return data buttons - return html; -} - -function setContributorButtons(snippet, key) { - // set the contributor name - if (snippet.contributor_company) { - var contributor_name = snippet.contributor_company; - } else if (snippet.contributor_name) { - var contributor_name = snippet.contributor_name; - } else { - var contributor_name = Joomla.JText._('COM_COMPONENTBUILDER_JCB_COMMUNITY'); - } - // set the contributor url - if (snippet.contributor_website) { - var contributor_url = snippet.contributor_website; - } else if (snippet.contributor_email) { - var contributor_url = 'mailto:'+snippet.contributor_email; - } else { - var contributor_url = 'https://github.com/vdm-io/Joomla-Component-Builder-Snippets'; - } - var html = '
'; - html += ''; - html += ' ' + contributor_name + ''; - html += ' '+Joomla.JText._('COM_COMPONENTBUILDER_VIEW_BLAME')+''; - html += '
'; - // return contributor buttons - return html; -} - -// do a bulk update -function checkBulkSnippetGithub() { - // check if there is new items - if (bulkItems.new.length === 0) { - jQuery('#bulk-button-new').prop('disabled', true); - jQuery('#bulk-button-new').attr('title', Joomla.JText._('COM_COMPONENTBUILDER_THERE_ARE_NO_NEW_SNIPPETS_AT_THIS_TIME')); - jQuery('#bulk-notice-new').show(); - } - // check if there is diverged items - if (bulkItems.diverged.length === 0) { - jQuery('#bulk-button-diverged').prop('disabled', true); - jQuery('#bulk-button-diverged').attr('title', Joomla.JText._('COM_COMPONENTBUILDER_THERE_ARE_NO_DIVERGED_SNIPPETS_AT_THIS_TIME')); - jQuery('#bulk-notice-diverged').show(); - } - // check if there is ahead items - if (bulkItems.ahead.length === 0) { - jQuery('#bulk-button-ahead').prop('disabled', true); - jQuery('#bulk-button-ahead').attr('title', Joomla.JText._('COM_COMPONENTBUILDER_THERE_ARE_NO_AHEAD_SNIPPETS_AT_THIS_TIME')); - jQuery('#bulk-notice-ahead').show(); - } - // check if there is behind items - if (bulkItems.behind.length === 0) { - jQuery('#bulk-button-behind').prop('disabled', true); - jQuery('#bulk-button-behind').attr('title', Joomla.JText._('COM_COMPONENTBUILDER_THERE_ARE_NO_OUT_OF_DATE_SNIPPETS_AT_THIS_TIME')); - jQuery('#bulk-notice-behind').show(); - } - // check if all we should close the all button - if (bulkItems.behind.length === 0 && bulkItems.new.length === 0 && bulkItems.ahead.length === 0 && bulkItems.diverged.length === 0) { - jQuery('#bulk-button-all').prop('disabled', true); - jQuery('#bulk-button-all').attr('title', Joomla.JText._('COM_COMPONENTBUILDER_THERE_ARE_NO_SNIPPETS_TO_UPDATE_AT_THIS_TIME')); - jQuery('#bulk-notice-all').show(); - } -} - -// do a bulk update -function bulkSnippetGithub(status) { - // if all then trigger those with values - if ('all' === status) { - bulkSnippetGithub('behind'); - bulkSnippetGithub('new'); - bulkSnippetGithub('ahead'); - bulkSnippetGithub('diverged'); - } else if (bulkItems[status].length > 0) { - jQuery.each(bulkItems[status], function(i, key){ - setTimeout(function(){ - doBulkUpdate_server(key, status).done(function(result) { - if (result.message) { - // only show errors - if ('error' === result.status || 'warning' === result.status) { - UIkit.notify(result.message, {status: result.status}); - } - // update local items - if ('success' === result.status) { - // get key ID - var keyID = getKeyID(key); - // update snippet if we can - updateSnippetDisplay(keyID, 'equal'); - } - } else { - UIkit.notify(Joomla.JText._('COM_COMPONENTBUILDER_SNIPPET_COULD_NOT_BE_UPDATEDSAVED'), {status:'danger'}); - } - }); - }, 200); - }); - // reset array - bulkItems[status].length = 0; - // update the buttons (since we only do the bulk update once) - checkBulkSnippetGithub(); - } -} - -function doBulkUpdate_server(path, status) { - // set the ajax scope - ajaxcall = null; - var getUrl = JRouter("index.php?option=com_componentbuilder&task=ajax.setSnippetGithub&format=json&raw=true"); - if (token.length > 0 && path.length > 0 && status.length > 0) { - var request = token+'=1&path='+path+'&status='+status; - } - return jQuery.ajax({ - type: 'POST', - url: getUrl, - dataType: 'json', - data: request, - jsonp: false - }); -} - -// set the snippet from gitHub -function setSnippetGithub(key, status) { - var message = getConfirmUpdate(status); - UIkit.modal.confirm(message, function(){ - // will be executed on confirm. - setSnippetGithub_server(key, status).done(function(result) { - if (result.message) { - UIkit.notify(result.message, {status: result.status}); - if ('success' === result.status) { - // get key ID - var keyID = getKeyID(key); - // update snippet if we can - updateSnippetDisplay(keyID, 'equal'); - } - } else { - UIkit.notify(Joomla.JText._('COM_COMPONENTBUILDER_SNIPPET_COULD_NOT_BE_UPDATEDSAVED'), {status:'danger'}); - } - }); - }); -} - -function setSnippetGithub_server(path, status) { - // set the ajax scope - ajaxcall = null; - var getUrl = JRouter("index.php?option=com_componentbuilder&task=ajax.setSnippetGithub&format=json&raw=true"); - if (token.length > 0 && path.length > 0 && status.length > 0) { - var request = token+'=1&path='+path+'&status='+status; - } - return jQuery.ajax({ - type: 'POST', - url: getUrl, - dataType: 'json', - data: request, - jsonp: false - }); -} - -// update the snippet display -function updateSnippetDisplay(keyID, status) { - // update badge - jQuery('#'+keyID+'-badge').html(' ' +status); - jQuery('#'+keyID+'-badge').attr('href' , '#'+status+'-meaning'); - // update button - if ('equal' === status) { - // update notice - jQuery('#'+keyID+'-getbutton').attr('title', Joomla.JText._('COM_COMPONENTBUILDER_NO_NEED_TO_GET_IT_SINCE_IT_IS_ALREADY_IN_SYNC_WITH_YOUR_LOCAL_VERSION')); - jQuery('#'+keyID+'-getbutton').prop('disabled', true); - jQuery('#'+keyID+'-getbutton').html(' ' + Joomla.JText._('COM_COMPONENTBUILDER_LOCAL_SNIPPET')); - // counter delay just incase - setTimeout(function(){ - jQuery('#'+keyID+'-getbutton').prop('disabled', true); - }, 2000); - } - // update the data filter - jQuery('#'+keyID+'-panel').attr('data-uk-filter', status); - // tell the grid to update - jQuery('#snippets-grid').trigger('display.uk.check'); -} - -// set the modal -function getSnippetModal(key, type) { - // set the ajax scope - ajaxcall = 'snippets'; - var _snippet = jQuery.jStorage.get(key, null); - if (_snippet) { - // show modal - showSnippetModal(_snippet, type); - } else { - jQuery.get('https://raw.githubusercontent.com/vdm-io/Joomla-Component-Builder-Snippets/master/'+key) - .done(function(snippet) { - // convert the string to json.object - snippet = jQuery.parseJSON(snippet); - jQuery.jStorage.set(key, snippet, {TTL: expire}); - // show modal - showSnippetModal(snippet, type); - }) - .error(function(jqXHR, textStatus, errorThrown) { - // we could do more - }); - } -} - -// show the modal -function showSnippetModal(snippet, type) { - var html = '
'; - html += ''; - html += '

' + snippet.library + ' - (' + snippet.type + ') ' + snippet.name + '

'; - if ('contributor' === type) { - html += '
'; - html += '
'+Joomla.JText._('COM_COMPONENTBUILDER_COMPANY_NAME')+'
'; - html += '
'+snippet.contributor_company+'
'; - html += '
'+Joomla.JText._('COM_COMPONENTBUILDER_AUTHOR_NAME')+'
'; - html += '
'+snippet.contributor_name+'
'; - html += '
'+Joomla.JText._('COM_COMPONENTBUILDER_AUTHOR_EMAIL')+'
'; - html += '
'+snippet.contributor_email+'
'; - html += '
'+Joomla.JText._('COM_COMPONENTBUILDER_AUTHOR_WEBSITE')+'
'; - html += '
'+snippet.contributor_website+'
'; - html += '
'; - } else { - html += '
'; - } - html += '
C: ' + snippet.created + ' | M: ' + snippet.modified + ''; - html += '
'; - // get current page position - var scroll = jQuery(window).scrollTop(); - // add html to modal - var modal = UIkit.modal.blockUI(html, {center:true, bgclose:true}).on({ - 'hide.uk.modal': function(){ - // scroll fix since the modal pops to the top of the page - jQuery(window).scrollTop(scroll); - } - }); - // show modal - modal.show(); -} - -// get key ID -function getKeyID(key) { - // get useful ID - var keyID = key.replace('-', ''); - keyID = keyID.replace('.json', ''); - keyID = keyID.replace(/\s+/ig, '-'); - keyID = keyID.replace(/\(/g, ''); - keyID = keyID.replace(/\)/g, ''); - // return the id build - return keyID; -} -// get key ID -function getKeyID(key) { - // get useful ID - var keyID = key.replace('-', ''); - keyID = keyID.replace('.json', ''); - keyID = keyID.replace(/\s+/ig, '-'); - keyID = keyID.replace(/\(/g, ''); - keyID = keyID.replace(/\)/g, ''); - // return the id build - return keyID; -} diff --git a/admin/assets/js/initialization_selection.js b/admin/assets/js/initialization_selection.js new file mode 100644 index 000000000..ceac379f8 --- /dev/null +++ b/admin/assets/js/initialization_selection.js @@ -0,0 +1,395 @@ +/** + * @package Joomla.Component.Builder + * + * @created 30th April, 2015 + * @author Llewellyn van der Merwe + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +/* JS Document */ + +const memoryinitialization = []; + +function setSessionMemory(key, values, merge = true) { + if (merge) { + values = mergeSessionMemory(key, values); + } else { + values = JSON.stringify(values); + } + + if (typeof Storage !== "undefined") { + sessionStorage.setItem(key, values); + } else { + memoryinitialization[key] = values; + } +} + +function mergeSessionMemory(key, values) { + const oldValues = getSessionMemory(key); + + if (oldValues) { + values = { ...oldValues, ...values }; + } + + return JSON.stringify(values); +} + +function getSessionMemory(key, defaultValue = null) { + if (typeof Storage !== "undefined") { + const localValue = sessionStorage.getItem(key); + + if (isJsonString(localValue)) { + defaultValue = JSON.parse(localValue); + } + } else if (typeof memoryinitialization[key] !== "undefined") { + const localValue = memoryinitialization[key]; + + if (isJsonString(localValue)) { + defaultValue = JSON.parse(localValue); + } + } + + return defaultValue; +} + +function isJsonString(str) { + try { + JSON.parse(str); + } catch (e) { + return false; + } + + return true; +} + +function getArrayFormat(items) { + // Check if items is an object and not an array + if (typeof items === 'object' && !Array.isArray(items)) { + return Object.values(items); + } + return items; +} +class InitializationManager { + #repoArea = document.getElementById('select-repo-area'); + #powersArea = document.getElementById('select-powers-area'); + #initButton = document.getElementById('init-selected-powers'); + #backButton = document.getElementById('back-to-select-repo'); + #loadingDiv = window.loadingDiv || null; + #buildTable = typeof buildPowerSelectionTable === 'function' ? buildPowerSelectionTable : null; + #drawTable = typeof drawPowerSelectionTable === 'function' ? drawPowerSelectionTable : null; + + currentRepo = null; + currentArea = null; + + constructor() { + this._bindRepoButtons(); + this._bindInitSelectedPowers(); + this._updateInitButtonState(); + } + + /** Getter for selected items using global window reference. */ + get selectedItems() { + if (!Array.isArray(window.selectedPowerItems)) { + window.selectedPowerItems = []; + } + return window.selectedPowerItems; + } + + /** Setter for selected items with sync to window and button state update. */ + set selectedItems(items) { + window.selectedPowerItems = items; + this._updateInitButtonState(); + } + + /** Add items to selection if not already selected. */ + addSelectedItems(data) { + if (!data || typeof data.length !== 'number') return; + + const updated = [...this.selectedItems]; + + for (let i = 0; i < data.length; i++) { + const item = data[i]; + if (!updated.some(existing => this.#isSameItem(existing, item))) { + updated.push(item); + } + } + + this.selectedItems = updated; + } + + /** Remove items from selection based on identity comparison. */ + removeSelectedItems(data) { + if (!data || typeof data.length !== 'number') return; + + const updated = this.selectedItems.filter(existing => { + for (let i = 0; i < data.length; i++) { + if (this.#isSameItem(existing, data[i])) { + return false; + } + } + return true; + }); + + this.selectedItems = updated; + } + + /** Check if two items are the same using GUID. */ + #isSameItem(a, b) { + return a?.guid && b?.guid && a.guid === b.guid; + } + + /** Enable/disable the init button based on selection state. */ + _updateInitButtonState() { + if (this.#initButton) { + this.#initButton.disabled = this.selectedItems.length === 0; + } + } + + _bindRepoButtons() { + document.querySelectorAll('.select-repo-to-initialize').forEach(button => { + button.addEventListener('click', (e) => this._handleRepoClick(e)); + }); + } + + _bindInitSelectedPowers() { + if (this.#initButton) { + this.#initButton.addEventListener('click', () => this._handleInitSelectedPowers()); + } + if (this.#backButton) { + this.#backButton.addEventListener('click', () => this._handleBackToRepos()); + } + } + + async _handleRepoClick(event) { + const button = event.currentTarget; + const repo = button?.dataset?.repo; + const area = button?.dataset?.area; + + if (!repo || !area) { + this._notify(Joomla.Text._("COM_COMPONENTBUILDER_MISSING_REPOSITORY_OR_AREA_DATA"), "danger"); + return; + } + + this._showLoading(); + clearPowerSelectionTable(); + + const url = `${UrlAjax}getRepoIndex&repo=${encodeURIComponent(repo)}&area=${encodeURIComponent(area)}`; + + try { + const response = await fetch(url); + + if (!response.ok) throw new Error(`HTTP ${response.status}`); + + const data = await response.json(); + + if (data.success && data.index && this.#buildTable) { + const repoData = data.index[0]; + + const repoBase = repoData.base || 'https://git.vdm.dev'; + const repoPath = repoData.path || 'joomla/super-powers'; + const repoBranch = repoData.read_branch || 'master'; + + window.targetPowerRepoUrl = `${repoBase}/${repoPath}/src/branch/${repoBranch}/`; + + this.#buildTable(repoData.index); + + setTimeout(() => { + this._transitionTo(this.#repoArea, this.#powersArea); + this._hideLoading(); + }, 500); + + this.currentRepo = repoData.guid; + this.currentArea = area; + } else { + this._notify(data.message || Joomla.Text._("COM_COMPONENTBUILDER_FAILED_TO_RETRIEVE_REPOSITORY_INDEX"), "danger"); + this._hideLoading(); + } + } catch (error) { + console.error("Fetch error:", error); + this._hideLoading(); + this._notify(Joomla.Text._("COM_COMPONENTBUILDER_NETWORK_OR_SERVER_ERROR_OCCURRED_WHILE_FETCHING_INDEX"), "danger"); + } + } + + _handleBackToRepos() { + this._transitionTo(this.#powersArea, this.#repoArea); + } + + async _handleInitSelectedPowers() { + if (!Array.isArray(this.selectedItems) || this.selectedItems.length === 0) { + this._notify(Joomla.Text._("COM_COMPONENTBUILDER_NO_ITEMS_SELECTED"), "warning"); + return; + } + + this._showLoading(); + + const area = this.currentArea || 'error'; + const repo = this.currentRepo || 'error'; + + try { + // Convert selected items to form data + const formData = new FormData(); + + // Assuming Joomla expects `selected[]` for multiple values + for (const item of this.selectedItems) { + formData.append('selected[]', item.guid); // Only sending GUIDs + } + formData.append('area', area); + formData.append('repo', repo); + + const response = await fetch(`${UrlAjax}initSelectedPowers`, { + method: 'POST', + body: formData + }); + + if (!response.ok) throw new Error(`HTTP ${response.status}`); + + const data = await response.json(); + + if (!data.success) { + this._notify(data.message || Joomla.Text._("COM_COMPONENTBUILDER_FAILED_TO_INITIALIZE_SELECTED_POWERS"), "danger"); + } else { + this._handleResultLog(data.result_log || {}); + } + + this._hideLoading(); + this._transitionTo(this.#powersArea, this.#repoArea); + } catch (error) { + console.error("Submission error:", error); + this._notify(Joomla.Text._("COM_COMPONENTBUILDER_ERROR_OCCURRED_WHILE_INITIALIZING_POWERS"), "danger"); + + this._hideLoading(); + this._transitionTo(this.#powersArea, this.#repoArea); + } + } + + _handleResultLog(resultLog) { + const localGuids = this._normalizeGuids(resultLog.local); + const notFoundGuids = this._normalizeGuids(resultLog.not_found); + const addedGuids = this._normalizeGuids(resultLog.added); + + if (localGuids.length > 0) { + this._notify( + this._generateResultMessage(localGuids, 'local'), + 'info' + ); + } + + if (notFoundGuids.length > 0) { + this._notify( + this._generateResultMessage(notFoundGuids, 'not_found'), + 'info' + ); + } + + if (addedGuids.length > 0) { + this._notify( + this._generateResultMessage(addedGuids, 'added'), + 'success' + ); + } + } + + _normalizeGuids(value) { + if (!value) return []; + + if (Array.isArray(value)) { + return value; + } + + if (typeof value === 'object') { + return Object.keys(value); + } + + return []; + } + + _generateResultMessage(guids, type) { + const messages = { + local: Joomla.Text._('COM_COMPONENTBUILDER_THESE_ITEMS_WERE_ALREADY_PRESENT_LOCALLY_AND_WERE_NOT_INITIALIZED'), + not_found: Joomla.Text._('COM_COMPONENTBUILDER_THESE_ITEMS_COULD_NOT_BE_FOUND_IN_THE_REMOTE_REPOSITORY_AND_WERE_NOT_INITIALIZED'), + added: Joomla.Text._('COM_COMPONENTBUILDER_THESE_ITEMS_WERE_SUCCESSFULLY_INITIALIZED') + }; + + const names = []; + + for (const guid of guids) { + const item = this.selectedItems.find(i => i.guid === guid); + if (item?.name) { + names.push(item.name); + } + } + + if (names.length === 0) { + return null; + } + + return `${messages[type]}\n
- ${names.join('\n
- ')}`; + } + + _transitionTo(hideEl, showEl) { + if (hideEl && showEl) { + UIkit.util.ready(() => { + UIkit.util.removeClass(hideEl, 'uk-animation-slide-top-small'); + UIkit.util.removeClass(showEl, 'uk-animation-slide-bottom-small'); + UIkit.util.addClass(hideEl, 'uk-animation-slide-top-small'); + + setTimeout(() => { + hideEl.style.display = 'none'; + showEl.style.display = ''; + UIkit.util.addClass(showEl, 'uk-animation-slide-bottom-small'); + if (this.#drawTable) this.#drawTable(); + }, 300); + }); + } + } + + _showLoading() { + if (this.#loadingDiv) this.#loadingDiv.style.display = 'block'; + } + + _hideLoading() { + if (this.#loadingDiv) this.#loadingDiv.style.display = 'none'; + } + + _notify(message, type = 'info') { + const alertTypes = { + primary: 'alert-primary', + info: 'alert-info', + success: 'alert-success', + warning: 'alert-warning', + danger: 'alert-danger', + }; + + const alertClass = alertTypes[type] || alertTypes.primary; + + let container = document.getElementById('alert-container'); + if (!container) { + container = document.createElement('div'); + container.id = 'alert-container'; + container.className = 'position-fixed top-0 start-50 translate-middle-x p-3'; + container.style.zIndex = '1060'; + document.body.appendChild(container); + } + + const alert = document.createElement('div'); + alert.className = `alert ${alertClass} alert-dismissible fade show`; + alert.setAttribute('role', 'alert'); + alert.innerHTML = ` + ${message} + + `; + + container.appendChild(alert); + + setTimeout(() => { + alert.classList.remove('show'); + alert.classList.add('hide'); + alert.addEventListener('transitionend', () => { + alert.remove(); + }); + }, 5000); + } +} \ No newline at end of file diff --git a/admin/assets/js/search.js b/admin/assets/js/search.js index bffebc42d..263a7d356 100644 --- a/admin/assets/js/search.js +++ b/admin/assets/js/search.js @@ -91,7 +91,7 @@ const doSearch = async (signal, tables) => { if (response.ok) { return response.json(); } else { - UIkit.notify(Joomla.JText._('COM_COMPONENTBUILDER_THE_SEARCH_PROCESS_HAD_AN_ERROR_WITH_TABLE') + ' ' + tableName, {pos:'top-right', status:'danger'}); + UIkit.notify(Joomla.Text._('COM_COMPONENTBUILDER_THE_SEARCH_PROCESS_HAD_AN_ERROR_WITH_TABLE') + ' ' + tableName, {pos:'top-right', status:'danger'}); } }).then((data) => { if (typeof data.success !== 'undefined') { @@ -116,11 +116,11 @@ const doSearch = async (signal, tables) => { searchProgressBarObject.innerHTML = percent.toFixed(2) + '%'; // when complete hide the progress bar if (progress == total) { - let total_field_line = ' ' + fieldCount + ' ' + Joomla.JText._('COM_COMPONENTBUILDER_FIELDS_THAT_HAD') + ' ' + lineCount + ' ' + Joomla.JText._('COM_COMPONENTBUILDER_LINES') + ' '; + let total_field_line = ' ' + fieldCount + ' ' + Joomla.Text._('COM_COMPONENTBUILDER_FIELDS_THAT_HAD') + ' ' + lineCount + ' ' + Joomla.Text._('COM_COMPONENTBUILDER_LINES') + ' '; if (progress == 1) { - searchProgressBarObject.innerHTML = Joomla.JText._('COM_COMPONENTBUILDER_SEARCHING') + ' ' + tableName + total_field_line + Joomla.JText._('COM_COMPONENTBUILDER_AND_FINISHED_THE_SEARCH_IN') + ' ' + getSearchLenght() + ' ' + Joomla.JText._('COM_COMPONENTBUILDER_SECONDS'); + searchProgressBarObject.innerHTML = Joomla.Text._('COM_COMPONENTBUILDER_SEARCHING') + ' ' + tableName + total_field_line + Joomla.Text._('COM_COMPONENTBUILDER_AND_FINISHED_THE_SEARCH_IN') + ' ' + getSearchLenght() + ' ' + Joomla.Text._('COM_COMPONENTBUILDER_SECONDS'); } else { - searchProgressBarObject.innerHTML = Joomla.JText._('COM_COMPONENTBUILDER_SEARCHING') + ' ' + progress + ' ' + Joomla.JText._('COM_COMPONENTBUILDER_TABLES_WITH') + total_field_line + Joomla.JText._('COM_COMPONENTBUILDER_AND_FINISHED_THE_SEARCH_IN') + ' ' + getSearchLenght() + ' ' + Joomla.JText._('COM_COMPONENTBUILDER_SECONDS'); + searchProgressBarObject.innerHTML = Joomla.Text._('COM_COMPONENTBUILDER_SEARCHING') + ' ' + progress + ' ' + Joomla.Text._('COM_COMPONENTBUILDER_TABLES_WITH') + total_field_line + Joomla.Text._('COM_COMPONENTBUILDER_AND_FINISHED_THE_SEARCH_IN') + ' ' + getSearchLenght() + ' ' + Joomla.Text._('COM_COMPONENTBUILDER_SECONDS'); } // show the search button startSearchButton.style.display = ''; @@ -235,11 +235,11 @@ const replaceAllCheck = () => { let searchValue = searchObject.value; let replaceValue = replaceObject.value; // load question - let question = Joomla.JText._('COM_COMPONENTBUILDER_YOUR_ARE_ABOUT_TO_UPDATE_BALLB_VALUES_THAT_CAN_BE_FOUND_IN_THE_DATABASE') + '
' + - Joomla.JText._('COM_COMPONENTBUILDER_YOU_WILL_REPLACE') + ': [' + htmlentities(searchValue) + '] ' + - Joomla.JText._('COM_COMPONENTBUILDER_WITH') + ': [' + htmlentities(replaceValue) + ']
' + - Joomla.JText._('COM_COMPONENTBUILDER_THIS_CAN_NOT_BE_UNDONE_BYOU_HAVE_BEEN_WARNEDB') + '

' + - Joomla.JText._('COM_COMPONENTBUILDER_ARE_YOU_THEREFORE_ABSOLUTELY_SURE_YOU_WANT_TO_CONTINUE'); + let question = Joomla.Text._('COM_COMPONENTBUILDER_YOUR_ARE_ABOUT_TO_UPDATE_BALLB_VALUES_THAT_CAN_BE_FOUND_IN_THE_DATABASE') + '
' + + Joomla.Text._('COM_COMPONENTBUILDER_YOU_WILL_REPLACE') + ': [' + htmlentities(searchValue) + '] ' + + Joomla.Text._('COM_COMPONENTBUILDER_WITH') + ': [' + htmlentities(replaceValue) + ']
' + + Joomla.Text._('COM_COMPONENTBUILDER_THIS_CAN_NOT_BE_UNDONE_BYOU_HAVE_BEEN_WARNEDB') + '

' + + Joomla.Text._('COM_COMPONENTBUILDER_ARE_YOU_THEREFORE_ABSOLUTELY_SURE_YOU_WANT_TO_CONTINUE'); // do check UIkit.modal.confirm(question, function () { @@ -258,7 +258,7 @@ const replaceAllCheck = () => { } else { replaceAll(controller_replace.signal, searchTables); } - }, {labels: { Ok: Joomla.JText._('COM_COMPONENTBUILDER_YES_UPDATE_ALL'), Cancel: Joomla.JText._('COM_COMPONENTBUILDER_NO') }}); + }, {labels: { Ok: Joomla.Text._('COM_COMPONENTBUILDER_YES_UPDATE_ALL'), Cancel: Joomla.Text._('COM_COMPONENTBUILDER_NO') }}); }; /** @@ -321,7 +321,7 @@ const replaceAll = async (signal, tables) => { if (response.ok) { return response.json(); } else { - UIkit.notify(Joomla.JText._('COM_COMPONENTBUILDER_THE_REPLACE_PROCESS_HAD_AN_ERROR_WITH_TABLE') + ' ' + tableName, {pos:'top-right', status:'danger'}); + UIkit.notify(Joomla.Text._('COM_COMPONENTBUILDER_THE_REPLACE_PROCESS_HAD_AN_ERROR_WITH_TABLE') + ' ' + tableName, {pos:'top-right', status:'danger'}); } }).then((data) => { if (typeof data.success !== 'undefined') { @@ -343,22 +343,22 @@ const replaceAll = async (signal, tables) => { // if not reqex we reverse the search for you so you can see the update was a success if (regexValue == 0) { // set the replace value as the search value - UIkit.modal.confirm(Joomla.JText._('COM_COMPONENTBUILDER_WOULD_YOU_LIKE_TO_DO_A_REVERSE_SEARCH'), function(){ + UIkit.modal.confirm(Joomla.Text._('COM_COMPONENTBUILDER_WOULD_YOU_LIKE_TO_DO_A_REVERSE_SEARCH'), function(){ startNewSearch(replaceValue, searchValue, matchValue, wholeValue, regexValue, 2); }, function () { - UIkit.modal.confirm(Joomla.JText._('COM_COMPONENTBUILDER_WOULD_YOU_LIKE_TO_REPEAT_THE_SAME_SEARCH'), function(){ + UIkit.modal.confirm(Joomla.Text._('COM_COMPONENTBUILDER_WOULD_YOU_LIKE_TO_REPEAT_THE_SAME_SEARCH'), function(){ startSearch(); }, function () { clearSearch(); - }, {labels: { Ok: Joomla.JText._('COM_COMPONENTBUILDER_YES'), Cancel: Joomla.JText._('COM_COMPONENTBUILDER_NO') }}); - }, {labels: { Ok: Joomla.JText._('COM_COMPONENTBUILDER_YES'), Cancel: Joomla.JText._('COM_COMPONENTBUILDER_NO') }}); + }, {labels: { Ok: Joomla.Text._('COM_COMPONENTBUILDER_YES'), Cancel: Joomla.Text._('COM_COMPONENTBUILDER_NO') }}); + }, {labels: { Ok: Joomla.Text._('COM_COMPONENTBUILDER_YES'), Cancel: Joomla.Text._('COM_COMPONENTBUILDER_NO') }}); } else { // else we search it again just to prove its changed - UIkit.modal.confirm(Joomla.JText._('COM_COMPONENTBUILDER_WOULD_YOU_LIKE_TO_REPEAT_THE_SAME_SEARCH'), function(){ + UIkit.modal.confirm(Joomla.Text._('COM_COMPONENTBUILDER_WOULD_YOU_LIKE_TO_REPEAT_THE_SAME_SEARCH'), function(){ startSearch(); }, function () { clearSearch(); - }, {labels: { Ok: Joomla.JText._('COM_COMPONENTBUILDER_YES'), Cancel: Joomla.JText._('COM_COMPONENTBUILDER_NO') }}); + }, {labels: { Ok: Joomla.Text._('COM_COMPONENTBUILDER_YES'), Cancel: Joomla.Text._('COM_COMPONENTBUILDER_NO') }}); } }, 3000); } @@ -381,13 +381,13 @@ const replaceAll = async (signal, tables) => { */ const setValueCheck = (row, field, table) => { // load question - let question = Joomla.JText._('COM_COMPONENTBUILDER_YOUR_ARE_ABOUT_TO_UPDATE_ROW') + ' (' + row + ') -> (' + field + ') ' + - Joomla.JText._('COM_COMPONENTBUILDER_FIELD_IN_THE') + ' (' + table + ') ' + Joomla.JText._('COM_COMPONENTBUILDER_TABLE') + '.

' + - Joomla.JText._('COM_COMPONENTBUILDER_THIS_CAN_NOT_BE_UNDONE_ARE_YOU_SURE_YOU_WANT_TO_CONTINUE'); + let question = Joomla.Text._('COM_COMPONENTBUILDER_YOUR_ARE_ABOUT_TO_UPDATE_ROW') + ' (' + row + ') -> (' + field + ') ' + + Joomla.Text._('COM_COMPONENTBUILDER_FIELD_IN_THE') + ' (' + table + ') ' + Joomla.Text._('COM_COMPONENTBUILDER_TABLE') + '.

' + + Joomla.Text._('COM_COMPONENTBUILDER_THIS_CAN_NOT_BE_UNDONE_ARE_YOU_SURE_YOU_WANT_TO_CONTINUE'); // do check UIkit.modal.confirm(question, function () { setValue(row, field, table); - }, {labels: { Ok: Joomla.JText._('COM_COMPONENTBUILDER_YES'), Cancel: Joomla.JText._('COM_COMPONENTBUILDER_NO') }}); + }, {labels: { Ok: Joomla.Text._('COM_COMPONENTBUILDER_YES'), Cancel: Joomla.Text._('COM_COMPONENTBUILDER_NO') }}); }; /** diff --git a/admin/compiler/joomla_3/import.gif b/admin/compiler/joomla_3/import.gif index 10bcb8569..4371cc618 100644 Binary files a/admin/compiler/joomla_3/import.gif and b/admin/compiler/joomla_3/import.gif differ diff --git a/admin/compiler/joomla_4/ajax.gif b/admin/compiler/joomla_4/ajax.gif new file mode 100644 index 000000000..4371cc618 Binary files /dev/null and b/admin/compiler/joomla_4/ajax.gif differ diff --git a/admin/compiler/joomla_4/import.gif b/admin/compiler/joomla_4/import.gif deleted file mode 100644 index 10bcb8569..000000000 Binary files a/admin/compiler/joomla_4/import.gif and /dev/null differ diff --git a/admin/compiler/joomla_4/settings.json b/admin/compiler/joomla_4/settings.json index 56faa4878..7cb59cf80 100644 --- a/admin/compiler/joomla_4/settings.json +++ b/admin/compiler/joomla_4/settings.json @@ -252,8 +252,8 @@ "newName": "HeaderCheck.php", "type": "file" }, - "import.gif": { - "naam": "import.gif", + "ajax.gif": { + "naam": "ajax.gif", "path": "c0mp0n3nt/admin/assets/images", "rename": false, "type": "file" diff --git a/admin/forms/dynamic_get.xml b/admin/forms/dynamic_get.xml index 67acff77c..eda9e8c75 100644 --- a/admin/forms/dynamic_get.xml +++ b/admin/forms/dynamic_get.xml @@ -332,15 +332,30 @@ hint="COM_COMPONENTBUILDER_DYNAMIC_GET_DB_SELECTION_HINT" required="true" /> - +