use container for process/render vars
This commit is contained in:
parent
783514eb44
commit
90677d76e5
2 changed files with 145 additions and 98 deletions
168
src/Manage.php
168
src/Manage.php
|
@ -39,123 +39,91 @@ class Manage extends dcNsProcess
|
|||
return false;
|
||||
}
|
||||
|
||||
// set vars used in process and render methods
|
||||
dcCore::app()->admin->translater = new Translater();
|
||||
dcCore::app()->admin->type = $_REQUEST['type'] ?? dcCore::app()->admin->translater->start_page ?: '';
|
||||
dcCore::app()->admin->module = $_REQUEST['module'] ?? '';
|
||||
dcCore::app()->admin->lang = $_REQUEST['lang'] ?? '';
|
||||
$action = $_POST['action'] ?? '';
|
||||
|
||||
// check module type
|
||||
if (!in_array(dcCore::app()->admin->type, ['plugin', 'theme'])) {
|
||||
dcCore::app()->admin->type = '';
|
||||
}
|
||||
// check if module exists
|
||||
if (!empty(dcCore::app()->admin->type) && !empty(dcCore::app()->admin->module)) {
|
||||
try {
|
||||
dcCore::app()->admin->module = dcCore::app()->admin->translater->getModule(dcCore::app()->admin->type, dcCore::app()->admin->module);
|
||||
} catch (Exception $e) {
|
||||
dcCore::app()->error->add($e->getMessage());
|
||||
dcCore::app()->admin->module = '';
|
||||
}
|
||||
}
|
||||
//check if module lang exists
|
||||
if (!empty(dcCore::app()->admin->module) && !empty(dcCore::app()->admin->lang)) {
|
||||
try {
|
||||
dcCore::app()->admin->lang = dcCore::app()->admin->translater->getLang(dcCore::app()->admin->module, dcCore::app()->admin->lang);
|
||||
} catch (Exception $e) {
|
||||
dcCore::app()->error->add($e->getMessage());
|
||||
dcCore::app()->admin->lang = '';
|
||||
}
|
||||
}
|
||||
$current = ManageContainer::init();
|
||||
|
||||
// execute action
|
||||
try {
|
||||
if ($action == 'module_create_backups') {
|
||||
if (empty(dcCore::app()->admin->module) || empty($_POST['codes'])) {
|
||||
if ($current->action == 'module_create_backups') {
|
||||
if (empty($current->module) || empty($_POST['codes'])) {
|
||||
throw new Exception(__('Nothing to backup'));
|
||||
}
|
||||
$module_codes = dcCore::app()->admin->module->getUsedlangs();
|
||||
foreach ($module_codes as $code_id) {
|
||||
foreach ($current->module->getUsedlangs() as $code_id) {
|
||||
if (in_array($code_id, $_POST['codes'])) {
|
||||
dcCore::app()->admin->module->createBackup($code_id);
|
||||
$current->module->createBackup($code_id);
|
||||
}
|
||||
}
|
||||
|
||||
self::redirect(__('Backup successfully created'));
|
||||
}
|
||||
|
||||
if ($action == 'module_restore_backup') {
|
||||
if (empty(dcCore::app()->admin->module) || empty($_POST['files'])) {
|
||||
if ($current->action == 'module_restore_backup') {
|
||||
if (empty($current->module) || empty($_POST['files'])) {
|
||||
throw new Exception(__('Nothing to restore'));
|
||||
}
|
||||
$module_backups = dcCore::app()->admin->module->getBackups(true);
|
||||
foreach ($module_backups as $backup_file) {
|
||||
foreach ($current->module->getBackups(true) as $backup_file) {
|
||||
if (in_array($backup_file, $_POST['files'])) {
|
||||
dcCore::app()->admin->module->restoreBackup($backup_file);
|
||||
$current->module->restoreBackup($backup_file);
|
||||
}
|
||||
}
|
||||
|
||||
self::redirect(__('Backup successfully restored'));
|
||||
}
|
||||
|
||||
if ($action == 'module_delete_backup') {
|
||||
if (empty(dcCore::app()->admin->module) || empty($_POST['files'])) {
|
||||
if ($current->action == 'module_delete_backup') {
|
||||
if (empty($current->module) || empty($_POST['files'])) {
|
||||
throw new Exception(__('Nothing to delete'));
|
||||
}
|
||||
$module_backups = dcCore::app()->admin->module->getBackups(true);
|
||||
foreach ($module_backups as $backup_file) {
|
||||
foreach ($current->module->getBackups(true) as $backup_file) {
|
||||
if (in_array($backup_file, $_POST['files'])) {
|
||||
dcCore::app()->admin->module->deleteBackup($backup_file);
|
||||
$current->module->deleteBackup($backup_file);
|
||||
}
|
||||
}
|
||||
|
||||
self::redirect(__('Backup successfully deleted'));
|
||||
}
|
||||
|
||||
if ($action == 'module_export_pack') {
|
||||
if (empty(dcCore::app()->admin->module) || empty($_POST['codes'])) {
|
||||
if ($current->action == 'module_export_pack') {
|
||||
if (empty($current->module) || empty($_POST['codes'])) {
|
||||
throw new Exception(__('Nothing to export'));
|
||||
}
|
||||
dcCore::app()->admin->module->exportPack($_POST['codes']);
|
||||
$current->module->exportPack($_POST['codes']);
|
||||
|
||||
self::redirect(__('Language successfully exported'));
|
||||
}
|
||||
|
||||
if ($action == 'module_import_pack') {
|
||||
if ($current->action == 'module_import_pack') {
|
||||
if (empty($_FILES['packfile']['name'])) {
|
||||
throw new Exception(__('Nothing to import'));
|
||||
}
|
||||
dcCore::app()->admin->module->importPack($_FILES['packfile']);
|
||||
$current->module->importPack($_FILES['packfile']);
|
||||
|
||||
self::redirect(__('Language successfully imported'));
|
||||
}
|
||||
|
||||
if ($action == 'module_add_code') {
|
||||
if (empty(dcCore::app()->admin->module) || empty($_POST['code'])) {
|
||||
if ($current->action == 'module_add_code') {
|
||||
if (empty($current->module) || empty($_POST['code'])) {
|
||||
throw new Exception(__('Nothing to create'));
|
||||
}
|
||||
dcCore::app()->admin->module->addLang($_POST['code'], $_POST['from'] ?? '');
|
||||
$current->module->addLang($_POST['code'], $_POST['from'] ?? '');
|
||||
|
||||
self::redirect(__('Language successfully added'), $_POST['code']);
|
||||
}
|
||||
|
||||
if ($action == 'module_delete_codes') {
|
||||
if (empty(dcCore::app()->admin->module) || empty($_POST['codes'])) {
|
||||
if ($current->action == 'module_delete_codes') {
|
||||
if (empty($current->module) || empty($_POST['codes'])) {
|
||||
throw new Exception(__('Nothing to delete'));
|
||||
}
|
||||
$module_codes = dcCore::app()->admin->module->getUsedlangs();
|
||||
foreach ($module_codes as $code_id) {
|
||||
foreach ($current->module->getUsedlangs() as $code_id) {
|
||||
if (in_array($code_id, $_POST['codes'])) {
|
||||
dcCore::app()->admin->module->delLang($code_id);
|
||||
$current->module->delLang($code_id);
|
||||
}
|
||||
}
|
||||
|
||||
self::redirect(__('Language successfully deleted'), $_POST['code']);
|
||||
}
|
||||
|
||||
if ($action == 'module_update_code') {
|
||||
if (empty(dcCore::app()->admin->module) || empty($_POST['code']) || empty($_POST['entries'])) {
|
||||
if ($current->action == 'module_update_code') {
|
||||
if (empty($current->module) || empty($_POST['code']) || empty($_POST['entries'])) {
|
||||
throw new Exception(__('Nothing to update'));
|
||||
}
|
||||
if (!empty($_POST['update_group'])) {
|
||||
|
@ -165,7 +133,7 @@ class Manage extends dcNsProcess
|
|||
}
|
||||
}
|
||||
}
|
||||
dcCore::app()->admin->module->updLang($_POST['code'], $_POST['entries']);
|
||||
$current->module->updLang($_POST['code'], $_POST['entries']);
|
||||
|
||||
self::redirect(__('Language successfully updated'), $_POST['code']);
|
||||
}
|
||||
|
@ -182,18 +150,20 @@ class Manage extends dcNsProcess
|
|||
return;
|
||||
}
|
||||
|
||||
$current = ManageContainer::init();
|
||||
|
||||
$breadcrumb = [My::name() => dcCore::app()->adminurl->get(My::id(), ['type' => '-'])];
|
||||
if (empty(dcCore::app()->admin->type)) {
|
||||
if (empty($current->type)) {
|
||||
$breadcrumb = [My::name() => ''];
|
||||
} elseif (empty(dcCore::app()->admin->module)) {
|
||||
$breadcrumb[dcCore::app()->admin->type == 'plugin' ? __('Plugins') : __('Themes')] = '';
|
||||
} elseif (empty(dcCore::app()->admin->lang)) {
|
||||
$breadcrumb[dcCore::app()->admin->type == 'plugin' ? __('Plugins') : __('Themes')] = dcCore::app()->adminurl->get(My::id(), ['type' => dcCore::app()->admin->type]);
|
||||
$breadcrumb[html::escapeHTML(dcCore::app()->admin->module->name)] = '';
|
||||
} elseif (!empty(dcCore::app()->admin->lang)) {
|
||||
$breadcrumb[dcCore::app()->admin->type == 'plugin' ? __('Plugins') : __('Themes')] = dcCore::app()->adminurl->get(My::id(), ['type' => dcCore::app()->admin->type]);
|
||||
$breadcrumb[html::escapeHTML(dcCore::app()->admin->module->name)] = dcCore::app()->adminurl->get(My::id(), ['type' => dcCore::app()->admin->type, 'module' => dcCore::app()->admin->module->id]);
|
||||
$breadcrumb[html::escapeHTML(sprintf(__('%s language edition'), dcCore::app()->admin->lang->name))] = '';
|
||||
} elseif (empty($current->module)) {
|
||||
$breadcrumb[$current->type == 'plugin' ? __('Plugins') : __('Themes')] = '';
|
||||
} elseif (empty($current->lang)) {
|
||||
$breadcrumb[$current->type == 'plugin' ? __('Plugins') : __('Themes')] = dcCore::app()->adminurl->get(My::id(), ['type' => $current->type]);
|
||||
$breadcrumb[html::escapeHTML($current->module->name)] = '';
|
||||
} elseif (!empty($current->lang)) {
|
||||
$breadcrumb[$current->type == 'plugin' ? __('Plugins') : __('Themes')] = dcCore::app()->adminurl->get(My::id(), ['type' => $current->type]);
|
||||
$breadcrumb[html::escapeHTML($current->module->name)] = dcCore::app()->adminurl->get(My::id(), ['type' => $current->type, 'module' => $current->module->id]);
|
||||
$breadcrumb[html::escapeHTML(sprintf(__('%s language edition'), $current->lang->name))] = '';
|
||||
}
|
||||
|
||||
dcPage::openModule(
|
||||
|
@ -215,15 +185,15 @@ class Manage extends dcNsProcess
|
|||
dcPage::breadcrumb($breadcrumb) .
|
||||
dcPage::notices();
|
||||
|
||||
if (empty(dcCore::app()->admin->module) && dcCore::app()->admin->type != '') {
|
||||
if (empty($current->module) && $current->type != '') {
|
||||
// modules list
|
||||
echo '<form id="theme-form" method="post" action="' . dcCore::app()->adminurl->get(My::id(), ['type' => 'plugin']) . '">';
|
||||
|
||||
$res = '';
|
||||
$modules = dcCore::app()->admin->translater->getModules(dcCore::app()->admin->type);
|
||||
$modules = $current->translater->getModules($current->type);
|
||||
ksort($modules);
|
||||
foreach ($modules as $module) {
|
||||
if (dcCore::app()->admin->translater->hide_default && in_array($module->id, My::defaultDistribModules(dcCore::app()->admin->type))) {
|
||||
if ($current->translater->hide_default && in_array($module->id, My::defaultDistribModules($current->type))) {
|
||||
continue;
|
||||
}
|
||||
if ($module->root_writable) {
|
||||
|
@ -264,7 +234,7 @@ class Manage extends dcNsProcess
|
|||
echo '
|
||||
<div class="table-outer">
|
||||
<table class="clear">
|
||||
<caption>' . sprintf(__('Modules list of type "%s"'), dcCore::app()->admin->type) . '</caption>
|
||||
<caption>' . sprintf(__('Modules list of type "%s"'), $current->type) . '</caption>
|
||||
<tr>
|
||||
<th class="nowrap">' . __('Id') . '</th>
|
||||
<th class="nowrap">' . __('Languages') . '</th>
|
||||
|
@ -279,17 +249,17 @@ class Manage extends dcNsProcess
|
|||
echo '</form>';
|
||||
|
||||
dcPage::helpBlock('translater.type');
|
||||
} elseif (!empty(dcCore::app()->admin->module) && empty(dcCore::app()->admin->lang)) {
|
||||
$codes = dcCore::app()->admin->module->getUsedLangs();
|
||||
$backups = dcCore::app()->admin->module->getBackups();
|
||||
$unused_codes = dcCore::app()->admin->module->getUnusedLangs();
|
||||
} elseif (!empty($current->module) && empty($current->lang)) {
|
||||
$codes = $current->module->getUsedLangs();
|
||||
$backups = $current->module->getBackups();
|
||||
$unused_codes = $current->module->getUnusedLangs();
|
||||
|
||||
// module summary
|
||||
echo '<h3>' . sprintf(__('Module %s %s by %s'), dcCore::app()->admin->module->name, dcCore::app()->admin->module->version, dcCore::app()->admin->module->author) . '</h3>
|
||||
echo '<h3>' . sprintf(__('Module %s %s by %s'), $current->module->name, $current->module->version, $current->module->author) . '</h3>
|
||||
<ul class="nice col">
|
||||
<li><strong>' . __('Root') . '</strong> ' . dcCore::app()->admin->module->root . '</li>
|
||||
<li><strong>' . __('Locales') . '</strong> ' . dcCore::app()->admin->module->locales . '</li>
|
||||
<li><strong>' . __('Backups') . '</strong> ' . dcCore::app()->admin->module->getBackupRoot() . '</li>
|
||||
<li><strong>' . __('Root') . '</strong> ' . $current->module->root . '</li>
|
||||
<li><strong>' . __('Locales') . '</strong> ' . $current->module->locales . '</li>
|
||||
<li><strong>' . __('Backups') . '</strong> ' . $current->module->getBackupRoot() . '</li>
|
||||
</ul>
|
||||
<p> </p>';
|
||||
|
||||
|
@ -313,7 +283,7 @@ class Manage extends dcNsProcess
|
|||
'<td class="minimal">' . form::checkbox(['codes[]', 'existing_code_' . $code_id], $code_id, '', '', '', false) . '</td>' .
|
||||
'<td class="nowrap">' .
|
||||
'<a href="' .
|
||||
dcCore::app()->adminurl->get(My::id(), ['type' => dcCore::app()->admin->module->type, 'module' => dcCore::app()->admin->module->id, 'lang' => $code_id])
|
||||
dcCore::app()->adminurl->get(My::id(), ['type' => $current->module->type, 'module' => $current->module->id, 'lang' => $code_id])
|
||||
. '" title="' . sprintf(__('Edit %s language'), html::escapeHTML($code_name)) . '">' . $code_name . '</a>' .
|
||||
'</td>' .
|
||||
'<td class="nowrap maximal"> ' . $code_id . '</td>';
|
||||
|
@ -348,7 +318,7 @@ class Manage extends dcNsProcess
|
|||
dcCore::app()->formNonce() .
|
||||
dcCore::app()->adminurl->getHiddenFormFields(
|
||||
My::id(),
|
||||
['type' => dcCore::app()->admin->module->type, 'module' => dcCore::app()->admin->module->id]
|
||||
['type' => $current->module->type, 'module' => $current->module->id]
|
||||
) . '
|
||||
</p></div></form><p> </p></div>';
|
||||
}
|
||||
|
@ -390,7 +360,7 @@ class Manage extends dcNsProcess
|
|||
$backup_code['name'],
|
||||
$backup_code['code'],
|
||||
dt::str(
|
||||
dcCore::app()->blog->settings->get('system')->get('date_format') . ' ' . dcCore::app()->blog->settings->get('system->time_format'),
|
||||
dcCore::app()->blog->settings->get('system')->get('date_format') . ' ' . dcCore::app()->blog->settings->get('system')->get('time_format'),
|
||||
(int) $backup_code['time'],
|
||||
dcCore::app()->blog->settings->get('system')->get('blog_timezone')
|
||||
),
|
||||
|
@ -413,7 +383,7 @@ class Manage extends dcNsProcess
|
|||
dcCore::app()->formNonce() .
|
||||
dcCore::app()->adminurl->getHiddenFormFields(
|
||||
My::id(),
|
||||
['type' => dcCore::app()->admin->module->type, 'module' => dcCore::app()->admin->module->id]
|
||||
['type' => $current->module->type, 'module' => $current->module->id]
|
||||
) . '
|
||||
</p></div></form><p> </p></div>';
|
||||
}
|
||||
|
@ -439,7 +409,7 @@ class Manage extends dcNsProcess
|
|||
dcCore::app()->formNonce() .
|
||||
dcCore::app()->adminurl->getHiddenFormFields(
|
||||
My::id(),
|
||||
['type' => dcCore::app()->admin->module->type, 'module' => dcCore::app()->admin->module->id, 'action' => 'module_add_code']
|
||||
['type' => $current->module->type, 'module' => $current->module->id, 'action' => 'module_add_code']
|
||||
) . '
|
||||
</p></form><p> </p></div>';
|
||||
}
|
||||
|
@ -454,15 +424,15 @@ class Manage extends dcNsProcess
|
|||
dcCore::app()->formNonce() .
|
||||
dcCore::app()->adminurl->getHiddenFormFields(
|
||||
My::id(),
|
||||
['type' => dcCore::app()->admin->module->type, 'module' => dcCore::app()->admin->module->id, 'action' => 'module_import_pack']
|
||||
['type' => $current->module->type, 'module' => $current->module->id, 'action' => 'module_import_pack']
|
||||
) . '
|
||||
</p></form><p> </p></div>';
|
||||
|
||||
echo '</div>';
|
||||
|
||||
dcPage::helpBlock('translater.module');
|
||||
} elseif (!empty(dcCore::app()->admin->lang)) {
|
||||
$lines = dcCore::app()->admin->lang->getMessages();
|
||||
} elseif (!empty($current->lang)) {
|
||||
$lines = $current->lang->getMessages();
|
||||
$allowed_l10n_groups = [];
|
||||
|
||||
echo
|
||||
|
@ -491,7 +461,7 @@ class Manage extends dcNsProcess
|
|||
|
||||
$i = 1;
|
||||
foreach ($lines as $msgid => $rs) {
|
||||
$in_dc = ($rs['in_dc'] && dcCore::app()->admin->translater->parse_nodc);
|
||||
$in_dc = $rs['in_dc'] && $current->translater->parse_nodc ? true : false;
|
||||
$t_msgstr = $t_files = $strin = [];
|
||||
|
||||
foreach ($rs['o_msgstrs'] as $o_msgstr) {
|
||||
|
@ -535,7 +505,7 @@ class Manage extends dcNsProcess
|
|||
|
||||
if (!empty($rs['plural'])) {
|
||||
$t_msgstr = $strin = [];
|
||||
foreach (dcCore::app()->admin->lang->plural as $j => $plural) {
|
||||
foreach ($current->lang->plural as $j => $plural) {
|
||||
foreach ($rs['o_msgstrs'] as $o_msgstr) {
|
||||
if (isset($o_msgstr['msgstr'][$j + 1])) {
|
||||
if (!isset($strin[$o_msgstr['msgstr'][$j + 1]])) {
|
||||
|
@ -591,10 +561,10 @@ class Manage extends dcNsProcess
|
|||
'<p class="col right">' .
|
||||
'<input id="do-action" type="submit" value="' . __('Save') . ' (s)" accesskey="s" /></p>' .
|
||||
dcCore::app()->formNonce() .
|
||||
form::hidden(['code'], dcCore::app()->admin->lang->code) .
|
||||
form::hidden(['code'], $current->lang->code) .
|
||||
dcCore::app()->adminurl->getHiddenFormFields(
|
||||
My::id(),
|
||||
['type' => dcCore::app()->admin->module->type, 'module' => dcCore::app()->admin->module->id, 'lang' => dcCore::app()->admin->lang->code, 'action' => 'module_update_code']
|
||||
['type' => $current->module->type, 'module' => $current->module->id, 'lang' => $current->lang->code, 'action' => 'module_update_code']
|
||||
) .
|
||||
'</p></div>' .
|
||||
'</form>' .
|
||||
|
@ -610,13 +580,13 @@ class Manage extends dcNsProcess
|
|||
sprintf(
|
||||
$line,
|
||||
dcCore::app()->adminurl->get(My::id(), ['type' => 'plugin']),
|
||||
dcCore::app()->admin->type == 'plugin' ? ' class="active"' : '',
|
||||
$current->type == 'plugin' ? ' class="active"' : '',
|
||||
__('Translate plugins')
|
||||
) .
|
||||
sprintf(
|
||||
$line,
|
||||
dcCore::app()->adminurl->get(My::id(), ['type' => 'theme']),
|
||||
dcCore::app()->admin->type == 'theme' ? ' class="active"' : '',
|
||||
$current->type == 'theme' ? ' class="active"' : '',
|
||||
__('Translate themes')
|
||||
)
|
||||
);
|
||||
|
@ -629,9 +599,11 @@ class Manage extends dcNsProcess
|
|||
|
||||
private static function redirect(string $msg, ?string $lang = null): void
|
||||
{
|
||||
$current = ManageContainer::init();
|
||||
|
||||
$redir = [
|
||||
'type' => dcCore::app()->admin->type,
|
||||
'module' => dcCore::app()->admin->module->id,
|
||||
'type' => $current->type,
|
||||
'module' => $current->module->id,
|
||||
];
|
||||
if ($lang) {
|
||||
$redir['lang'] = $lang;
|
||||
|
|
75
src/ManageContainer.php
Normal file
75
src/ManageContainer.php
Normal file
|
@ -0,0 +1,75 @@
|
|||
<?php
|
||||
/**
|
||||
* @brief translater, a plugin for Dotclear 2
|
||||
*
|
||||
* @package Dotclear
|
||||
* @subpackage Plugin
|
||||
*
|
||||
* @author Jean-Christian Denis & contributors
|
||||
*
|
||||
* @copyright Jean-Christian Denis
|
||||
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Dotclear\Plugin\translater;
|
||||
|
||||
use dcCore;
|
||||
|
||||
class ManageContainer
|
||||
{
|
||||
private static ManageContainer $container;
|
||||
|
||||
public readonly Translater $translater;
|
||||
public readonly string|TranslaterModule $module;
|
||||
public readonly string|TranslaterLang $lang;
|
||||
public readonly string $type;
|
||||
public readonly string $action;
|
||||
|
||||
protected function __construct()
|
||||
{
|
||||
$this->translater = new Translater();
|
||||
|
||||
$type = $_REQUEST['type'] ?? $this->translater->start_page ?: '';
|
||||
$module = $_REQUEST['module'] ?? '';
|
||||
$lang = $_REQUEST['lang'] ?? '';
|
||||
$action = $_POST['action'] ?? '';
|
||||
|
||||
// check module type
|
||||
if (!in_array($type, ['plugin', 'theme'])) {
|
||||
$type = '';
|
||||
}
|
||||
// check if module exists
|
||||
if (!empty($type) && !empty($module)) {
|
||||
try {
|
||||
$module = $this->translater->getModule($type, $module);
|
||||
} catch (Exception $e) {
|
||||
dcCore::app()->error->add($e->getMessage());
|
||||
$module = '';
|
||||
}
|
||||
}
|
||||
//check if module lang exists
|
||||
if (!empty($module) && !empty($lang)) {
|
||||
try {
|
||||
$lang = $this->translater->getLang($module, $lang);
|
||||
} catch (Exception $e) {
|
||||
dcCore::app()->error->add($e->getMessage());
|
||||
$lang = '';
|
||||
}
|
||||
}
|
||||
|
||||
$this->type = $type;
|
||||
$this->module = $module;
|
||||
$this->lang = $lang;
|
||||
$this->action = $action;
|
||||
}
|
||||
|
||||
public static function init(): ManageContainer
|
||||
{
|
||||
if (!(self::$container instanceof self)) {
|
||||
self::$container = new self();
|
||||
}
|
||||
|
||||
return self::$container;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue