Files
Component-Builder/admin/tmpl/extrusion/default.php
T
Robot bb9b155f00 Release of v6.2.0
Add a dedicated Extrusion view for importing existing Joomla components and PHP libraries into JCB. Unify component-folder and SQL-dump extrusion through a single engine. Add PHP class harvesting into JCB Powers, including automatic class matching and dependency linking. Add import pairing with Create, Update, and Skip controls, dry runs, and per-record change previews. Improve SQL schema reconstruction to preserve column types, defaults, keys, indexes, and table configuration. Improve field imports to preserve XML settings, options, GUID relationships, and storage formats without double-encoding subform data. Reuse shared field definitions across views and preserve existing customizations during repeated imports. Detect unchanged records and avoid unnecessary writes during repeated Extrusion runs. Restore language strings and compiler placeholders in imported code, field XML, view markup, and SQL. Improve Site View and Custom Admin View discovery, template recovery, and Dynamic Get relationships. Fix Power namespace reconstruction to correctly preserve custom aliases and apply NamespacePrefix and ComponentNamespace placeholders. Fix duplicate Compile button submissions that could start concurrent builds and cause intermittent folder creation or deletion errors. #1318. Add Repair Existing Power Namespaces with automatic matching and namespace-only updates that preserve class code, GUIDs, and settings. Improve Power discovery performance with component-scoped matching, dependency indexes, and reusable parsing. Protect Extrusion imports against ambiguous matches, conflicting compiler paths, and stale change previews. Improve Extrusion error reporting and recovery after interrupted import requests. Improve the Extrusion interface with folder pickers, grouped filtering, bulk selection, responsive layouts, and a dedicated dashboard icon. Fix Extrusion self-compilation by preserving runtime marker literals and align import authorization with native view-access permissions. Replace execution of imported SQL with static parsing and validate source paths without executing imported PHP. Complete JSON:API generation for API-enabled Admin Views, including CRUD operations, relationships, filtering, pagination, and field-level permissions. Include generated API files in component manifests so they are installed with compiled components. Add API_ROUTES and API_ROUTES_METHOD placeholders for linked webservices plugins, supporting routes by record ID, GUID, and unique fields. Add read-only API resources for supported Site Views and Custom Admin Views using their existing Dynamic Gets. Fix API record creation when IDs and GUIDs are omitted, generate record keys on the server, and preserve existing GUIDs during updates. Fix API item and list model selection, including resource names with irregular plural forms. Fix API read permissions to support read-only users and return native JSON:API access-denied responses instead of administrator redirects. Fix cross-site scripting risks in generated views through corrected text sanitization, Joomla-native HTML escaping, and field escape settings. Fix edit-own permission bypasses by checking stored record ownership and applying field permissions to the record being saved. Strengthen file upload and deletion permissions with ownership and component permission checks. Fix subform updates that could overwrite or reassign records belonging to another parent. Block unsafe URL schemes in Markdown links and images. Use cryptographically secure randomness for generated passwords and upload names, and sanitize uploaded filenames. Fix generated IIS library access configuration and add missing index.html files to compiled folders. Complete extraction of generated-code logic from the legacy Fields, Interpretation, and Infusion helpers into dedicated compiler services. Consolidate shared compiler logic across Joomla versions while retaining version-specific generation where required. Refactor the Power parser to use PHP's native lexer for reliable handling of modern syntax, multiline declarations, and complex types. Fix JCB Search to prevent matching records from being skipped when processing successive batches. Fix compilation of database-aware Joomla 4 modules caused by a missing utility class import. Fix CLI repository resolution to report unresolved repository GUIDs without triggering a fatal error. Fix PHP warnings when the compiler's placeholder report contains no results. Fix toolbar generation when descriptions are missing or null. Preserve original source line endings when compiler processing leaves the content unchanged.
2026-10-08 15:36:26 +00:00

401 lines
27 KiB
PHP

<?php
/**
* @package Joomla.Component.Builder
*
* @created 30th April, 2015
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/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
*/
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\HTML\HTMLHelper as Html;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
use VDM\Component\Componentbuilder\Administrator\Helper\ComponentbuilderHelper;
/** @var Joomla\CMS\WebAsset\WebAssetManager $wa */
$wa = $this->getDocument()->getWebAssetManager();
$wa->useScript('keepalive')->useScript('form.validate');
Html::_('bootstrap.tooltip');
use Joomla\CMS\Session\Session;
// No direct access to this file
defined('_JEXEC') or die;
//keep main menu visible
$this->app->getInput()->set('hidemainmenu', false);
// the ajax gateway every extrusion call travels through
$urlAjax = 'index.php?option=com_componentbuilder&format=json&raw=true&' . Session::getFormToken() . '=1&task=ajax.';
?>
<?php if ($this->canDo->get('extrusion.access')): ?>
<script type="text/javascript">
Joomla.submitbutton = function(task) {
if (task === 'extrusion.back') {
parent.history.back();
return false;
} else {
var form = document.getElementById('adminForm');
form.task.value = task;
form.submit();
}
}
</script>
<div class="main-card p-md-3" id="extrusion-page">
<ul class="nav nav-tabs" id="extrusion-tabs">
<li class="nav-item">
<button type="button" class="nav-link active" id="extrusion-tab-setup" data-extrusion-tab="setup">
<span class="icon-cog" aria-hidden="true"></span>
<?php echo Text::_('COM_COMPONENTBUILDER_SETUP'); ?>
</button>
</li>
<li class="nav-item">
<button type="button" class="nav-link" id="extrusion-tab-pairing" data-extrusion-tab="pairing" disabled>
<span class="icon-shuffle" aria-hidden="true"></span>
<?php echo Text::_('COM_COMPONENTBUILDER_PAIRING'); ?>
</button>
</li>
<li class="nav-item">
<button type="button" class="nav-link" id="extrusion-tab-results" data-extrusion-tab="results" disabled>
<span class="icon-list" aria-hidden="true"></span>
<?php echo Text::_('COM_COMPONENTBUILDER_RESULTS'); ?>
</button>
</li>
</ul>
<div id="extrusion-pane-setup" class="extrusion-pane" data-extrusion-pane="setup">
<form action="<?php echo Route::_('index.php?option=com_componentbuilder&view=extrusion'); ?>"
method="post" name="adminForm" id="adminForm" class="form-validate" enctype="multipart/form-data">
<div class="row">
<div class="col-md-5 p-md-3">
<h3><?php echo Text::_('COM_COMPONENTBUILDER_PULL_AN_EXISTING_EXTENSION_INTO_JCB'); ?></h3>
<p><?php echo Text::_('COM_COMPONENTBUILDER_SELECT_THE_FOLDERS_OF_A_JOOMLA_COMPONENT_OR_ANY_LIBRARY_OF_PHP_CLASSES_STRAIGHT_FROM_THIS_SITE_THE_TOOL_DISCOVERS_EVERYTHING_INSIDE_THEM_ON_ITS_OWN_INCLUDING_THE_INSTALL_SQL_SHOWS_YOU_EXACTLY_WHAT_IT_FOUND_AND_LETS_YOU_DECIDE_ITEM_BY_ITEM_WHAT_BECOMES_NEW_WHAT_UPDATES_SOMETHING_YOU_ALREADY_HAVE_AND_WHAT_STAYS_OUT'); ?></p>
<?php if ($this->form): ?>
<?php echo $this->form->renderFieldset('source'); ?>
<?php endif; ?>
<button type="button" class="btn btn-primary btn-lg px-4" style="width: 100%;" id="extrusion-harvest-button">
<span class="icon-search icon-white" aria-hidden="true"></span>
<?php echo Text::_('COM_COMPONENTBUILDER_HARVEST_THE_SOURCE'); ?>
</button>
<div id="extrusion-setup-notice" class="alert alert-danger mt-2" style="display:none;"></div>
</div>
<div class="col-md-7 p-md-3">
<div class="accordion" id="extrusion-switches">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#extrusion-switches-body">
<?php echo Text::_('COM_COMPONENTBUILDER_WHAT_SHOULD_BE_HARVESTED'); ?>
</button>
</h2>
<div id="extrusion-switches-body" class="accordion-collapse collapse show" data-bs-parent="#extrusion-switches">
<div class="accordion-body">
<?php if ($this->form): ?>
<?php echo $this->form->renderFieldset('switches'); ?>
<?php echo $this->form->renderFieldset('advanced'); ?>
<?php endif; ?>
<div id="extrusion-namespace-repair-options" hidden>
<button type="button" class="btn btn-outline-primary" id="extrusion-repair-namespaces-button"
aria-describedby="extrusion-namespace-repair-description">
<span class="icon-refresh" aria-hidden="true"></span>
<?php echo Text::_('COM_COMPONENTBUILDER_REPAIR_EXISTING_POWER_NAMESPACES'); ?>
</button>
<p id="extrusion-namespace-repair-description" class="mt-2">
<?php echo Text::_('COM_COMPONENTBUILDER_SELECT_AN_EXISTING_TARGET_COMPONENT_IN_UPDATE_MODE_AND_ITS_LIBRARY_SOURCE_FOLDERS_REVIEW_AND_REPAIR_NAMESPACE_PLACEHOLDERS_FOR_MATCHED_POWERS_ONLY_THEIR_GUIDS_CODE_SETTINGS_AND_LINKS_ARE_RETAINED'); ?>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="p-md-3"><?php if ($this->dankie == 2): ?>
<?php echo LayoutHelper::render('jcbsupportmessage', []); ?><?php else: ?>
<?php echo ComponentbuilderHelper::getDynamicContent('banner', '728-90'); ?><?php endif; ?>
</div>
</div>
<input type="hidden" name="task" value="" />
<?php echo Html::_('form.token'); ?>
</form>
</div>
<div id="extrusion-pane-running" class="extrusion-pane" data-extrusion-pane="running" style="display:none;">
<div class="row">
<div class="col-md-4 p-md-3">
<h3><?php echo $this->escape($this->user->name); ?>, <?php echo Text::_('COM_COMPONENTBUILDER_PLEASE_WAIT'); ?></h3>
<p><b><span id="extrusion-running-title"><?php echo Text::_('COM_COMPONENTBUILDER_THE_SOURCE'); ?></span></b>
<span id="extrusion-running-verb"><?php echo Text::_('COM_COMPONENTBUILDER_IS_BEING_HARVESTED'); ?></span>
<span class="loading-dots">.</span></p>
<p style="font-size: smaller;"><?php echo Text::_('COM_COMPONENTBUILDER_A_LARGE_SOURCE_CAN_CARRY_HUNDREDS_OF_CLASSES_AND_VIEWS_SO_THIS_MAY_TAKE_A_MOMENT'); ?></p>
</div>
</div>
<div class="col-md-8 p-md-3">
<div class="p-md-3"><?php if ($this->dankie == 2): ?>
<?php echo LayoutHelper::render('jcbsupportmessage', []); ?><?php else: ?>
<?php echo ComponentbuilderHelper::getDynamicContent('banner', '728-90'); ?><?php endif; ?>
</div>
</div>
</div>
<div id="extrusion-pane-pairing" class="extrusion-pane" data-extrusion-pane="pairing" style="display:none;">
<div class="row p-md-3">
<div class="col-md-8">
<h3 id="extrusion-pairing-title"><?php echo Text::_('COM_COMPONENTBUILDER_PAIR_THE_HARVEST_WITH_WHAT_YOU_ALREADY_HAVE'); ?></h3>
<p><?php echo Text::_('COM_COMPONENTBUILDER_EVERYTHING_BELOW_WAS_FOUND_IN_THE_SOURCE_PROPOSALS_IDENTIFY_THE_ACTUAL_TARGET_RECORDS_AMBIGUOUS_OR_CONFLICTING_POWERS_MUST_BE_RESOLVED_BEFORE_IMPORT_CHANGE_ANY_DECISION_NOTHING_IS_WRITTEN_UNTIL_YOU_APPROVE_THE_CURRENT_PLAN'); ?></p>
<p id="extrusion-namespace-repair-notice" class="alert alert-info" role="status" hidden>
<?php echo Text::_('COM_COMPONENTBUILDER_NAMESPACE_REPAIR_ONLY_THE_NAMESPACES_OF_EXISTING_MATCHED_POWERS_CAN_CHANGE_REVIEW_THE_PROPOSED_NAMESPACE_DIFFERENCES_UNMATCHED_CLASSES_ARE_SKIPPED'); ?>
</p>
</div>
<div class="col-md-4" style="text-align: right;">
<label for="extrusion-component-select" style="display:block;"><?php echo Text::_('COM_COMPONENTBUILDER_TARGET_COMPONENT'); ?></label>
<select id="extrusion-component-select" class="form-select" style="display:inline-block; max-width: 100%;"></select>
</div>
</div>
<div id="extrusion-bulk-bar" class="p-md-2">
<div class="extrusion-filters">
<div class="extrusion-filter-field">
<label for="extrusion-filter-type"><?php echo Text::_('COM_COMPONENTBUILDER_ENTITY_TYPE'); ?></label>
<select id="extrusion-filter-type" class="form-select form-select-sm">
<option value=""><?php echo Text::_('COM_COMPONENTBUILDER_ALL_TYPES'); ?></option>
<option value="power"><?php echo Text::_('COM_COMPONENTBUILDER_POWERS'); ?></option>
<option value="admin_view"><?php echo Text::_('COM_COMPONENTBUILDER_ADMIN_VIEWS'); ?></option>
<option value="field"><?php echo Text::_('COM_COMPONENTBUILDER_FIELDS'); ?></option>
<option value="site_view"><?php echo Text::_('COM_COMPONENTBUILDER_SITE_VIEWS'); ?></option>
<option value="custom_admin_view"><?php echo Text::_('COM_COMPONENTBUILDER_CUSTOM_ADMIN_VIEWS'); ?></option>
<option value="layout"><?php echo Text::_('COM_COMPONENTBUILDER_LAYOUTS'); ?></option>
<option value="template"><?php echo Text::_('COM_COMPONENTBUILDER_TEMPLATES'); ?></option>
</select>
</div>
<div class="extrusion-filter-field">
<label for="extrusion-filter-status"><?php echo Text::_('COM_COMPONENTBUILDER_MATCHING_STATUS'); ?></label>
<select id="extrusion-filter-status" class="form-select form-select-sm">
<option value=""><?php echo Text::_('COM_COMPONENTBUILDER_ALL_STATUSES'); ?></option>
<option value="matched"><?php echo Text::_('COM_COMPONENTBUILDER_MATCHED'); ?></option>
<option value="ambiguous"><?php echo Text::_('COM_COMPONENTBUILDER_AMBIGUOUS'); ?></option>
<option value="conflict"><?php echo Text::_('COM_COMPONENTBUILDER_CONFLICT'); ?></option>
<option value="unresolved"><?php echo Text::_('COM_COMPONENTBUILDER_UNRESOLVED'); ?></option>
<option value="unmatched"><?php echo Text::_('COM_COMPONENTBUILDER_UNMATCHED'); ?></option>
<option value="new"><?php echo Text::_('COM_COMPONENTBUILDER_NEW'); ?></option>
<option value="similar"><?php echo Text::_('COM_COMPONENTBUILDER_SIMILAR'); ?></option>
<option value="shared"><?php echo Text::_('COM_COMPONENTBUILDER_SHARED'); ?></option>
<option value="ignored"><?php echo Text::_('COM_COMPONENTBUILDER_IGNORED'); ?></option>
<option value="filtered"><?php echo Text::_('COM_COMPONENTBUILDER_FILTERED'); ?></option>
</select>
</div>
<div class="extrusion-filter-field">
<label for="extrusion-filter-change"><?php echo Text::_('COM_COMPONENTBUILDER_PLANNED_CHANGE'); ?></label>
<select id="extrusion-filter-change" class="form-select form-select-sm">
<option value=""><?php echo Text::_('COM_COMPONENTBUILDER_ALL_CHANGES'); ?></option>
<option value="create"><?php echo Text::_('COM_COMPONENTBUILDER_CREATE_NEW'); ?></option>
<option value="update"><?php echo Text::_('COM_COMPONENTBUILDER_UPDATE'); ?></option>
<option value="nochange"><?php echo Text::_('COM_COMPONENTBUILDER_NO_CHANGE'); ?></option>
<option value="ignore"><?php echo Text::_('COM_COMPONENTBUILDER_IGNORE'); ?></option>
<option value="blocked"><?php echo Text::_('COM_COMPONENTBUILDER_BLOCKED'); ?></option>
<option value="pending"><?php echo Text::_('COM_COMPONENTBUILDER_PENDING_REVIEW'); ?></option>
</select>
</div>
<div class="extrusion-filter-field">
<label for="extrusion-filter"><?php echo Text::_('COM_COMPONENTBUILDER_SEARCH_THE_TREE'); ?></label>
<input type="text" id="extrusion-filter" class="form-control form-control-sm"
placeholder="<?php echo Text::_('COM_COMPONENTBUILDER_FILTER_THE_TREE'); ?>" />
</div>
</div>
<div class="extrusion-bulk-actions">
<span class="extrusion-filter-count"><span id="extrusion-visible-count">0</span> / <span id="extrusion-total-count">0</span> <?php echo Text::_('COM_COMPONENTBUILDER_ITEMS_SHOWN'); ?></span>
<span><span id="extrusion-selected-count">0</span> <?php echo Text::_('COM_COMPONENTBUILDER_SELECTED_IN_THIS_VIEW'); ?>:</span>
<button type="button" class="btn btn-sm btn-outline-primary" data-extrusion-bulk="create"><?php echo Text::_('COM_COMPONENTBUILDER_CREATE_NEW'); ?></button>
<button type="button" class="btn btn-sm btn-outline-secondary" data-extrusion-bulk="ignore"><?php echo Text::_('COM_COMPONENTBUILDER_IGNORE'); ?></button>
<button type="button" class="btn btn-sm btn-outline-secondary" data-extrusion-bulk="reset"><?php echo Text::_('COM_COMPONENTBUILDER_BACK_TO_PROPOSED'); ?></button>
<small><?php echo Text::_('COM_COMPONENTBUILDER_GROUP_SELECTION_INCLUDES_NESTED_ITEMS_MATCHING_THESE_FILTERS'); ?></small>
</div>
</div>
<div id="extrusion-ambiguity-notice" class="alert alert-warning" hidden>
<?php echo Text::_('COM_COMPONENTBUILDER_SOME_ITEMS_HAVE_MORE_THAN_ONE_POSSIBLE_TARGET_FILTER_THEM_AND_CHOOSE_THE_CORRECT_RECORD'); ?>
<button type="button" class="btn btn-sm btn-outline-secondary" id="extrusion-show-ambiguous"><?php echo Text::_('COM_COMPONENTBUILDER_SHOW_AMBIGUOUS_ITEMS'); ?></button>
</div>
<div id="extrusion-board" class="p-md-2"></div>
<p id="extrusion-filter-empty" class="p-md-2" role="status" hidden><?php echo Text::_('COM_COMPONENTBUILDER_NO_ITEMS_MATCH_THESE_FILTERS'); ?></p>
<div class="p-md-2">
<div id="extrusion-review-notice" role="status" aria-live="polite"></div>
</div>
<div class="p-md-3">
<button type="button" class="btn btn-success btn-lg px-4" id="extrusion-import-button" disabled>
<span class="icon-download icon-white" aria-hidden="true"></span>
<span id="extrusion-import-label"><?php echo Text::_('COM_COMPONENTBUILDER_IMPORT_INTO_JCB'); ?></span>
</button>
<button type="button" class="btn btn-outline-secondary btn-lg px-4" id="extrusion-back-button">
<?php echo Text::_('COM_COMPONENTBUILDER_BACK_TO_SETUP'); ?>
</button>
</div>
</div>
<div id="extrusion-pane-results" class="extrusion-pane" data-extrusion-pane="results" style="display:none;">
<div class="row p-md-3">
<div class="col-md-12">
<h3 id="extrusion-results-title"><?php echo Text::_('COM_COMPONENTBUILDER_THE_IMPORT_REPORT'); ?></h3>
<div id="extrusion-results"></div>
</div>
</div>
</div>
<div id="extrusion-folder-modal" class="extrusion-modal" style="display:none;">
<div class="extrusion-modal-card">
<h4><?php echo Text::_('COM_COMPONENTBUILDER_SELECT_A_FOLDER'); ?></h4>
<div id="extrusion-folder-path" class="extrusion-folder-path"></div>
<div id="extrusion-folder-list" class="extrusion-modal-list"></div>
<div>
<button type="button" class="btn btn-success" id="extrusion-folder-choose"><?php echo Text::_('COM_COMPONENTBUILDER_CHOOSE_THIS_FOLDER'); ?></button>
<button type="button" class="btn btn-outline-secondary" id="extrusion-folder-close"><?php echo Text::_('COM_COMPONENTBUILDER_CANCEL'); ?></button>
</div>
</div>
</div>
<div id="extrusion-modal" class="extrusion-modal" style="display:none;">
<div class="extrusion-modal-card">
<h4 id="extrusion-modal-title"><?php echo Text::_('COM_COMPONENTBUILDER_CHOOSE_THE_TARGET'); ?></h4>
<input type="text" id="extrusion-modal-search" class="form-control"
placeholder="<?php echo Text::_('COM_COMPONENTBUILDER_TYPE_TO_SEARCH'); ?>" autocomplete="off" aria-describedby="extrusion-power-search-hint" />
<p id="extrusion-power-search-hint" hidden><?php echo Text::_('COM_COMPONENTBUILDER_LINKED_POWERS_ARE_SHOWN_FIRST_TO_FIND_ANOTHER_POWER_ENTER_ITS_EXACT_NAME_SYSTEM_NAME_NAMESPACE_OR_GUID'); ?></p>
<div id="extrusion-modal-list" class="extrusion-modal-list"></div>
<button type="button" class="btn btn-outline-secondary" id="extrusion-modal-close"><?php echo Text::_('COM_COMPONENTBUILDER_CANCEL'); ?></button>
</div>
</div>
<div id="extrusion-confirm-modal" class="extrusion-modal" role="dialog" aria-modal="true"
aria-labelledby="extrusion-confirm-title" aria-describedby="extrusion-confirm-description" style="display:none;">
<div class="extrusion-modal-card">
<h4 id="extrusion-confirm-title"><?php echo Text::_('COM_COMPONENTBUILDER_CONFIRM_IMPORT'); ?></h4>
<p id="extrusion-confirm-description"><?php echo Text::_('COM_COMPONENTBUILDER_I_ACKNOWLEDGE_THAT_THESE_CHANGES_CAN_AFFECT_THE_SYSTEM'); ?></p>
<p id="extrusion-confirm-dry-run" hidden><?php echo Text::_('COM_COMPONENTBUILDER_THIS_IS_A_DRY_RUN_NO_RECORDS_WILL_BE_WRITTEN'); ?></p>
<div class="extrusion-confirm-actions">
<button type="button" class="btn btn-success" id="extrusion-confirm-import"><?php echo Text::_('COM_COMPONENTBUILDER_ACKNOWLEDGE_AND_IMPORT'); ?></button>
<button type="button" class="btn btn-outline-secondary" id="extrusion-confirm-cancel"><?php echo Text::_('COM_COMPONENTBUILDER_CANCEL'); ?></button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
// the extrusion page bootstrap
window.JCBExtrusion = {
url: '<?php echo $urlAjax; ?>',
canImport: true,
text: {
pairingTitle: '<?php echo Text::_('COM_COMPONENTBUILDER_PAIR_THE_HARVEST_WITH_WHAT_YOU_ALREADY_HAVE', true); ?>',
repairPairingTitle: '<?php echo Text::_('COM_COMPONENTBUILDER_REVIEW_EXISTING_POWER_NAMESPACE_REPAIRS', true); ?>',
repairNeedTarget: '<?php echo Text::_('COM_COMPONENTBUILDER_NAMESPACE_REPAIR_REQUIRES_UPDATE_MODE_AND_AN_EXPLICITLY_SELECTED_EXISTING_TARGET_COMPONENT', true); ?>',
repairNeedLibraries: '<?php echo Text::_('COM_COMPONENTBUILDER_SELECT_AT_LEAST_ONE_LIBRARY_SOURCE_FOLDER_CONTAINING_THE_CLASSES_WHOSE_POWER_NAMESPACES_SHOULD_BE_REPAIRED', true); ?>',
repairProposal: '<?php echo Text::_('COM_COMPONENTBUILDER_PROPOSED_NAMESPACE_REPAIR', true); ?>',
importLabel: '<?php echo Text::_('COM_COMPONENTBUILDER_IMPORT_INTO_JCB', true); ?>',
repairLabel: '<?php echo Text::_('COM_COMPONENTBUILDER_APPLY_NAMESPACE_REPAIRS', true); ?>',
confirmTitle: '<?php echo Text::_('COM_COMPONENTBUILDER_CONFIRM_IMPORT', true); ?>',
repairConfirmTitle: '<?php echo Text::_('COM_COMPONENTBUILDER_CONFIRM_NAMESPACE_REPAIR', true); ?>',
confirmDescription: '<?php echo Text::_('COM_COMPONENTBUILDER_I_ACKNOWLEDGE_THAT_THESE_CHANGES_CAN_AFFECT_THE_SYSTEM', true); ?>',
repairConfirmDescription: '<?php echo Text::_('COM_COMPONENTBUILDER_I_ACKNOWLEDGE_THAT_CHANGING_THESE_EXISTING_POWER_NAMESPACES_CAN_AFFECT_THEIR_CONSUMERS_ONLY_THE_REVIEWED_NAMESPACE_CHANGES_WILL_BE_APPLIED', true); ?>',
confirmLabel: '<?php echo Text::_('COM_COMPONENTBUILDER_ACKNOWLEDGE_AND_IMPORT', true); ?>',
repairConfirmLabel: '<?php echo Text::_('COM_COMPONENTBUILDER_ACKNOWLEDGE_AND_REPAIR', true); ?>',
reportTitle: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_IMPORT_REPORT', true); ?>',
repairReportTitle: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_NAMESPACE_REPAIR_REPORT', true); ?>',
repairing: '<?php echo Text::_('COM_COMPONENTBUILDER_IS_HAVING_ITS_POWER_NAMESPACES_REPAIRED', true); ?>',
reviewPending: '<?php echo Text::_('COM_COMPONENTBUILDER_RESOLVING_THE_CURRENT_TARGETS_AND_WRITE_PLAN', true); ?>',
reviewBlocked: '<?php echo Text::_('COM_COMPONENTBUILDER_RESOLVE_THE_BLOCKED_ITEMS_BEFORE_IMPORTING', true); ?>',
blockerDetails: '<?php echo Text::_('COM_COMPONENTBUILDER_REVIEW_CONFLICT_DETAILS', true); ?>',
ambiguousHint: '<?php echo Text::_('COM_COMPONENTBUILDER_CHOOSE_THE_CORRECT_TARGET_FROM_THE_CANDIDATES', true); ?>',
selectGroup: '<?php echo Text::_('COM_COMPONENTBUILDER_SELECT_GROUP', true); ?>',
selectItem: '<?php echo Text::_('COM_COMPONENTBUILDER_SELECT_ITEM', true); ?>',
reviewReady: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_CURRENT_TARGETS_AND_EFFECTIVE_CHANGES_HAVE_BEEN_VALIDATED', true); ?>',
actualTarget: '<?php echo Text::_('COM_COMPONENTBUILDER_ACTUAL_TARGET', true); ?>',
newIdentity: '<?php echo Text::_('COM_COMPONENTBUILDER_NEW_POWER_IDENTITY', true); ?>',
otherCandidates: '<?php echo Text::_('COM_COMPONENTBUILDER_OTHER_CANDIDATES', true); ?>',
relocation: '<?php echo Text::_('COM_COMPONENTBUILDER_VALIDATED_NAMESPACE_RELOCATION', true); ?>',
skippedExisting: '<?php echo Text::_('COM_COMPONENTBUILDER_SKIPPED_EXISTING_AVAILABLE_TO_DEPENDENCIES', true); ?>',
unresolved: '<?php echo Text::_('COM_COMPONENTBUILDER_UNRESOLVED', true); ?>',
status_matched: '<?php echo Text::_('COM_COMPONENTBUILDER_MATCHED', true); ?>',
status_new: '<?php echo Text::_('COM_COMPONENTBUILDER_NEW', true); ?>',
status_ambiguous: '<?php echo Text::_('COM_COMPONENTBUILDER_AMBIGUOUS', true); ?>',
status_conflict: '<?php echo Text::_('COM_COMPONENTBUILDER_CONFLICT', true); ?>',
status_unresolved: '<?php echo Text::_('COM_COMPONENTBUILDER_UNRESOLVED', true); ?>',
status_ignored: '<?php echo Text::_('COM_COMPONENTBUILDER_IGNORED', true); ?>',
status_filtered: '<?php echo Text::_('COM_COMPONENTBUILDER_FILTERED', true); ?>',
status_unmatched: '<?php echo Text::_('COM_COMPONENTBUILDER_UNMATCHED', true); ?>',
status_similar: '<?php echo Text::_('COM_COMPONENTBUILDER_SIMILAR', true); ?>',
status_shared: '<?php echo Text::_('COM_COMPONENTBUILDER_SHARED', true); ?>',
harvesting: '<?php echo Text::_('COM_COMPONENTBUILDER_IS_BEING_HARVESTED', true); ?>',
importing: '<?php echo Text::_('COM_COMPONENTBUILDER_IS_BEING_IMPORTED', true); ?>',
theSource: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_SOURCE', true); ?>',
harvestFailed: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_HARVEST_FAILED', true); ?>',
importFailed: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_IMPORT_FAILED', true); ?>',
requestFailed: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_REQUEST_FAILED_REVIEW_THE_CURRENT_STATE_BEFORE_TRYING_AGAIN', true); ?>',
networkFailed: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_CONNECTION_FAILED_BEFORE_A_RESPONSE_WAS_RECEIVED_CHECK_THE_CONNECTION_AND_REVIEW_THE_CURRENT_STATE_BEFORE_TRYING_AGAIN', true); ?>',
httpFailed: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_SERVER_RETURNED_AN_UNSUCCESSFUL_RESPONSE', true); ?>',
invalidResponse: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_SERVER_RESPONSE_WAS_NOT_VALID_JSON_FOR_THIS_OPERATION', true); ?>',
operationFailed: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_SERVER_COULD_NOT_COMPLETE_THIS_OPERATION', true); ?>',
failureReference: '<?php echo Text::_('COM_COMPONENTBUILDER_FAILURE_REFERENCE', true); ?>',
powerSearchTruncated: '<?php echo Text::_('COM_COMPONENTBUILDER_SHOWING_THE_FIRST_ONE_HUNDRED_MATCHES_REFINE_THE_SEARCH_WITH_AN_EXACT_NAMESPACE_OR_GUID', true); ?>',
needSource: '<?php echo Text::_('COM_COMPONENTBUILDER_SELECT_AT_LEAST_AN_ADMIN_FOLDER_A_SITE_FOLDER_OR_A_LIBRARY_FOLDER_TO_HARVEST', true); ?>',
createNew: '<?php echo Text::_('COM_COMPONENTBUILDER_CREATE_NEW', true); ?>',
update: '<?php echo Text::_('COM_COMPONENTBUILDER_UPDATE', true); ?>',
ignore: '<?php echo Text::_('COM_COMPONENTBUILDER_IGNORE', true); ?>',
proposed: '<?php echo Text::_('COM_COMPONENTBUILDER_PROPOSED', true); ?>',
detected: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_SOURCE_WAS_RECOGNISED_AS', true); ?>',
noTarget: '<?php echo Text::_('COM_COMPONENTBUILDER_NO_TARGET_COMPONENT', true); ?>',
chooseTarget: '<?php echo Text::_('COM_COMPONENTBUILDER_CHOOSE_THE_TARGET', true); ?>',
noMatches: '<?php echo Text::_('COM_COMPONENTBUILDER_NOTHING_MATCHES_YOUR_SEARCH', true); ?>',
adminViews: '<?php echo Text::_('COM_COMPONENTBUILDER_ADMIN_VIEWS', true); ?>',
fields: '<?php echo Text::_('COM_COMPONENTBUILDER_FIELDS', true); ?>',
siteViews: '<?php echo Text::_('COM_COMPONENTBUILDER_SITE_VIEWS', true); ?>',
customAdminViews: '<?php echo Text::_('COM_COMPONENTBUILDER_CUSTOM_ADMIN_VIEWS', true); ?>',
layouts: '<?php echo Text::_('COM_COMPONENTBUILDER_LAYOUTS', true); ?>',
templates: '<?php echo Text::_('COM_COMPONENTBUILDER_TEMPLATES', true); ?>',
powers: '<?php echo Text::_('COM_COMPONENTBUILDER_POWERS', true); ?>',
matched: '<?php echo Text::_('COM_COMPONENTBUILDER_MATCHED', true); ?>',
similar: '<?php echo Text::_('COM_COMPONENTBUILDER_SIMILAR', true); ?>',
newItem: '<?php echo Text::_('COM_COMPONENTBUILDER_NEW', true); ?>',
items: '<?php echo Text::_('COM_COMPONENTBUILDER_ITEMS', true); ?>',
written: '<?php echo Text::_('COM_COMPONENTBUILDER_WRITTEN', true); ?>',
skipped: '<?php echo Text::_('COM_COMPONENTBUILDER_SKIPPED', true); ?>',
failed: '<?php echo Text::_('COM_COMPONENTBUILDER_FAILED', true); ?>',
dryRun: '<?php echo Text::_('COM_COMPONENTBUILDER_THIS_WAS_A_DRY_RUN_NOTHING_WAS_WRITTEN', true); ?>',
importDone: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_IMPORT_HAS_RUN', true); ?>',
harvestAgain: '<?php echo Text::_('COM_COMPONENTBUILDER_HARVEST_AGAIN', true); ?>',
messages: '<?php echo Text::_('COM_COMPONENTBUILDER_MESSAGES', true); ?>',
report: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_FULL_REPORT', true); ?>',
selectFolder: '<?php echo Text::_('COM_COMPONENTBUILDER_SELECT', true); ?>',
addLibrary: '<?php echo Text::_('COM_COMPONENTBUILDER_ADD_A_LIBRARY_FOLDER', true); ?>',
siteRoot: '<?php echo Text::_('COM_COMPONENTBUILDER_SITE_ROOT', true); ?>',
upOneFolder: '<?php echo Text::_('COM_COMPONENTBUILDER_UP_ONE_FOLDER', true); ?>',
emptyFolder: '<?php echo Text::_('COM_COMPONENTBUILDER_THIS_FOLDER_HOLDS_NO_FOLDERS', true); ?>',
folderFailed: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_FOLDER_LIST_COULD_NOT_BE_LOADED', true); ?>',
catalogueFailed: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_EXISTING_DEFINITIONS_COULD_NOT_BE_LOADED_SO_NOTHING_COULD_BE_MATCHED_AGAINST_THIS_COMPONENT', true); ?>',
shared: '<?php echo Text::_('COM_COMPONENTBUILDER_SHARED', true); ?>',
sharedWith: '<?php echo Text::_('COM_COMPONENTBUILDER_ONE_FIELD_OWNED_BY', true); ?>',
detach: '<?php echo Text::_('COM_COMPONENTBUILDER_DETACH', true); ?>',
detachHint: '<?php echo Text::_('COM_COMPONENTBUILDER_DECIDE_THIS_VIEW_ON_ITS_OWN_INSTEAD_OF_SHARING_THE_FIELD', true); ?>',
detached: '<?php echo Text::_('COM_COMPONENTBUILDER_DETACHED', true); ?>',
oneField: '<?php echo Text::_('COM_COMPONENTBUILDER_ONE_FIELD_LINKED_BY', true); ?>',
views: '<?php echo Text::_('COM_COMPONENTBUILDER_VIEWS', true); ?>',
sharedSection: '<?php echo Text::_('COM_COMPONENTBUILDER_SHARED', true); ?>',
adopted: '<?php echo Text::_('COM_COMPONENTBUILDER_ADOPTED', true); ?>',
consolidated: '<?php echo Text::_('COM_COMPONENTBUILDER_CONSOLIDATED', true); ?>',
reused: '<?php echo Text::_('COM_COMPONENTBUILDER_REUSED', true); ?>',
kept: '<?php echo Text::_('COM_COMPONENTBUILDER_KEPT', true); ?>',
noChange: '<?php echo Text::_('COM_COMPONENTBUILDER_NO_CHANGE', true); ?>',
noChangeHint: '<?php echo Text::_('COM_COMPONENTBUILDER_THIS_RECORD_ALREADY_SAYS_WHAT_THE_SOURCE_SAYS_SO_THE_IMPORT_LEAVES_IT_ALONE_ITS_VIEW_IS_STILL_WIRED_UP_AS_IT_SHOULD_BE', true); ?>',
diffHint: '<?php echo Text::_('COM_COMPONENTBUILDER_SEE_EXACTLY_WHAT_THIS_IMPORT_WOULD_CHANGE_HERE', true); ?>',
diffLoading: '<?php echo Text::_('COM_COMPONENTBUILDER_READING_WHAT_WOULD_CHANGE', true); ?>',
weighing: '<?php echo Text::_('COM_COMPONENTBUILDER_WEIGHING', true); ?>',
weighingHint: '<?php echo Text::_('COM_COMPONENTBUILDER_THIS_ROW_WAS_DECIDED_A_MOMENT_AGO_SO_WHAT_IT_WOULD_CHANGE_IS_BEING_READ_AGAIN_UNDER_THE_PAIRING_IT_HAS_NOW', true); ?>',
weighingFailed: '<?php echo Text::_('COM_COMPONENTBUILDER_THE_BOARD_COULD_NOT_BE_WEIGHED_AGAIN_UNDER_ITS_DECISIONS_OPEN_A_ROW_TO_READ_WHAT_IT_WOULD_CHANGE_NOW', true); ?>',
diffCreates: '<?php echo Text::_('COM_COMPONENTBUILDER_WOULD_BE_CREATED', true); ?>',
diffUpdates: '<?php echo Text::_('COM_COMPONENTBUILDER_WOULD_BE_UPDATED', true); ?>'
}
};
</script>
<?php else: ?>
<h1><?php echo Text::_('COM_COMPONENTBUILDER_NO_ACCESS_GRANTED'); ?></h1>
<?php endif; ?>