Skip to content

Commit f999aae

Browse files
feat: implement more functionality and improve ui/ux
1 parent 578decf commit f999aae

File tree

75 files changed

+388
-353
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+388
-353
lines changed

episko_gui_backend/app-icon.png

57.9 KB

episko_gui_backend/capabilities/default.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@
33
"identifier": "default",
44
"description": "enables the default permissions",
55
"windows": ["main"],
6-
"permissions": ["core:default", "dialog:default"]
6+
"permissions": [
7+
"core:default",
8+
"dialog:default"
9+
]
710
}

episko_gui_backend/icons/128x128.png

-1.51 KB
579 Bytes

episko_gui_backend/icons/32x32.png

-606 Bytes

episko_gui_backend/icons/64x64.png

3.87 KB
-1.67 KB
-1.72 KB
-1.37 KB
1.34 KB
-604 Bytes
2.03 KB
-956 Bytes
-1.45 KB
-1.54 KB
-1.05 KB

episko_gui_backend/icons/icon.icns

109 KB
Binary file not shown.

episko_gui_backend/icons/icon.ico

-3.39 KB
Binary file not shown.

episko_gui_backend/icons/icon.png

15.4 KB
865 Bytes
3.26 KB
1.35 KB
3.22 KB
3.22 KB
5.35 KB
4.75 KB
4.75 KB
7.86 KB
7.86 KB
13.3 KB
4.41 KB
10.7 KB
12.1 KB

episko_gui_backend/src/commands.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,24 @@ pub async fn create_metadata(
137137
Ok(metadata.id)
138138
}
139139

140+
#[tauri::command]
141+
pub async fn delete_metadata(
142+
metadata: MetadataDto,
143+
state: tauri::State<'_, Mutex<AppState>>,
144+
) -> Result<(), Error> {
145+
let mut state = state.lock().await;
146+
147+
let metadata: Metadata = metadata.into();
148+
149+
state.config_handler.remove_saved_file(&metadata.directory);
150+
state.config_handler.save_config()?;
151+
152+
metadata.remove_from_db(&state.db).await?;
153+
Metadata::remove_file(&metadata.directory)?;
154+
155+
Ok(())
156+
}
157+
140158
#[tauri::command]
141159
pub async fn load_from_file(
142160
path: &Path,

episko_gui_backend/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use tokio::sync::Mutex;
77

88
mod commands;
99
use commands::{
10-
create_metadata, get_all, get_all_categories, get_all_languages, get_statistics, get_with_id,
11-
init_cache, load_from_directory, load_from_file, update_metadata,
10+
create_metadata, delete_metadata, get_all, get_all_categories, get_all_languages,
11+
get_statistics, get_with_id, init_cache, load_from_directory, load_from_file, update_metadata,
1212
};
1313

1414
pub mod model;
@@ -46,6 +46,7 @@ pub async fn run() -> Result<(), Box<dyn std::error::Error>> {
4646
get_statistics,
4747
update_metadata,
4848
create_metadata,
49+
delete_metadata,
4950
load_from_file,
5051
load_from_directory,
5152
])

episko_gui_backend/src/model/dco.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use episko_lib::{
2+
ApplyIf as _,
23
metadata::{
3-
property::Property, BuildSystem, Category, Ide, Language, Metadata, MetadataBuilder,
4+
BuildSystem, Category, Ide, Language, Metadata, MetadataBuilder, property::Property,
45
},
5-
ApplyIf as _,
66
};
77
use serde::{Deserialize, Serialize};
88
use std::path::PathBuf;
@@ -66,12 +66,9 @@ impl MetadataDco {
6666
.categories(self.categories)
6767
.languages(self.languages)
6868
.build_systems(self.build_systems)
69-
.apply_if(self.preferred_ide, MetadataBuilder::preferred_ide)
70-
.apply_if(self.description.as_deref(), MetadataBuilder::description)
71-
.apply_if(
72-
self.repository_url.as_deref(),
73-
MetadataBuilder::repository_url,
74-
)
69+
.update_ide(self.preferred_ide)
70+
.update_description(self.description)
71+
.update_repository_url(self.repository_url)
7572
.build()?)
7673
}
7774
}
@@ -80,7 +77,7 @@ impl MetadataDco {
8077
mod tests {
8178
use super::*;
8279
use episko_lib::metadata::{
83-
property::Property as _, BuildSystem, Category, Ide, Language, Metadata,
80+
BuildSystem, Category, Ide, Language, Metadata, property::Property as _,
8481
};
8582
use std::path::PathBuf;
8683

episko_gui_backend/src/model/dto.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,30 @@ impl From<Metadata> for MetadataDto {
4242
}
4343
}
4444

45+
impl Into<Metadata> for MetadataDto {
46+
fn into(self) -> Metadata {
47+
Metadata {
48+
id: self.id,
49+
directory: self.directory,
50+
title: self.title,
51+
description: self.description,
52+
categories: self.categories,
53+
languages: self.languages,
54+
build_systems: self.build_systems,
55+
preferred_ide: self.preferred_ide,
56+
repository_url: self.repository_url,
57+
created: self.created,
58+
updated: self.updated,
59+
}
60+
}
61+
}
62+
4563
#[cfg(test)]
4664
mod tests {
4765
use super::*;
4866
use chrono::Utc;
4967
use episko_lib::metadata::{
50-
property::Property as _, BuildSystem, Category, Ide, Language, Metadata,
68+
BuildSystem, Category, Ide, Language, Metadata, property::Property as _,
5169
};
5270
use uuid::Uuid;
5371

episko_lib/src/database/update_metadata.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
use crate::metadata::property::Property;
1+
use log::info;
2+
use log::trace;
3+
24
use crate::metadata::Metadata;
5+
use crate::metadata::property::Property;
36

47
use super::DatabaseHandler;
58
use super::DatabaseObject;
@@ -17,6 +20,15 @@ impl Metadata {
1720
pub async fn update_in_db(&self, db: &DatabaseHandler) -> Result<()> {
1821
let mut transaction = db.conn().begin().await?;
1922

23+
info!("Updating: {self:#?}");
24+
25+
match &self.preferred_ide {
26+
Some(ide) => {
27+
ide.write_to_db(&mut *transaction).await?;
28+
}
29+
None => (),
30+
}
31+
2032
let ide_id = self
2133
.preferred_ide
2234
.as_ref()

episko_lib/src/metadata.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ pub enum Error {
187187
#[error("unable to save metadata: {0}")]
188188
Save(String),
189189

190+
#[error("unable to delete metadata: {0}")]
191+
Delete(String),
192+
190193
#[error("unable to find manifests in directory: {0}")]
191194
Directory(String),
192195
}

episko_lib/src/metadata/builder.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use uuid::Uuid;
1414
// Temporary for compatibility reasons.
1515
pub use crate::ApplyIf;
1616

17-
use super::{property::Property, BuildSystem, Category, Ide, Language, Metadata};
17+
use super::{BuildSystem, Category, Ide, Language, Metadata, property::Property};
1818

1919
/// To allow for flexible building all fields
2020
/// can start of as `None` or an empty `Vec`.
@@ -216,6 +216,13 @@ impl MetadataBuilder {
216216
self
217217
}
218218

219+
/// Update the preferred [`Ide`]
220+
#[must_use]
221+
pub fn update_ide(mut self, ide: Option<Ide>) -> Self {
222+
self.preferred_ide = ide;
223+
self
224+
}
225+
219226
/// Set the description
220227
#[must_use]
221228
pub fn description(mut self, description: &str) -> Self {
@@ -226,6 +233,13 @@ impl MetadataBuilder {
226233
self
227234
}
228235

236+
/// Update the description
237+
#[must_use]
238+
pub fn update_description(mut self, description: Option<String>) -> Self {
239+
self.description = description;
240+
self
241+
}
242+
229243
/// Set the repository url
230244
#[must_use]
231245
pub fn repository_url(mut self, url: &str) -> Self {
@@ -236,6 +250,13 @@ impl MetadataBuilder {
236250
self
237251
}
238252

253+
/// Update the repository url
254+
#[must_use]
255+
pub fn update_repository_url(mut self, url: Option<String>) -> Self {
256+
self.repository_url = url;
257+
self
258+
}
259+
239260
/// Set the creation [`DateTime`]
240261
#[must_use]
241262
pub fn created(mut self, created: DateTime<Utc>) -> Self {

episko_lib/src/metadata/metadata_handler.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,23 @@ impl MetadataHandler {
5858
Ok(())
5959
}
6060

61+
pub async fn delete_metadata(
62+
metadata: &Metadata,
63+
db: &DatabaseHandler,
64+
config_handler: &mut ConfigHandler,
65+
) -> Result<()> {
66+
// if part of dir, returns false but can be ignored
67+
let _ = config_handler.remove_saved_file(&metadata.directory);
68+
69+
metadata
70+
.remove_from_db(&db)
71+
.await
72+
.map_err(|err| Error::Delete(err.to_string()))?;
73+
Metadata::remove_file(&metadata.directory).map_err(|err| Error::Delete(err.to_string()))?;
74+
75+
Ok(())
76+
}
77+
6178
/// Get paths to locations of manifests
6279
///
6380
/// Loading should be done using tauri and events and stuff

src/app.css

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878

7979
@plugin "daisyui/theme" {
8080
name: 'forest';
81-
default: true;
81+
default: false;
8282
prefersdark: true;
8383
color-scheme: 'dark';
8484
--color-base-100: oklch(20.84% 0.008 17.911);
@@ -110,3 +110,39 @@
110110
--depth: 0;
111111
--noise: 0;
112112
}
113+
114+
115+
@plugin "daisyui/theme" {
116+
name: "lofi";
117+
default: true;
118+
prefersdark: false;
119+
color-scheme: "light";
120+
--color-base-100: oklch(100% 0 0);
121+
--color-base-200: oklch(97% 0 0);
122+
--color-base-300: oklch(94% 0 0);
123+
--color-base-content: oklch(0% 0 0);
124+
--color-primary: oklch(15.906% 0 0);
125+
--color-primary-content: oklch(100% 0 0);
126+
--color-secondary: oklch(21.455% 0.001 17.278);
127+
--color-secondary-content: oklch(100% 0 0);
128+
--color-accent: oklch(26.861% 0 0);
129+
--color-accent-content: oklch(100% 0 0);
130+
--color-neutral: oklch(0% 0 0);
131+
--color-neutral-content: oklch(100% 0 0);
132+
--color-info: oklch(79.54% 0.103 205.9);
133+
--color-info-content: oklch(15.908% 0.02 205.9);
134+
--color-success: oklch(90.13% 0.153 164.14);
135+
--color-success-content: oklch(18.026% 0.03 164.14);
136+
--color-warning: oklch(88.37% 0.135 79.94);
137+
--color-warning-content: oklch(17.674% 0.027 79.94);
138+
--color-error: oklch(78.66% 0.15 28.47);
139+
--color-error-content: oklch(15.732% 0.03 28.47);
140+
--radius-selector: 2rem;
141+
--radius-field: 0.25rem;
142+
--radius-box: 0.5rem;
143+
--size-selector: 0.25rem;
144+
--size-field: 0.25rem;
145+
--border: 1px;
146+
--depth: 0;
147+
--noise: 0;
148+
}

src/lib/assets/logo.png

64.2 KB

src/lib/commands.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type {
1010
Statistic,
1111
Uuid
1212
} from './types';
13-
import { parseMetadata, parseMetadataDco, parseMetadataPreviewArray } from './schemas/metadata';
13+
import { MetadataDtoSchema, parseMetadata, parseMetadataDco, parseMetadataPreviewArray } from './schemas/metadata';
1414
import { PagedMetadataPreviewSchema } from './schemas/pagedData';
1515
import { parseCategoryArray } from './schemas/category';
1616
import { parseLanguageArray } from './schemas/language';
@@ -59,6 +59,18 @@ export default {
5959
);
6060
},
6161

62+
async delete_metadata(metadata: Metadata): Promise<void> {
63+
// as this is the only place where this transformation is needed
64+
// it can reside here for now
65+
let metadataDto = {
66+
build_systems: metadata.buildSystems,
67+
preferred_ide: metadata.preferredIde,
68+
repository_url: metadata.repositoryUrl,
69+
...metadata
70+
}
71+
return invoke('delete_metadata', { metadata: metadataDto })
72+
},
73+
6274
async load_from_file(path: string): Promise<Uuid> {
6375
return invoke('load_from_file', { path: path });
6476
},

src/lib/components/app-sidebar.svelte

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
SettingsIcon,
99
SquarePen
1010
} from 'lucide-svelte';
11+
import logo from '$lib/assets/logo.png';
1112
1213
const data = {
1314
user: {
@@ -70,12 +71,12 @@
7071
{#snippet child({ props })}
7172
<a {...props}>
7273
<div
73-
class="bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg"
74+
class="text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg"
7475
>
75-
<Command class="size-4" />
76+
<img alt="episko logo" class="size-8 dark:invert dark:grayscale" src={logo} />
7677
</div>
7778
<div class="grid flex-1 text-left text-sm leading-tight">
78-
<span class="truncate font-semibold">Episko</span>
79+
<span class="truncate font-semibold">episko</span>
7980
</div>
8081
</a>
8182
{/snippet}

src/lib/components/nav-secondary.svelte

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts">
22
import * as Sidebar from '$lib/components/ui/sidebar/index.js';
33
import type { ComponentProps } from 'svelte';
4+
import { toast } from 'svelte-sonner';
45
56
let {
67
ref = $bindable(null),
@@ -15,6 +16,10 @@
1516
icon: any;
1617
}[];
1718
} & ComponentProps<typeof Sidebar.Group> = $props();
19+
20+
function disabledClick() {
21+
toast.warning('This function is not implemented yet!');
22+
}
1823
</script>
1924

2025
<Sidebar.Group bind:ref {...restProps}>
@@ -24,10 +29,10 @@
2429
<Sidebar.MenuItem>
2530
<Sidebar.MenuButton size="sm">
2631
{#snippet child({ props })}
27-
<a href={item.url} {...props}>
32+
<button onclick={disabledClick} {...props}>
2833
<item.icon />
2934
<span>{item.title}</span>
30-
</a>
35+
</button>
3136
{/snippet}
3237
</Sidebar.MenuButton>
3338
</Sidebar.MenuItem>

0 commit comments

Comments
 (0)