mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-12 21:38:38 +00:00
Workshop - Show required plugins on profile pages
Workshop - Show related profiles on plugin pages
This commit is contained in:
parent
36bff3c5f3
commit
9132301dbf
@ -10,10 +10,10 @@ namespace Artemis.UI.Screens.Workshop.Entries.Details;
|
|||||||
public class EntryInfoViewModel : ViewModelBase
|
public class EntryInfoViewModel : ViewModelBase
|
||||||
{
|
{
|
||||||
private readonly INotificationService _notificationService;
|
private readonly INotificationService _notificationService;
|
||||||
public IGetEntryById_Entry Entry { get; }
|
public IEntryDetails Entry { get; }
|
||||||
public DateTimeOffset? UpdatedAt { get; }
|
public DateTimeOffset? UpdatedAt { get; }
|
||||||
|
|
||||||
public EntryInfoViewModel(IGetEntryById_Entry entry, INotificationService notificationService)
|
public EntryInfoViewModel(IEntryDetails entry, INotificationService notificationService)
|
||||||
{
|
{
|
||||||
_notificationService = notificationService;
|
_notificationService = notificationService;
|
||||||
Entry = entry;
|
Entry = entry;
|
||||||
|
|||||||
@ -20,7 +20,7 @@ public class EntryReleasesViewModel : ViewModelBase
|
|||||||
private readonly IWindowService _windowService;
|
private readonly IWindowService _windowService;
|
||||||
private readonly INotificationService _notificationService;
|
private readonly INotificationService _notificationService;
|
||||||
|
|
||||||
public EntryReleasesViewModel(IGetEntryById_Entry entry, EntryInstallationHandlerFactory factory, IWindowService windowService, INotificationService notificationService)
|
public EntryReleasesViewModel(IEntryDetails entry, EntryInstallationHandlerFactory factory, IWindowService windowService, INotificationService notificationService)
|
||||||
{
|
{
|
||||||
_factory = factory;
|
_factory = factory;
|
||||||
_windowService = windowService;
|
_windowService = windowService;
|
||||||
@ -31,7 +31,7 @@ public class EntryReleasesViewModel : ViewModelBase
|
|||||||
OnInstallationStarted = Confirm;
|
OnInstallationStarted = Confirm;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IGetEntryById_Entry Entry { get; }
|
public IEntryDetails Entry { get; }
|
||||||
public ReactiveCommand<Unit, Unit> DownloadLatestRelease { get; }
|
public ReactiveCommand<Unit, Unit> DownloadLatestRelease { get; }
|
||||||
|
|
||||||
public Func<IEntryDetails, Task<bool>> OnInstallationStarted { get; set; }
|
public Func<IEntryDetails, Task<bool>> OnInstallationStarted { get; set; }
|
||||||
|
|||||||
@ -21,9 +21,11 @@
|
|||||||
HorizontalContentAlignment="Stretch"
|
HorizontalContentAlignment="Stretch"
|
||||||
Command="{CompiledBinding NavigateToEntry}"
|
Command="{CompiledBinding NavigateToEntry}"
|
||||||
IsVisible="{CompiledBinding Entry, Converter={x:Static ObjectConverters.IsNotNull}}">
|
IsVisible="{CompiledBinding Entry, Converter={x:Static ObjectConverters.IsNotNull}}">
|
||||||
<Grid ColumnDefinitions="Auto,*,Auto">
|
<Grid ColumnDefinitions="Auto,*,Auto" RowDefinitions="*, Auto">
|
||||||
<!-- Icon -->
|
<!-- Icon -->
|
||||||
<Border Grid.Column="0"
|
<Border Grid.Column="0"
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.RowSpan="2"
|
||||||
CornerRadius="6"
|
CornerRadius="6"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Margin="0 0 10 0"
|
Margin="0 0 10 0"
|
||||||
@ -34,7 +36,7 @@
|
|||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<!-- Body -->
|
<!-- Body -->
|
||||||
<Grid Grid.Column="1" VerticalAlignment="Stretch" RowDefinitions="Auto,*,Auto">
|
<Grid Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" VerticalAlignment="Stretch" RowDefinitions="Auto,*,Auto">
|
||||||
<TextBlock Grid.Row="0" Margin="0 0 0 5" TextTrimming="CharacterEllipsis">
|
<TextBlock Grid.Row="0" Margin="0 0 0 5" TextTrimming="CharacterEllipsis">
|
||||||
<Run Classes="h5" Text="{CompiledBinding Entry.Name, FallbackValue=Title}" />
|
<Run Classes="h5" Text="{CompiledBinding Entry.Name, FallbackValue=Title}" />
|
||||||
<Run Classes="subtitle">by</Run>
|
<Run Classes="subtitle">by</Run>
|
||||||
@ -65,7 +67,7 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<!-- Info -->
|
<!-- Info -->
|
||||||
<StackPanel Grid.Column="2" Margin="0 0 4 0">
|
<StackPanel Grid.Column="2" Grid.Row="0" Margin="0 0 4 0" HorizontalAlignment="Right">
|
||||||
<TextBlock TextAlignment="Right" Text="{CompiledBinding Entry.CreatedAt, FallbackValue=01-01-1337, Converter={StaticResource DateTimeConverter}}" />
|
<TextBlock TextAlignment="Right" Text="{CompiledBinding Entry.CreatedAt, FallbackValue=01-01-1337, Converter={StaticResource DateTimeConverter}}" />
|
||||||
<TextBlock TextAlignment="Right">
|
<TextBlock TextAlignment="Right">
|
||||||
<avalonia:MaterialIcon Kind="Downloads" />
|
<avalonia:MaterialIcon Kind="Downloads" />
|
||||||
@ -73,6 +75,18 @@
|
|||||||
<Run>downloads</Run>
|
<Run>downloads</Run>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
|
<!-- Install state -->
|
||||||
|
<StackPanel Grid.Column="2" Grid.Row="1" Margin="0 0 4 0" HorizontalAlignment="Right" VerticalAlignment="Bottom" IsVisible="{CompiledBinding IsInstalled}">
|
||||||
|
<TextBlock TextAlignment="Right" IsVisible="{CompiledBinding !UpdateAvailable}">
|
||||||
|
<avalonia:MaterialIcon Kind="CheckCircle" Foreground="{DynamicResource SystemAccentColorLight1}"/>
|
||||||
|
<Run>installed</Run>
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock TextAlignment="Right" IsVisible="{CompiledBinding UpdateAvailable}">
|
||||||
|
<avalonia:MaterialIcon Kind="Update" Foreground="{DynamicResource SystemAccentColorLight1}"/>
|
||||||
|
<Run>update available</Run>
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Button>
|
</Button>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
@ -1,26 +1,39 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Reactive;
|
using System.Reactive;
|
||||||
|
using System.Reactive.Disposables;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Artemis.UI.Shared;
|
using Artemis.UI.Shared;
|
||||||
using Artemis.UI.Shared.Routing;
|
using Artemis.UI.Shared.Routing;
|
||||||
using Artemis.WebClient.Workshop;
|
using Artemis.WebClient.Workshop;
|
||||||
|
using Artemis.WebClient.Workshop.Models;
|
||||||
|
using Artemis.WebClient.Workshop.Services;
|
||||||
|
using PropertyChanged.SourceGenerator;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
|
|
||||||
namespace Artemis.UI.Screens.Workshop.Entries.List;
|
namespace Artemis.UI.Screens.Workshop.Entries.List;
|
||||||
|
|
||||||
public class EntryListItemViewModel : ActivatableViewModelBase
|
public partial class EntryListItemViewModel : ActivatableViewModelBase
|
||||||
{
|
{
|
||||||
private readonly IRouter _router;
|
private readonly IRouter _router;
|
||||||
|
[Notify] private bool _isInstalled;
|
||||||
|
[Notify] private bool _updateAvailable;
|
||||||
|
|
||||||
public EntryListItemViewModel(IGetEntries_Entries_Items entry, IRouter router)
|
public EntryListItemViewModel(IEntrySummary entry, IRouter router, IWorkshopService workshopService)
|
||||||
{
|
{
|
||||||
_router = router;
|
_router = router;
|
||||||
|
|
||||||
Entry = entry;
|
Entry = entry;
|
||||||
NavigateToEntry = ReactiveCommand.CreateFromTask(ExecuteNavigateToEntry);
|
NavigateToEntry = ReactiveCommand.CreateFromTask(ExecuteNavigateToEntry);
|
||||||
|
|
||||||
|
this.WhenActivated((CompositeDisposable _) =>
|
||||||
|
{
|
||||||
|
InstalledEntry? installedEntry = workshopService.GetInstalledEntry(entry.Id);
|
||||||
|
IsInstalled = installedEntry != null;
|
||||||
|
UpdateAvailable = installedEntry != null && installedEntry.ReleaseId != entry.LatestReleaseId;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public IGetEntries_Entries_Items Entry { get; }
|
public IEntrySummary Entry { get; }
|
||||||
public ReactiveCommand<Unit, Unit> NavigateToEntry { get; }
|
public ReactiveCommand<Unit, Unit> NavigateToEntry { get; }
|
||||||
|
|
||||||
private async Task ExecuteNavigateToEntry()
|
private async Task ExecuteNavigateToEntry()
|
||||||
|
|||||||
@ -21,7 +21,7 @@ namespace Artemis.UI.Screens.Workshop.Entries.List;
|
|||||||
|
|
||||||
public abstract partial class EntryListViewModel : RoutableScreen<WorkshopListParameters>
|
public abstract partial class EntryListViewModel : RoutableScreen<WorkshopListParameters>
|
||||||
{
|
{
|
||||||
private readonly SourceList<IGetEntries_Entries_Items> _entries = new();
|
private readonly SourceList<IEntrySummary> _entries = new();
|
||||||
private readonly ObservableAsPropertyHelper<bool> _isLoading;
|
private readonly ObservableAsPropertyHelper<bool> _isLoading;
|
||||||
private readonly INotificationService _notificationService;
|
private readonly INotificationService _notificationService;
|
||||||
private readonly string _route;
|
private readonly string _route;
|
||||||
@ -37,13 +37,13 @@ public abstract partial class EntryListViewModel : RoutableScreen<WorkshopListPa
|
|||||||
CategoriesViewModel categoriesViewModel,
|
CategoriesViewModel categoriesViewModel,
|
||||||
EntryListInputViewModel entryListInputViewModel,
|
EntryListInputViewModel entryListInputViewModel,
|
||||||
INotificationService notificationService,
|
INotificationService notificationService,
|
||||||
Func<IGetEntries_Entries_Items, EntryListItemViewModel> getEntryListViewModel)
|
Func<IEntrySummary, EntryListItemViewModel> getEntryListViewModel)
|
||||||
{
|
{
|
||||||
_route = route;
|
_route = route;
|
||||||
_workshopClient = workshopClient;
|
_workshopClient = workshopClient;
|
||||||
_notificationService = notificationService;
|
_notificationService = notificationService;
|
||||||
_showPagination = this.WhenAnyValue<EntryListViewModel, int>(vm => vm.TotalPages).Select(t => t > 1).ToProperty(this, vm => vm.ShowPagination);
|
_showPagination = this.WhenAnyValue(vm => vm.TotalPages).Select(t => t > 1).ToProperty(this, vm => vm.ShowPagination);
|
||||||
_isLoading = this.WhenAnyValue<EntryListViewModel, bool, int, int>(vm => vm.Page, vm => vm.LoadedPage, (p, c) => p != c).ToProperty(this, vm => vm.IsLoading);
|
_isLoading = this.WhenAnyValue(vm => vm.Page, vm => vm.LoadedPage, (p, c) => p != c).ToProperty(this, vm => vm.IsLoading);
|
||||||
|
|
||||||
CategoriesViewModel = categoriesViewModel;
|
CategoriesViewModel = categoriesViewModel;
|
||||||
InputViewModel = entryListInputViewModel;
|
InputViewModel = entryListInputViewModel;
|
||||||
|
|||||||
@ -14,7 +14,7 @@ public class LayoutListViewModel : List.EntryListViewModel
|
|||||||
CategoriesViewModel categoriesViewModel,
|
CategoriesViewModel categoriesViewModel,
|
||||||
EntryListInputViewModel entryListInputViewModel,
|
EntryListInputViewModel entryListInputViewModel,
|
||||||
INotificationService notificationService,
|
INotificationService notificationService,
|
||||||
Func<IGetEntries_Entries_Items, EntryListItemViewModel> getEntryListViewModel)
|
Func<IEntrySummary, EntryListItemViewModel> getEntryListViewModel)
|
||||||
: base("workshop/entries/layouts", workshopClient, router, categoriesViewModel, entryListInputViewModel, notificationService, getEntryListViewModel)
|
: base("workshop/entries/layouts", workshopClient, router, categoriesViewModel, entryListInputViewModel, notificationService, getEntryListViewModel)
|
||||||
{
|
{
|
||||||
entryListInputViewModel.SearchWatermark = "Search layouts";
|
entryListInputViewModel.SearchWatermark = "Search layouts";
|
||||||
|
|||||||
@ -14,7 +14,7 @@ public class PluginListViewModel : EntryListViewModel
|
|||||||
CategoriesViewModel categoriesViewModel,
|
CategoriesViewModel categoriesViewModel,
|
||||||
EntryListInputViewModel entryListInputViewModel,
|
EntryListInputViewModel entryListInputViewModel,
|
||||||
INotificationService notificationService,
|
INotificationService notificationService,
|
||||||
Func<IGetEntries_Entries_Items, EntryListItemViewModel> getEntryListViewModel)
|
Func<IEntrySummary, EntryListItemViewModel> getEntryListViewModel)
|
||||||
: base("workshop/entries/plugins", workshopClient, router, categoriesViewModel, entryListInputViewModel, notificationService, getEntryListViewModel)
|
: base("workshop/entries/plugins", workshopClient, router, categoriesViewModel, entryListInputViewModel, notificationService, getEntryListViewModel)
|
||||||
{
|
{
|
||||||
entryListInputViewModel.SearchWatermark = "Search plugins";
|
entryListInputViewModel.SearchWatermark = "Search plugins";
|
||||||
|
|||||||
@ -14,7 +14,7 @@ public class ProfileListViewModel : List.EntryListViewModel
|
|||||||
CategoriesViewModel categoriesViewModel,
|
CategoriesViewModel categoriesViewModel,
|
||||||
EntryListInputViewModel entryListInputViewModel,
|
EntryListInputViewModel entryListInputViewModel,
|
||||||
INotificationService notificationService,
|
INotificationService notificationService,
|
||||||
Func<IGetEntries_Entries_Items, EntryListItemViewModel> getEntryListViewModel)
|
Func<IEntrySummary, EntryListItemViewModel> getEntryListViewModel)
|
||||||
: base("workshop/entries/profiles", workshopClient, router, categoriesViewModel, entryListInputViewModel, notificationService, getEntryListViewModel)
|
: base("workshop/entries/profiles", workshopClient, router, categoriesViewModel, entryListInputViewModel, notificationService, getEntryListViewModel)
|
||||||
{
|
{
|
||||||
entryListInputViewModel.SearchWatermark = "Search profiles";
|
entryListInputViewModel.SearchWatermark = "Search profiles";
|
||||||
|
|||||||
@ -17,13 +17,17 @@
|
|||||||
</Border>
|
</Border>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<Border Classes="card" Grid.Row="1" Grid.Column="1" Margin="10 0">
|
<ScrollViewer Grid.Row="1" Grid.Column="1">
|
||||||
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
<StackPanel Margin="10 0" Spacing="10">
|
||||||
<mdxaml:MarkdownScrollViewer.Styles>
|
<Border Classes="card">
|
||||||
<StyleInclude Source="/Styles/Markdown.axaml" />
|
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
||||||
</mdxaml:MarkdownScrollViewer.Styles>
|
<mdxaml:MarkdownScrollViewer.Styles>
|
||||||
</mdxaml:MarkdownScrollViewer>
|
<StyleInclude Source="/Styles/Markdown.axaml" />
|
||||||
</Border>
|
</mdxaml:MarkdownScrollViewer.Styles>
|
||||||
|
</mdxaml:MarkdownScrollViewer>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</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>
|
||||||
|
|||||||
@ -24,10 +24,10 @@ public partial class LayoutDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
private readonly IWorkshopClient _client;
|
private readonly IWorkshopClient _client;
|
||||||
private readonly IDeviceService _deviceService;
|
private readonly IDeviceService _deviceService;
|
||||||
private readonly IWindowService _windowService;
|
private readonly IWindowService _windowService;
|
||||||
private readonly Func<IGetEntryById_Entry, EntryInfoViewModel> _getEntryInfoViewModel;
|
private readonly Func<IEntryDetails, EntryInfoViewModel> _getEntryInfoViewModel;
|
||||||
private readonly Func<IGetEntryById_Entry, EntryReleasesViewModel> _getEntryReleasesViewModel;
|
private readonly Func<IEntryDetails, EntryReleasesViewModel> _getEntryReleasesViewModel;
|
||||||
private readonly Func<IGetEntryById_Entry, EntryImagesViewModel> _getEntryImagesViewModel;
|
private readonly Func<IEntryDetails, EntryImagesViewModel> _getEntryImagesViewModel;
|
||||||
[Notify] private IGetEntryById_Entry? _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;
|
||||||
@ -35,9 +35,9 @@ public partial class LayoutDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
public LayoutDetailsViewModel(IWorkshopClient client,
|
public LayoutDetailsViewModel(IWorkshopClient client,
|
||||||
IDeviceService deviceService,
|
IDeviceService deviceService,
|
||||||
IWindowService windowService,
|
IWindowService windowService,
|
||||||
Func<IGetEntryById_Entry, EntryInfoViewModel> getEntryInfoViewModel,
|
Func<IEntryDetails, EntryInfoViewModel> getEntryInfoViewModel,
|
||||||
Func<IGetEntryById_Entry, EntryReleasesViewModel> getEntryReleasesViewModel,
|
Func<IEntryDetails, EntryReleasesViewModel> getEntryReleasesViewModel,
|
||||||
Func<IGetEntryById_Entry, EntryImagesViewModel> getEntryImagesViewModel)
|
Func<IEntryDetails, EntryImagesViewModel> getEntryImagesViewModel)
|
||||||
{
|
{
|
||||||
_client = client;
|
_client = client;
|
||||||
_deviceService = deviceService;
|
_deviceService = deviceService;
|
||||||
@ -59,19 +59,12 @@ public partial class LayoutDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Entry = result.Data?.Entry;
|
Entry = result.Data?.Entry;
|
||||||
if (Entry == null)
|
EntryInfoViewModel = Entry != null ? _getEntryInfoViewModel(Entry) : null;
|
||||||
{
|
EntryReleasesViewModel = Entry != null ? _getEntryReleasesViewModel(Entry) : null;
|
||||||
EntryInfoViewModel = null;
|
EntryImagesViewModel = Entry != null ? _getEntryImagesViewModel(Entry) : null;
|
||||||
EntryReleasesViewModel = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
EntryInfoViewModel = _getEntryInfoViewModel(Entry);
|
|
||||||
EntryReleasesViewModel = _getEntryReleasesViewModel(Entry);
|
|
||||||
EntryImagesViewModel = _getEntryImagesViewModel(Entry);
|
|
||||||
|
|
||||||
|
if (EntryReleasesViewModel != null)
|
||||||
EntryReleasesViewModel.OnInstallationFinished = OnInstallationFinished;
|
EntryReleasesViewModel.OnInstallationFinished = OnInstallationFinished;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OnInstallationFinished(InstalledEntry installedEntry)
|
private async Task OnInstallationFinished(InstalledEntry installedEntry)
|
||||||
|
|||||||
@ -17,13 +17,27 @@
|
|||||||
</Border>
|
</Border>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<Border Classes="card" Grid.Row="1" Grid.Column="1" Margin="10 0">
|
<ScrollViewer Grid.Row="1" Grid.Column="1">
|
||||||
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
<StackPanel Margin="10 0" Spacing="10">
|
||||||
<mdxaml:MarkdownScrollViewer.Styles>
|
<Border Classes="card">
|
||||||
<StyleInclude Source="/Styles/Markdown.axaml" />
|
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
||||||
</mdxaml:MarkdownScrollViewer.Styles>
|
<mdxaml:MarkdownScrollViewer.Styles>
|
||||||
</mdxaml:MarkdownScrollViewer>
|
<StyleInclude Source="/Styles/Markdown.axaml" />
|
||||||
</Border>
|
</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>
|
||||||
|
</ScrollViewer>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</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,10 +1,13 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Artemis.Core;
|
using Artemis.Core;
|
||||||
using Artemis.Core.Services;
|
using Artemis.Core.Services;
|
||||||
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.Screens.Workshop.Plugins.Dialogs;
|
using Artemis.UI.Screens.Workshop.Plugins.Dialogs;
|
||||||
using Artemis.UI.Shared.Routing;
|
using Artemis.UI.Shared.Routing;
|
||||||
@ -21,20 +24,23 @@ public partial class PluginDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
private readonly IWorkshopClient _client;
|
private readonly IWorkshopClient _client;
|
||||||
private readonly IWindowService _windowService;
|
private readonly IWindowService _windowService;
|
||||||
private readonly IPluginManagementService _pluginManagementService;
|
private readonly IPluginManagementService _pluginManagementService;
|
||||||
private readonly Func<IGetEntryById_Entry, EntryInfoViewModel> _getEntryInfoViewModel;
|
private readonly Func<IEntryDetails, EntryInfoViewModel> _getEntryInfoViewModel;
|
||||||
private readonly Func<IGetEntryById_Entry, EntryReleasesViewModel> _getEntryReleasesViewModel;
|
private readonly Func<IEntryDetails, EntryReleasesViewModel> _getEntryReleasesViewModel;
|
||||||
private readonly Func<IGetEntryById_Entry, EntryImagesViewModel> _getEntryImagesViewModel;
|
private readonly Func<IEntryDetails, EntryImagesViewModel> _getEntryImagesViewModel;
|
||||||
[Notify] private IGetEntryById_Entry? _entry;
|
private readonly Func<IEntrySummary, EntryListItemViewModel> _getEntryListViewModel;
|
||||||
|
[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>? _dependants;
|
||||||
|
|
||||||
public PluginDetailsViewModel(IWorkshopClient client,
|
public PluginDetailsViewModel(IWorkshopClient client,
|
||||||
IWindowService windowService,
|
IWindowService windowService,
|
||||||
IPluginManagementService pluginManagementService,
|
IPluginManagementService pluginManagementService,
|
||||||
Func<IGetEntryById_Entry, EntryInfoViewModel> getEntryInfoViewModel,
|
Func<IEntryDetails, EntryInfoViewModel> getEntryInfoViewModel,
|
||||||
Func<IGetEntryById_Entry, EntryReleasesViewModel> getEntryReleasesViewModel,
|
Func<IEntryDetails, EntryReleasesViewModel> getEntryReleasesViewModel,
|
||||||
Func<IGetEntryById_Entry, EntryImagesViewModel> getEntryImagesViewModel)
|
Func<IEntryDetails, EntryImagesViewModel> getEntryImagesViewModel,
|
||||||
|
Func<IEntrySummary, EntryListItemViewModel> getEntryListViewModel)
|
||||||
{
|
{
|
||||||
_client = client;
|
_client = client;
|
||||||
_windowService = windowService;
|
_windowService = windowService;
|
||||||
@ -42,6 +48,7 @@ public partial class PluginDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
_getEntryInfoViewModel = getEntryInfoViewModel;
|
_getEntryInfoViewModel = getEntryInfoViewModel;
|
||||||
_getEntryReleasesViewModel = getEntryReleasesViewModel;
|
_getEntryReleasesViewModel = getEntryReleasesViewModel;
|
||||||
_getEntryImagesViewModel = getEntryImagesViewModel;
|
_getEntryImagesViewModel = getEntryImagesViewModel;
|
||||||
|
_getEntryListViewModel = getEntryListViewModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
||||||
@ -56,20 +63,20 @@ public partial class PluginDetailsViewModel : RoutableScreen<WorkshopDetailParam
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Entry = result.Data?.Entry;
|
Entry = result.Data?.Entry;
|
||||||
if (Entry == null)
|
EntryInfoViewModel = Entry != null ? _getEntryInfoViewModel(Entry) : null;
|
||||||
{
|
EntryReleasesViewModel = Entry != null ? _getEntryReleasesViewModel(Entry) : null;
|
||||||
EntryInfoViewModel = null;
|
EntryImagesViewModel = Entry != null ? _getEntryImagesViewModel(Entry) : null;
|
||||||
EntryReleasesViewModel = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
EntryInfoViewModel = _getEntryInfoViewModel(Entry);
|
|
||||||
EntryReleasesViewModel = _getEntryReleasesViewModel(Entry);
|
|
||||||
EntryImagesViewModel = _getEntryImagesViewModel(Entry);
|
|
||||||
|
|
||||||
|
if (EntryReleasesViewModel != null)
|
||||||
|
{
|
||||||
EntryReleasesViewModel.OnInstallationStarted = OnInstallationStarted;
|
EntryReleasesViewModel.OnInstallationStarted = OnInstallationStarted;
|
||||||
EntryReleasesViewModel.OnInstallationFinished = OnInstallationFinished;
|
EntryReleasesViewModel.OnInstallationFinished = OnInstallationFinished;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IReadOnlyList<IEntrySummary>? dependants = (await _client.GetDependantEntries.ExecuteAsync(entryId, 0, 25, cancellationToken)).Data?.Entries?.Items;
|
||||||
|
Dependants = dependants != null && dependants.Any()
|
||||||
|
? new ReadOnlyObservableCollection<EntryListItemViewModel>(new ObservableCollection<EntryListItemViewModel>(dependants.Select(_getEntryListViewModel)))
|
||||||
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<bool> OnInstallationStarted(IEntryDetails entryDetails)
|
private async Task<bool> OnInstallationStarted(IEntryDetails entryDetails)
|
||||||
|
|||||||
@ -17,13 +17,28 @@
|
|||||||
</Border>
|
</Border>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<Border Classes="card" Grid.Row="1" Grid.Column="1" Margin="10 0">
|
<ScrollViewer Grid.Row="1" Grid.Column="1">
|
||||||
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
<StackPanel Margin="10 0" Spacing="10">
|
||||||
<mdxaml:MarkdownScrollViewer.Styles>
|
<Border Classes="card">
|
||||||
<StyleInclude Source="/Styles/Markdown.axaml" />
|
<mdxaml:MarkdownScrollViewer Markdown="{CompiledBinding Entry.Description}" MarkdownStyleName="FluentAvalonia">
|
||||||
</mdxaml:MarkdownScrollViewer.Styles>
|
<mdxaml:MarkdownScrollViewer.Styles>
|
||||||
</mdxaml:MarkdownScrollViewer>
|
<StyleInclude Source="/Styles/Markdown.axaml" />
|
||||||
</Border>
|
</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>
|
||||||
|
</ScrollViewer>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</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,7 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
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;
|
||||||
@ -13,23 +17,28 @@ namespace Artemis.UI.Screens.Workshop.Profile;
|
|||||||
public partial class ProfileDetailsViewModel : RoutableScreen<WorkshopDetailParameters>
|
public partial class ProfileDetailsViewModel : RoutableScreen<WorkshopDetailParameters>
|
||||||
{
|
{
|
||||||
private readonly IWorkshopClient _client;
|
private readonly IWorkshopClient _client;
|
||||||
private readonly Func<IGetEntryById_Entry, EntryInfoViewModel> _getEntryInfoViewModel;
|
private readonly Func<IEntryDetails, EntryInfoViewModel> _getEntryInfoViewModel;
|
||||||
private readonly Func<IGetEntryById_Entry, EntryReleasesViewModel> _getEntryReleasesViewModel;
|
private readonly Func<IEntryDetails, EntryReleasesViewModel> _getEntryReleasesViewModel;
|
||||||
private readonly Func<IGetEntryById_Entry, EntryImagesViewModel> _getEntryImagesViewModel;
|
private readonly Func<IEntryDetails, EntryImagesViewModel> _getEntryImagesViewModel;
|
||||||
[Notify] private IGetEntryById_Entry? _entry;
|
private readonly Func<IEntrySummary, EntryListItemViewModel> _getEntryListViewModel;
|
||||||
|
|
||||||
|
[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,
|
||||||
Func<IGetEntryById_Entry, EntryInfoViewModel> getEntryInfoViewModel,
|
Func<IEntryDetails, EntryInfoViewModel> getEntryInfoViewModel,
|
||||||
Func<IGetEntryById_Entry, EntryReleasesViewModel> getEntryReleasesViewModel,
|
Func<IEntryDetails, EntryReleasesViewModel> getEntryReleasesViewModel,
|
||||||
Func<IGetEntryById_Entry, EntryImagesViewModel> getEntryImagesViewModel)
|
Func<IEntryDetails, EntryImagesViewModel> getEntryImagesViewModel,
|
||||||
|
Func<IEntrySummary, EntryListItemViewModel> getEntryListViewModel)
|
||||||
{
|
{
|
||||||
_client = client;
|
_client = client;
|
||||||
_getEntryInfoViewModel = getEntryInfoViewModel;
|
_getEntryInfoViewModel = getEntryInfoViewModel;
|
||||||
_getEntryReleasesViewModel = getEntryReleasesViewModel;
|
_getEntryReleasesViewModel = getEntryReleasesViewModel;
|
||||||
_getEntryImagesViewModel = getEntryImagesViewModel;
|
_getEntryImagesViewModel = getEntryImagesViewModel;
|
||||||
|
_getEntryListViewModel = getEntryListViewModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
|
||||||
@ -44,16 +53,13 @@ public partial class ProfileDetailsViewModel : RoutableScreen<WorkshopDetailPara
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Entry = result.Data?.Entry;
|
Entry = result.Data?.Entry;
|
||||||
if (Entry == null)
|
EntryInfoViewModel = Entry != null ? _getEntryInfoViewModel(Entry) : null;
|
||||||
{
|
EntryReleasesViewModel = Entry != null ? _getEntryReleasesViewModel(Entry) : null;
|
||||||
EntryInfoViewModel = null;
|
EntryImagesViewModel = Entry != null ? _getEntryImagesViewModel(Entry) : null;
|
||||||
EntryReleasesViewModel = null;
|
|
||||||
}
|
IReadOnlyList<IEntrySummary>? dependencies = (await _client.GetLatestDependencies.ExecuteAsync(entryId, cancellationToken)).Data?.Entry?.LatestRelease?.Dependencies;
|
||||||
else
|
Dependencies = dependencies != null && dependencies.Any()
|
||||||
{
|
? new ReadOnlyObservableCollection<EntryListItemViewModel>(new ObservableCollection<EntryListItemViewModel>(dependencies.Select(_getEntryListViewModel)))
|
||||||
EntryInfoViewModel = _getEntryInfoViewModel(Entry);
|
: null;
|
||||||
EntryReleasesViewModel = _getEntryReleasesViewModel(Entry);
|
|
||||||
EntryImagesViewModel = _getEntryImagesViewModel(Entry);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -41,7 +41,7 @@ public class LayoutEntryInstallationHandler : IEntryInstallationHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure there is an installed entry
|
// Ensure there is an installed entry
|
||||||
InstalledEntry installedEntry = _workshopService.GetInstalledEntry(entry) ?? new InstalledEntry(entry, release);
|
InstalledEntry installedEntry = _workshopService.GetInstalledEntry(entry.Id) ?? new InstalledEntry(entry, release);
|
||||||
DirectoryInfo releaseDirectory = installedEntry.GetReleaseDirectory(release);
|
DirectoryInfo releaseDirectory = installedEntry.GetReleaseDirectory(release);
|
||||||
|
|
||||||
// If the folder already exists, remove it so that if the layout now contains less files, old things dont stick around
|
// If the folder already exists, remove it so that if the layout now contains less files, old things dont stick around
|
||||||
|
|||||||
@ -25,7 +25,7 @@ public class PluginEntryInstallationHandler : IEntryInstallationHandler
|
|||||||
public async Task<EntryInstallResult> InstallAsync(IEntryDetails entry, IRelease release, Progress<StreamProgress> progress, CancellationToken cancellationToken)
|
public async Task<EntryInstallResult> InstallAsync(IEntryDetails entry, IRelease release, Progress<StreamProgress> progress, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// Ensure there is an installed entry
|
// Ensure there is an installed entry
|
||||||
InstalledEntry? installedEntry = _workshopService.GetInstalledEntry(entry);
|
InstalledEntry? installedEntry = _workshopService.GetInstalledEntry(entry.Id);
|
||||||
if (installedEntry != null)
|
if (installedEntry != null)
|
||||||
{
|
{
|
||||||
// If the folder already exists, we're not going to reinstall the plugin since files may be in use, consider our job done
|
// If the folder already exists, we're not going to reinstall the plugin since files may be in use, consider our job done
|
||||||
|
|||||||
@ -36,7 +36,7 @@ public class ProfileEntryInstallationHandler : IEntryInstallationHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find existing installation to potentially replace the profile
|
// Find existing installation to potentially replace the profile
|
||||||
InstalledEntry? installedEntry = _workshopService.GetInstalledEntry(entry);
|
InstalledEntry? installedEntry = _workshopService.GetInstalledEntry(entry.Id);
|
||||||
if (installedEntry != null && installedEntry.TryGetMetadata("ProfileId", out Guid profileId))
|
if (installedEntry != null && installedEntry.TryGetMetadata("ProfileId", out Guid profileId))
|
||||||
{
|
{
|
||||||
ProfileConfiguration? existing = _profileService.ProfileCategories.SelectMany(c => c.ProfileConfigurations).FirstOrDefault(c => c.ProfileId == profileId);
|
ProfileConfiguration? existing = _profileService.ProfileCategories.SelectMany(c => c.ProfileConfigurations).FirstOrDefault(c => c.ProfileId == profileId);
|
||||||
|
|||||||
@ -28,6 +28,20 @@ fragment submittedEntry on Entry {
|
|||||||
createdAt
|
createdAt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fragment entrySummary on Entry {
|
||||||
|
id
|
||||||
|
author
|
||||||
|
name
|
||||||
|
summary
|
||||||
|
entryType
|
||||||
|
downloads
|
||||||
|
createdAt
|
||||||
|
latestReleaseId
|
||||||
|
categories {
|
||||||
|
...category
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fragment entryDetails on Entry {
|
fragment entryDetails on Entry {
|
||||||
id
|
id
|
||||||
author
|
author
|
||||||
|
|||||||
@ -0,0 +1,15 @@
|
|||||||
|
query GetDependantEntries($entryId: Long! $skip: Int $take: Int) {
|
||||||
|
entries(
|
||||||
|
where: {
|
||||||
|
latestRelease: { dependencies: { some: { id: { eq: $entryId } } } }
|
||||||
|
}
|
||||||
|
skip: $skip
|
||||||
|
take: $take
|
||||||
|
order: { createdAt: DESC }
|
||||||
|
) {
|
||||||
|
totalCount
|
||||||
|
items {
|
||||||
|
...entrySummary
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -2,16 +2,7 @@ query GetEntries($search: String $filter: EntryFilterInput $skip: Int $take: Int
|
|||||||
entries(search: $search where: $filter skip: $skip take: $take, order: $order) {
|
entries(search: $search where: $filter skip: $skip take: $take, order: $order) {
|
||||||
totalCount
|
totalCount
|
||||||
items {
|
items {
|
||||||
id
|
...entrySummary
|
||||||
author
|
|
||||||
name
|
|
||||||
summary
|
|
||||||
entryType
|
|
||||||
downloads
|
|
||||||
createdAt
|
|
||||||
categories {
|
|
||||||
...category
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
query GetLatestDependencies($id: Long!) {
|
||||||
|
entry(id: $id) {
|
||||||
|
latestRelease {
|
||||||
|
dependencies {
|
||||||
|
...entrySummary
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -14,7 +14,7 @@ public interface IWorkshopService
|
|||||||
Task NavigateToEntry(long entryId, EntryType entryType);
|
Task NavigateToEntry(long entryId, EntryType entryType);
|
||||||
|
|
||||||
List<InstalledEntry> GetInstalledEntries();
|
List<InstalledEntry> GetInstalledEntries();
|
||||||
InstalledEntry? GetInstalledEntry(IEntryDetails entry);
|
InstalledEntry? GetInstalledEntry(long entryId);
|
||||||
void RemoveInstalledEntry(InstalledEntry installedEntry);
|
void RemoveInstalledEntry(InstalledEntry installedEntry);
|
||||||
void SaveInstalledEntry(InstalledEntry entry);
|
void SaveInstalledEntry(InstalledEntry entry);
|
||||||
void Initialize();
|
void Initialize();
|
||||||
|
|||||||
@ -152,9 +152,9 @@ public class WorkshopService : IWorkshopService
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public InstalledEntry? GetInstalledEntry(IEntryDetails entry)
|
public InstalledEntry? GetInstalledEntry(long entryId)
|
||||||
{
|
{
|
||||||
EntryEntity? entity = _entryRepository.GetByEntryId(entry.Id);
|
EntryEntity? entity = _entryRepository.GetByEntryId(entryId);
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -5,8 +5,6 @@ schema {
|
|||||||
mutation: Mutation
|
mutation: Mutation
|
||||||
}
|
}
|
||||||
|
|
||||||
directive @tag(name: String!) on SCHEMA | SCALAR | OBJECT | FIELD_DEFINITION | ARGUMENT_DEFINITION | INTERFACE | UNION | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION
|
|
||||||
|
|
||||||
type Category {
|
type Category {
|
||||||
icon: String!
|
icon: String!
|
||||||
id: Long!
|
id: Long!
|
||||||
@ -35,6 +33,7 @@ type Entry {
|
|||||||
authorId: UUID!
|
authorId: UUID!
|
||||||
categories: [Category!]!
|
categories: [Category!]!
|
||||||
createdAt: DateTime!
|
createdAt: DateTime!
|
||||||
|
dependantReleases: [Release!]!
|
||||||
description: String!
|
description: String!
|
||||||
downloads: Long!
|
downloads: Long!
|
||||||
entryType: EntryType!
|
entryType: EntryType!
|
||||||
@ -46,6 +45,7 @@ type Entry {
|
|||||||
latestReleaseId: Long
|
latestReleaseId: Long
|
||||||
layoutInfo: [LayoutInfo!]!
|
layoutInfo: [LayoutInfo!]!
|
||||||
name: String!
|
name: String!
|
||||||
|
pluginInfo: PluginInfo
|
||||||
releases: [Release!]!
|
releases: [Release!]!
|
||||||
summary: String!
|
summary: String!
|
||||||
tags: [Tag!]!
|
tags: [Tag!]!
|
||||||
@ -84,10 +84,33 @@ type Mutation {
|
|||||||
updateEntryImage(input: UpdateEntryImageInput!): Image
|
updateEntryImage(input: UpdateEntryImageInput!): Image
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PluginInfo {
|
||||||
|
api: Int
|
||||||
|
entry: Entry!
|
||||||
|
entryId: Long!
|
||||||
|
helpPage: String
|
||||||
|
platforms: PluginPlatform
|
||||||
|
pluginGuid: UUID!
|
||||||
|
repository: String
|
||||||
|
requiresAdmin: Boolean!
|
||||||
|
website: String
|
||||||
|
}
|
||||||
|
|
||||||
|
"A segment of a collection."
|
||||||
|
type PluginInfosCollectionSegment {
|
||||||
|
"A flattened list of the items."
|
||||||
|
items: [PluginInfo!]
|
||||||
|
"Information to aid in pagination."
|
||||||
|
pageInfo: CollectionSegmentInfo!
|
||||||
|
totalCount: Int!
|
||||||
|
}
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
categories(order: [CategorySortInput!], where: CategoryFilterInput): [Category!]!
|
categories(order: [CategorySortInput!], where: CategoryFilterInput): [Category!]!
|
||||||
entries(order: [EntrySortInput!], search: String, skip: Int, take: Int, where: EntryFilterInput): EntriesCollectionSegment
|
entries(order: [EntrySortInput!], search: String, skip: Int, take: Int, where: EntryFilterInput): EntriesCollectionSegment
|
||||||
entry(id: Long!): Entry
|
entry(id: Long!): Entry
|
||||||
|
pluginInfo(pluginGuid: UUID!): PluginInfo
|
||||||
|
pluginInfos(order: [PluginInfoSortInput!], skip: Int, take: Int, where: PluginInfoFilterInput): PluginInfosCollectionSegment
|
||||||
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
|
||||||
@ -96,6 +119,7 @@ type Query {
|
|||||||
|
|
||||||
type Release {
|
type Release {
|
||||||
createdAt: DateTime!
|
createdAt: DateTime!
|
||||||
|
dependencies: [Entry!]!
|
||||||
downloadSize: Long!
|
downloadSize: Long!
|
||||||
downloads: Long!
|
downloads: Long!
|
||||||
entry: Entry!
|
entry: Entry!
|
||||||
@ -131,11 +155,18 @@ enum KeyboardLayoutType {
|
|||||||
UNKNOWN
|
UNKNOWN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum PluginPlatform {
|
||||||
|
LINUX
|
||||||
|
OSX
|
||||||
|
WINDOWS
|
||||||
|
}
|
||||||
|
|
||||||
enum RGBDeviceType {
|
enum RGBDeviceType {
|
||||||
ALL
|
ALL
|
||||||
COOLER
|
COOLER
|
||||||
DRAM
|
DRAM
|
||||||
FAN
|
FAN
|
||||||
|
GAME_CONTROLLER
|
||||||
GRAPHICS_CARD
|
GRAPHICS_CARD
|
||||||
HEADSET
|
HEADSET
|
||||||
HEADSET_STAND
|
HEADSET_STAND
|
||||||
@ -166,6 +197,11 @@ scalar Long
|
|||||||
|
|
||||||
scalar UUID
|
scalar UUID
|
||||||
|
|
||||||
|
input BooleanOperationFilterInput {
|
||||||
|
eq: Boolean
|
||||||
|
neq: Boolean
|
||||||
|
}
|
||||||
|
|
||||||
input CategoryFilterInput {
|
input CategoryFilterInput {
|
||||||
and: [CategoryFilterInput!]
|
and: [CategoryFilterInput!]
|
||||||
icon: StringOperationFilterInput
|
icon: StringOperationFilterInput
|
||||||
@ -220,6 +256,7 @@ input EntryFilterInput {
|
|||||||
authorId: UuidOperationFilterInput
|
authorId: UuidOperationFilterInput
|
||||||
categories: ListFilterInputTypeOfCategoryFilterInput
|
categories: ListFilterInputTypeOfCategoryFilterInput
|
||||||
createdAt: DateTimeOperationFilterInput
|
createdAt: DateTimeOperationFilterInput
|
||||||
|
dependantReleases: ListFilterInputTypeOfReleaseFilterInput
|
||||||
description: StringOperationFilterInput
|
description: StringOperationFilterInput
|
||||||
downloads: LongOperationFilterInput
|
downloads: LongOperationFilterInput
|
||||||
entryType: EntryTypeOperationFilterInput
|
entryType: EntryTypeOperationFilterInput
|
||||||
@ -232,6 +269,7 @@ input EntryFilterInput {
|
|||||||
layoutInfo: ListFilterInputTypeOfLayoutInfoFilterInput
|
layoutInfo: ListFilterInputTypeOfLayoutInfoFilterInput
|
||||||
name: StringOperationFilterInput
|
name: StringOperationFilterInput
|
||||||
or: [EntryFilterInput!]
|
or: [EntryFilterInput!]
|
||||||
|
pluginInfo: PluginInfoFilterInput
|
||||||
releases: ListFilterInputTypeOfReleaseFilterInput
|
releases: ListFilterInputTypeOfReleaseFilterInput
|
||||||
summary: StringOperationFilterInput
|
summary: StringOperationFilterInput
|
||||||
tags: ListFilterInputTypeOfTagFilterInput
|
tags: ListFilterInputTypeOfTagFilterInput
|
||||||
@ -250,6 +288,7 @@ input EntrySortInput {
|
|||||||
latestRelease: ReleaseSortInput
|
latestRelease: ReleaseSortInput
|
||||||
latestReleaseId: SortEnumType
|
latestReleaseId: SortEnumType
|
||||||
name: SortEnumType
|
name: SortEnumType
|
||||||
|
pluginInfo: PluginInfoSortInput
|
||||||
summary: SortEnumType
|
summary: SortEnumType
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,6 +361,13 @@ input ListFilterInputTypeOfCategoryFilterInput {
|
|||||||
some: CategoryFilterInput
|
some: CategoryFilterInput
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input ListFilterInputTypeOfEntryFilterInput {
|
||||||
|
all: EntryFilterInput
|
||||||
|
any: Boolean
|
||||||
|
none: EntryFilterInput
|
||||||
|
some: EntryFilterInput
|
||||||
|
}
|
||||||
|
|
||||||
input ListFilterInputTypeOfImageFilterInput {
|
input ListFilterInputTypeOfImageFilterInput {
|
||||||
all: ImageFilterInput
|
all: ImageFilterInput
|
||||||
any: Boolean
|
any: Boolean
|
||||||
@ -372,6 +418,39 @@ input NullableOfKeyboardLayoutTypeOperationFilterInput {
|
|||||||
nin: [KeyboardLayoutType]
|
nin: [KeyboardLayoutType]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input NullableOfPluginPlatformOperationFilterInput {
|
||||||
|
eq: PluginPlatform
|
||||||
|
in: [PluginPlatform]
|
||||||
|
neq: PluginPlatform
|
||||||
|
nin: [PluginPlatform]
|
||||||
|
}
|
||||||
|
|
||||||
|
input PluginInfoFilterInput {
|
||||||
|
and: [PluginInfoFilterInput!]
|
||||||
|
api: IntOperationFilterInput
|
||||||
|
entry: EntryFilterInput
|
||||||
|
entryId: LongOperationFilterInput
|
||||||
|
helpPage: StringOperationFilterInput
|
||||||
|
or: [PluginInfoFilterInput!]
|
||||||
|
platforms: NullableOfPluginPlatformOperationFilterInput
|
||||||
|
pluginGuid: UuidOperationFilterInput
|
||||||
|
repository: StringOperationFilterInput
|
||||||
|
requiresAdmin: BooleanOperationFilterInput
|
||||||
|
website: StringOperationFilterInput
|
||||||
|
}
|
||||||
|
|
||||||
|
input PluginInfoSortInput {
|
||||||
|
api: SortEnumType
|
||||||
|
entry: EntrySortInput
|
||||||
|
entryId: SortEnumType
|
||||||
|
helpPage: SortEnumType
|
||||||
|
platforms: SortEnumType
|
||||||
|
pluginGuid: SortEnumType
|
||||||
|
repository: SortEnumType
|
||||||
|
requiresAdmin: SortEnumType
|
||||||
|
website: SortEnumType
|
||||||
|
}
|
||||||
|
|
||||||
input RGBDeviceTypeOperationFilterInput {
|
input RGBDeviceTypeOperationFilterInput {
|
||||||
eq: RGBDeviceType
|
eq: RGBDeviceType
|
||||||
in: [RGBDeviceType!]
|
in: [RGBDeviceType!]
|
||||||
@ -382,6 +461,7 @@ input RGBDeviceTypeOperationFilterInput {
|
|||||||
input ReleaseFilterInput {
|
input ReleaseFilterInput {
|
||||||
and: [ReleaseFilterInput!]
|
and: [ReleaseFilterInput!]
|
||||||
createdAt: DateTimeOperationFilterInput
|
createdAt: DateTimeOperationFilterInput
|
||||||
|
dependencies: ListFilterInputTypeOfEntryFilterInput
|
||||||
downloadSize: LongOperationFilterInput
|
downloadSize: LongOperationFilterInput
|
||||||
downloads: LongOperationFilterInput
|
downloads: LongOperationFilterInput
|
||||||
entry: EntryFilterInput
|
entry: EntryFilterInput
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user