mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Workshop - Added dedicated release page
This commit is contained in:
parent
9c04932afa
commit
9e994840f6
@ -18,6 +18,17 @@ public class RouteRegistration<TViewModel> : IRouterRegistration where TViewMode
|
|||||||
Route = new Route(path);
|
Route = new Route(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="RouteRegistration{TViewModel}" /> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">The path of the route.</param>
|
||||||
|
/// <param name="children">The children of the route.</param>
|
||||||
|
public RouteRegistration(string path, List<IRouterRegistration> children)
|
||||||
|
{
|
||||||
|
Route = new Route(path);
|
||||||
|
Children = children;
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -56,6 +56,10 @@
|
|||||||
<DependentUpon>LayoutListView.axaml</DependentUpon>
|
<DependentUpon>LayoutListView.axaml</DependentUpon>
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Update="Screens\Workshop\EntryReleases\EntryReleasesView.axaml.cs">
|
||||||
|
<DependentUpon>EntryReleasesView.axaml</DependentUpon>
|
||||||
|
<SubType>Code</SubType>
|
||||||
|
</Compile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@ -7,6 +7,7 @@ using Artemis.UI.Screens.Settings.Updating;
|
|||||||
using Artemis.UI.Screens.SurfaceEditor;
|
using Artemis.UI.Screens.SurfaceEditor;
|
||||||
using Artemis.UI.Screens.Workshop;
|
using Artemis.UI.Screens.Workshop;
|
||||||
using Artemis.UI.Screens.Workshop.Entries;
|
using Artemis.UI.Screens.Workshop.Entries;
|
||||||
|
using Artemis.UI.Screens.Workshop.EntryReleases;
|
||||||
using Artemis.UI.Screens.Workshop.Home;
|
using Artemis.UI.Screens.Workshop.Home;
|
||||||
using Artemis.UI.Screens.Workshop.Layout;
|
using Artemis.UI.Screens.Workshop.Layout;
|
||||||
using Artemis.UI.Screens.Workshop.Library;
|
using Artemis.UI.Screens.Workshop.Library;
|
||||||
@ -16,68 +17,51 @@ using Artemis.UI.Screens.Workshop.Profile;
|
|||||||
using Artemis.UI.Shared.Routing;
|
using Artemis.UI.Shared.Routing;
|
||||||
using PluginDetailsViewModel = Artemis.UI.Screens.Workshop.Plugins.PluginDetailsViewModel;
|
using PluginDetailsViewModel = Artemis.UI.Screens.Workshop.Plugins.PluginDetailsViewModel;
|
||||||
|
|
||||||
namespace Artemis.UI.Routing;
|
namespace Artemis.UI.Routing
|
||||||
|
|
||||||
public static class Routes
|
|
||||||
{
|
{
|
||||||
public static List<IRouterRegistration> ArtemisRoutes =
|
public static class Routes
|
||||||
[
|
{
|
||||||
new RouteRegistration<BlankViewModel>("blank"),
|
public static readonly List<IRouterRegistration> ArtemisRoutes =
|
||||||
new RouteRegistration<HomeViewModel>("home"),
|
[
|
||||||
new RouteRegistration<WorkshopViewModel>("workshop")
|
new RouteRegistration<BlankViewModel>("blank"),
|
||||||
{
|
new RouteRegistration<HomeViewModel>("home"),
|
||||||
Children =
|
new RouteRegistration<WorkshopViewModel>("workshop", [
|
||||||
[
|
|
||||||
new RouteRegistration<WorkshopOfflineViewModel>("offline/{message:string}"),
|
new RouteRegistration<WorkshopOfflineViewModel>("offline/{message:string}"),
|
||||||
new RouteRegistration<EntriesViewModel>("entries")
|
new RouteRegistration<EntriesViewModel>("entries", [
|
||||||
{
|
new RouteRegistration<PluginListViewModel>("plugins", [
|
||||||
Children =
|
new RouteRegistration<PluginDetailsViewModel>("details/{entryId:long}", [
|
||||||
[
|
new RouteRegistration<EntryReleaseViewModel>("releases/{releaseId:long}")
|
||||||
new RouteRegistration<PluginListViewModel>("plugins")
|
])
|
||||||
{
|
]),
|
||||||
Children = [new RouteRegistration<PluginDetailsViewModel>("details/{entryId:long}")]
|
new RouteRegistration<ProfileListViewModel>("profiles", [
|
||||||
},
|
new RouteRegistration<ProfileDetailsViewModel>("details/{entryId:long}", [
|
||||||
new RouteRegistration<ProfileListViewModel>("profiles")
|
new RouteRegistration<EntryReleaseViewModel>("releases/{releaseId:long}")
|
||||||
{
|
])
|
||||||
Children = [new RouteRegistration<ProfileDetailsViewModel>("details/{entryId:long}")]
|
]),
|
||||||
},
|
new RouteRegistration<LayoutListViewModel>("layouts", [
|
||||||
new RouteRegistration<LayoutListViewModel>("layouts")
|
new RouteRegistration<LayoutDetailsViewModel>("details/{entryId:long}", [
|
||||||
{
|
new RouteRegistration<EntryReleaseViewModel>("releases/{releaseId:long}")
|
||||||
Children = [new RouteRegistration<LayoutDetailsViewModel>("details/{entryId:long}")]
|
])
|
||||||
},
|
])
|
||||||
]
|
]),
|
||||||
},
|
new RouteRegistration<WorkshopLibraryViewModel>("library", [
|
||||||
|
new RouteRegistration<InstalledTabViewModel>("installed"),
|
||||||
new RouteRegistration<WorkshopLibraryViewModel>("library")
|
new RouteRegistration<SubmissionsTabViewModel>("submissions"),
|
||||||
{
|
new RouteRegistration<SubmissionDetailViewModel>("submissions/{entryId:long}")
|
||||||
Children =
|
])
|
||||||
[
|
]),
|
||||||
new RouteRegistration<InstalledTabViewModel>("installed"),
|
new RouteRegistration<SurfaceEditorViewModel>("surface-editor"),
|
||||||
new RouteRegistration<SubmissionsTabViewModel>("submissions"),
|
new RouteRegistration<SettingsViewModel>("settings", [
|
||||||
new RouteRegistration<SubmissionDetailViewModel>("submissions/{entryId:long}")
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
|
|
||||||
new RouteRegistration<SurfaceEditorViewModel>("surface-editor"),
|
|
||||||
new RouteRegistration<SettingsViewModel>("settings")
|
|
||||||
{
|
|
||||||
Children =
|
|
||||||
[
|
|
||||||
new RouteRegistration<GeneralTabViewModel>("general"),
|
new RouteRegistration<GeneralTabViewModel>("general"),
|
||||||
new RouteRegistration<PluginsTabViewModel>("plugins"),
|
new RouteRegistration<PluginsTabViewModel>("plugins"),
|
||||||
new RouteRegistration<DevicesTabViewModel>("devices"),
|
new RouteRegistration<DevicesTabViewModel>("devices"),
|
||||||
new RouteRegistration<ReleasesTabViewModel>("releases")
|
new RouteRegistration<ReleasesTabViewModel>("releases", [
|
||||||
{
|
new RouteRegistration<ReleaseDetailsViewModel>("{releaseId:guid}")
|
||||||
Children = [new RouteRegistration<ReleaseDetailsViewModel>("{releaseId:guid}")]
|
]),
|
||||||
},
|
|
||||||
|
|
||||||
new RouteRegistration<AccountTabViewModel>("account"),
|
new RouteRegistration<AccountTabViewModel>("account"),
|
||||||
new RouteRegistration<AboutTabViewModel>("about")
|
new RouteRegistration<AboutTabViewModel>("about")
|
||||||
]
|
]),
|
||||||
},
|
new RouteRegistration<ProfileEditorViewModel>("profile-editor/{profileConfigurationId:guid}")
|
||||||
|
];
|
||||||
new RouteRegistration<ProfileEditorViewModel>("profile-editor/{profileConfigurationId:guid}")
|
}
|
||||||
];
|
|
||||||
}
|
}
|
||||||
@ -149,5 +149,4 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
</UserControl>
|
</UserControl>
|
||||||
@ -0,0 +1,92 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
|
||||||
|
xmlns:entryReleases="clr-namespace:Artemis.UI.Screens.Workshop.EntryReleases"
|
||||||
|
xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
|
||||||
|
xmlns:converters="clr-namespace:Artemis.UI.Converters"
|
||||||
|
xmlns:sharedConverters="clr-namespace:Artemis.UI.Shared.Converters;assembly=Artemis.UI.Shared"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="Artemis.UI.Screens.Workshop.EntryReleases.EntryReleaseView"
|
||||||
|
x:DataType="entryReleases:EntryReleaseViewModel">
|
||||||
|
<UserControl.Resources>
|
||||||
|
<converters:DateTimeConverter x:Key="DateTimeConverter" />
|
||||||
|
<sharedConverters:BytesToStringConverter x:Key="BytesToStringConverter" />
|
||||||
|
</UserControl.Resources>
|
||||||
|
<UserControl.Styles>
|
||||||
|
<Style Selector="Grid.info-container">
|
||||||
|
<Setter Property="Margin" Value="10" />
|
||||||
|
</Style>
|
||||||
|
<Style Selector="avalonia|MaterialIcon.info-icon">
|
||||||
|
<Setter Property="VerticalAlignment" Value="Top" />
|
||||||
|
<Setter Property="Margin" Value="0 3 10 0" />
|
||||||
|
</Style>
|
||||||
|
<Style Selector="TextBlock.info-title">
|
||||||
|
<Setter Property="Margin" Value="0 0 0 5" />
|
||||||
|
<Setter Property="Opacity" Value="0.8" />
|
||||||
|
</Style>
|
||||||
|
<Style Selector="TextBlock.info-body">
|
||||||
|
</Style>
|
||||||
|
<Style Selector="TextBlock.info-link">
|
||||||
|
<Setter Property="Cursor" Value="Hand" />
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource SystemAccentColorLight3}" />
|
||||||
|
</Style>
|
||||||
|
<Style Selector="TextBlock.info-link:pointerover">
|
||||||
|
<Setter Property="Cursor" Value="Hand" />
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource SystemAccentColorLight1}" />
|
||||||
|
</Style>
|
||||||
|
</UserControl.Styles>
|
||||||
|
|
||||||
|
<Grid RowDefinitions="Auto,Auto">
|
||||||
|
<Border Grid.Row="0" Classes="card" Margin="0 0 0 10">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Classes="h4 no-margin">Release info</TextBlock>
|
||||||
|
<Border Classes="card-separator" />
|
||||||
|
<Grid Margin="-5 -10" ColumnDefinitions="*,*,*">
|
||||||
|
<Grid Grid.Column="0" ColumnDefinitions="*,*" RowDefinitions="*,*,*" Classes="info-container" HorizontalAlignment="Left">
|
||||||
|
<avalonia:MaterialIcon Kind="Calendar" Grid.Column="0" Grid.RowSpan="2" Classes="info-icon" />
|
||||||
|
<TextBlock Grid.Column="1" Grid.Row="0" Classes="info-title">Release date</TextBlock>
|
||||||
|
<TextBlock Grid.Column="1"
|
||||||
|
Grid.Row="1"
|
||||||
|
Classes="info-body"
|
||||||
|
Text="{CompiledBinding Release.CreatedAt, Converter={StaticResource DateTimeConverter}}" />
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid Grid.Column="1" ColumnDefinitions="*,*" RowDefinitions="*,*" Classes="info-container" HorizontalAlignment="Center">
|
||||||
|
<avalonia:MaterialIcon Kind="TickNetworkOutline" Grid.Column="0" Grid.RowSpan="2" Classes="info-icon" />
|
||||||
|
<TextBlock Grid.Column="1" Grid.Row="0" Classes="info-title">Version</TextBlock>
|
||||||
|
<TextBlock Grid.Column="1"
|
||||||
|
Grid.Row="1"
|
||||||
|
Classes="info-body"
|
||||||
|
Cursor="Hand"
|
||||||
|
Text="{CompiledBinding Release.Version}" />
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid Grid.Column="2" ColumnDefinitions="*,*" RowDefinitions="*,*" Classes="info-container" HorizontalAlignment="Right">
|
||||||
|
<avalonia:MaterialIcon Kind="BoxOutline" Grid.Column="0" Grid.RowSpan="2" Classes="info-icon" />
|
||||||
|
<TextBlock Grid.Column="1" Grid.Row="0" Classes="info-title">File size</TextBlock>
|
||||||
|
<TextBlock Grid.Column="1"
|
||||||
|
Grid.Row="1"
|
||||||
|
Classes="info-body"
|
||||||
|
Text="{CompiledBinding Release.DownloadSize, Converter={StaticResource BytesToStringConverter}, Mode=OneWay}" />
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Grid.Row="1" Classes="card">
|
||||||
|
<Grid RowDefinitions="Auto,Auto,*">
|
||||||
|
<TextBlock Grid.Row="0" Classes="h5 no-margin">Release notes</TextBlock>
|
||||||
|
<Border Grid.Row="1" Classes="card-separator" />
|
||||||
|
|
||||||
|
<mdxaml:MarkdownScrollViewer Grid.Row="2" Markdown="{CompiledBinding Release.Changelog}" MarkdownStyleName="FluentAvalonia">
|
||||||
|
<mdxaml:MarkdownScrollViewer.Styles>
|
||||||
|
<StyleInclude Source="/Styles/Markdown.axaml" />
|
||||||
|
</mdxaml:MarkdownScrollViewer.Styles>
|
||||||
|
</mdxaml:MarkdownScrollViewer>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
|
||||||
|
namespace Artemis.UI.Screens.Workshop.EntryReleases;
|
||||||
|
|
||||||
|
public partial class EntryReleaseView : ReactiveUserControl<EntryReleaseViewModel>
|
||||||
|
{
|
||||||
|
public EntryReleaseView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Artemis.UI.Screens.Workshop.Parameters;
|
||||||
|
using Artemis.UI.Shared.Routing;
|
||||||
|
using Artemis.WebClient.Workshop;
|
||||||
|
using PropertyChanged.SourceGenerator;
|
||||||
|
using StrawberryShake;
|
||||||
|
|
||||||
|
namespace Artemis.UI.Screens.Workshop.EntryReleases;
|
||||||
|
|
||||||
|
public partial class EntryReleaseViewModel : RoutableScreen<ReleaseDetailParameters>
|
||||||
|
{
|
||||||
|
private readonly IWorkshopClient _client;
|
||||||
|
[Notify] private IGetReleaseById_Release? _release;
|
||||||
|
|
||||||
|
public EntryReleaseViewModel(IWorkshopClient client)
|
||||||
|
{
|
||||||
|
_client = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override async Task OnNavigating(ReleaseDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
IOperationResult<IGetReleaseByIdResult> result = await _client.GetReleaseById.ExecuteAsync(parameters.ReleaseId, cancellationToken);
|
||||||
|
if (result.IsErrorResult())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Release = result.Data?.Release;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -25,12 +25,7 @@
|
|||||||
CommandParameter="{CompiledBinding LatestRelease}">
|
CommandParameter="{CompiledBinding LatestRelease}">
|
||||||
<Grid ColumnDefinitions="Auto,*">
|
<Grid ColumnDefinitions="Auto,*">
|
||||||
<!-- Icon -->
|
<!-- Icon -->
|
||||||
<avalonia:MaterialIcon Grid.Column="0"
|
<avalonia:MaterialIcon Grid.Column="0" Margin="0 6" Width="50" Height="50" Kind="BoxStar"/>
|
||||||
Margin="0 6"
|
|
||||||
Width="50"
|
|
||||||
Height="50"
|
|
||||||
Kind="BoxStar">
|
|
||||||
</avalonia:MaterialIcon>
|
|
||||||
|
|
||||||
<!-- Body -->
|
<!-- Body -->
|
||||||
<StackPanel Grid.Column="1" Margin="10 0" VerticalAlignment="Center">
|
<StackPanel Grid.Column="1" Margin="10 0" VerticalAlignment="Center">
|
||||||
@ -62,12 +57,8 @@
|
|||||||
Command="{Binding $parent[details:EntryReleasesView].DataContext.NavigateToRelease}"
|
Command="{Binding $parent[details:EntryReleasesView].DataContext.NavigateToRelease}"
|
||||||
CommandParameter="{CompiledBinding}">
|
CommandParameter="{CompiledBinding}">
|
||||||
<Grid ColumnDefinitions="Auto,*">
|
<Grid ColumnDefinitions="Auto,*">
|
||||||
<avalonia:MaterialIcon Grid.Column="0"
|
<!-- Icon -->
|
||||||
Margin="0 6"
|
<avalonia:MaterialIcon Grid.Column="0" Margin="0 6" Width="25" Height="25" Kind="Archive"/>
|
||||||
Width="25"
|
|
||||||
Height="25"
|
|
||||||
Kind="Archive">
|
|
||||||
</avalonia:MaterialIcon>
|
|
||||||
|
|
||||||
<!-- Body -->
|
<!-- Body -->
|
||||||
<StackPanel Grid.Column="1" Margin="10 0" VerticalAlignment="Center">
|
<StackPanel Grid.Column="1" Margin="10 0" VerticalAlignment="Center">
|
||||||
@ -52,7 +52,20 @@ public class EntryReleasesViewModel : ViewModelBase
|
|||||||
|
|
||||||
private async Task ExecuteNavigateToRelease(IRelease release)
|
private async Task ExecuteNavigateToRelease(IRelease release)
|
||||||
{
|
{
|
||||||
await _router.Navigate($"workshop/entries/{Entry.Id}/releases/{release.Id}");
|
switch (Entry.EntryType)
|
||||||
|
{
|
||||||
|
case EntryType.Profile:
|
||||||
|
await _router.Navigate($"workshop/entries/profiles/details/{Entry.Id}/releases/{release.Id}");
|
||||||
|
break;
|
||||||
|
case EntryType.Layout:
|
||||||
|
await _router.Navigate($"workshop/entries/layouts/details/{Entry.Id}/releases/{release.Id}");
|
||||||
|
break;
|
||||||
|
case EntryType.Plugin:
|
||||||
|
await _router.Navigate($"workshop/entries/plugins/details/{Entry.Id}/releases/{release.Id}");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException(nameof(Entry.EntryType));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ExecuteDownloadLatestRelease(CancellationToken cancellationToken)
|
private async Task ExecuteDownloadLatestRelease(CancellationToken cancellationToken)
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
|
||||||
|
xmlns:layout="clr-namespace:Artemis.UI.Screens.Workshop.Layout"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="Artemis.UI.Screens.Workshop.Layout.LayoutDescriptionView"
|
||||||
|
x:DataType="layout:LayoutDescriptionViewModel">
|
||||||
|
<StackPanel Spacing="10">
|
||||||
|
<Border Classes="card">
|
||||||
|
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
||||||
|
<mdxaml:MarkdownScrollViewer.Styles>
|
||||||
|
<StyleInclude Source="/Styles/Markdown.axaml" />
|
||||||
|
</mdxaml:MarkdownScrollViewer.Styles>
|
||||||
|
</mdxaml:MarkdownScrollViewer>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
|
||||||
|
namespace Artemis.UI.Screens.Workshop.Layout;
|
||||||
|
|
||||||
|
public partial class LayoutDescriptionView : ReactiveUserControl<LayoutDescriptionViewModel>
|
||||||
|
{
|
||||||
|
public LayoutDescriptionView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
using Artemis.UI.Shared.Routing;
|
||||||
|
using Artemis.WebClient.Workshop;
|
||||||
|
using PropertyChanged.SourceGenerator;
|
||||||
|
|
||||||
|
namespace Artemis.UI.Screens.Workshop.Layout;
|
||||||
|
|
||||||
|
public partial class LayoutDescriptionViewModel : RoutableScreen
|
||||||
|
{
|
||||||
|
[Notify] private IEntryDetails? _entry;
|
||||||
|
}
|
||||||
@ -4,6 +4,8 @@
|
|||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:layout="clr-namespace:Artemis.UI.Screens.Workshop.Layout"
|
xmlns:layout="clr-namespace:Artemis.UI.Screens.Workshop.Layout"
|
||||||
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
|
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
|
||||||
|
xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
|
||||||
|
xmlns:ui="clr-namespace:Artemis.UI"
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="800"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="800"
|
||||||
x:Class="Artemis.UI.Screens.Workshop.Layout.LayoutDetailsView"
|
x:Class="Artemis.UI.Screens.Workshop.Layout.LayoutDetailsView"
|
||||||
x:DataType="layout:LayoutDetailsViewModel">
|
x:DataType="layout:LayoutDetailsViewModel">
|
||||||
@ -18,15 +20,11 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<ScrollViewer Grid.Row="1" Grid.Column="1">
|
<ScrollViewer Grid.Row="1" Grid.Column="1">
|
||||||
<StackPanel Margin="10 0" Spacing="10">
|
<controls:Frame Name="RouterFrame" IsNavigationStackEnabled="False" CacheSize="0" Margin="10 0">
|
||||||
<Border Classes="card">
|
<controls:Frame.NavigationPageFactory>
|
||||||
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
<ui:PageFactory />
|
||||||
<mdxaml:MarkdownScrollViewer.Styles>
|
</controls:Frame.NavigationPageFactory>
|
||||||
<StyleInclude Source="/Styles/Markdown.axaml" />
|
</controls:Frame>
|
||||||
</mdxaml:MarkdownScrollViewer.Styles>
|
|
||||||
</mdxaml:MarkdownScrollViewer>
|
|
||||||
</Border>
|
|
||||||
</StackPanel>
|
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
|
||||||
<ContentControl Grid.Row="1" Grid.Column="2" IsVisible="{CompiledBinding Entry.Images.Count}" Content="{CompiledBinding EntryImagesViewModel}" />
|
<ContentControl Grid.Row="1" Grid.Column="2" IsVisible="{CompiledBinding Entry.Images.Count}" Content="{CompiledBinding EntryImagesViewModel}" />
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
|
using System;
|
||||||
|
using System.Reactive.Disposables;
|
||||||
using Avalonia.ReactiveUI;
|
using Avalonia.ReactiveUI;
|
||||||
|
using ReactiveUI;
|
||||||
|
|
||||||
namespace Artemis.UI.Screens.Workshop.Layout;
|
namespace Artemis.UI.Screens.Workshop.Layout;
|
||||||
|
|
||||||
@ -7,5 +10,8 @@ public partial class LayoutDetailsView : ReactiveUserControl<LayoutDetailsViewMo
|
|||||||
public LayoutDetailsView()
|
public LayoutDetailsView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
this.WhenActivated(d => ViewModel.WhenAnyValue(vm => vm.Screen)
|
||||||
|
.Subscribe(screen => RouterFrame.NavigateFromObject(screen ?? ViewModel?.LayoutDescriptionViewModel))
|
||||||
|
.DisposeWith(d));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -19,7 +19,7 @@ using StrawberryShake;
|
|||||||
|
|
||||||
namespace Artemis.UI.Screens.Workshop.Layout;
|
namespace Artemis.UI.Screens.Workshop.Layout;
|
||||||
|
|
||||||
public partial class LayoutDetailsViewModel : RoutableScreen<WorkshopDetailParameters>
|
public partial class LayoutDetailsViewModel : RoutableHostScreen<RoutableScreen, WorkshopDetailParameters>
|
||||||
{
|
{
|
||||||
private readonly IWorkshopClient _client;
|
private readonly IWorkshopClient _client;
|
||||||
private readonly IDeviceService _deviceService;
|
private readonly IDeviceService _deviceService;
|
||||||
@ -35,10 +35,12 @@ public partial class LayoutDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
public LayoutDetailsViewModel(IWorkshopClient client,
|
public LayoutDetailsViewModel(IWorkshopClient client,
|
||||||
IDeviceService deviceService,
|
IDeviceService deviceService,
|
||||||
IWindowService windowService,
|
IWindowService windowService,
|
||||||
|
LayoutDescriptionViewModel layoutDescriptionViewModel,
|
||||||
Func<IEntryDetails, EntryInfoViewModel> getEntryInfoViewModel,
|
Func<IEntryDetails, EntryInfoViewModel> getEntryInfoViewModel,
|
||||||
Func<IEntryDetails, EntryReleasesViewModel> getEntryReleasesViewModel,
|
Func<IEntryDetails, EntryReleasesViewModel> getEntryReleasesViewModel,
|
||||||
Func<IEntryDetails, EntryImagesViewModel> getEntryImagesViewModel)
|
Func<IEntryDetails, EntryImagesViewModel> getEntryImagesViewModel)
|
||||||
{
|
{
|
||||||
|
LayoutDescriptionViewModel = layoutDescriptionViewModel;
|
||||||
_client = client;
|
_client = client;
|
||||||
_deviceService = deviceService;
|
_deviceService = deviceService;
|
||||||
_windowService = windowService;
|
_windowService = windowService;
|
||||||
@ -47,9 +49,12 @@ public partial class LayoutDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
_getEntryImagesViewModel = getEntryImagesViewModel;
|
_getEntryImagesViewModel = getEntryImagesViewModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LayoutDescriptionViewModel LayoutDescriptionViewModel { get; }
|
||||||
|
|
||||||
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await GetEntry(parameters.EntryId, cancellationToken);
|
if (Entry?.Id != parameters.EntryId)
|
||||||
|
await GetEntry(parameters.EntryId, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task GetEntry(long entryId, CancellationToken cancellationToken)
|
private async Task GetEntry(long entryId, CancellationToken cancellationToken)
|
||||||
@ -65,6 +70,8 @@ public partial class LayoutDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
|
|
||||||
if (EntryReleasesViewModel != null)
|
if (EntryReleasesViewModel != null)
|
||||||
EntryReleasesViewModel.OnInstallationFinished = OnInstallationFinished;
|
EntryReleasesViewModel.OnInstallationFinished = OnInstallationFinished;
|
||||||
|
|
||||||
|
LayoutDescriptionViewModel.Entry = Entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OnInstallationFinished(InstalledEntry installedEntry)
|
private async Task OnInstallationFinished(InstalledEntry installedEntry)
|
||||||
|
|||||||
@ -12,14 +12,8 @@ public partial class LayoutListView : ReactiveUserControl<LayoutListViewModel>
|
|||||||
public LayoutListView()
|
public LayoutListView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.WhenActivated(d =>
|
this.WhenActivated(d => ViewModel.WhenAnyValue(vm => vm.Screen)
|
||||||
{
|
.Subscribe(screen => RouterFrame.NavigateFromObject(screen ?? ViewModel?.EntryListViewModel))
|
||||||
ViewModel.WhenAnyValue(vm => vm.Screen).Subscribe(Navigate).DisposeWith(d);
|
.DisposeWith(d));
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Navigate(RoutableScreen? viewModel)
|
|
||||||
{
|
|
||||||
RouterFrame.NavigateFromObject(viewModel ?? ViewModel?.EntryListViewModel);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
namespace Artemis.UI.Screens.Workshop.Parameters;
|
||||||
|
|
||||||
|
public class ReleaseDetailParameters
|
||||||
|
{
|
||||||
|
public long ReleaseId { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:plugins="clr-namespace:Artemis.UI.Screens.Workshop.Plugins"
|
||||||
|
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="Artemis.UI.Screens.Workshop.Plugins.PluginDescriptionView"
|
||||||
|
x:DataType="plugins:PluginDescriptionViewModel">
|
||||||
|
<StackPanel Spacing="10">
|
||||||
|
<Border Classes="card">
|
||||||
|
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
||||||
|
<mdxaml:MarkdownScrollViewer.Styles>
|
||||||
|
<StyleInclude Source="/Styles/Markdown.axaml" />
|
||||||
|
</mdxaml:MarkdownScrollViewer.Styles>
|
||||||
|
</mdxaml:MarkdownScrollViewer>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Classes="card" VerticalAlignment="Top" IsVisible="{CompiledBinding Dependants, Converter={x:Static ObjectConverters.IsNotNull}}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Theme="{StaticResource SubtitleTextBlockStyle}">Used by these profiles</TextBlock>
|
||||||
|
<Border Classes="card-separator" />
|
||||||
|
<ScrollViewer>
|
||||||
|
<ItemsControl ItemsSource="{CompiledBinding Dependants}">
|
||||||
|
<ItemsControl.ItemsPanel>
|
||||||
|
<ItemsPanelTemplate>
|
||||||
|
<StackPanel Spacing="5"></StackPanel>
|
||||||
|
</ItemsPanelTemplate>
|
||||||
|
</ItemsControl.ItemsPanel>
|
||||||
|
</ItemsControl>
|
||||||
|
</ScrollViewer>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
|
||||||
|
namespace Artemis.UI.Screens.Workshop.Plugins;
|
||||||
|
|
||||||
|
public partial class PluginDescriptionView : ReactiveUserControl<PluginDescriptionViewModel>
|
||||||
|
{
|
||||||
|
public PluginDescriptionView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Artemis.UI.Screens.Workshop.Entries.List;
|
||||||
|
using Artemis.UI.Shared.Routing;
|
||||||
|
using Artemis.WebClient.Workshop;
|
||||||
|
using PropertyChanged.SourceGenerator;
|
||||||
|
|
||||||
|
namespace Artemis.UI.Screens.Workshop.Plugins;
|
||||||
|
|
||||||
|
public partial class PluginDescriptionViewModel : RoutableScreen
|
||||||
|
{
|
||||||
|
[Notify] private IEntryDetails? _entry;
|
||||||
|
[Notify] private List<EntryListItemViewModel>? _dependants;
|
||||||
|
private readonly IWorkshopClient _client;
|
||||||
|
private readonly Func<IEntrySummary, EntryListItemViewModel> _getEntryListViewModel;
|
||||||
|
|
||||||
|
public PluginDescriptionViewModel(IWorkshopClient client, Func<IEntrySummary, EntryListItemViewModel> getEntryListViewModel)
|
||||||
|
{
|
||||||
|
_client = client;
|
||||||
|
_getEntryListViewModel = getEntryListViewModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task SetEntry(IEntryDetails? entry, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Entry = entry;
|
||||||
|
|
||||||
|
if (entry != null)
|
||||||
|
{
|
||||||
|
IReadOnlyList<IEntrySummary>? dependants = (await _client.GetDependantEntries.ExecuteAsync(entry.Id, 0, 25, cancellationToken)).Data?.Entries?.Items;
|
||||||
|
Dependants = dependants != null && dependants.Any() ? dependants.Select(_getEntryListViewModel).OrderByDescending(d => d.Entry.Downloads).Take(10).ToList() : null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Dependants = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,6 +5,8 @@
|
|||||||
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
|
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
|
||||||
xmlns:plugins="clr-namespace:Artemis.UI.Screens.Workshop.Plugins"
|
xmlns:plugins="clr-namespace:Artemis.UI.Screens.Workshop.Plugins"
|
||||||
xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
|
xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
|
||||||
|
xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
|
||||||
|
xmlns:ui="clr-namespace:Artemis.UI"
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="Artemis.UI.Screens.Workshop.Plugins.PluginDetailsView"
|
x:Class="Artemis.UI.Screens.Workshop.Plugins.PluginDetailsView"
|
||||||
x:DataType="plugins:PluginDetailsViewModel">
|
x:DataType="plugins:PluginDetailsViewModel">
|
||||||
@ -35,31 +37,11 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<ScrollViewer Grid.Row="1" Grid.Column="1">
|
<ScrollViewer Grid.Row="1" Grid.Column="1">
|
||||||
<StackPanel Margin="10 0" Spacing="10">
|
<controls:Frame Name="RouterFrame" IsNavigationStackEnabled="False" CacheSize="0" Margin="10 0">
|
||||||
<Border Classes="card">
|
<controls:Frame.NavigationPageFactory>
|
||||||
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
<ui:PageFactory />
|
||||||
<mdxaml:MarkdownScrollViewer.Styles>
|
</controls:Frame.NavigationPageFactory>
|
||||||
<StyleInclude Source="/Styles/Markdown.axaml" />
|
</controls:Frame>
|
||||||
</mdxaml:MarkdownScrollViewer.Styles>
|
|
||||||
</mdxaml:MarkdownScrollViewer>
|
|
||||||
</Border>
|
|
||||||
|
|
||||||
<Border Classes="card" VerticalAlignment="Top" IsVisible="{CompiledBinding Dependants, Converter={x:Static ObjectConverters.IsNotNull}}">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Theme="{StaticResource SubtitleTextBlockStyle}">Used by these profiles</TextBlock>
|
|
||||||
<Border Classes="card-separator" />
|
|
||||||
<ScrollViewer>
|
|
||||||
<ItemsControl ItemsSource="{CompiledBinding Dependants}">
|
|
||||||
<ItemsControl.ItemsPanel>
|
|
||||||
<ItemsPanelTemplate>
|
|
||||||
<StackPanel Spacing="5"></StackPanel>
|
|
||||||
</ItemsPanelTemplate>
|
|
||||||
</ItemsControl.ItemsPanel>
|
|
||||||
</ItemsControl>
|
|
||||||
</ScrollViewer>
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
</StackPanel>
|
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
|
||||||
<ContentControl Grid.Row="1" Grid.Column="2" IsVisible="{CompiledBinding Entry.Images.Count}" Content="{CompiledBinding EntryImagesViewModel}" />
|
<ContentControl Grid.Row="1" Grid.Column="2" IsVisible="{CompiledBinding Entry.Images.Count}" Content="{CompiledBinding EntryImagesViewModel}" />
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
|
using System;
|
||||||
|
using System.Reactive.Disposables;
|
||||||
using Avalonia.ReactiveUI;
|
using Avalonia.ReactiveUI;
|
||||||
|
using ReactiveUI;
|
||||||
|
|
||||||
namespace Artemis.UI.Screens.Workshop.Plugins;
|
namespace Artemis.UI.Screens.Workshop.Plugins;
|
||||||
|
|
||||||
@ -7,5 +10,8 @@ public partial class PluginDetailsView : ReactiveUserControl<PluginDetailsViewMo
|
|||||||
public PluginDetailsView()
|
public PluginDetailsView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
this.WhenActivated(d => ViewModel.WhenAnyValue(vm => vm.Screen)
|
||||||
|
.Subscribe(screen => RouterFrame.NavigateFromObject(screen ?? ViewModel?.PluginDescriptionViewModel))
|
||||||
|
.DisposeWith(d));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -19,7 +19,7 @@ using StrawberryShake;
|
|||||||
|
|
||||||
namespace Artemis.UI.Screens.Workshop.Plugins;
|
namespace Artemis.UI.Screens.Workshop.Plugins;
|
||||||
|
|
||||||
public partial class PluginDetailsViewModel : RoutableScreen<WorkshopDetailParameters>
|
public partial class PluginDetailsViewModel : RoutableHostScreen<RoutableScreen, WorkshopDetailParameters>
|
||||||
{
|
{
|
||||||
private readonly IWorkshopClient _client;
|
private readonly IWorkshopClient _client;
|
||||||
private readonly IWindowService _windowService;
|
private readonly IWindowService _windowService;
|
||||||
@ -27,7 +27,6 @@ public partial class PluginDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
private readonly Func<IEntryDetails, EntryInfoViewModel> _getEntryInfoViewModel;
|
private readonly Func<IEntryDetails, EntryInfoViewModel> _getEntryInfoViewModel;
|
||||||
private readonly Func<IEntryDetails, EntryReleasesViewModel> _getEntryReleasesViewModel;
|
private readonly Func<IEntryDetails, EntryReleasesViewModel> _getEntryReleasesViewModel;
|
||||||
private readonly Func<IEntryDetails, EntryImagesViewModel> _getEntryImagesViewModel;
|
private readonly Func<IEntryDetails, EntryImagesViewModel> _getEntryImagesViewModel;
|
||||||
private readonly Func<IEntrySummary, EntryListItemViewModel> _getEntryListViewModel;
|
|
||||||
[Notify] private IGetPluginEntryById_Entry? _entry;
|
[Notify] private IGetPluginEntryById_Entry? _entry;
|
||||||
[Notify] private EntryInfoViewModel? _entryInfoViewModel;
|
[Notify] private EntryInfoViewModel? _entryInfoViewModel;
|
||||||
[Notify] private EntryReleasesViewModel? _entryReleasesViewModel;
|
[Notify] private EntryReleasesViewModel? _entryReleasesViewModel;
|
||||||
@ -37,23 +36,26 @@ public partial class PluginDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
public PluginDetailsViewModel(IWorkshopClient client,
|
public PluginDetailsViewModel(IWorkshopClient client,
|
||||||
IWindowService windowService,
|
IWindowService windowService,
|
||||||
IPluginManagementService pluginManagementService,
|
IPluginManagementService pluginManagementService,
|
||||||
|
PluginDescriptionViewModel pluginDescriptionViewModel,
|
||||||
Func<IEntryDetails, EntryInfoViewModel> getEntryInfoViewModel,
|
Func<IEntryDetails, EntryInfoViewModel> getEntryInfoViewModel,
|
||||||
Func<IEntryDetails, EntryReleasesViewModel> getEntryReleasesViewModel,
|
Func<IEntryDetails, EntryReleasesViewModel> getEntryReleasesViewModel,
|
||||||
Func<IEntryDetails, EntryImagesViewModel> getEntryImagesViewModel,
|
Func<IEntryDetails, EntryImagesViewModel> getEntryImagesViewModel)
|
||||||
Func<IEntrySummary, EntryListItemViewModel> getEntryListViewModel)
|
|
||||||
{
|
{
|
||||||
|
PluginDescriptionViewModel = pluginDescriptionViewModel;
|
||||||
_client = client;
|
_client = client;
|
||||||
_windowService = windowService;
|
_windowService = windowService;
|
||||||
_pluginManagementService = pluginManagementService;
|
_pluginManagementService = pluginManagementService;
|
||||||
_getEntryInfoViewModel = getEntryInfoViewModel;
|
_getEntryInfoViewModel = getEntryInfoViewModel;
|
||||||
_getEntryReleasesViewModel = getEntryReleasesViewModel;
|
_getEntryReleasesViewModel = getEntryReleasesViewModel;
|
||||||
_getEntryImagesViewModel = getEntryImagesViewModel;
|
_getEntryImagesViewModel = getEntryImagesViewModel;
|
||||||
_getEntryListViewModel = getEntryListViewModel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PluginDescriptionViewModel PluginDescriptionViewModel { get; }
|
||||||
|
|
||||||
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await GetEntry(parameters.EntryId, cancellationToken);
|
if (Entry?.Id != parameters.EntryId)
|
||||||
|
await GetEntry(parameters.EntryId, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task GetEntry(long entryId, CancellationToken cancellationToken)
|
private async Task GetEntry(long entryId, CancellationToken cancellationToken)
|
||||||
@ -73,13 +75,7 @@ public partial class PluginDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
EntryReleasesViewModel.OnInstallationFinished = OnInstallationFinished;
|
EntryReleasesViewModel.OnInstallationFinished = OnInstallationFinished;
|
||||||
}
|
}
|
||||||
|
|
||||||
IReadOnlyList<IEntrySummary>? dependants = (await _client.GetDependantEntries.ExecuteAsync(entryId, 0, 25, cancellationToken)).Data?.Entries?.Items;
|
await PluginDescriptionViewModel.SetEntry(Entry, cancellationToken);
|
||||||
Dependants = dependants != null && dependants.Any()
|
|
||||||
? new ReadOnlyObservableCollection<EntryListItemViewModel>(new ObservableCollection<EntryListItemViewModel>(dependants
|
|
||||||
.Select(_getEntryListViewModel)
|
|
||||||
.OrderByDescending(d => d.Entry.Downloads)
|
|
||||||
.Take(10)))
|
|
||||||
: null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<bool> OnInstallationStarted(IEntryDetails entryDetails, IRelease release)
|
private async Task<bool> OnInstallationStarted(IEntryDetails entryDetails, IRelease release)
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Reactive.Disposables;
|
using System.Reactive.Disposables;
|
||||||
using Artemis.UI.Shared.Routing;
|
|
||||||
using Avalonia.ReactiveUI;
|
using Avalonia.ReactiveUI;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
|
|
||||||
@ -11,14 +10,8 @@ public partial class PluginListView : ReactiveUserControl<PluginListViewModel>
|
|||||||
public PluginListView()
|
public PluginListView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.WhenActivated(d =>
|
this.WhenActivated(d => ViewModel.WhenAnyValue(vm => vm.Screen)
|
||||||
{
|
.Subscribe(screen => RouterFrame.NavigateFromObject(screen ?? ViewModel?.EntryListViewModel))
|
||||||
ViewModel.WhenAnyValue(vm => vm.Screen).Subscribe(Navigate).DisposeWith(d);
|
.DisposeWith(d));
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Navigate(RoutableScreen? viewModel)
|
|
||||||
{
|
|
||||||
RouterFrame.NavigateFromObject(viewModel ?? ViewModel?.EntryListViewModel);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:profile="clr-namespace:Artemis.UI.Screens.Workshop.Profile"
|
||||||
|
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="Artemis.UI.Screens.Workshop.Profile.ProfileDescriptionView"
|
||||||
|
x:DataType="profile:ProfileDescriptionViewModel">
|
||||||
|
<StackPanel Spacing="10">
|
||||||
|
<Border Classes="card">
|
||||||
|
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
||||||
|
<mdxaml:MarkdownScrollViewer.Styles>
|
||||||
|
<StyleInclude Source="/Styles/Markdown.axaml" />
|
||||||
|
</mdxaml:MarkdownScrollViewer.Styles>
|
||||||
|
</mdxaml:MarkdownScrollViewer>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Classes="card" VerticalAlignment="Top" IsVisible="{CompiledBinding Dependencies, Converter={x:Static ObjectConverters.IsNotNull}}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Theme="{StaticResource SubtitleTextBlockStyle}">Required plugins</TextBlock>
|
||||||
|
<Border Classes="card-separator" />
|
||||||
|
<ScrollViewer>
|
||||||
|
<ItemsControl ItemsSource="{CompiledBinding Dependencies}">
|
||||||
|
<ItemsControl.ItemsPanel>
|
||||||
|
<ItemsPanelTemplate>
|
||||||
|
<StackPanel Spacing="5"></StackPanel>
|
||||||
|
</ItemsPanelTemplate>
|
||||||
|
</ItemsControl.ItemsPanel>
|
||||||
|
</ItemsControl>
|
||||||
|
</ScrollViewer>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
|
||||||
|
namespace Artemis.UI.Screens.Workshop.Profile;
|
||||||
|
|
||||||
|
public partial class ProfileDescriptionView : ReactiveUserControl<ProfileDescriptionViewModel>
|
||||||
|
{
|
||||||
|
public ProfileDescriptionView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Artemis.UI.Screens.Workshop.Entries.List;
|
||||||
|
using Artemis.UI.Shared.Routing;
|
||||||
|
using Artemis.WebClient.Workshop;
|
||||||
|
using PropertyChanged.SourceGenerator;
|
||||||
|
|
||||||
|
namespace Artemis.UI.Screens.Workshop.Profile;
|
||||||
|
|
||||||
|
public partial class ProfileDescriptionViewModel : RoutableScreen
|
||||||
|
{
|
||||||
|
private readonly IWorkshopClient _client;
|
||||||
|
private readonly Func<IEntrySummary, EntryListItemViewModel> _getEntryListViewModel;
|
||||||
|
[Notify] private IEntryDetails? _entry;
|
||||||
|
[Notify] private List<EntryListItemViewModel>? _dependencies;
|
||||||
|
|
||||||
|
public ProfileDescriptionViewModel(IWorkshopClient client, Func<IEntrySummary, EntryListItemViewModel> getEntryListViewModel)
|
||||||
|
{
|
||||||
|
_client = client;
|
||||||
|
_getEntryListViewModel = getEntryListViewModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task SetEntry(IEntryDetails? entry, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Entry = entry;
|
||||||
|
|
||||||
|
if (entry != null)
|
||||||
|
{
|
||||||
|
IReadOnlyList<IEntrySummary>? dependencies = (await _client.GetLatestDependencies.ExecuteAsync(entry.Id, cancellationToken)).Data?.Entry?.LatestRelease?.Dependencies;
|
||||||
|
Dependencies = dependencies != null && dependencies.Any() ? dependencies.Select(_getEntryListViewModel).ToList() : null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Dependencies = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,6 +4,8 @@
|
|||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:profile="clr-namespace:Artemis.UI.Screens.Workshop.Profile"
|
xmlns:profile="clr-namespace:Artemis.UI.Screens.Workshop.Profile"
|
||||||
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
|
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
|
||||||
|
xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
|
||||||
|
xmlns:ui="clr-namespace:Artemis.UI"
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="800"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="800"
|
||||||
x:Class="Artemis.UI.Screens.Workshop.Profile.ProfileDetailsView"
|
x:Class="Artemis.UI.Screens.Workshop.Profile.ProfileDetailsView"
|
||||||
x:DataType="profile:ProfileDetailsViewModel">
|
x:DataType="profile:ProfileDetailsViewModel">
|
||||||
@ -18,33 +20,12 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<ScrollViewer Grid.Row="1" Grid.Column="1">
|
<ScrollViewer Grid.Row="1" Grid.Column="1">
|
||||||
<StackPanel Margin="10 0" Spacing="10">
|
<controls:Frame Name="RouterFrame" IsNavigationStackEnabled="False" CacheSize="0" Margin="10 0">
|
||||||
<Border Classes="card">
|
<controls:Frame.NavigationPageFactory>
|
||||||
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
<ui:PageFactory />
|
||||||
<mdxaml:MarkdownScrollViewer.Styles>
|
</controls:Frame.NavigationPageFactory>
|
||||||
<StyleInclude Source="/Styles/Markdown.axaml" />
|
</controls:Frame>
|
||||||
</mdxaml:MarkdownScrollViewer.Styles>
|
|
||||||
</mdxaml:MarkdownScrollViewer>
|
|
||||||
</Border>
|
|
||||||
|
|
||||||
<Border Classes="card" VerticalAlignment="Top" IsVisible="{CompiledBinding Dependencies, Converter={x:Static ObjectConverters.IsNotNull}}">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Theme="{StaticResource SubtitleTextBlockStyle}">Required plugins</TextBlock>
|
|
||||||
<Border Classes="card-separator" />
|
|
||||||
<ScrollViewer>
|
|
||||||
<ItemsControl ItemsSource="{CompiledBinding Dependencies}">
|
|
||||||
<ItemsControl.ItemsPanel>
|
|
||||||
<ItemsPanelTemplate>
|
|
||||||
<StackPanel Spacing="5"></StackPanel>
|
|
||||||
</ItemsPanelTemplate>
|
|
||||||
</ItemsControl.ItemsPanel>
|
|
||||||
</ItemsControl>
|
|
||||||
</ScrollViewer>
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
</StackPanel>
|
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
|
||||||
|
|
||||||
<ContentControl Grid.Row="1" Grid.Column="2" IsVisible="{CompiledBinding Entry.Images.Count}" Content="{CompiledBinding EntryImagesViewModel}" />
|
<ContentControl Grid.Row="1" Grid.Column="2" IsVisible="{CompiledBinding Entry.Images.Count}" Content="{CompiledBinding EntryImagesViewModel}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
|
using System;
|
||||||
|
using System.Reactive.Disposables;
|
||||||
using Avalonia.ReactiveUI;
|
using Avalonia.ReactiveUI;
|
||||||
|
using ReactiveUI;
|
||||||
|
|
||||||
namespace Artemis.UI.Screens.Workshop.Profile;
|
namespace Artemis.UI.Screens.Workshop.Profile;
|
||||||
|
|
||||||
@ -7,5 +10,8 @@ public partial class ProfileDetailsView : ReactiveUserControl<ProfileDetailsView
|
|||||||
public ProfileDetailsView()
|
public ProfileDetailsView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
this.WhenActivated(d => ViewModel.WhenAnyValue(vm => vm.Screen)
|
||||||
|
.Subscribe(screen => RouterFrame.NavigateFromObject(screen ?? ViewModel?.ProfileDescriptionViewModel))
|
||||||
|
.DisposeWith(d));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5,7 +5,6 @@ using System.Linq;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Artemis.UI.Screens.Workshop.Entries.Details;
|
using Artemis.UI.Screens.Workshop.Entries.Details;
|
||||||
using Artemis.UI.Screens.Workshop.Entries.List;
|
|
||||||
using Artemis.UI.Screens.Workshop.Parameters;
|
using Artemis.UI.Screens.Workshop.Parameters;
|
||||||
using Artemis.UI.Shared.Routing;
|
using Artemis.UI.Shared.Routing;
|
||||||
using Artemis.WebClient.Workshop;
|
using Artemis.WebClient.Workshop;
|
||||||
@ -14,36 +13,38 @@ using StrawberryShake;
|
|||||||
|
|
||||||
namespace Artemis.UI.Screens.Workshop.Profile;
|
namespace Artemis.UI.Screens.Workshop.Profile;
|
||||||
|
|
||||||
public partial class ProfileDetailsViewModel : RoutableScreen<WorkshopDetailParameters>
|
public partial class ProfileDetailsViewModel : RoutableHostScreen<RoutableScreen, WorkshopDetailParameters>
|
||||||
{
|
{
|
||||||
private readonly IWorkshopClient _client;
|
private readonly IWorkshopClient _client;
|
||||||
private readonly Func<IEntryDetails, EntryInfoViewModel> _getEntryInfoViewModel;
|
private readonly Func<IEntryDetails, EntryInfoViewModel> _getEntryInfoViewModel;
|
||||||
private readonly Func<IEntryDetails, EntryReleasesViewModel> _getEntryReleasesViewModel;
|
private readonly Func<IEntryDetails, EntryReleasesViewModel> _getEntryReleasesViewModel;
|
||||||
private readonly Func<IEntryDetails, EntryImagesViewModel> _getEntryImagesViewModel;
|
private readonly Func<IEntryDetails, EntryImagesViewModel> _getEntryImagesViewModel;
|
||||||
private readonly Func<IEntrySummary, EntryListItemViewModel> _getEntryListViewModel;
|
|
||||||
|
|
||||||
[Notify] private IEntryDetails? _entry;
|
[Notify] private IEntryDetails? _entry;
|
||||||
[Notify] private EntryInfoViewModel? _entryInfoViewModel;
|
[Notify] private EntryInfoViewModel? _entryInfoViewModel;
|
||||||
[Notify] private EntryReleasesViewModel? _entryReleasesViewModel;
|
[Notify] private EntryReleasesViewModel? _entryReleasesViewModel;
|
||||||
[Notify] private EntryImagesViewModel? _entryImagesViewModel;
|
[Notify] private EntryImagesViewModel? _entryImagesViewModel;
|
||||||
[Notify] private ReadOnlyObservableCollection<EntryListItemViewModel>? _dependencies;
|
|
||||||
|
|
||||||
public ProfileDetailsViewModel(IWorkshopClient client,
|
public ProfileDetailsViewModel(IWorkshopClient client,
|
||||||
|
ProfileDescriptionViewModel profileDescriptionViewModel,
|
||||||
Func<IEntryDetails, EntryInfoViewModel> getEntryInfoViewModel,
|
Func<IEntryDetails, EntryInfoViewModel> getEntryInfoViewModel,
|
||||||
Func<IEntryDetails, EntryReleasesViewModel> getEntryReleasesViewModel,
|
Func<IEntryDetails, EntryReleasesViewModel> getEntryReleasesViewModel,
|
||||||
Func<IEntryDetails, EntryImagesViewModel> getEntryImagesViewModel,
|
Func<IEntryDetails, EntryImagesViewModel> getEntryImagesViewModel)
|
||||||
Func<IEntrySummary, EntryListItemViewModel> getEntryListViewModel)
|
|
||||||
{
|
{
|
||||||
|
ProfileDescriptionViewModel = profileDescriptionViewModel;
|
||||||
|
|
||||||
_client = client;
|
_client = client;
|
||||||
_getEntryInfoViewModel = getEntryInfoViewModel;
|
_getEntryInfoViewModel = getEntryInfoViewModel;
|
||||||
_getEntryReleasesViewModel = getEntryReleasesViewModel;
|
_getEntryReleasesViewModel = getEntryReleasesViewModel;
|
||||||
_getEntryImagesViewModel = getEntryImagesViewModel;
|
_getEntryImagesViewModel = getEntryImagesViewModel;
|
||||||
_getEntryListViewModel = getEntryListViewModel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ProfileDescriptionViewModel ProfileDescriptionViewModel { get; }
|
||||||
|
|
||||||
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await GetEntry(parameters.EntryId, cancellationToken);
|
if (Entry?.Id != parameters.EntryId)
|
||||||
|
await GetEntry(parameters.EntryId, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task GetEntry(long entryId, CancellationToken cancellationToken)
|
private async Task GetEntry(long entryId, CancellationToken cancellationToken)
|
||||||
@ -56,10 +57,7 @@ public partial class ProfileDetailsViewModel : RoutableScreen<WorkshopDetailPara
|
|||||||
EntryInfoViewModel = Entry != null ? _getEntryInfoViewModel(Entry) : null;
|
EntryInfoViewModel = Entry != null ? _getEntryInfoViewModel(Entry) : null;
|
||||||
EntryReleasesViewModel = Entry != null ? _getEntryReleasesViewModel(Entry) : null;
|
EntryReleasesViewModel = Entry != null ? _getEntryReleasesViewModel(Entry) : null;
|
||||||
EntryImagesViewModel = Entry != null ? _getEntryImagesViewModel(Entry) : null;
|
EntryImagesViewModel = Entry != null ? _getEntryImagesViewModel(Entry) : null;
|
||||||
|
|
||||||
IReadOnlyList<IEntrySummary>? dependencies = (await _client.GetLatestDependencies.ExecuteAsync(entryId, cancellationToken)).Data?.Entry?.LatestRelease?.Dependencies;
|
await ProfileDescriptionViewModel.SetEntry(Entry, cancellationToken);
|
||||||
Dependencies = dependencies != null && dependencies.Any()
|
|
||||||
? new ReadOnlyObservableCollection<EntryListItemViewModel>(new ObservableCollection<EntryListItemViewModel>(dependencies.Select(_getEntryListViewModel)))
|
|
||||||
: null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,8 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Reactive.Disposables;
|
using System.Reactive.Disposables;
|
||||||
using Artemis.UI.Shared.Routing;
|
|
||||||
using Avalonia.ReactiveUI;
|
using Avalonia.ReactiveUI;
|
||||||
using Avalonia.Threading;
|
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
|
|
||||||
namespace Artemis.UI.Screens.Workshop.Profile;
|
namespace Artemis.UI.Screens.Workshop.Profile;
|
||||||
@ -12,14 +10,8 @@ public partial class ProfileListView : ReactiveUserControl<ProfileListViewModel>
|
|||||||
public ProfileListView()
|
public ProfileListView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.WhenActivated(d =>
|
this.WhenActivated(d => ViewModel.WhenAnyValue(vm => vm.Screen)
|
||||||
{
|
.Subscribe(screen => RouterFrame.NavigateFromObject(screen ?? ViewModel?.EntryListViewModel))
|
||||||
ViewModel.WhenAnyValue(vm => vm.Screen).Subscribe(Navigate).DisposeWith(d);
|
.DisposeWith(d));
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Navigate(RoutableScreen? viewModel)
|
|
||||||
{
|
|
||||||
RouterFrame.NavigateFromObject(viewModel ?? ViewModel?.EntryListViewModel);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -48,6 +48,9 @@
|
|||||||
<GraphQL Update="Mutations\CreateEntry.graphql">
|
<GraphQL Update="Mutations\CreateEntry.graphql">
|
||||||
<Generator>MSBuild:GenerateGraphQLCode</Generator>
|
<Generator>MSBuild:GenerateGraphQLCode</Generator>
|
||||||
</GraphQL>
|
</GraphQL>
|
||||||
|
<GraphQL Update="Queries\GetReleaseById.graphql">
|
||||||
|
<Generator>MSBuild:GenerateGraphQLCode</Generator>
|
||||||
|
</GraphQL>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@ -0,0 +1,6 @@
|
|||||||
|
query GetReleaseById($id: Long!) {
|
||||||
|
release(id: $id) {
|
||||||
|
...release
|
||||||
|
changelog
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -2,7 +2,7 @@ schema: schema.graphql
|
|||||||
extensions:
|
extensions:
|
||||||
endpoints:
|
endpoints:
|
||||||
Default GraphQL Endpoint:
|
Default GraphQL Endpoint:
|
||||||
url: https://localhost:7281/graphql
|
url: https://workshop.artemis-rgb.com/graphql
|
||||||
headers:
|
headers:
|
||||||
user-agent: JS GraphQL
|
user-agent: JS GraphQL
|
||||||
introspect: true
|
introspect: true
|
||||||
|
|||||||
@ -102,6 +102,7 @@ type Mutation {
|
|||||||
removeLayoutInfo(id: Long!): LayoutInfo!
|
removeLayoutInfo(id: Long!): LayoutInfo!
|
||||||
updateEntry(input: UpdateEntryInput!): Entry
|
updateEntry(input: UpdateEntryInput!): Entry
|
||||||
updateEntryImage(input: UpdateEntryImageInput!): Image
|
updateEntryImage(input: UpdateEntryImageInput!): Image
|
||||||
|
updateRelease(input: UpdateReleaseInput!): Release
|
||||||
}
|
}
|
||||||
|
|
||||||
"Information about pagination in a connection."
|
"Information about pagination in a connection."
|
||||||
@ -158,6 +159,7 @@ type Query {
|
|||||||
entry(id: Long!): Entry
|
entry(id: Long!): Entry
|
||||||
pluginInfo(pluginGuid: UUID!): PluginInfo
|
pluginInfo(pluginGuid: UUID!): PluginInfo
|
||||||
pluginInfos(order: [PluginInfoSortInput!], skip: Int, take: Int, where: PluginInfoFilterInput): PluginInfosCollectionSegment
|
pluginInfos(order: [PluginInfoSortInput!], skip: Int, take: Int, where: PluginInfoFilterInput): PluginInfosCollectionSegment
|
||||||
|
release(id: Long!): Release
|
||||||
searchEntries(input: String!, order: [EntrySortInput!], type: EntryType, where: EntryFilterInput): [Entry!]!
|
searchEntries(input: String!, order: [EntrySortInput!], type: EntryType, where: EntryFilterInput): [Entry!]!
|
||||||
searchKeyboardLayout(deviceProvider: UUID!, logicalLayout: String, model: String!, physicalLayout: KeyboardLayoutType!, vendor: String!): LayoutInfo
|
searchKeyboardLayout(deviceProvider: UUID!, logicalLayout: String, model: String!, physicalLayout: KeyboardLayoutType!, vendor: String!): LayoutInfo
|
||||||
searchLayout(deviceProvider: UUID!, deviceType: RGBDeviceType!, model: String!, vendor: String!): LayoutInfo
|
searchLayout(deviceProvider: UUID!, deviceType: RGBDeviceType!, model: String!, vendor: String!): LayoutInfo
|
||||||
@ -165,6 +167,7 @@ type Query {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Release {
|
type Release {
|
||||||
|
changelog: String
|
||||||
createdAt: DateTime!
|
createdAt: DateTime!
|
||||||
dependencies: [Entry!]!
|
dependencies: [Entry!]!
|
||||||
downloadSize: Long!
|
downloadSize: Long!
|
||||||
@ -498,6 +501,7 @@ input RGBDeviceTypeOperationFilterInput {
|
|||||||
|
|
||||||
input ReleaseFilterInput {
|
input ReleaseFilterInput {
|
||||||
and: [ReleaseFilterInput!]
|
and: [ReleaseFilterInput!]
|
||||||
|
changelog: StringOperationFilterInput
|
||||||
createdAt: DateTimeOperationFilterInput
|
createdAt: DateTimeOperationFilterInput
|
||||||
dependencies: ListFilterInputTypeOfEntryFilterInput
|
dependencies: ListFilterInputTypeOfEntryFilterInput
|
||||||
downloadSize: LongOperationFilterInput
|
downloadSize: LongOperationFilterInput
|
||||||
@ -511,6 +515,7 @@ input ReleaseFilterInput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
input ReleaseSortInput {
|
input ReleaseSortInput {
|
||||||
|
changelog: SortEnumType
|
||||||
createdAt: SortEnumType
|
createdAt: SortEnumType
|
||||||
downloadSize: SortEnumType
|
downloadSize: SortEnumType
|
||||||
downloads: SortEnumType
|
downloads: SortEnumType
|
||||||
@ -558,6 +563,11 @@ input UpdateEntryInput {
|
|||||||
tags: [String!]!
|
tags: [String!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input UpdateReleaseInput {
|
||||||
|
changelog: String
|
||||||
|
id: Long!
|
||||||
|
}
|
||||||
|
|
||||||
input UuidOperationFilterInput {
|
input UuidOperationFilterInput {
|
||||||
eq: UUID
|
eq: UUID
|
||||||
gt: UUID
|
gt: UUID
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user