add panel for beaglequeue parameters + arrange so that a checkbox can enable/disable other params
This commit is contained in:
parent
ce9e528a42
commit
f581d3b522
@ -278,17 +278,17 @@ ConfParamFNW::ConfParamFNW(QWidget *parent, ConfLink cflink,
|
||||
m_le->sizePolicy().hasHeightForWidth()));
|
||||
m_hl->addWidget(m_le);
|
||||
|
||||
QPushButton *pb = new QPushButton(this);
|
||||
pb->setText(tr("Browse"));
|
||||
pb->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,
|
||||
QSizePolicy::Fixed,
|
||||
0, // Horizontal stretch
|
||||
0, // Vertical stretch
|
||||
pb->sizePolicy().hasHeightForWidth()));
|
||||
m_hl->addWidget(pb);
|
||||
m_pb = new QPushButton(this);
|
||||
m_pb->setText(tr("Browse"));
|
||||
m_pb->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,
|
||||
QSizePolicy::Fixed,
|
||||
0, // Horizontal stretch
|
||||
0, // Vertical stretch
|
||||
m_pb->sizePolicy().hasHeightForWidth()));
|
||||
m_hl->addWidget(m_pb);
|
||||
|
||||
loadValue();
|
||||
QObject::connect(pb, SIGNAL(clicked()), this, SLOT(showBrowserDialog()));
|
||||
QObject::connect(m_pb, SIGNAL(clicked()), this, SLOT(showBrowserDialog()));
|
||||
QObject::connect(m_le, SIGNAL(textChanged(const QString&)),
|
||||
this, SLOT(setValue(const QString&)));
|
||||
}
|
||||
|
||||
@ -45,6 +45,7 @@ class QLISTBOX;
|
||||
class QSpinBox;
|
||||
class QComboBox;
|
||||
class QCheckBox;
|
||||
class QPushButton;
|
||||
|
||||
namespace confgui {
|
||||
|
||||
@ -89,18 +90,19 @@ namespace confgui {
|
||||
bool m_fsencoding;
|
||||
virtual bool createCommon(const QString& lbltxt,
|
||||
const QString& tltptxt);
|
||||
|
||||
public slots:
|
||||
virtual void setEnabled(bool) = 0;
|
||||
protected slots:
|
||||
void setValue(const QString& newvalue);
|
||||
void setValue(int newvalue);
|
||||
void setValue(bool newvalue);
|
||||
};
|
||||
|
||||
|
||||
// Widgets for setting the different types of configuration parameters:
|
||||
|
||||
// Int
|
||||
class ConfParamIntW : public ConfParamW {
|
||||
Q_OBJECT
|
||||
public:
|
||||
ConfParamIntW(QWidget *parent, ConfLink cflink,
|
||||
const QString& lbltxt,
|
||||
@ -108,40 +110,51 @@ namespace confgui {
|
||||
int minvalue = INT_MIN,
|
||||
int maxvalue = INT_MAX);
|
||||
virtual void loadValue();
|
||||
public slots:
|
||||
virtual void setEnabled(bool i) {if(m_sb) ((QWidget*)m_sb)->setEnabled(i);}
|
||||
protected:
|
||||
QSpinBox *m_sb;
|
||||
};
|
||||
|
||||
// Arbitrary string
|
||||
class ConfParamStrW : public ConfParamW {
|
||||
Q_OBJECT
|
||||
public:
|
||||
ConfParamStrW(QWidget *parent, ConfLink cflink,
|
||||
const QString& lbltxt,
|
||||
const QString& tltptxt);
|
||||
virtual void loadValue();
|
||||
public slots:
|
||||
virtual void setEnabled(bool i) {if(m_le) ((QWidget*)m_le)->setEnabled(i);}
|
||||
protected:
|
||||
QLineEdit *m_le;
|
||||
};
|
||||
|
||||
// Constrained string: choose from list
|
||||
class ConfParamCStrW : public ConfParamW {
|
||||
Q_OBJECT
|
||||
public:
|
||||
ConfParamCStrW(QWidget *parent, ConfLink cflink,
|
||||
const QString& lbltxt,
|
||||
const QString& tltptxt, const QStringList& sl);
|
||||
virtual void loadValue();
|
||||
public slots:
|
||||
virtual void setEnabled(bool i) {if(m_cmb) ((QWidget*)m_cmb)->setEnabled(i);}
|
||||
protected:
|
||||
QComboBox *m_cmb;
|
||||
};
|
||||
|
||||
// Boolean
|
||||
class ConfParamBoolW : public ConfParamW {
|
||||
Q_OBJECT
|
||||
public:
|
||||
ConfParamBoolW(QWidget *parent, ConfLink cflink,
|
||||
const QString& lbltxt,
|
||||
const QString& tltptxt);
|
||||
virtual void loadValue();
|
||||
protected:
|
||||
public slots:
|
||||
virtual void setEnabled(bool i) {if(m_cb) ((QWidget*)m_cb)->setEnabled(i);}
|
||||
public:
|
||||
QCheckBox *m_cb;
|
||||
};
|
||||
|
||||
@ -155,8 +168,15 @@ namespace confgui {
|
||||
virtual void loadValue();
|
||||
protected slots:
|
||||
void showBrowserDialog();
|
||||
public slots:
|
||||
virtual void setEnabled(bool i)
|
||||
{
|
||||
if(m_le) ((QWidget*)m_le)->setEnabled(i);
|
||||
if(m_pb) ((QWidget*)m_pb)->setEnabled(i);
|
||||
}
|
||||
protected:
|
||||
QLineEdit *m_le;
|
||||
QPushButton *m_pb;
|
||||
bool m_isdir;
|
||||
};
|
||||
|
||||
@ -170,6 +190,8 @@ namespace confgui {
|
||||
virtual void loadValue();
|
||||
QLISTBOX *getListBox() {return m_lb;}
|
||||
|
||||
public slots:
|
||||
virtual void setEnabled(bool i) {if(m_lb) ((QWidget*)m_lb)->setEnabled(i);}
|
||||
protected slots:
|
||||
virtual void showInputDialog();
|
||||
void deleteSelected();
|
||||
|
||||
@ -45,6 +45,7 @@ static char rcsid[] = "@(#$Id: confguiindex.cpp,v 1.13 2008-09-30 12:38:29 docke
|
||||
#include QLISTBOX_INCLUDE
|
||||
#include <qtimer.h>
|
||||
#include <qmessagebox.h>
|
||||
#include <qcheckbox.h>
|
||||
|
||||
#include <list>
|
||||
using std::list;
|
||||
@ -130,6 +131,57 @@ void ConfIndexW::reloadPanels()
|
||||
w = new ConfSubPanelW(this, m_conf);
|
||||
m_widgets.push_back(w);
|
||||
addTab(w, QObject::tr("Local parameters"));
|
||||
|
||||
w = new ConfBeaglePanelW(this, m_conf);
|
||||
m_widgets.push_back(w);
|
||||
addTab(w, QObject::tr("Beagle web history"));
|
||||
|
||||
}
|
||||
|
||||
ConfBeaglePanelW::ConfBeaglePanelW(QWidget *parent, ConfNull *config)
|
||||
: QWidget(parent)
|
||||
{
|
||||
QVBOXLAYOUT *vboxLayout = new QVBOXLAYOUT(this);
|
||||
vboxLayout->setSpacing(spacing);
|
||||
vboxLayout->setMargin(margin);
|
||||
QGROUPBOX *gb1 = new QGROUPBOX(1, Qt::Horizontal, this);
|
||||
gb1->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
|
||||
QSizePolicy::Preferred,
|
||||
1, // Horizontal stretch
|
||||
3, // Vertical stretch
|
||||
gb1->sizePolicy().hasHeightForWidth()));
|
||||
gb1->setFlat(1);
|
||||
// gb1->setInsideMargin(0);
|
||||
// gb1->setInsideSpacing(0);
|
||||
|
||||
ConfLink lnk1(new ConfLinkRclRep(config, "processbeaglequeue"));
|
||||
ConfParamBoolW* cp1 =
|
||||
new ConfParamBoolW(gb1, lnk1, tr("Process Beagle queue"),
|
||||
tr("Beagle MUST NOT be running. Enables processing "
|
||||
"the beagle queue to index Firefox web history.<br>"
|
||||
"(you must also install the Firefox Beagle Plugin)"
|
||||
));
|
||||
|
||||
ConfLink lnk2(new ConfLinkRclRep(config, "webcachedir"));
|
||||
ConfParamFNW* cp2 =
|
||||
new ConfParamFNW(gb1, lnk2, tr("Web cache directory name"),
|
||||
tr("The name for a directory where to store the cache "
|
||||
"for visited web pages.<br>"
|
||||
"A non-absolute path is taken relative to the "
|
||||
"configuration directory."), true);
|
||||
cp2->setEnabled(cp1->m_cb->isOn());
|
||||
connect(cp1->m_cb, SIGNAL(toggled(bool)), cp2, SLOT(setEnabled(bool)));
|
||||
|
||||
ConfLink lnk3(new ConfLinkRclRep(config, "webcachemaxmbs"));
|
||||
ConfParamIntW *cp3 =
|
||||
new ConfParamIntW(gb1, lnk3, tr("Max. size for the web cache (MB)"),
|
||||
tr("Entries will be recycled once the size is reached"),
|
||||
-1, 1000);
|
||||
cp3->setEnabled(cp1->m_cb->isOn());
|
||||
connect(cp1->m_cb, SIGNAL(toggled(bool)), cp3, SLOT(setEnabled(bool)));
|
||||
|
||||
vboxLayout->addWidget(gb1);
|
||||
|
||||
}
|
||||
|
||||
ConfTopPanelW::ConfTopPanelW(QWidget *parent, ConfNull *config)
|
||||
@ -179,44 +231,65 @@ ConfTopPanelW::ConfTopPanelW(QWidget *parent, ConfNull *config)
|
||||
"Use 'stderr' for terminal output"), false);
|
||||
vboxLayout->addWidget(e4);
|
||||
|
||||
QGROUPBOX *groupbox1 = new QGROUPBOX(2, Qt::Horizontal, this);
|
||||
groupbox1->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
|
||||
QSizePolicy::Preferred,
|
||||
1, // Horizontal stretch
|
||||
3, // Vertical stretch
|
||||
groupbox1->sizePolicy().hasHeightForWidth()));
|
||||
groupbox1->setFlat(1);
|
||||
groupbox1->setInsideMargin(0);
|
||||
groupbox1->setInsideSpacing(0);
|
||||
|
||||
ConfLink lnk1(new ConfLinkRclRep(config, "loglevel"));
|
||||
ConfParamIntW *e1 = new
|
||||
ConfParamIntW(this, lnk1, tr("Log verbosity level"),
|
||||
new ConfParamIntW(groupbox1, lnk1, tr("Log verbosity level"),
|
||||
tr("This value adjusts the amount of "
|
||||
"messages,<br>from only errors to a "
|
||||
"lot of debugging data."), 0, 6);
|
||||
vboxLayout->addWidget(e1);
|
||||
|
||||
ConfLink lnkidxflsh(new ConfLinkRclRep(config, "idxflushmb"));
|
||||
ConfParamIntW *eidxflsh = new
|
||||
ConfParamIntW(this, lnkidxflsh, tr("Index flush megabytes interval"),
|
||||
|
||||
new ConfParamIntW(groupbox1, lnkidxflsh,
|
||||
tr("Index flush megabytes interval"),
|
||||
tr("This value adjust the amount of "
|
||||
"data which is indexed between flushes to disk.<br>"
|
||||
"This helps control the indexer memory usage. "
|
||||
"Default 10MB "), 0, 1000);
|
||||
vboxLayout->addWidget(eidxflsh);
|
||||
|
||||
ConfLink lnkfsocc(new ConfLinkRclRep(config, "maxfsoccuppc"));
|
||||
ConfParamIntW *efsocc = new
|
||||
ConfParamIntW(this, lnkfsocc, tr("Max disk occupation (%)"),
|
||||
new ConfParamIntW(groupbox1, lnkfsocc, tr("Max disk occupation (%)"),
|
||||
tr("This is the percentage of disk occupation where "
|
||||
"indexing will fail and stop (to avoid filling up "
|
||||
"your disk).<br>"
|
||||
"0 means no limit (this is the default)."), 0, 100);
|
||||
vboxLayout->addWidget(efsocc);
|
||||
|
||||
ConfLink lnkusfc(new ConfLinkRclRep(config, "usesystemfilecommand"));
|
||||
new ConfParamBoolW(groupbox1, lnkusfc, tr("Use system's 'file' command"),
|
||||
tr("Use the system's 'file' command if internal<br>"
|
||||
"mime type identification fails."));
|
||||
vboxLayout->addWidget(groupbox1);
|
||||
|
||||
|
||||
QGROUPBOX *groupbox2 = new QGROUPBOX(2, Qt::Horizontal, this);
|
||||
groupbox2->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
|
||||
QSizePolicy::Preferred,
|
||||
1, // Horizontal stretch
|
||||
3, // Vertical stretch
|
||||
groupbox1->sizePolicy().hasHeightForWidth()));
|
||||
groupbox2->setFlat(1);
|
||||
groupbox2->setInsideMargin(0);
|
||||
groupbox2->setInsideSpacing(0);
|
||||
|
||||
ConfLink lnknaspl(new ConfLinkRclRep(config, "noaspell"));
|
||||
ConfParamBoolW *enaspl = new
|
||||
ConfParamBoolW(this, lnknaspl, tr("No aspell usage"),
|
||||
ConfParamBoolW* cpasp =
|
||||
new ConfParamBoolW(groupbox2, lnknaspl, tr("No aspell usage"),
|
||||
tr("Disables use of aspell to generate spelling "
|
||||
"approximation in the term explorer tool.<br> "
|
||||
"Useful if aspell is absent or does not work. "));
|
||||
vboxLayout->addWidget(enaspl);
|
||||
|
||||
ConfLink lnk2(new ConfLinkRclRep(config, "aspellLanguage"));
|
||||
ConfParamStrW *e2 = new
|
||||
ConfParamStrW(this, lnk2, tr("Aspell language"),
|
||||
ConfParamStrW* cpaspl =
|
||||
new ConfParamStrW(groupbox2, lnk2, tr("Aspell language"),
|
||||
tr("The language for the aspell dictionary. "
|
||||
"This should look like 'en' or 'fr' ...<br>"
|
||||
"If this value is not set, the NLS environment "
|
||||
@ -224,7 +297,10 @@ ConfTopPanelW::ConfTopPanelW(QWidget *parent, ConfNull *config)
|
||||
"To get an idea of what is installed on your system, "
|
||||
"type 'aspell config' and look for .dat files inside "
|
||||
"the 'data-dir' directory. "));
|
||||
vboxLayout->addWidget(e2);
|
||||
cpaspl->setEnabled(!cpasp->m_cb->isOn());
|
||||
connect(cpasp->m_cb, SIGNAL(toggled(bool)), cpaspl,SLOT(setDisabled(bool)));
|
||||
|
||||
vboxLayout->addWidget(groupbox2);
|
||||
|
||||
ConfLink lnkdbd(new ConfLinkRclRep(config, "dbdir"));
|
||||
ConfParamFNW *edbd = new
|
||||
@ -235,12 +311,6 @@ ConfTopPanelW::ConfTopPanelW(QWidget *parent, ConfNull *config)
|
||||
), true);
|
||||
vboxLayout->addWidget(edbd);
|
||||
|
||||
ConfLink lnkusfc(new ConfLinkRclRep(config, "usesystemfilecommand"));
|
||||
ConfParamBoolW *eusfc = new
|
||||
ConfParamBoolW(this, lnkusfc, tr("Use system's 'file' command"),
|
||||
tr("Use the system's 'file' command if internal<br>"
|
||||
"mime type identification fails."));
|
||||
vboxLayout->addWidget(eusfc);
|
||||
}
|
||||
|
||||
ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
@ -257,11 +327,6 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
QObject::tr("The list of subdirectories in the indexed "
|
||||
"hierarchy <br>where some parameters need "
|
||||
"to be redefined. Default: empty."));
|
||||
m_subdirs->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
|
||||
QSizePolicy::Preferred,
|
||||
1, // Horizontal stretch
|
||||
1, // Vertical stretch
|
||||
m_subdirs->sizePolicy().hasHeightForWidth()));
|
||||
m_subdirs->getListBox()->setSelectionMode(QLISTBOX::Single);
|
||||
connect(m_subdirs->getListBox(), SIGNAL(selectionChanged()),
|
||||
this, SLOT(subDirChanged()));
|
||||
@ -276,6 +341,11 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
m_subdirs->getListBox()->insertStringList(qls);
|
||||
vboxLayout->addWidget(m_subdirs);
|
||||
|
||||
QFRAME *line2 = new QFRAME(this);
|
||||
line2->setFrameShape(QFRAME::HLine);
|
||||
line2->setFrameShadow(QFRAME::Sunken);
|
||||
vboxLayout->addWidget(line2);
|
||||
|
||||
QLabel *explain = new QLabel(this);
|
||||
explain->setText(
|
||||
QObject::
|
||||
@ -287,10 +357,6 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
"the +/- buttons."));
|
||||
vboxLayout->addWidget(explain);
|
||||
|
||||
QFRAME *line2 = new QFRAME(this);
|
||||
line2->setFrameShape(QFRAME::HLine);
|
||||
line2->setFrameShadow(QFRAME::Sunken);
|
||||
vboxLayout->addWidget(line2);
|
||||
|
||||
m_groupbox = new QGROUPBOX(1, Qt::Horizontal, this);
|
||||
m_groupbox->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
|
||||
@ -338,9 +404,19 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
), charsets);
|
||||
m_widgets.push_back(e21);
|
||||
|
||||
QGROUPBOX *groupbox1 = new QGROUPBOX(2, Qt::Horizontal, m_groupbox);
|
||||
groupbox1->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
|
||||
QSizePolicy::Preferred,
|
||||
1, // Horizontal stretch
|
||||
3, // Vertical stretch
|
||||
groupbox1->sizePolicy().hasHeightForWidth()));
|
||||
groupbox1->setFlat(1);
|
||||
groupbox1->setInsideMargin(0);
|
||||
groupbox1->setInsideSpacing(0);
|
||||
|
||||
ConfLink lnk3(new ConfLinkRclRep(config, "followLinks", &m_sk));
|
||||
ConfParamBoolW *e3 = new
|
||||
ConfParamBoolW(m_groupbox, lnk3,
|
||||
ConfParamBoolW(groupbox1, lnk3,
|
||||
QObject::tr("Follow symbolic links"),
|
||||
QObject::tr("Follow symbolic links while "
|
||||
"indexing. The default is no, "
|
||||
@ -349,7 +425,7 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
|
||||
ConfLink lnkafln(new ConfLinkRclRep(config, "indexallfilenames", &m_sk));
|
||||
ConfParamBoolW *eafln = new
|
||||
ConfParamBoolW(m_groupbox, lnkafln,
|
||||
ConfParamBoolW(groupbox1, lnkafln,
|
||||
QObject::tr("Index all file names"),
|
||||
QObject::tr("Index the names of files for which the contents "
|
||||
"cannot be identified or processed (no or "
|
||||
@ -358,7 +434,7 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
|
||||
ConfLink lnkzfmaxkbs(new ConfLinkRclRep(config, "compressedfilemaxkbs"));
|
||||
ConfParamIntW *ezfmaxkbs = new
|
||||
ConfParamIntW(m_groupbox, lnkzfmaxkbs,
|
||||
ConfParamIntW(groupbox1, lnkzfmaxkbs,
|
||||
tr("Max. compressed file size (KB)"),
|
||||
tr("This value sets a threshold beyond which compressed"
|
||||
"files will not be processed. Set to -1 for no "
|
||||
@ -368,7 +444,7 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
|
||||
ConfLink lnktxtmaxmbs(new ConfLinkRclRep(config, "textfilemaxmbs"));
|
||||
ConfParamIntW *etxtmaxmbs = new
|
||||
ConfParamIntW(m_groupbox, lnktxtmaxmbs,
|
||||
ConfParamIntW(groupbox1, lnktxtmaxmbs,
|
||||
tr("Max. text file size (MB)"),
|
||||
tr("This value sets a threshold beyond which text "
|
||||
"files will not be processed. Set to -1 for no "
|
||||
@ -379,7 +455,7 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
|
||||
ConfLink lnktxtpagekbs(new ConfLinkRclRep(config, "textfilepagekbs"));
|
||||
ConfParamIntW *etxtpagekbs = new
|
||||
ConfParamIntW(m_groupbox, lnktxtpagekbs,
|
||||
ConfParamIntW(groupbox1, lnktxtpagekbs,
|
||||
tr("Text file page size (KB)"),
|
||||
tr("If this value is set (not equal to -1), text "
|
||||
"files will be split in chunks of this size for "
|
||||
@ -388,12 +464,9 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
-1, 1000000);
|
||||
m_widgets.push_back(etxtpagekbs);
|
||||
|
||||
vboxLayout->addWidget(m_groupbox);
|
||||
subDirChanged();
|
||||
|
||||
ConfLink lnkfiltmaxsecs(new ConfLinkRclRep(config, "filtermaxseconds"));
|
||||
ConfParamIntW *efiltmaxsecs = new
|
||||
ConfParamIntW(m_groupbox, lnkfiltmaxsecs,
|
||||
ConfParamIntW(groupbox1, lnkfiltmaxsecs,
|
||||
tr("Max. filter exec. time (S)"),
|
||||
tr("External filters working longer than this will be "
|
||||
"aborted. This is for the rare case (ie: postscript) "
|
||||
@ -402,6 +475,9 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
|
||||
-1, 10000);
|
||||
m_widgets.push_back(efiltmaxsecs);
|
||||
|
||||
|
||||
vboxLayout->addWidget(m_groupbox);
|
||||
subDirChanged();
|
||||
}
|
||||
|
||||
void ConfSubPanelW::reloadAll()
|
||||
|
||||
@ -54,6 +54,11 @@ public:
|
||||
ConfTopPanelW(QWidget *parent, ConfNull *config);
|
||||
};
|
||||
|
||||
#if QT_VERSION < 0x040000
|
||||
#include <qgroupbox.h>
|
||||
#else
|
||||
#include <Q3GroupBox>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* A panel for the parameters that can be changed in subdirectories:
|
||||
@ -72,11 +77,23 @@ private:
|
||||
ConfParamDNLW *m_subdirs;
|
||||
list<ConfParamW*> m_widgets;
|
||||
ConfNull *m_config;
|
||||
#if QT_VERSION < 0x040000
|
||||
QGroupBox *m_groupbox;
|
||||
|
||||
#else
|
||||
Q3GroupBox *m_groupbox;
|
||||
#endif
|
||||
void reloadAll();
|
||||
};
|
||||
|
||||
/**
|
||||
* Extra or little used parameters
|
||||
*/
|
||||
class ConfBeaglePanelW : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
ConfBeaglePanelW(QWidget *parent, ConfNull *config);
|
||||
};
|
||||
|
||||
} // Namespace confgui
|
||||
|
||||
#endif /* _confguiindex_h_included_ */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user