forked from qt-creator/qt-creator
Consolidate build/deploystep default display name handling
Use the display name from the factory as default, override if needed. Change-Id: I03519c998432fea4120b0de8b2fc2686644635f2 Reviewed-by: Christian Stenger <christian.stenger@qt.io> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -492,8 +492,6 @@ AndroidBuildApkStep::AndroidBuildApkStep(BuildStepList *parent, Utils::Id id)
|
||||
m_buildTargetSdk(AndroidConfig::apiLevelNameFor(AndroidConfigurations::
|
||||
sdkManager()->latestAndroidSdkPlatform()))
|
||||
{
|
||||
//: AndroidBuildApkStep default display name
|
||||
setDefaultDisplayName(tr("Build Android APK"));
|
||||
setImmutable(true);
|
||||
}
|
||||
|
||||
|
@@ -89,9 +89,6 @@ AndroidDeployQtStep::AndroidDeployQtStep(BuildStepList *parent, Utils::Id id)
|
||||
const QtSupport::BaseQtVersion * const qt = QtSupport::QtKitAspect::qtVersion(kit());
|
||||
m_uninstallPreviousPackage = qt && qt->qtVersion() < QtSupport::QtVersionNumber(5, 4, 0);
|
||||
|
||||
//: AndroidDeployQtStep default display name
|
||||
setDefaultDisplayName(tr("Deploy to Android Device"));
|
||||
|
||||
connect(this, &AndroidDeployQtStep::askForUninstall,
|
||||
this, &AndroidDeployQtStep::slotAskForUninstall,
|
||||
Qt::BlockingQueuedConnection);
|
||||
@@ -606,7 +603,7 @@ AndroidDeployQtStepFactory::AndroidDeployQtStepFactory()
|
||||
setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY);
|
||||
setSupportedDeviceType(Constants::ANDROID_DEVICE_TYPE);
|
||||
setRepeatable(false);
|
||||
setDisplayName(AndroidDeployQtStep::tr("Deploy to Android device or emulator"));
|
||||
setDisplayName(AndroidDeployQtStep::tr("Deploy to Android device"));
|
||||
}
|
||||
|
||||
} // Internal
|
||||
|
@@ -78,9 +78,7 @@ private:
|
||||
AndroidPackageInstallationStep::AndroidPackageInstallationStep(BuildStepList *bsl, Id id)
|
||||
: AbstractProcessStep(bsl, id)
|
||||
{
|
||||
const QString name = tr("Copy application data");
|
||||
setDefaultDisplayName(name);
|
||||
setDisplayName(name);
|
||||
setDisplayName(tr("Copy application data"));
|
||||
setWidgetExpandedByDefault(false);
|
||||
setImmutable(true);
|
||||
setSummaryUpdater([this] {
|
||||
|
@@ -73,8 +73,6 @@ private:
|
||||
|
||||
AutogenStep::AutogenStep(BuildStepList *bsl, Utils::Id id) : AbstractProcessStep(bsl, id)
|
||||
{
|
||||
setDefaultDisplayName(tr("Autogen"));
|
||||
|
||||
m_additionalArgumentsAspect = addAspect<StringAspect>();
|
||||
m_additionalArgumentsAspect->setSettingsKey(
|
||||
"AutotoolsProjectManager.AutogenStep.AdditionalArguments");
|
||||
|
@@ -72,8 +72,6 @@ private:
|
||||
AutoreconfStep::AutoreconfStep(BuildStepList *bsl, Utils::Id id)
|
||||
: AbstractProcessStep(bsl, id)
|
||||
{
|
||||
setDefaultDisplayName(tr("Autoreconf"));
|
||||
|
||||
m_additionalArgumentsAspect = addAspect<StringAspect>();
|
||||
m_additionalArgumentsAspect->setSettingsKey("AutotoolsProjectManager.AutoreconfStep.AdditionalArguments");
|
||||
m_additionalArgumentsAspect->setLabelText(tr("Arguments:"));
|
||||
|
@@ -93,8 +93,6 @@ private:
|
||||
ConfigureStep::ConfigureStep(BuildStepList *bsl, Utils::Id id)
|
||||
: AbstractProcessStep(bsl, id)
|
||||
{
|
||||
setDefaultDisplayName(tr("Configure"));
|
||||
|
||||
m_additionalArgumentsAspect = addAspect<StringAspect>();
|
||||
m_additionalArgumentsAspect->setDisplayStyle(StringAspect::LineEditDisplay);
|
||||
m_additionalArgumentsAspect->setSettingsKey(
|
||||
|
@@ -44,15 +44,11 @@ class QdbMakeDefaultAppStep final : public RemoteLinux::AbstractRemoteLinuxDeplo
|
||||
|
||||
public:
|
||||
QdbMakeDefaultAppStep(BuildStepList *bsl, Utils::Id id);
|
||||
|
||||
static QString stepDisplayName() { return tr("Change default application"); }
|
||||
};
|
||||
|
||||
QdbMakeDefaultAppStep::QdbMakeDefaultAppStep(BuildStepList *bsl, Utils::Id id)
|
||||
: AbstractRemoteLinuxDeployStep(bsl, id)
|
||||
{
|
||||
setDefaultDisplayName(stepDisplayName());
|
||||
|
||||
auto service = createDeployService<QdbMakeDefaultAppService>();
|
||||
|
||||
auto selection = addAspect<SelectionAspect>();
|
||||
@@ -71,7 +67,7 @@ QdbMakeDefaultAppStep::QdbMakeDefaultAppStep(BuildStepList *bsl, Utils::Id id)
|
||||
QdbMakeDefaultAppStepFactory::QdbMakeDefaultAppStepFactory()
|
||||
{
|
||||
registerStep<QdbMakeDefaultAppStep>(Constants::QdbMakeDefaultAppStepId);
|
||||
setDisplayName(QdbMakeDefaultAppStep::stepDisplayName());
|
||||
setDisplayName(QdbMakeDefaultAppStep::tr("Change default application"));
|
||||
setSupportedDeviceType(Qdb::Constants::QdbLinuxOsType);
|
||||
setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY);
|
||||
}
|
||||
|
@@ -43,8 +43,6 @@ class QdbStopApplicationStep final : public RemoteLinux::AbstractRemoteLinuxDepl
|
||||
|
||||
public:
|
||||
QdbStopApplicationStep(BuildStepList *bsl, Utils::Id id);
|
||||
|
||||
static QString stepDisplayName() { return tr("Stop already running application"); }
|
||||
};
|
||||
|
||||
QdbStopApplicationStep::QdbStopApplicationStep(BuildStepList *bsl, Utils::Id id)
|
||||
@@ -52,7 +50,6 @@ QdbStopApplicationStep::QdbStopApplicationStep(BuildStepList *bsl, Utils::Id id)
|
||||
{
|
||||
auto service = createDeployService<QdbStopApplicationService>();
|
||||
|
||||
setDefaultDisplayName(stepDisplayName());
|
||||
setWidgetExpandedByDefault(false);
|
||||
|
||||
setInternalInitializer([service] { return service->isDeploymentPossible(); });
|
||||
@@ -63,7 +60,7 @@ QdbStopApplicationStep::QdbStopApplicationStep(BuildStepList *bsl, Utils::Id id)
|
||||
QdbStopApplicationStepFactory::QdbStopApplicationStepFactory()
|
||||
{
|
||||
registerStep<QdbStopApplicationStep>(Constants::QdbStopApplicationStepId);
|
||||
setDisplayName(QdbStopApplicationStep::stepDisplayName());
|
||||
setDisplayName(QdbStopApplicationStep::tr("Stop already running application"));
|
||||
setSupportedDeviceType(Constants::QdbLinuxOsType);
|
||||
setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY);
|
||||
}
|
||||
|
@@ -172,9 +172,6 @@ Qt::ItemFlags CMakeTargetItem::flags(int) const
|
||||
CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl, Utils::Id id) :
|
||||
AbstractProcessStep(bsl, id)
|
||||
{
|
||||
//: Default display name for the cmake make step.
|
||||
setDefaultDisplayName(tr("CMake Build"));
|
||||
|
||||
m_cmakeArguments = addAspect<StringAspect>();
|
||||
m_cmakeArguments->setSettingsKey(CMAKE_ARGUMENTS_KEY);
|
||||
m_cmakeArguments->setLabelText(tr("CMake arguments:"));
|
||||
@@ -542,7 +539,7 @@ void CMakeBuildStep::processFinished(int exitCode, QProcess::ExitStatus status)
|
||||
CMakeBuildStepFactory::CMakeBuildStepFactory()
|
||||
{
|
||||
registerStep<CMakeBuildStep>(Constants::CMAKE_BUILD_STEP_ID);
|
||||
setDisplayName(CMakeBuildStep::tr("Build", "Display name for CMakeProjectManager::CMakeBuildStep id."));
|
||||
setDisplayName(CMakeBuildStep::tr("CMake Build", "Display name for CMakeProjectManager::CMakeBuildStep id."));
|
||||
setSupportedProjectType(Constants::CMAKE_PROJECT_ID);
|
||||
}
|
||||
|
||||
|
@@ -153,8 +153,6 @@ BuildStepConfigWidget *IosBuildStep::createConfigWidget()
|
||||
IosBuildStep::IosBuildStep(BuildStepList *stepList, Id id)
|
||||
: AbstractProcessStep(stepList, id)
|
||||
{
|
||||
setDefaultDisplayName(tr("xcodebuild"));
|
||||
|
||||
setCommandLineProvider([this] { return CommandLine(buildCommand(), allArguments()); });
|
||||
setUseEnglishOutput();
|
||||
|
||||
|
@@ -114,7 +114,6 @@ void IosDeployStep::updateDisplayNames()
|
||||
{
|
||||
IDevice::ConstPtr dev = DeviceKitAspect::device(kit());
|
||||
const QString devName = dev.isNull() ? IosDevice::name() : dev->displayName();
|
||||
setDefaultDisplayName(tr("Deploy to %1").arg(devName));
|
||||
setDisplayName(tr("Deploy to %1").arg(devName));
|
||||
}
|
||||
|
||||
@@ -316,7 +315,7 @@ IosSimulator::ConstPtr IosDeployStep::iossimulator() const
|
||||
IosDeployStepFactory::IosDeployStepFactory()
|
||||
{
|
||||
registerStep<IosDeployStep>(Constants::IOS_DEPLOY_STEP_ID);
|
||||
setDisplayName(IosDeployStep::tr("Deploy to iOS device or emulator"));
|
||||
setDisplayName(IosDeployStep::tr("Deploy to iOS device"));
|
||||
setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY);
|
||||
setSupportedDeviceTypes({Constants::IOS_DEVICE_TYPE, Constants::IOS_SIMULATOR_TYPE});
|
||||
setRepeatable(false);
|
||||
|
@@ -56,7 +56,6 @@ const char TOOL_ARGUMENTS_KEY[] = "MesonProjectManager.BuildStep.AdditionalArgum
|
||||
NinjaBuildStep::NinjaBuildStep(ProjectExplorer::BuildStepList *bsl, Utils::Id id)
|
||||
: ProjectExplorer::AbstractProcessStep{bsl, id}
|
||||
{
|
||||
setDefaultDisplayName(tr("Meson Build"));
|
||||
if (m_targetName.isEmpty())
|
||||
setBuildTarget(defaultBuildTarget());
|
||||
setLowPriority();
|
||||
@@ -215,7 +214,7 @@ MesonBuildStepFactory::MesonBuildStepFactory()
|
||||
{
|
||||
registerStep<NinjaBuildStep>(Constants::MESON_BUILD_STEP_ID);
|
||||
setSupportedProjectType(Constants::Project::ID);
|
||||
setDisplayName(NinjaBuildStep::tr("Meson"));
|
||||
setDisplayName(NinjaBuildStep::tr("Meson Build"));
|
||||
}
|
||||
|
||||
void MesonProjectManager::Internal::NinjaBuildStep::setBuildTarget(const QString &targetName)
|
||||
|
@@ -49,7 +49,6 @@ const char C_NIMBLEBUILDCONFIGURATION_BUILDTYPE[] = "Nim.NimbleBuildConfiguratio
|
||||
|
||||
// NimbleBuildStep
|
||||
const char C_NIMBLEBUILDSTEP_ID[] = "Nim.NimbleBuildStep";
|
||||
const char C_NIMBLEBUILDSTEP_DISPLAY[] = QT_TRANSLATE_NOOP("NimbleBuildStep", "Nimble Build");
|
||||
const char C_NIMBLEBUILDSTEP_ARGUMENTS[] = "Nim.NimbleBuildStep.Arguments";
|
||||
|
||||
// NimbleTaskStep
|
||||
@@ -60,7 +59,6 @@ const QString C_NIMBLETASKSTEP_TASKARGS = QStringLiteral("Nim.NimbleTaskStep.Tas
|
||||
|
||||
// NimCompilerBuildStep
|
||||
const char C_NIMCOMPILERBUILDSTEP_ID[] = "Nim.NimCompilerBuildStep";
|
||||
const char C_NIMCOMPILERBUILDSTEP_DISPLAY[] = QT_TRANSLATE_NOOP("NimCompilerBuildStep", "Nim Compiler Build Step");
|
||||
const QString C_NIMCOMPILERBUILDSTEP_USERCOMPILEROPTIONS = QStringLiteral("Nim.NimCompilerBuildStep.UserCompilerOptions");
|
||||
const QString C_NIMCOMPILERBUILDSTEP_DEFAULTBUILDOPTIONS = QStringLiteral("Nim.NimCompilerBuildStep.DefaultBuildOptions");
|
||||
const QString C_NIMCOMPILERBUILDSTEP_TARGETNIMFILE = QStringLiteral("Nim.NimCompilerBuildStep.TargetNimFile");
|
||||
|
@@ -99,9 +99,6 @@ private:
|
||||
NimbleBuildStep::NimbleBuildStep(BuildStepList *parentList, Id id)
|
||||
: AbstractProcessStep(parentList, id)
|
||||
{
|
||||
setDefaultDisplayName(tr(Constants::C_NIMBLEBUILDSTEP_DISPLAY));
|
||||
setDisplayName(tr(Constants::C_NIMBLEBUILDSTEP_DISPLAY));
|
||||
|
||||
m_arguments = addAspect<ArgumentsAspect>();
|
||||
m_arguments->setSettingsKey(Constants::C_NIMBLEBUILDSTEP_ARGUMENTS);
|
||||
m_arguments->setResetter([this] { return defaultArguments(); });
|
||||
|
@@ -93,8 +93,6 @@ class NimParser : public ProjectExplorer::OutputTaskParser
|
||||
NimCompilerBuildStep::NimCompilerBuildStep(BuildStepList *parentList, Utils::Id id)
|
||||
: AbstractProcessStep(parentList, id)
|
||||
{
|
||||
setDefaultDisplayName(tr(Constants::C_NIMCOMPILERBUILDSTEP_DISPLAY));
|
||||
setDisplayName(tr(Constants::C_NIMCOMPILERBUILDSTEP_DISPLAY));
|
||||
setCommandLineProvider([this] { return commandLine(); });
|
||||
|
||||
connect(project(), &ProjectExplorer::Project::fileListChanged,
|
||||
|
@@ -62,9 +62,6 @@ private:
|
||||
NimCompilerCleanStep::NimCompilerCleanStep(BuildStepList *parentList, Utils::Id id)
|
||||
: BuildStep(parentList, id)
|
||||
{
|
||||
setDefaultDisplayName(tr("Nim Clean Step"));
|
||||
setDisplayName(tr("Nim Clean Step"));
|
||||
|
||||
auto workingDirectory = addAspect<StringAspect>();
|
||||
workingDirectory->setLabelText(tr("Working directory:"));
|
||||
workingDirectory->setDisplayStyle(StringAspect::LineEditDisplay);
|
||||
@@ -140,7 +137,7 @@ NimCompilerCleanStepFactory::NimCompilerCleanStepFactory()
|
||||
setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
|
||||
setSupportedConfiguration(Constants::C_NIMBUILDCONFIGURATION_ID);
|
||||
setRepeatable(false);
|
||||
setDisplayName(NimCompilerCleanStep::tr("Nim Compiler Clean Step"));
|
||||
setDisplayName(NimCompilerCleanStep::tr("Nim Clean Step"));
|
||||
}
|
||||
|
||||
} // Nim
|
||||
|
@@ -467,12 +467,14 @@ Utils::Id BuildStepFactory::stepId() const
|
||||
|
||||
BuildStep *BuildStepFactory::create(BuildStepList *parent)
|
||||
{
|
||||
return m_info.creator(parent);
|
||||
BuildStep *step = m_info.creator(parent);
|
||||
step->setDefaultDisplayName(m_info.displayName);
|
||||
return step;
|
||||
}
|
||||
|
||||
BuildStep *BuildStepFactory::restore(BuildStepList *parent, const QVariantMap &map)
|
||||
{
|
||||
BuildStep *bs = m_info.creator(parent);
|
||||
BuildStep *bs = create(parent);
|
||||
if (!bs)
|
||||
return nullptr;
|
||||
if (!bs->fromMap(map)) {
|
||||
|
@@ -38,7 +38,6 @@ using namespace ProjectExplorer;
|
||||
DeviceCheckBuildStep::DeviceCheckBuildStep(BuildStepList *bsl, Utils::Id id)
|
||||
: BuildStep(bsl, id)
|
||||
{
|
||||
setDefaultDisplayName(displayName());
|
||||
setWidgetExpandedByDefault(false);
|
||||
}
|
||||
|
||||
|
@@ -70,7 +70,6 @@ namespace ProjectExplorer {
|
||||
MakeStep::MakeStep(BuildStepList *parent, Id id)
|
||||
: AbstractProcessStep(parent, id)
|
||||
{
|
||||
setDefaultDisplayName(defaultDisplayName());
|
||||
setLowPriority();
|
||||
|
||||
setCommandLineProvider([this] { return effectiveMakeCommand(Execution); });
|
||||
|
@@ -64,9 +64,6 @@ public:
|
||||
ProcessStep::ProcessStep(BuildStepList *bsl, Utils::Id id)
|
||||
: AbstractProcessStep(bsl, id)
|
||||
{
|
||||
//: Default ProcessStep display name
|
||||
setDefaultDisplayName(tr("Custom Process Step"));
|
||||
|
||||
m_command = addAspect<StringAspect>();
|
||||
m_command->setSettingsKey(PROCESS_COMMAND_KEY);
|
||||
m_command->setDisplayStyle(StringAspect::PathChooserDisplay);
|
||||
@@ -121,7 +118,8 @@ void ProcessStep::setupProcessParameters(ProcessParameters *pp)
|
||||
ProcessStepFactory::ProcessStepFactory()
|
||||
{
|
||||
registerStep<ProcessStep>("ProjectExplorer.ProcessStep");
|
||||
setDisplayName(ProcessStep::tr("Custom Process Step", "item in combobox"));
|
||||
//: Default ProcessStep display name
|
||||
setDisplayName(ProcessStep::tr("Custom Process Step"));
|
||||
}
|
||||
|
||||
} // Internal
|
||||
|
@@ -80,8 +80,6 @@ const char QMAKE_SELECTED_ABIS_KEY[] = "QtProjectManager.QMakeBuildStep.Selected
|
||||
QMakeStep::QMakeStep(BuildStepList *bsl, Utils::Id id)
|
||||
: AbstractProcessStep(bsl, id)
|
||||
{
|
||||
//: QMakeStep default display name
|
||||
setDefaultDisplayName(tr("qmake"));
|
||||
setLowPriority();
|
||||
}
|
||||
|
||||
@@ -778,6 +776,7 @@ QMakeStepFactory::QMakeStepFactory()
|
||||
registerStep<QMakeStep>(Constants::QMAKE_BS_ID);
|
||||
setSupportedConfiguration(Constants::QMAKE_BC_ID);
|
||||
setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
|
||||
//: QMakeStep default display name
|
||||
setDisplayName(QMakeStep::tr("qmake"));
|
||||
setFlags(BuildStepInfo::UniqueStep);
|
||||
}
|
||||
|
@@ -73,8 +73,6 @@ GenericDirectUploadStep::GenericDirectUploadStep(BuildStepList *bsl, Utils::Id i
|
||||
setRunPreparer([this, service] {
|
||||
service->setDeployableFiles(target()->deploymentData().allFiles());
|
||||
});
|
||||
|
||||
setDefaultDisplayName(displayName());
|
||||
}
|
||||
|
||||
GenericDirectUploadStep::~GenericDirectUploadStep() = default;
|
||||
|
@@ -57,8 +57,6 @@ const char CustomCommandLineAspectId[] = "RemoteLinux.MakeInstall.CustomCommandL
|
||||
|
||||
MakeInstallStep::MakeInstallStep(BuildStepList *parent, Utils::Id id) : MakeStep(parent, id)
|
||||
{
|
||||
setDefaultDisplayName(displayName());
|
||||
|
||||
const auto makeAspect = addAspect<ExecutableAspect>();
|
||||
makeAspect->setId(MakeAspectId);
|
||||
makeAspect->setSettingsKey(MakeAspectId);
|
||||
|
@@ -40,8 +40,6 @@ RemoteLinuxCheckForFreeDiskSpaceStep::RemoteLinuxCheckForFreeDiskSpaceStep
|
||||
(BuildStepList *bsl, Utils::Id id)
|
||||
: AbstractRemoteLinuxDeployStep(bsl, id)
|
||||
{
|
||||
setDefaultDisplayName(displayName());
|
||||
|
||||
auto service = createDeployService<RemoteLinuxCheckForFreeDiskSpaceService>();
|
||||
|
||||
auto pathToCheckAspect = addAspect<StringAspect>();
|
||||
|
@@ -47,8 +47,6 @@ RemoteLinuxCustomCommandDeploymentStep::RemoteLinuxCustomCommandDeploymentStep
|
||||
commandLine->setDisplayStyle(StringAspect::LineEditDisplay);
|
||||
commandLine->setHistoryCompleter("RemoteLinuxCustomCommandDeploymentStep.History");
|
||||
|
||||
setDefaultDisplayName(displayName());
|
||||
|
||||
setInternalInitializer([service, commandLine] {
|
||||
service->setCommandLine(commandLine->value().trimmed());
|
||||
return service->isDeploymentPossible();
|
||||
|
@@ -41,7 +41,6 @@ RemoteLinuxKillAppStep::RemoteLinuxKillAppStep(BuildStepList *bsl, Utils::Id id)
|
||||
{
|
||||
auto service = createDeployService<RemoteLinuxKillAppService>();
|
||||
|
||||
setDefaultDisplayName(displayName());
|
||||
setWidgetExpandedByDefault(false);
|
||||
|
||||
setInternalInitializer([this, service] {
|
||||
|
@@ -195,8 +195,6 @@ RsyncDeployStep::RsyncDeployStep(BuildStepList *bsl, Utils::Id id)
|
||||
BoolAspect::LabelPlacement::InExtraLabel);
|
||||
ignoreMissingFiles->setValue(false);
|
||||
|
||||
setDefaultDisplayName(displayName());
|
||||
|
||||
setInternalInitializer([service, flags, ignoreMissingFiles] {
|
||||
service->setIgnoreMissingFiles(ignoreMissingFiles->value());
|
||||
service->setFlags(flags->value());
|
||||
|
@@ -76,8 +76,6 @@ struct TarFileHeader {
|
||||
TarPackageCreationStep::TarPackageCreationStep(BuildStepList *bsl, Utils::Id id)
|
||||
: AbstractPackagingStep(bsl, id)
|
||||
{
|
||||
setDefaultDisplayName(displayName());
|
||||
|
||||
m_ignoreMissingFilesAspect = addAspect<BoolAspect>();
|
||||
m_ignoreMissingFilesAspect->setLabel(tr("Ignore missing files"),
|
||||
BoolAspect::LabelPlacement::AtCheckBox);
|
||||
|
@@ -66,7 +66,6 @@ UploadAndInstallTarPackageStep::UploadAndInstallTarPackageStep(BuildStepList *bs
|
||||
{
|
||||
auto service = createDeployService<UploadAndInstallTarPackageService>();
|
||||
|
||||
setDefaultDisplayName(displayName());
|
||||
setWidgetExpandedByDefault(false);
|
||||
|
||||
setInternalInitializer([this, service] {
|
||||
|
Reference in New Issue
Block a user