Files
work/Visor/Visor/Pages/Setting/Wizard.razor
T
astankovmi fa9fd1e06a
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 12s
Готов Wizard
2026-07-14 17:45:41 +03:00

496 lines
24 KiB
Plaintext

@page "/setting/wizard"
@using Visor.Models
@using System.Text.Json
<h3>Wizard</h3>
<Toaster>
<Toast @bind-Visible="@toastError">
<ToastHeader>
<Strong Margin="Margin.IsAuto.FromEnd">@error_group</Strong>
<CloseButton />
</ToastHeader>
<ToastBody>
@error_msg
</ToastBody>
</Toast>
</Toaster>
<LoadingIndicator @bind-Visible="@visible">
<Steps @ref="stepsRef" @bind-SelectedStep="@selectedStep" NavigationAllowed="NavigationAllowed">
<Items>
<Step Name="1">Объекты</Step>
<Step Name="2">Типы</Step>
<Step Name="3">Устройства</Step>
<Step Name="4">Итог</Step>
</Items>
<Content>
<StepPanel Name="1">
<Row>
<Column ColumnSize="ColumnSize.Is3">
<Card>
<CardBody>
<CardText>
<Field>
<TextInput Autofocus="true" @bind-Value="obj_name" Placeholder="Название объекта">
<FieldHelp>Введите название объекта. Например: VNK, SPB...</FieldHelp>
</TextInput>
</Field>
<Field>
<TextInput @bind-Value="obj_desc" Placeholder="Описание объекта">
<FieldHelp>Введите текстовое описание объекта</FieldHelp>
</TextInput>
</Field>
<Field>
<Button Color="Color.Primary" Clicked="@AddNewObject">
<Icon Name="IconName.Add" />
</Button>
<Button Color="Color.Primary" Clicked="@GetCurrentObject">
<Icon Name="IconName.Redo" />
</Button>
</Field>
</CardText>
</CardBody>
</Card>
</Column>
<Column ColumnSize="ColumnSize.Is9">
<Card>
<CardBody>
<CardText>
<Table>
<TableHeader>
<TableRow>
<TableHeaderCell>Название объекта</TableHeaderCell>
<TableHeaderCell>Описание объекта</TableHeaderCell>
</TableRow>
</TableHeader>
<TableBody>
@foreach (var item in _list_obj)
{
<TableRow>
<TableRowCell>@item.NameObject</TableRowCell>
<TableRowCell>@item.DescriptionObject</TableRowCell>
</TableRow>
}
</TableBody>
</Table>
</CardText>
</CardBody>
</Card>
</Column>
</Row>
</StepPanel>
<StepPanel Name="2">
<Row>
<Column ColumnSize="ColumnSize.Is3">
<Card>
<CardBody>
<CardText>
<Field>
<TextInput Autofocus="true" @bind-Value="type_name" Placeholder="Название типа устройства">
<FieldHelp>Введите название типа. Например: Server, Switch...</FieldHelp>
</TextInput>
</Field>
<Field>
<TextInput @bind-Value="type_desc" Placeholder="Описание типа">
<FieldHelp>Введите текстовое описание типа устройства</FieldHelp>
</TextInput>
</Field>
<Field>
<Button Color="Color.Primary" Clicked="@AddNewType">
<Icon Name="IconName.Add" />
</Button>
</Field>
</CardText>
</CardBody>
</Card>
</Column>
<Column ColumnSize="ColumnSize.Is9">
<Card>
<CardBody>
<CardText>
<Table>
<TableHeader>
<TableRow>
<TableHeaderCell>Тип устройства</TableHeaderCell>
<TableHeaderCell>Описание типа устройств</TableHeaderCell>
</TableRow>
</TableHeader>
<TableBody>
@foreach (var item in _list_type)
{
<TableRow>
<TableRowCell>@item.Name</TableRowCell>
<TableRowCell>@item.Description</TableRowCell>
</TableRow>
}
</TableBody>
</Table>
</CardText>
</CardBody>
</Card>
</Column>
</Row>
</StepPanel>
<StepPanel Name="3">
<Row>
<Column ColumnSize="ColumnSize.Is3">
<Card>
<CardBody>
<CardTitle Size="HeadingSize.Is2">
Добавление устройства
</CardTitle>
<CardText>
<Addons Size="Size.Small">
<Addon AddonType="AddonType.Start">
<AddonLabel Width="Width.Is25">IP</AddonLabel>
</Addon>
<Addon AddonType="AddonType.Body">
<InputMask @bind-Value="dev_ip" Width="Width.Is50" Placeholder="Введите IP" />
</Addon>
</Addons>
<Addons Size="Size.Small">
<Addon AddonType="AddonType.Start">
<AddonLabel Width="Width.Is25">MAC</AddonLabel>
</Addon>
<Addon AddonType="AddonType.Body">
<InputMask @bind-Value="dev_mac" Width="Width.Is50" Placeholder="Введите MAC" />
</Addon>
</Addons>
<Addons Size="Size.Small">
<Addon AddonType="AddonType.Start">
<AddonLabel Width="Width.Is25">Название</AddonLabel>
</Addon>
<Addon AddonType="AddonType.Body">
<TextInput @bind-Value="dev_name" Width="Width.Is50" Placeholder="Введите название устройства" />
</Addon>
</Addons>
<Addons Size="Size.Small">
<Addon AddonType="AddonType.Start">
<AddonLabel Width="Width.Is25">Описание</AddonLabel>
</Addon>
<Addon AddonType="AddonType.Body">
<TextInput @bind-Value="dev_desc" Width="Width.Is50" Placeholder="Введите описание устройства" />
</Addon>
</Addons>
<Addons Size="Size.Small">
<Addon AddonType="AddonType.Start">
<AddonLabel Width="Width.Is25">Место установки</AddonLabel>
</Addon>
<Addon AddonType="AddonType.Body">
<TextInput @bind-Value="dev_loc" Width="Width.Is50" Placeholder="Введите где установлено устройство" />
</Addon>
</Addons>
<Addons Size="Size.Small">
<Addon AddonType="AddonType.Start">
<AddonLabel Width="Width.Is25">Тип устройства</AddonLabel>
</Addon>
<Addon AddonType="AddonType.Body">
<Select Width="Width.Is50" TValue="Guid" @bind-Value="@id_type">
<SelectItem Value="999">Тип устройства</SelectItem>
@foreach (var sel in _list_type)
{
<SelectItem Value="@sel.Id">@sel.Name</SelectItem>
}
</Select>
</Addon>
</Addons>
<Addons Size="Size.Small">
<Addon AddonType="AddonType.Start">
<AddonLabel Width="Width.Is25">Объект</AddonLabel>
</Addon>
<Addon AddonType="AddonType.Body">
<Select Width="Width.Is50" TValue="Guid" @bind-Value="@id_obj">
<SelectItem Value="999">На объекте</SelectItem>
@foreach (var sel in _list_obj)
{
<SelectItem Value="@sel.Id">@sel.NameObject</SelectItem>
}
</Select>
</Addon>
</Addons>
<Addons Size="Size.Small">
<Addon AddonType="AddonType.Start">
<AddonLabel Width="Width.Is25">Подключен к</AddonLabel>
</Addon>
<Addon AddonType="AddonType.Body">
<Select Width="Width.Is50" TValue="Guid" @bind-Value="@id_dev">
<SelectItem Value="999">Коммутатор</SelectItem>
@foreach (var sel in _list_switch)
{
<SelectItem Value="@sel.Id">@sel.Name</SelectItem>
}
</Select>
</Addon>
@* <Addon AddonType="AddonType.End">
<Button Clicked="@RefreshListSwitch">
<Icon Name="IconName.Undo" />
</Button>
</Addon> *@
</Addons>
<Addons Size="Size.Small">
<Addon AddonType="AddonType.Start">
<AddonLabel Width="Width.Is25">Порт подключения</AddonLabel>
</Addon>
<Addon AddonType="AddonType.Body">
<NumericInput @bind-Value="num_port" Min="1" Max="28" Width="Width.Is50" />
</Addon>
</Addons>
<Button Width="Width.Is100" Color="Color.Dark" Clicked="@AddNewDev">Добавить</Button>
</CardText>
</CardBody>
</Card>
</Column>
<Column ColumnSize="ColumnSize.Is9">
<Card>
<CardBody>
<CardText>
<Table>
<TableHeader>
<TableRow>
<TableHeaderCell>Имя</TableHeaderCell>
<TableHeaderCell>Адрес</TableHeaderCell>
</TableRow>
</TableHeader>
<TableBody>
@foreach (var item in _list_dev)
{
<TableRow>
<TableRowCell>@item.Name</TableRowCell>
<TableRowCell>@item.Ip</TableRowCell>
</TableRow>
}
</TableBody>
</Table>
</CardText>
</CardBody>
</Card>
</Column>
</Row>
</StepPanel>
<StepPanel Name="4">
<Row>
<CardDeck>
<Card>
<CardBody>
<CardTitle TextAlignment="TextAlignment.Center">
ОБЪЕКТЫ
</CardTitle>
<CardText>
Объектов к добавлению - @_list_obj.Count
</CardText>
</CardBody>
</Card>
<Card>
<CardBody>
<CardTitle TextAlignment="TextAlignment.Center">
ТИПЫ УСТРОЙСТВ
</CardTitle>
<CardText>
Типов к добавлению - @_list_type.Count
</CardText>
</CardBody>
</Card>
<Card>
<CardBody>
<CardTitle TextAlignment="TextAlignment.Center">
УСТРОЙСТВА
</CardTitle>
<CardText>
Устройств к добавлению - @_list_dev.Count
из них коммутаторов - @_list_switch.Count
</CardText>
</CardBody>
</Card>
</CardDeck>
</Row>
</StepPanel>
</Content>
</Steps>
<Div Flex="Flex.JustifyContent.Center">
<Button Color="Color.Secondary" Margin="Margin.Is2.FromEnd" Clicked="() => stepsRef.PreviousStep()">
Назад
</Button>
<Button Color="Color.Primary" Clicked="clickSave">
@nextButton
</Button>
</Div>
</LoadingIndicator>
<Progress Visibility="@visibleProgress" Indeterminate />
@code {
bool visible, toastError = false;
Visibility visibleProgress = Visibility.Invisible;
private Steps stepsRef;
private ObjectItems obj_item;
private DeviceTypeItems type_item;
private DeviceItems dev_item;
private List<ObjectItems> list_obj = new(), _list_obj = new();
private List<DeviceTypeItems> list_type = new(), _list_type = new();
private static List<DeviceItems> list_dev = new(), _list_dev = new();
private List<DeviceItems> _list_switch = new();
private string email, nextButton = "Далее";
private string selectedStep = "1";
private Guid id_type, id_obj, id_dev;
private int num_port;
private string obj_name, obj_desc;
private string type_name, type_desc;
private string error_msg, error_group;
private string dev_ip, dev_mac, dev_desc, dev_name, dev_loc;
protected override async Task OnInitializedAsync()
{
visible = true;
await AllPubData.GetAll();
list_type = AllPubData.ListDeviceTypeItems;
list_obj = AllPubData.ListObjectItems;
list_dev = AllPubData.ListDeviceItems;
visible = false;
}
private Task<bool> NavigationAllowed(StepNavigationContext context)
{
if (context.CurrentStepIndex == 3 && context.NextStepIndex == 4)
{
nextButton = "Сохранить";
//return Task.FromResult(true);
}
if (context.CurrentStepIndex == 4 && context.NextStepIndex > 4)
{
//return Task.FromResult(false);
}
if (context.CurrentStepIndex == 4 && context.NextStepIndex < 4)
{
nextButton = "Далее";
}
return Task.FromResult(true);
}
private async void AddNewObject()
{
if (obj_name == null)
{
return;
}
obj_item = new()
{
Id = Guid.NewGuid(),
NameObject = obj_name,
DescriptionObject = obj_desc,
};
_list_obj.Add(obj_item);
obj_name = string.Empty;
obj_desc = string.Empty;
}
private async void AddNewType()
{
if (type_name == null)
{
return;
}
type_item = new()
{
Id = Guid.NewGuid(),
Name = type_name,
Description = type_desc,
};
_list_type.Add(type_item);
type_name = string.Empty;
type_desc = string.Empty;
}
private async void AddNewDev()
{
if (dev_ip == null || dev_mac == null || dev_name == null) return;
dev_item = new()
{
Id = Guid.NewGuid(),
Ip = dev_ip,
Mac = dev_mac,
Description = dev_desc,
Name = dev_name,
Location = dev_loc,
ListDevices = null,
DeviceType = _list_type.Single(t => t.Id == id_type).Id,
DeviceObject = _list_obj.Single(o => o.Id == id_obj).Id,
ConnectedToPortOnSwitch = num_port
};
_list_dev.Add(dev_item);
if (list_type.First(d => d.Id == dev_item.DeviceType).Name.Contains("Switch")) _list_switch.Add(dev_item);
dev_ip = string.Empty;
dev_mac = string.Empty;
dev_desc = string.Empty;
dev_name = string.Empty;
dev_loc = string.Empty;
}
private async void clickSave()
{
if (nextButton == "Далее") await stepsRef.NextStep();
else
{
visibleProgress = Visibility.Visible;
try
{
foreach (var item in _list_obj)
{
var p = await AllPubData.http.PostAsJsonAsync("api/Object/AddObject", item);
if (!p.IsSuccessStatusCode)
{
error_group = "ОБЪЕКТ";
error_msg = $"{item.NameObject} не добавлено.\r\nСтатус код: {p.StatusCode}";
toastError = true;
//await Task.Delay(500);
}
}
foreach (var item in _list_type)
{
var p = await AllPubData.http.PostAsJsonAsync("api/Type/AddType", item);
if (!p.IsSuccessStatusCode)
{
error_group = "ТИП";
error_msg = $"{item.Name} не добавлено.\r\nСтатус код: {p.StatusCode}";
toastError = true;
//await Task.Delay(500);
}
}
foreach (var item in _list_dev)
{
var p = await AllPubData.http.PostAsJsonAsync("api/Device/AddDevice", item);
if (!p.IsSuccessStatusCode)
{
error_group = "УСТРОЙСТВА";
error_msg = $"{item.Name} не добавлено.\r\nСтатус код: {p.StatusCode}";
toastError = true;
//await Task.Delay(500);
}
}
}
catch (Exception)
{
error_group = "ПРОЦЕСС";
error_msg = $"Во время добавления произошел сбой.";
toastError = true;
}
finally
{
visibleProgress = Visibility.Invisible;
}
}
}
private void GetCurrentObject()
{
_list_obj = AllPubData.ListObjectItems;
_list_type = AllPubData.ListDeviceTypeItems;
_list_dev = AllPubData.ListDeviceItems;
}
}