Calendar attachments.

This commit is contained in:
Burak Kaan Köse
2026-01-03 23:59:37 +01:00
parent c8ef031e7d
commit 4603b1fb14
20 changed files with 758 additions and 21 deletions
@@ -128,13 +128,11 @@ public static class CalendarXamlHelpers
/// <summary>
/// Returns visibility for attendee status badge.
/// Only shows status for non-organizers and when status is not NeedsAction.
/// Always shows status for all attendees.
/// </summary>
public static Microsoft.UI.Xaml.Visibility GetAttendeeStatusVisibility(AttendeeStatus status)
{
// Don't show "Needs Action" status as it's the default
return status == AttendeeStatus.NeedsAction
? Microsoft.UI.Xaml.Visibility.Collapsed
: Microsoft.UI.Xaml.Visibility.Visible;
// Always show status
return Microsoft.UI.Xaml.Visibility.Visible;
}
}
@@ -103,4 +103,14 @@ public class NativeAppService : INativeAppService
//await taskbarManager.RequestPinCurrentAppAsync();
}
public bool IsAppRunningInBackground()
=> !Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread().HasThreadAccess;
public string GetCalendarAttachmentsFolderPath()
{
var attachmentsFolder = System.IO.Path.Combine(ApplicationData.Current.LocalFolder.Path, "CalendarAttachments");
System.IO.Directory.CreateDirectory(attachmentsFolder);
return attachmentsFolder;
}
}
@@ -10,6 +10,7 @@
xmlns:coreControls="using:Wino.Mail.WinUI.Controls"
xmlns:ctControls="using:CommunityToolkit.WinUI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:data="using:Wino.Calendar.ViewModels.Data"
xmlns:domain="using:Wino.Core.Domain"
xmlns:enums="using:Wino.Core.Domain.Enums"
xmlns:helpers="using:Wino.Helpers"
@@ -444,6 +445,7 @@
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<PersonPicture
@@ -464,7 +466,10 @@
FontSize="13"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="{x:Bind Email}" />
<StackPanel Grid.Row="2" Orientation="Horizontal" Spacing="6">
<StackPanel
Grid.Row="2"
Orientation="Horizontal"
Spacing="6">
<Border
Padding="6,2"
Background="{ThemeResource AccentFillColorDefaultBrush}"
@@ -476,18 +481,22 @@
Foreground="{ThemeResource TextOnAccentFillColorPrimaryBrush}"
Text="{x:Bind domain:Translator.CalendarEventDetails_Organizer}" />
</Border>
<Border
Padding="6,2"
Background="{ThemeResource CardStrokeColorDefaultBrush}"
CornerRadius="4"
Visibility="{x:Bind calendarHelpers:CalendarXamlHelpers.GetAttendeeStatusVisibility(AttendenceStatus)}">
<TextBlock
FontSize="11"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="{x:Bind calendarHelpers:CalendarXamlHelpers.GetAttendeeStatusText(AttendenceStatus)}" />
</Border>
</StackPanel>
</Grid>
<Border
Grid.Column="2"
Padding="6,2"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Background="{ThemeResource CardStrokeColorDefaultBrush}"
CornerRadius="4"
Visibility="{x:Bind calendarHelpers:CalendarXamlHelpers.GetAttendeeStatusVisibility(AttendenceStatus)}">
<TextBlock
FontSize="11"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="{x:Bind calendarHelpers:CalendarXamlHelpers.GetAttendeeStatusText(AttendenceStatus)}" />
</Border>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
@@ -508,6 +517,100 @@
<TextBlock Style="{StaticResource EventDetailsPanelTitleStyle}" Text="{x:Bind domain:Translator.CalendarEventDetails_Attachments}" />
<ListView
Grid.Row="1"
Margin="-12,0"
IsItemClickEnabled="True"
ItemClick="AttachmentClicked"
ItemsSource="{x:Bind ViewModel.Attachments, Mode=OneWay}"
SelectionMode="None">
<ListView.ItemTemplate>
<DataTemplate x:DataType="data:CalendarAttachmentViewModel">
<Grid Height="51">
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid
Grid.Row="0"
Height="50"
Margin="-8,0,0,0"
Background="Transparent"
ColumnSpacing="3">
<ToolTipService.ToolTip>
<ToolTip Content="{x:Bind FileName}" />
</ToolTipService.ToolTip>
<Grid.ContextFlyout>
<MenuFlyout Placement="Right">
<MenuFlyoutItem
Click="OpenCalendarAttachment_Click"
CommandParameter="{x:Bind}"
Text="{x:Bind domain:Translator.Buttons_Open}">
<MenuFlyoutItem.Icon>
<PathIcon Data="{StaticResource OpenFilePathIcon}" />
</MenuFlyoutItem.Icon>
</MenuFlyoutItem>
<MenuFlyoutItem
Click="SaveCalendarAttachment_Click"
CommandParameter="{x:Bind}"
Text="{x:Bind domain:Translator.Buttons_Save}">
<MenuFlyoutItem.Icon>
<PathIcon Data="{StaticResource SaveAttachmentPathIcon}" />
</MenuFlyoutItem.Icon>
</MenuFlyoutItem>
</MenuFlyout>
</Grid.ContextFlyout>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- Icon -->
<ContentControl
VerticalAlignment="Center"
Content="{x:Bind AttachmentType}"
ContentTemplateSelector="{StaticResource FileTypeIconSelector}" />
<!-- Name && Size -->
<Grid
Grid.Column="1"
MaxWidth="200"
HorizontalAlignment="Left"
VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
FontSize="13"
MaxLines="1"
Text="{x:Bind FileName}"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<TextBlock
Grid.Row="1"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
FontSize="11"
Foreground="Gray"
Text="{x:Bind ReadableSize}" />
</Grid>
</Grid>
<ProgressBar
Grid.Row="1"
Margin="0,-5,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
IsIndeterminate="{x:Bind IsBusy, Mode=OneWay}"
ShowError="False"
ShowPaused="False"
Visibility="{x:Bind IsBusy, Mode=OneWay}" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Grid>
</ScrollViewer>
@@ -7,6 +7,7 @@ using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Navigation;
using Microsoft.Web.WebView2.Core;
using Windows.System;
using Wino.Calendar.ViewModels.Data;
using Wino.Core.Domain;
using Wino.Core.Domain.Interfaces;
using Wino.Mail.WinUI;
@@ -203,4 +204,28 @@ public sealed partial class EventDetailsPage : EventDetailsPageAbstract,
WeakReferenceMessenger.Default.Unregister<ApplicationThemeChanged>(this);
WeakReferenceMessenger.Default.Unregister<CalendarDescriptionRenderingRequested>(this);
}
private void AttachmentClicked(object sender, ItemClickEventArgs e)
{
if (e.ClickedItem is CalendarAttachmentViewModel attachmentViewModel)
{
ViewModel?.OpenAttachmentCommand.Execute(attachmentViewModel);
}
}
private void OpenCalendarAttachment_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
if (sender is MenuFlyoutItem item && item.CommandParameter is CalendarAttachmentViewModel attachment)
{
ViewModel?.OpenAttachmentCommand.Execute(attachment);
}
}
private void SaveCalendarAttachment_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
if (sender is MenuFlyoutItem item && item.CommandParameter is CalendarAttachmentViewModel attachment)
{
ViewModel?.SaveAttachmentCommand.Execute(attachment);
}
}
}