Fix refresh display status
This commit is contained in:
@@ -158,20 +158,16 @@ namespace MP_TAB_SERV.Components
|
||||
}
|
||||
}
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
isLoading = RecMSE == null;
|
||||
await setGaugeVals();
|
||||
await Task.Delay(1);
|
||||
setGaugeVals();
|
||||
}
|
||||
|
||||
protected async Task setGaugeVals()
|
||||
protected void setGaugeVals()
|
||||
{
|
||||
await Task.Delay(1);
|
||||
Log.Info("MBlock 01");
|
||||
if (RecMSE != null)
|
||||
{
|
||||
Log.Info("MBlock 02");
|
||||
innerCircleVals.Clear();
|
||||
outerCircleVals.Clear();
|
||||
currMaxVal = int.Parse(RecMSE.NumPezzi.ToString()!);
|
||||
@@ -184,7 +180,7 @@ namespace MP_TAB_SERV.Components
|
||||
{
|
||||
outerCircleVals.Add(new CircleGaugeMulti.CircSegm() { Color = "#1367FD", Value = RecMSE.extraVal });
|
||||
}
|
||||
Log.Info("MBlock 03");
|
||||
//Log.Trace($"MBlock | {RecMSE.IdxMacchina} | 03");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
</div>
|
||||
@if (cancelSetupEnabled)
|
||||
{
|
||||
<div class="col-12 col-sm-12 col-md-6 p-2">
|
||||
<div class="col-12 col-md-6 p-2">
|
||||
<button class="btn btn-lg btn-danger w-100">Annulla Setup ODL <i class="fa-solid fa-ban me-1"></i></button>
|
||||
</div>
|
||||
}
|
||||
@@ -54,9 +54,9 @@
|
||||
<h4>@titleOdlDetail</h4>
|
||||
</div>
|
||||
<div>
|
||||
@if (idxPOdlSel == 0)
|
||||
@if (idxPOdlSel == 0 && !inAttr)
|
||||
{
|
||||
<button class="btn btn-lg btn-dark w-100" disabled="@inAttr" @onclick="ToggleOdlDetail"><i class="fa-solid fa-chevron-up"></i> @txtBtnOdlDetail</button>
|
||||
<button class="btn btn-lg btn-dark w-100" @onclick="ToggleOdlDetail"><i class="fa-solid fa-chevron-up"></i> @txtBtnOdlDetail</button>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
@@ -111,7 +111,14 @@
|
||||
TCiclo:
|
||||
</div>
|
||||
<div class="px-0 text-end fw-bold">
|
||||
@currPodl.Tcassegnato.ToString("N2")
|
||||
@if (currOdl != null && currOdl.Tcassegnato > 0)
|
||||
{
|
||||
@currOdl.Tcassegnato.ToString("N2")
|
||||
}
|
||||
else
|
||||
{
|
||||
@currPodl.Tcassegnato.ToString("N2")
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col d-flex justify-content-between">
|
||||
@@ -153,6 +160,16 @@
|
||||
|
||||
@if (!inAttr)
|
||||
{
|
||||
<div class="col-12 col-md-6">
|
||||
@if (idxPOdlSel > 0)
|
||||
{
|
||||
<button class="btn btn-lg btn-primary w-100" @onclick="OdlSetupStart"><i class="fa-solid fa-check me-1"></i> INIZIO Attrezzaggio</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<button class="btn btn-lg btn-primary w-100" disabled="@endProdDisabled" @onclick="ProdEnd"><i class="fa-solid fa-ban me-1"></i>FINE Produzione</button>
|
||||
}
|
||||
</div>
|
||||
<div class="col-12 col-md-6 mb-2">
|
||||
<div class="input-group input-group-lg">
|
||||
<input type="text" class="form-control w-25" placeholder="Cerca" aria-label="Cerca">
|
||||
@@ -170,21 +187,14 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
@if (idxPOdlSel > 0)
|
||||
{
|
||||
<button class="btn btn-lg btn-primary w-100" @onclick="OdlSetupStart"><i class="fa-solid fa-check me-1"></i> INIZIO Attrezzaggio</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
</div>
|
||||
}
|
||||
@if (idxPOdlSel > 0 || inAttr)
|
||||
{
|
||||
<div class="col-12 col-sm-6">
|
||||
<label class="form-label">note Attrezzaggio</label>
|
||||
<textarea class="form-control" rows="3" @bind="@noteAttr"></textarea>
|
||||
<div class="form-floating">
|
||||
<textarea type="text" class="form-control" style="height: 7rem;" @bind="@noteAttr"></textarea>
|
||||
<label for="floatingComm">Note Attrezzaggio (opzionale)</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-sm-6">
|
||||
<SelTempoMSMC TempoMC="@tcRichAttr" modoControllo="SelTempoMSMC.timeControlMode.selettori" E_TCRich="SaveTCRich"></SelTempoMSMC>
|
||||
@@ -204,26 +214,26 @@
|
||||
|
||||
@if (inAttr)
|
||||
{
|
||||
<div class="col-12 col-sm-12 col-md-6 p-2">
|
||||
<div class="col-12 col-md-6 p-2">
|
||||
<button class="btn btn-lg btn-warning w-100" disabled="@needConfProd" @onclick="OdlSetupEnd"><i class="fa-solid fa-check me-1"></i> FINE Attr / INIZIO Prod.</button>
|
||||
</div>
|
||||
}
|
||||
<div class="col-12 col-sm-12 col-md-6 p-2">
|
||||
<button class="btn btn-lg btn-primary w-100" disabled="@needConfProd" @onclick="ProdEnd"><i class="fa-solid fa-ban me-1"></i>FINE Produzione</button>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-md-6 p-2">
|
||||
<div class="form-check form-switch fs-3">
|
||||
<input class="form-check-input" type="checkbox" @bind="@forceCloseOdl">
|
||||
<label class="form-check-label">@Traduci("ForceCloseODL")</label>
|
||||
else
|
||||
{
|
||||
<div class="col-12 col-md-6 p-2">
|
||||
<div class="form-check form-switch fs-3">
|
||||
<input class="form-check-input" type="checkbox" @bind="@forceCloseOdl">
|
||||
<label class="form-check-label">@Traduci("ForceCloseODL")</label>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<div class="col-12 col-md-6 p-2">
|
||||
<button class="btn btn-lg btn-success w-100" @onclick="() => SendFixEndSetup()"><i class="fa-solid fa-wrench me-1"></i> Fix Chiusura Arttrezzaggio (PLC)</button>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-md-6 p-2">
|
||||
<div class="col-12 col-md-6 p-2">
|
||||
<button class="btn btn-lg btn-info w-100" disabled="@needConfProd"><i class="fa-solid fa-triangle-exclamation me-1"></i> Mostra Riattrezzaggio</button>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-md-6 p-2">
|
||||
<button class="btn btn-lg btn-success w-100" disabled="@needConfProd"><i class="fa-solid fa-wrench me-1"></i> Fix Chiusura Arttrezzaggio (PLC)</button>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-md-6 p-2">
|
||||
<div class="col-12 col-md-6 p-2">
|
||||
<button class="btn btn-lg btn-danger w-100" disabled="@needConfProd"><i class="fa-solid fa-circle-exclamation me-1"></i> Creazione ODL Provvisorio</button>
|
||||
@* <div class="col-sm-12" runat="server" id="divOdlProvv">
|
||||
<div class="card">
|
||||
|
||||
@@ -152,8 +152,7 @@ namespace MP_TAB_SERV.Components
|
||||
// se in attr --> carico podlCurr...
|
||||
if (inAttr && RecMSE != null)
|
||||
{
|
||||
int currIdxPOdl = RecMSE != null ? RecMSE.IdxPOdl ?? 0 : 0;
|
||||
currPodl = await TabDServ.PODLExp_getByKey(currIdxPOdl);
|
||||
await ReloadXDL(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -284,7 +283,7 @@ namespace MP_TAB_SERV.Components
|
||||
idxOdl = idxODLStart;
|
||||
await advStep(currStep++);
|
||||
// faccio refresh e riporto
|
||||
await refreshData();
|
||||
await RefreshData();
|
||||
await CheckAttr();
|
||||
// chiudo update...
|
||||
isProcessing = false;
|
||||
@@ -296,8 +295,13 @@ namespace MP_TAB_SERV.Components
|
||||
/// <returns></returns>
|
||||
protected async Task OdlSetupStart()
|
||||
{
|
||||
if (!await JSRuntime.InvokeAsync<bool>("confirm", $"Confermi inizio della fase di attrezzaggio per l'articolo [{currPodl.CodArticolo}] {currPodl.DescArticolo}?"))
|
||||
TimeSpan estDur = TimeSpan.FromMinutes((double)tcRichAttr * currPodl.NumPezzi);
|
||||
string stima = estDur.TotalHours > 1 ? $"{estDur.TotalHours:N1} ore" : $"{estDur.TotalMinutes:N1} min";
|
||||
if (!await JSRuntime.InvokeAsync<bool>("confirm", $"PODL: {currPodl.IdxPromessa}{Environment.NewLine}Art: [{currPodl.CodArticolo}] {currPodl.DescArticolo}{Environment.NewLine}Pezzi: {currPodl.NumPezzi:N0} * TCiclo: {tcRichAttr:N3}min{Environment.NewLine}Tempo stimato: {stima}{Environment.NewLine}{Environment.NewLine}Confermi inizio della fase di attrezzaggio?"))
|
||||
return;
|
||||
|
||||
//if (!await JSRuntime.InvokeAsync<bool>("confirm", $"Confermi inizio della fase di attrezzaggio per l'articolo [{currPodl.CodArticolo}] {currPodl.DescArticolo}?"))
|
||||
// return;
|
||||
/***************************************************
|
||||
* comprende gestione machineSlave x fix ODL master --> slave
|
||||
*
|
||||
@@ -489,7 +493,7 @@ namespace MP_TAB_SERV.Components
|
||||
checkBtnStatus();
|
||||
fixSplitBtn(false);
|
||||
// faccio refresh e riporto
|
||||
await refreshData();
|
||||
await RefreshData();
|
||||
await CheckAttr();
|
||||
isProcessing = false;
|
||||
}
|
||||
@@ -622,13 +626,13 @@ namespace MP_TAB_SERV.Components
|
||||
}
|
||||
await advStep(currStep++);
|
||||
// faccio refresh e riporto
|
||||
await refreshData();
|
||||
await RefreshData();
|
||||
await CheckAttr();
|
||||
await advStep(currStep++);
|
||||
isProcessing = false;
|
||||
}
|
||||
|
||||
protected async Task refreshData()
|
||||
protected async Task RefreshData()
|
||||
{
|
||||
// refresh tabella dati tablet...
|
||||
TabDServ.RicalcMse(IdxMaccSel, 0);
|
||||
@@ -638,10 +642,8 @@ namespace MP_TAB_SERV.Components
|
||||
{
|
||||
// salvo in LocalStorage...
|
||||
await MServ.SaveMse(ListMSE);
|
||||
#if false
|
||||
// aggiorno MSE attuale
|
||||
RecMSE = ListMSE.Find(x => x.IdxMacchina == IdxMaccSel);
|
||||
#endif
|
||||
await E_Updated.InvokeAsync(ListMSE);
|
||||
}
|
||||
// update dati liste ODL
|
||||
@@ -662,7 +664,7 @@ namespace MP_TAB_SERV.Components
|
||||
string baseUrlAdmin = SMServ.GetConf("baseUrlAdmin");
|
||||
string pageUrlApprODL = SMServ.GetConf("pageUrlApprODL");
|
||||
string pageUrl = $"{baseUrlAdmin}{pageUrlApprODL}";
|
||||
string corpo = $"<b>ODL: {idxOdl} | TC Assegnato: {tcAss} | TC Rich: {tcRich}</b>{Environment.NewLine}{Environment.NewLine}";
|
||||
string corpo = $"<b>ODL: {idxOdl} | TC Assegnato: {tcAss:N3} | TC Rich: {tcRich}</b>{Environment.NewLine}{Environment.NewLine}";
|
||||
corpo += string.Format(corpoChgTc, Environment.NewLine, pageUrl);
|
||||
corpo = corpo.Replace($"{Environment.NewLine}", "<br/>");
|
||||
MailKitMailData mData = new MailKitMailData()
|
||||
@@ -699,8 +701,22 @@ namespace MP_TAB_SERV.Components
|
||||
// se devo mostrare, carico dati ODL!
|
||||
if (showOdlDetail && RecMSE != null)
|
||||
{
|
||||
int currIdxPOdl = RecMSE != null ? RecMSE.IdxPOdl ?? 0 : 0;
|
||||
currPodl = await TabDServ.PODLExp_getByKey(currIdxPOdl);
|
||||
await ReloadXDL(true);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ReloadXDL(bool reloadFromOdl)
|
||||
{
|
||||
int currIdxPOdl = IdxPOdlSel;
|
||||
if (reloadFromOdl)
|
||||
{
|
||||
currIdxPOdl = RecMSE != null ? RecMSE.IdxPOdl ?? 0 : 0;
|
||||
}
|
||||
currPodl = await TabDServ.PODLExp_getByKey(currIdxPOdl);
|
||||
// update a runtime dati ODL se assegnato
|
||||
if (currPodl.IdxOdl > 0)
|
||||
{
|
||||
currOdl = await TabDServ.OdlByIdx(currPodl.IdxOdl, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -709,6 +725,32 @@ namespace MP_TAB_SERV.Components
|
||||
return SMServ.Traduci($"{baseLang}_{lemma}".ToUpper());
|
||||
}
|
||||
|
||||
protected async Task SendFixEndSetup()
|
||||
{
|
||||
if (!await JSRuntime.InvokeAsync<bool>("confirm", $"Confermi invio FIX chiusura atrtezzaggio ad impianto?"))
|
||||
return;
|
||||
|
||||
string ts = string.Format("{0:yyMMdd}T{0:HHmmss.fff}Z", DateTime.Now);
|
||||
string outData = $"TS:{ts}|MATR:{MatrOpr}|ODL:{IdxOdl}";
|
||||
TabDServ.addTask4Machine(IdxMaccSel, taskType.fixStopSetup, outData);
|
||||
outData = "Inserita richiesta invio Fix chiusura attrezzaggio " + outData;
|
||||
lblOut = outData;
|
||||
// se è master --> chiamo update child!
|
||||
if (isMaster)
|
||||
{
|
||||
// invio eventi ad IOB slave...
|
||||
var slaveList = SMServ.ListM2S
|
||||
.Where(x => x.IdxMacchina.Equals(IdxMaccSel, StringComparison.InvariantCultureIgnoreCase))
|
||||
.ToList();
|
||||
foreach (var machine in slaveList)
|
||||
{
|
||||
// invio chiusura attrezzaggio
|
||||
outData = $"TS:{ts}|MATR:{MatrOpr}|ODL:{idxOdl}|master machine:{IdxMaccSel}";
|
||||
TabDServ.addTask4Machine(machine.IdxMacchinaSlave, taskType.fixStopSetup, outData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
@@ -786,6 +828,7 @@ namespace MP_TAB_SERV.Components
|
||||
}
|
||||
|
||||
private PODLExpModel currPodl { get; set; } = new PODLExpModel();
|
||||
private ODLExpModel currOdl { get; set; } = new ODLExpModel();
|
||||
|
||||
/// <summary>
|
||||
/// Variabile idxMacc parent x selezione ODL
|
||||
@@ -825,6 +868,11 @@ namespace MP_TAB_SERV.Components
|
||||
}
|
||||
}
|
||||
|
||||
private bool endProdDisabled
|
||||
{
|
||||
get => !odlOk || needConfProd;
|
||||
}
|
||||
|
||||
private int numPz2Conf
|
||||
{
|
||||
get
|
||||
@@ -848,7 +896,7 @@ namespace MP_TAB_SERV.Components
|
||||
}
|
||||
private string titleOdlDetail
|
||||
{
|
||||
get => IdxPOdlSel > 0 ? "Verifica parametri attrezzaggio NUOVO PODL" : "Parametri ODL Corrente";
|
||||
get => IdxPOdlSel > 0 ? "Verifica parametri attrezzaggio NUOVO PODL" : inAttr ? "Parametri PODL in Attrezzaggio" : "Parametri ODL Corrente";
|
||||
}
|
||||
|
||||
private string cssDetailOdl
|
||||
@@ -1174,13 +1222,18 @@ namespace MP_TAB_SERV.Components
|
||||
prodMacchina = rawData.FirstOrDefault() ?? new PzProdModel();
|
||||
}
|
||||
}
|
||||
// imposto tcRichAttr in base allo stato...
|
||||
if (odlOk)
|
||||
{
|
||||
tcRichAttr = currPodl.Tcassegnato; ;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ReloadPOdlDetailData()
|
||||
{
|
||||
if (IdxPOdlSel > 0)
|
||||
{
|
||||
currPodl = await TabDServ.PODLExp_getByKey(IdxPOdlSel);
|
||||
await ReloadXDL(false);
|
||||
// controllo se � cambiato PODL
|
||||
if (IdxPOdlSel != lastIdxPOdl)
|
||||
{
|
||||
|
||||
@@ -23,6 +23,6 @@
|
||||
}
|
||||
</div>
|
||||
<div class="col-4">
|
||||
@lblTempo
|
||||
→ @lblTempo
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -218,7 +218,7 @@ namespace MP_TAB_SERV.Components
|
||||
{
|
||||
get
|
||||
{
|
||||
string answ = tcMode == "mc" ? $"--> {TempoMS.TotalMinutes:N0}:{TempoMS:ss} (min:sec)" : $"--> {TempoMC:0.000} (min.cent)";
|
||||
string answ = tcMode == "mc" ? $"{TempoMS.TotalMinutes:N0}:{TempoMS:ss} (min:sec)" : $"{TempoMC:0.000} (min.cent)";
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<Version>6.16.2311.909</Version>
|
||||
<Version>6.16.2311.915</Version>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>MP_TAB_SERV</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
@@ -2,17 +2,11 @@
|
||||
@page "/home"
|
||||
@page "/status-map"
|
||||
|
||||
<MseSampler SampleMult="2" E_Updated="RefreshData"></MseSampler>
|
||||
<MseSampler SampleMult="1.5" E_Updated="SaveData"></MseSampler>
|
||||
<div class="row">
|
||||
@if (ListMSE == null || ListMSE.Count == 0 || isCalcSize)
|
||||
{
|
||||
@*@for (int i = 0; i < 10; i++)
|
||||
{
|
||||
<div class="col-6 col-sm-6 col-md-4 col-lg-3 col-xl-2 mb-2 px-1 bloccoMacc">
|
||||
@*<MachineBlock></MachineBlock>
|
||||
</div>
|
||||
}*@
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -96,6 +96,8 @@ namespace MP_TAB_SERV.Pages
|
||||
{
|
||||
await getWDim();
|
||||
isCalcSize = false;
|
||||
ListMSE = await MDataService.MseGetAll();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
if (ListMSE != null)
|
||||
{
|
||||
@@ -104,21 +106,20 @@ namespace MP_TAB_SERV.Pages
|
||||
}
|
||||
}
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
var df = MServ.UserPrefGet("DefCardMode");
|
||||
ShowCard = df == "shrink" ? false : true;
|
||||
isCalcSize = true;
|
||||
ListMSE = null;
|
||||
SetupConf();
|
||||
ListMSE = await MDataService.MseGetAll();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
protected void SaveData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
//await Task.Delay(1);
|
||||
ListMSE = newList;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
//Log.Trace("StatusMap | RefreshData");
|
||||
//await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<body>
|
||||
<i>Modulo MAPOSPEC </i>
|
||||
<h4>Versione: 6.16.2311.909</h4>
|
||||
<h4>Versione: 6.16.2311.915</h4>
|
||||
<br /> Note di rilascio:
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
@@ -1 +1 @@
|
||||
6.16.2311.909
|
||||
6.16.2311.915
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<item>
|
||||
<version>6.16.2311.909</version>
|
||||
<version>6.16.2311.915</version>
|
||||
<url>https://nexus.steamware.net/repository/SWS/MP-TAB-SERV/stable/LAST/MP-TAB-SERV.zip</url>
|
||||
<changelog>https://nexus.steamware.net/repository/SWS/MP-TAB-SERV/stable/LAST/ChangeLog.html</changelog>
|
||||
<mandatory>false</mandatory>
|
||||
|
||||
@@ -782,7 +782,7 @@ namespace MP.Data.Controllers
|
||||
var OnlyUnused = new SqlParameter("@onlyUnused", onlyUnused);
|
||||
dbResult = dbCtx
|
||||
.DbSetODLExp
|
||||
.FromSqlRaw("EXEC stp_ODL_getByIdx @IdxOdl, @onlyUnused", IdxOdl, onlyUnused)
|
||||
.FromSqlRaw("EXEC stp_ODL_getByIdx @IdxOdl, @onlyUnused", IdxOdl, OnlyUnused)
|
||||
.AsNoTracking()
|
||||
.ToList();
|
||||
}
|
||||
|
||||
@@ -47,10 +47,18 @@ namespace MP.Data.DatabaseModels
|
||||
get
|
||||
{
|
||||
string answ = "*";
|
||||
var allData = KeyRichiesta.Split('_');
|
||||
if (allData.Length > 0)
|
||||
if (!string.IsNullOrEmpty(KeyRichiesta))
|
||||
{
|
||||
answ = allData[0];
|
||||
try
|
||||
{
|
||||
var allData = KeyRichiesta.Split('_');
|
||||
if (allData.Length > 0)
|
||||
{
|
||||
answ = allData[0];
|
||||
}
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user