Skip to content

Commit 2c78052

Browse files
committed
Converted Demo to Lists+Todos design.
1 parent 7877784 commit 2c78052

File tree

13 files changed

+262
-159
lines changed

13 files changed

+262
-159
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,9 @@ TestResults/
6161
*.dylib
6262
*.dll
6363
*.so
64-
64+
*.xcframework
6565
.env
66+
*NativeLibs
6667

6768
# Ignore user id file
6869
user_id.txt

demos/TodoSQLite/AppShell.xaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
Shell.FlyoutBehavior="Disabled">
88

99
<ShellContent
10-
Title="Todo"
11-
ContentTemplate="{DataTemplate views:TodoListPage}"
12-
Route="TodoList" />
10+
Title="Todo Lists"
11+
ContentTemplate="{DataTemplate views:ListsPage}"
12+
Route="ListsPage" />
1313

1414
</Shell>

demos/TodoSQLite/AppShell.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ public partial class AppShell : Shell
77
public AppShell()
88
{
99
InitializeComponent();
10-
Routing.RegisterRoute(nameof(TodoItemPage), typeof(TodoItemPage));
10+
Routing.RegisterRoute(nameof(TodoListPage), typeof(TodoListPage));
1111
}
1212
}
Lines changed: 52 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,97 @@
1-
using Microsoft.Extensions.Logging;
2-
using Newtonsoft.Json;
3-
using PowerSync.Common.Client;
4-
using SQLite;
1+
using SQLite;
52
using TodoSQLite.Models;
63

74
namespace TodoSQLite.Data;
85

96
public class TodoItemDatabase
107
{
11-
SQLiteAsyncConnection Database;
12-
public TodoItemDatabase()
13-
{
14-
}
8+
SQLiteAsyncConnection database;
9+
1510
async Task Init()
1611
{
17-
18-
var db = new PowerSyncDatabase(new PowerSyncDatabaseOptions
19-
{
20-
Database = new SQLOpenOptions { DbFilename = "cli-example.db" },
21-
Schema = AppSchema.PowerSyncSchema,
22-
});
23-
await db.Init();
24-
var x = await db.GetAll<object>("select * from lists;");
25-
await Application.Current.MainPage.DisplayAlert("Title", JsonConvert.SerializeObject(x), "OK");
26-
27-
if (Database is not null)
12+
if (database is not null)
2813
return;
2914

15+
database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
16+
await database.CreateTableAsync<TodoList>();
17+
await database.CreateTableAsync<TodoItem>();
18+
}
3019

31-
Database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
32-
var result = await Database.CreateTableAsync<TodoItem>();
33-
20+
// List operations
21+
public async Task<List<TodoList>> GetListsAsync()
22+
{
23+
await Init();
24+
return await database.Table<TodoList>().OrderByDescending(l => l.CreatedAt).ToListAsync();
25+
}
3426

27+
public async Task<TodoList> GetListAsync(int id)
28+
{
29+
await Init();
30+
return await database.Table<TodoList>().Where(l => l.ID == id).FirstOrDefaultAsync();
31+
}
3532

33+
public async Task<int> SaveListAsync(TodoList list)
34+
{
35+
await Init();
36+
if (list.ID != 0)
37+
{
38+
return await database.UpdateAsync(list);
39+
}
40+
else
41+
{
42+
return await database.InsertAsync(list);
43+
}
3644
}
3745

38-
public async Task<List<TodoItem>> GetItemsAsync()
46+
public async Task<int> DeleteListAsync(TodoList list)
3947
{
4048
await Init();
41-
return await Database.Table<TodoItem>().ToListAsync();
49+
// First delete all todo items in this list
50+
await database.Table<TodoItem>().Where(t => t.ListId == list.ID).DeleteAsync();
51+
return await database.DeleteAsync(list);
4252
}
4353

44-
public async Task<List<TodoItem>> GetItemsNotDoneAsync()
54+
// Todo item operations
55+
public async Task<List<TodoItem>> GetItemsAsync(int listId)
4556
{
4657
await Init();
47-
return await Database.Table<TodoItem>().Where(t => t.Done).ToListAsync();
58+
return await database.Table<TodoItem>()
59+
.Where(t => t.ListId == listId)
60+
.OrderByDescending(t => t.ID)
61+
.ToListAsync();
62+
}
4863

49-
// SQL queries are also possible
50-
//return await Database.QueryAsync<TodoItem>("SELECT * FROM [TodoItem] WHERE [Done] = 0");
64+
public async Task<List<TodoItem>> GetItemsNotDoneAsync(int listId)
65+
{
66+
await Init();
67+
return await database.Table<TodoItem>()
68+
.Where(t => t.ListId == listId && !t.Done)
69+
.OrderByDescending(t => t.ID)
70+
.ToListAsync();
5171
}
5272

5373
public async Task<TodoItem> GetItemAsync(int id)
5474
{
5575
await Init();
56-
return await Database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
76+
return await database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
5777
}
5878

5979
public async Task<int> SaveItemAsync(TodoItem item)
6080
{
6181
await Init();
6282
if (item.ID != 0)
6383
{
64-
return await Database.UpdateAsync(item);
84+
return await database.UpdateAsync(item);
6585
}
6686
else
6787
{
68-
return await Database.InsertAsync(item);
88+
return await database.InsertAsync(item);
6989
}
7090
}
7191

7292
public async Task<int> DeleteItemAsync(TodoItem item)
7393
{
7494
await Init();
75-
return await Database.DeleteAsync(item);
95+
return await database.DeleteAsync(item);
7696
}
7797
}

demos/TodoSQLite/MauiProgram.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@ public static MauiApp CreateMauiApp()
1919
});
2020
builder.Logging.SetMinimumLevel(LogLevel.Debug);
2121
builder.Logging.AddDebug();
22-
builder.Services.AddSingleton<TodoListPage>();
23-
builder.Services.AddTransient<TodoItemPage>();
24-
2522
builder.Services.AddSingleton<TodoItemDatabase>();
23+
builder.Services.AddTransient<ListsPage>();
24+
builder.Services.AddTransient<TodoListPage>();
2625

2726
return builder.Build();
2827
}

demos/TodoSQLite/Models/TodoItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ public class TodoItem
77
[PrimaryKey, AutoIncrement]
88
public int ID { get; set; }
99
public string Name { get; set; }
10-
public string Notes { get; set; }
1110
public bool Done { get; set; }
11+
public int ListId { get; set; }
1212
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using SQLite;
2+
3+
namespace TodoSQLite.Models;
4+
5+
public class TodoList
6+
{
7+
[PrimaryKey, AutoIncrement]
8+
public int ID { get; set; }
9+
public string Name { get; set; }
10+
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
11+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
4+
x:Class="TodoSQLite.Views.ListsPage"
5+
Title="Todo Lists">
6+
<Grid RowDefinitions="Auto,*">
7+
<Button Text="New List"
8+
Clicked="OnAddClicked"
9+
Margin="10"
10+
HorizontalOptions="End"/>
11+
12+
<CollectionView Grid.Row="1"
13+
x:Name="ListsCollection"
14+
SelectionMode="Single"
15+
SelectionChanged="OnListSelected">
16+
<CollectionView.ItemTemplate>
17+
<DataTemplate>
18+
<Grid Padding="10">
19+
<Frame BorderColor="Gray"
20+
Padding="10"
21+
CornerRadius="5">
22+
<Grid ColumnDefinitions="*,Auto">
23+
<Label Text="{Binding Name}"
24+
FontSize="16"
25+
VerticalOptions="Center"/>
26+
<Button Grid.Column="1"
27+
Text="Delete"
28+
Clicked="OnDeleteClicked"
29+
CommandParameter="{Binding .}"/>
30+
</Grid>
31+
</Frame>
32+
</Grid>
33+
</DataTemplate>
34+
</CollectionView.ItemTemplate>
35+
</CollectionView>
36+
</Grid>
37+
</ContentPage>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using TodoSQLite.Models;
2+
using TodoSQLite.Data;
3+
4+
namespace TodoSQLite.Views;
5+
6+
public partial class ListsPage : ContentPage
7+
{
8+
private readonly TodoItemDatabase _database;
9+
10+
public ListsPage(TodoItemDatabase database)
11+
{
12+
InitializeComponent();
13+
_database = database;
14+
}
15+
16+
protected override async void OnAppearing()
17+
{
18+
base.OnAppearing();
19+
ListsCollection.ItemsSource = await _database.GetListsAsync();
20+
}
21+
22+
private async void OnAddClicked(object sender, EventArgs e)
23+
{
24+
string name = await DisplayPromptAsync("New List", "Enter list name:");
25+
if (!string.IsNullOrWhiteSpace(name))
26+
{
27+
var list = new TodoList { Name = name };
28+
await _database.SaveListAsync(list);
29+
ListsCollection.ItemsSource = await _database.GetListsAsync();
30+
}
31+
}
32+
33+
private async void OnDeleteClicked(object sender, EventArgs e)
34+
{
35+
var button = (Button)sender;
36+
var list = (TodoList)button.CommandParameter;
37+
38+
bool confirm = await DisplayAlert("Confirm Delete",
39+
$"Are you sure you want to delete the list '{list.Name}'?",
40+
"Yes", "No");
41+
42+
if (confirm)
43+
{
44+
await _database.DeleteListAsync(list);
45+
ListsCollection.ItemsSource = await _database.GetListsAsync();
46+
}
47+
}
48+
49+
private async void OnListSelected(object sender, SelectionChangedEventArgs e)
50+
{
51+
if (e.CurrentSelection.FirstOrDefault() is TodoList selectedList)
52+
{
53+
await Navigation.PushAsync(new TodoListPage(_database, selectedList));
54+
ListsCollection.SelectedItem = null;
55+
}
56+
}
57+
}

demos/TodoSQLite/Views/TodoItemPage.xaml

Lines changed: 0 additions & 26 deletions
This file was deleted.

0 commit comments

Comments
 (0)