Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e1109e925b | |||
| 6c67ab6259 | |||
| c467ed326c | |||
| 40cd64f667 | |||
| 05dae1031a |
+1
-1
@@ -3,7 +3,7 @@ node_modules/
|
|||||||
**/composer.lock
|
**/composer.lock
|
||||||
**/vendor/
|
**/vendor/
|
||||||
tools/
|
tools/
|
||||||
**/.env
|
**/configs/.env
|
||||||
**/.target
|
**/.target
|
||||||
package-lock.json
|
package-lock.json
|
||||||
build/
|
build/
|
||||||
|
|||||||
+3
-3
@@ -3,10 +3,10 @@
|
|||||||
<phar name="phpunit" version="~9.6" installed="9.6.34" location="./tools/phpunit" copy="false"/>
|
<phar name="phpunit" version="~9.6" installed="9.6.34" location="./tools/phpunit" copy="false"/>
|
||||||
<phar name="phpcbf" version="4" installed="4.0.1" location="./tools/phpcbf" copy="false"/>
|
<phar name="phpcbf" version="4" installed="4.0.1" location="./tools/phpcbf" copy="false"/>
|
||||||
<phar name="phpcs" version="4" installed="4.0.1" location="./tools/phpcs" copy="false"/>
|
<phar name="phpcs" version="4" installed="4.0.1" location="./tools/phpcs" copy="false"/>
|
||||||
<phar name="phpstan" version="^2.0" installed="2.1.54" location="./tools/phpstan" copy="false"/>
|
<phar name="phpstan" version="^2.0" installed="2.2.2" location="./tools/phpstan" copy="false"/>
|
||||||
<phar name="phan" version="^5.4.3" installed="5.5.2" location="./tools/phan" copy="false"/>
|
<phar name="phan" version="^5.4.3" installed="5.5.2" location="./tools/phan" copy="false"/>
|
||||||
<phar name="psalm" version="^5.26.1" installed="5.26.1" location="./tools/psalm" copy="false"/>
|
<phar name="psalm" version="^5.26.1" installed="5.26.1" location="./tools/psalm" copy="false"/>
|
||||||
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>
|
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>
|
||||||
<phar name="phpdocumentor" version="^3.4.2" installed="3.9.1" location="./tools/phpDocumentor" copy="false"/>
|
<phar name="phpdocumentor" version="^3.4.2" installed="3.10.0" location="./tools/phpDocumentor" copy="false"/>
|
||||||
<phar name="php-cs-fixer" version="^3.34.1" installed="3.95.1" location="./tools/php-cs-fixer" copy="false"/>
|
<phar name="php-cs-fixer" version="^3.34.1" installed="3.95.10" location="./tools/php-cs-fixer" copy="false"/>
|
||||||
</phive>
|
</phive>
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n"
|
"Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n"
|
"Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n"
|
"Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
|
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n"
|
"Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
|
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
test.env
|
||||||
@@ -1598,4 +1598,17 @@ function createNavMenu(nav_menu, header_id = 'mainHeader') // eslint-disable-lin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HTML decode &something; entrie
|
||||||
|
* @param {string} str
|
||||||
|
* @returns string
|
||||||
|
* @deprecated use utils.js
|
||||||
|
*/
|
||||||
|
function decodeHtmlEntities(str) // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const doc = parser.parseFromString(str, 'text/html');
|
||||||
|
return doc.documentElement.textContent;
|
||||||
|
}
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ var HtmlElementCreator = class {
|
|||||||
* @param {String} tag must set tag (div, span, etc)
|
* @param {String} tag must set tag (div, span, etc)
|
||||||
* @param {String} [id=''] optional set for id, if input, select will be used for name
|
* @param {String} [id=''] optional set for id, if input, select will be used for name
|
||||||
* @param {String} [content=''] text content inside, is skipped if sub elements exist
|
* @param {String} [content=''] text content inside, is skipped if sub elements exist
|
||||||
* @param {Array} [css=[]] array for css tags
|
* @param {Array<String>} [css=[]] array for css tags
|
||||||
* @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
|
* @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
|
||||||
* @return {Object} created element as an object
|
* @return {Object} created element as an object
|
||||||
*/
|
*/
|
||||||
@@ -509,6 +509,11 @@ function numberWithCommas(number) {
|
|||||||
function convertLBtoBR(string) {
|
function convertLBtoBR(string) {
|
||||||
return string.replace(/(?:\r\n|\r|\n)/g, "<br>");
|
return string.replace(/(?:\r\n|\r|\n)/g, "<br>");
|
||||||
}
|
}
|
||||||
|
function decodeHtmlEntities(str) {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const doc = parser.parseFromString(str, "text/html");
|
||||||
|
return doc.documentElement.textContent;
|
||||||
|
}
|
||||||
|
|
||||||
// src/utils/DateTimeHelpers.mjs
|
// src/utils/DateTimeHelpers.mjs
|
||||||
function getTimestamp() {
|
function getTimestamp() {
|
||||||
@@ -660,18 +665,19 @@ function getQueryStringParam(search = "", query = "", single = false) {
|
|||||||
if (search) {
|
if (search) {
|
||||||
let _params = url.searchParams.getAll(search);
|
let _params = url.searchParams.getAll(search);
|
||||||
if (_params.length == 1 || single === true) {
|
if (_params.length == 1 || single === true) {
|
||||||
param = _params[0];
|
return _params[0];
|
||||||
} else if (_params.length > 1) {
|
} else if (_params.length > 1) {
|
||||||
param = _params;
|
return _params;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
param = {};
|
let param2 = {};
|
||||||
for (const [key] of url.searchParams.entries()) {
|
for (const [key] of url.searchParams.entries()) {
|
||||||
if (typeof param[key] === "undefined") {
|
if (typeof param2[key] === "undefined") {
|
||||||
let _params = url.searchParams.getAll(key);
|
let _params = url.searchParams.getAll(key);
|
||||||
param[key] = _params.length < 2 || single === true ? _params[0] : _params;
|
param2[key] = _params.length < 2 || single === true ? _params[0] : _params;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return param2;
|
||||||
}
|
}
|
||||||
return param;
|
return param;
|
||||||
}
|
}
|
||||||
@@ -1425,6 +1431,9 @@ function numberWithCommas2(x) {
|
|||||||
function convertLBtoBR2(string) {
|
function convertLBtoBR2(string) {
|
||||||
return convertLBtoBR(string);
|
return convertLBtoBR(string);
|
||||||
}
|
}
|
||||||
|
function decodeHtmlEntities2(string) {
|
||||||
|
return decodeHtmlEntities(string);
|
||||||
|
}
|
||||||
function getTimestamp2() {
|
function getTimestamp2() {
|
||||||
return getTimestamp();
|
return getTimestamp();
|
||||||
}
|
}
|
||||||
@@ -1549,7 +1558,7 @@ function acssel(_element, css) {
|
|||||||
return hec.acssel(_element, css);
|
return hec.acssel(_element, css);
|
||||||
}
|
}
|
||||||
function scssel(_element, rcss, acss) {
|
function scssel(_element, rcss, acss) {
|
||||||
hec.scssel(_element, rcss, acss);
|
return hec.scssel(_element, rcss, acss);
|
||||||
}
|
}
|
||||||
function phfo(tree) {
|
function phfo(tree) {
|
||||||
return hec.phfo(tree);
|
return hec.phfo(tree);
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -43,7 +43,10 @@ class Byte
|
|||||||
public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string
|
public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string
|
||||||
{
|
{
|
||||||
// if not numeric, return as is
|
// if not numeric, return as is
|
||||||
if (is_numeric($bytes)) {
|
if (!is_numeric($bytes)) {
|
||||||
|
// if anything other return as string
|
||||||
|
return (string)$bytes;
|
||||||
|
}
|
||||||
// flags bit wise check
|
// flags bit wise check
|
||||||
// remove space between number and suffix
|
// remove space between number and suffix
|
||||||
if ($flags & self::BYTE_FORMAT_NOSPACE) {
|
if ($flags & self::BYTE_FORMAT_NOSPACE) {
|
||||||
@@ -104,10 +107,6 @@ class Byte
|
|||||||
} else {
|
} else {
|
||||||
return round($bytes_calc, 2) . $pre;
|
return round($bytes_calc, 2) . $pre;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// if anything other return as string
|
|
||||||
return (string)$bytes;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2232,9 +2232,9 @@ class IO
|
|||||||
$milliseconds = $matches[13] ?? '';
|
$milliseconds = $matches[13] ?? '';
|
||||||
|
|
||||||
// clean up, hide entries that have 00 in the time group
|
// clean up, hide entries that have 00 in the time group
|
||||||
$hour = $hour != '00' ? preg_replace('/^0/', '', $hour) : '';
|
$hour = !empty($hour) ? preg_replace('/^0/', '', $hour) : '';
|
||||||
$minutes = $minutes != '00' ? preg_replace('/^0/', '', $minutes) : '';
|
$minutes = !empty($minutes) ? preg_replace('/^0/', '', $minutes) : '';
|
||||||
$seconds = $seconds != '00' ? preg_replace('/^0/', '', $seconds) : '';
|
$seconds = !empty($seconds) ? preg_replace('/^0/', '', $seconds) : '';
|
||||||
|
|
||||||
// strip any leading or trailing spaces
|
// strip any leading or trailing spaces
|
||||||
$time_string = trim(
|
$time_string = trim(
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ class L10n
|
|||||||
* @param string $locale language name, if not set, try previous set
|
* @param string $locale language name, if not set, try previous set
|
||||||
* @param string $domain set name for mo file, if not set, try previous set
|
* @param string $domain set name for mo file, if not set, try previous set
|
||||||
* @param string $path path, if not set try to get from paths array, else self
|
* @param string $path path, if not set try to get from paths array, else self
|
||||||
* @param string $override_encoding if locale does not env encoding set, use this one
|
* @param string $override_encoding if locale does not have encoding set, use this one
|
||||||
* @return GetTextReader the main gettext reader object
|
* @return GetTextReader the main gettext reader object
|
||||||
*/
|
*/
|
||||||
public function getTranslator(
|
public function getTranslator(
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ enum Level: int
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name
|
* @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name
|
||||||
* @return static
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function fromName(string $name): self
|
public static function fromName(string $name): self
|
||||||
{
|
{
|
||||||
@@ -104,7 +104,7 @@ enum Level: int
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param value-of<self::VALUES> $value
|
* @param value-of<self::VALUES> $value
|
||||||
* @return static
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function fromValue(int $value): self
|
public static function fromValue(int $value): self
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -232,8 +232,15 @@ class Elements
|
|||||||
* @param string $class style sheet
|
* @param string $class style sheet
|
||||||
* @return string correct string for url href process
|
* @return string correct string for url href process
|
||||||
*/
|
*/
|
||||||
private static function createUrl($href, $atag, $_1, $_2, $_3, $name, $class): string
|
private static function createUrl(
|
||||||
{
|
string $href,
|
||||||
|
string $atag,
|
||||||
|
string $_1,
|
||||||
|
string $_2,
|
||||||
|
string $_3,
|
||||||
|
string $name,
|
||||||
|
string $class
|
||||||
|
): string {
|
||||||
// $this->debug('URL', "1: $_1 - 2: $_2 - $_3 - atag: $atag - name: $name - class: $class");
|
// $this->debug('URL', "1: $_1 - 2: $_2 - $_3 - atag: $atag - name: $name - class: $class");
|
||||||
// if $_1 ends with //, then we strip $_1 complete & target is also blanked (its an internal link)
|
// if $_1 ends with //, then we strip $_1 complete & target is also blanked (its an internal link)
|
||||||
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2)) {
|
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2)) {
|
||||||
@@ -250,11 +257,8 @@ class Elements
|
|||||||
. "##GT##" . ($name ? $name : $_2 . $_3) . "##LT##/a##GT##";
|
. "##GT##" . ($name ? $name : $_2 . $_3) . "##LT##/a##GT##";
|
||||||
} elseif ($href && !$atag) {
|
} elseif ($href && !$atag) {
|
||||||
return "href=##QUOT##$_1$_2$_3##QUOT##";
|
return "href=##QUOT##$_1$_2$_3##QUOT##";
|
||||||
} elseif ($atag) {
|
|
||||||
return $atag . $_2 . $_3;
|
|
||||||
} else {
|
|
||||||
return $href;
|
|
||||||
}
|
}
|
||||||
|
return $atag . $_2 . $_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -269,8 +273,15 @@ class Elements
|
|||||||
* @param string $class style sheet
|
* @param string $class style sheet
|
||||||
* @return string created html email a href string
|
* @return string created html email a href string
|
||||||
*/
|
*/
|
||||||
private static function createEmail($mailto, $atag, $_1, $_2, $_3, $title, $class)
|
private static function createEmail(
|
||||||
{
|
string $mailto,
|
||||||
|
string $atag,
|
||||||
|
string $_1,
|
||||||
|
string $_2,
|
||||||
|
string $_3,
|
||||||
|
string $title,
|
||||||
|
string $class
|
||||||
|
): string {
|
||||||
$email = $_1 . "@" . $_2 . "." . $_3;
|
$email = $_1 . "@" . $_2 . "." . $_3;
|
||||||
if (!$mailto && !$atag) {
|
if (!$mailto && !$atag) {
|
||||||
return "##LT##a href=##QUOT##mailto:" . $email . "##QUOT##"
|
return "##LT##a href=##QUOT##mailto:" . $email . "##QUOT##"
|
||||||
@@ -278,12 +289,8 @@ class Elements
|
|||||||
. "##GT##" . ($title ? $title : $email) . "##LT##/a##GT##";
|
. "##GT##" . ($title ? $title : $email) . "##LT##/a##GT##";
|
||||||
} elseif ($mailto && !$atag) {
|
} elseif ($mailto && !$atag) {
|
||||||
return "mailto:" . $email;
|
return "mailto:" . $email;
|
||||||
} elseif ($atag) {
|
|
||||||
return $atag . $email;
|
|
||||||
} else {
|
|
||||||
// else just return email as is
|
|
||||||
return $email;
|
|
||||||
}
|
}
|
||||||
|
return $atag . $email;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -954,11 +954,10 @@ class Curl implements Interface\RequestsInterface
|
|||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
unset($this->config['headers'][$header_key]);
|
unset($this->config['headers'][$header_key]);
|
||||||
unset($this->headers_named[$header_key]);
|
unset($this->headers_named[strtolower($header_key)]);
|
||||||
} elseif (
|
} elseif (
|
||||||
// string value, array keys = in
|
// right side is array, and value is anything string or array
|
||||||
// or both array and not a full match in the one before
|
// if right side is string, and we give value array, we do nothing
|
||||||
(is_string($value) || is_array($value)) &&
|
|
||||||
is_array($this->config['headers'][$header_key])
|
is_array($this->config['headers'][$header_key])
|
||||||
) {
|
) {
|
||||||
// part remove of key, value must be array
|
// part remove of key, value must be array
|
||||||
@@ -966,10 +965,14 @@ class Curl implements Interface\RequestsInterface
|
|||||||
$value = [$value];
|
$value = [$value];
|
||||||
}
|
}
|
||||||
// array values so we rewrite the key pos
|
// array values so we rewrite the key pos
|
||||||
$this->config['headers'][$header_key] = array_values(array_diff(
|
/** @var array<int|string,string> $headers */
|
||||||
$this->config['headers'][$header_key],
|
$headers = $this->config['headers'][$header_key];
|
||||||
|
$this->config['headers'][$header_key] = array_values(
|
||||||
|
array_diff(
|
||||||
|
$headers,
|
||||||
$value
|
$value
|
||||||
));
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user