Add clanker code

This commit is contained in:
2026-02-17 15:33:05 +01:00
parent ced3cbfe6e
commit 9874f78329
24 changed files with 1884 additions and 31 deletions

131
NOTES.md Normal file
View File

@@ -0,0 +1,131 @@
# Pozn<7A>mky k projektu - Evidence Autobazaru
## Spln<6C>n<EFBFBD> zad<61>n<EFBFBD>
### ? Z<>kladn<64> po<70>adavky
- [x] WPF aplikace
- [x] Evidence autobazaru
- [x] Serializace a deserializace (JSON)
- [x] CRUD operace (Create, Read, Update, Delete)
- [x] <20>ist<73> a organizovan<61> k<>d
- [x] Separation of Concerns (SoC)
### ? Model Auto (Vehicle)
- [x] Zna<6E>ka
- [x] Model
- [x] SPZ
- [x] Rok v<>roby
- [x] Palivo (Benz<6E>n, Nafta, Elektro, Hybrid, LPG, CNG)
- [x] N<>jezd v km
- [x] Barva (s color pickerem)
- [x] Fotografie (Base64)
- [x] Cena
### ? Model Vlastn<74>k (Owner)
- [x] Jm<4A>no
- [x] P<><50>jmen<65>
- [x] Adresa
- [x] Telefon
- [x] Email
- [x] Propojen<65> s autem
### ? GUI Features
- [x] Hlavn<76> okno se seznamem vozidel
- [x] Zobrazen<65> z<>kladn<64>ch <20>daj<61> (SPZ, zna<6E>ka+model, barva, rok, palivo)
- [x] Detail vozidla po kliknut<75> (double-click nebo tla<6C><61>tko)
- [x] Okno pro p<>id<69>n<EFBFBD> vozidla
- [x] Okno pro <20>pravu vozidla
- [x] Okno s detaily vozidla
- [x] V<>b<EFBFBD>r barvy pomoc<6F> Color Dialogu
- [x] V<>b<EFBFBD>r fotografie
## Technick<63> implementace
### Serializace
- Pou<6F>it **System.Text.Json** pro JSON serializaci
- Data ulo<6C>ena v souboru `vehicles.json`
- Automatick<63> na<6E>ten<65> p<>i startu aplikace
- Automatick<63> ukl<6B>d<EFBFBD>n<EFBFBD> po ka<6B>d<EFBFBD> zm<7A>n<EFBFBD>
### Validace
- <20><>seln<6C> vstupy (rok, km, cena) - validace pomoc<6F> `PreviewTextInput`
- SPZ - automatick<63> p<>evod na velk<6C> p<>smena
- Obr<62>zky - o<>et<65>en<65> chyb p<>i na<6E><61>t<EFBFBD>n<EFBFBD>/ukl<6B>d<EFBFBD>n<EFBFBD>
### Separation of Concerns
```
??? Models
? ??? Vehicle.cs # Datov<6F> model vozidla
? ??? Owner.cs # Datov<6F> model vlastn<74>ka
??? Data
? ??? DataManager.cs # Spr<70>va dat, serializace
??? Views
??? MainWindow.xaml/.cs # Hlavn<76> okno
??? AddVehicleWindow.xaml/.cs # P<>id<69>n<EFBFBD> vozidla
??? EditVehicleWindow.xaml/.cs # <20>prava vozidla
??? VehicleDetailWindow.xaml/.cs # Detail vozidla
```
## Pou<6F>it<69> technologie
- .NET 8.0
- WPF (Windows Presentation Foundation)
- System.Text.Json (JSON serializace)
- Windows Forms ColorDialog (v<>b<EFBFBD>r barvy)
- XAML pro UI design
## Budouc<75> vylep<65>en<65> (pro roz<6F><7A><EFBFBD>en<65>)
- [ ] Filtrov<6F>n<EFBFBD> a vyhled<65>v<EFBFBD>n<EFBFBD> vozidel
- [ ] <20>azen<65> podle r<>zn<7A>ch sloupc<70>
- [ ] Export do PDF/Excel
- [ ] V<>ce obr<62>zk<7A> na vozidlo
- [ ] Historie zm<7A>n vozidla
- [ ] Statistiky (pr<70>m<EFBFBD>rn<72> cena, nejstar<61><72>/nejnov<6F>j<EFBFBD><6A> vozidlo, atd.)
- [ ] Validace emailu a telefonn<6E>ho <20><>sla
- [ ] Podpora pro v<>ce autobazar<61>
- [ ] Cloudov<6F> synchronizace dat
## Zn<5A>m<EFBFBD> limitace
- Fotografie je ulo<6C>ena jako Base64 p<><70>mo v JSON (m<><6D>e zp<7A>sobit velk<6C> soubory)
- Validace vstup<75> je pouze na UI <20>rovni
- <20><>dn<64> autentizace/autorizace
-?u<>ivatelsk<73> aplikace (bez datab<61>ze)
## Testov<6F>n<EFBFBD>
Pro testov<6F>n<EFBFBD> aplikace pou<6F>ijte uk<75>zkov<6F> soubor `vehicles.example.json`:
1. P<>ejmenujte `vehicles.example.json` na `vehicles.json`
2. Spus<75>te aplikaci
3. Data se automaticky na<6E>tou
## Klasifika<6B>n<EFBFBD> krit<69>ria
### GUI (User Interface)
- ? P<>ehledn<64> a intuitivn<76> rozhran<61>
- ? Responsivn<76> design
- ? Spr<70>vn<76> pou<6F>it<69> WPF kontrol
- ? Color picker pro v<>b<EFBFBD>r barvy
- ? N<>hled fotografi<66>
### <20>istota k<>du
- ? Jasn<73> pojmenov<6F>n<EFBFBD>
- ? Odd<64>len<65> t<><74>dy pro r<>zn<7A> <20><>ely
- ? Try-catch bloky pro o<>et<65>en<65> chyb
- ? Koment<6E><74>e kde je to vhodn<64>
- ? Konzistentn<74> styl k<>du
### Funk<6E>nost
- ? V<>echny CRUD operace funguj<75>
- ? Serializace a deserializace funguje
- ? Validace vstup<75>
- ? O<>et<65>en<65> chyb
- ? Aplikace nepad<61>
### Separation of Concerns
- ? Model (Vehicle, Owner)
- ? Data Logic (DataManager)
- ? View (XAML)
- ? View Logic (Code-behind)
## Autorstv<74>
- **Autor**: Petr (23ib22_petr)
- **P<>edm<64>t**: PTA25 - Programov<6F>n<EFBFBD> v C#
- **Term<72>n odevzd<7A>n<EFBFBD>**: 1. 3. 2026

189
README.md Normal file
View File

@@ -0,0 +1,189 @@
# Evidence Autobazaru - WPF Aplikace
## Popis projektu
WPF aplikace pro evidenci vozidel v autobazaru s mo<6D>nost<73> serializace a deserializace dat.
## Funkce aplikace
### ? Implementovan<61> funkce
- **CRUD operace**
- Create (P<>id<69>n<EFBFBD> vozidla)
- Read (Zobrazen<65> seznamu a detail<69>)
- Update (<28>prava vozidel)
- Delete (Maz<61>n<EFBFBD> vozidel)
- **Serializace a deserializace**
- Ukl<6B>d<EFBFBD>n<EFBFBD> dat do JSON souboru (`vehicles.json`)
- Automatick<63> na<6E><61>t<EFBFBD>n<EFBFBD> dat p<>i spu<70>t<EFBFBD>n<EFBFBD> aplikace
- **Evidence vozidel**
- SPZ
- Zna<6E>ka (nap<61>. <20>koda, BMW, Audi)
- Model
- Rok v<>roby
- Palivo (Benz<6E>n, Nafta, Elektro, Hybrid, LPG, CNG)
- N<>jezd v km
- Cena v K<>
- Barva (s v<>b<EFBFBD>rem z Color Dialogu)
- Fotografie (ulo<6C>en<65> jako Base64)
- **Evidence vlastn<74>k<EFBFBD>**
- Jm<4A>no
- P<><50>jmen<65>
- Adresa
- Telefon
- Email
### ??? U<>ivatelsk<73> rozhran<61>
#### Hlavn<76> okno (MainWindow)
- Seznam v<>ech vozidel v p<>ehledn<64> tabulce
- Zobrazen<65>: SPZ, Zna<6E>ka a Model, Barva, Rok, Palivo
- Akce:
- **P<>idat vozidlo** - otev<65>e okno pro p<>id<69>n<EFBFBD> nov<6F>ho vozidla
- **Detail** - zobraz<61> detailn<6C> informace o vybran<61>m vozidle
- **Upravit** - umo<6D>n<EFBFBD> editaci vybran<61>ho vozidla
- **Smazat** - sma<6D>e vybran<61> vozidlo (s potvrzen<65>m)
- **Double-click** na vozidlo otev<65>e detail
#### Okno p<>id<69>n<EFBFBD> vozidla (AddVehicleWindow)
- Formul<75><6C> pro zad<61>n<EFBFBD> v<>ech <20>daj<61> o vozidle
- V<>b<EFBFBD>r barvy pomoc<6F> Color Dialogu
- V<>b<EFBFBD>r paliva z ComboBoxu
- Mo<4D>nost p<>idat fotografii
- Sekce pro zad<61>n<EFBFBD> informac<61> o vlastn<74>kovi
- Validace <20><>seln<6C>ch vstup<75>
#### Okno <20>pravy vozidla (EditVehicleWindow)
- P<>edvypln<6C>n<EFBFBD> <20>daje z vybran<61>ho vozidla
- N<>hled aktu<74>ln<6C> fotografie
- Mo<4D>nost zm<7A>ny v<>ech <20>daj<61> v<>etn<74> vlastn<74>ka
- Stejn<6A> funkce jako v okn<6B> p<>id<69>n<EFBFBD>
#### Okno detailu vozidla (VehicleDetailWindow)
- Kompletn<74> zobrazen<65> v<>ech informac<61>
- Zobrazen<65> fotografie vozidla
- Informace o vlastn<74>kovi
- Tla<6C><61>tka pro <20>pravu, smaz<61>n<EFBFBD> nebo zav<61>en<65>
## Struktura projektu
### T<><54>dy
#### `Vehicle.cs`
```csharp
- Spz: string
- Znacka: string
- Model: string
- Barva: string
- RokVyroby: int?
- Palivo: string
- NajeteKm: int?
- Cena: decimal?
- Fotografie: string (Base64)
- Vlastnik: Owner
- ZnackaModel: string (computed property)
```
#### `Owner.cs`
```csharp
- Jmeno: string
- Prijmeni: string
- Adresa: string
- Telefon: string
- Email: string
- CeleJmeno: string (computed property)
```
#### `DataManager.cs`
```csharp
- AddVehicle(Vehicle)
- GetAllVehicles(): IEnumerable<Vehicle>
- RemoveVehicle(Vehicle)
- Save() - serializace do JSON
- Load() - deserializace z JSON
```
## Technologie
- **.NET 8.0**
- **WPF (Windows Presentation Foundation)**
- **System.Text.Json** - pro serializaci/deserializaci
- **Windows Forms ColorDialog** - pro v<>b<EFBFBD>r barvy
## Principy n<>vrhu
### Separation of Concerns (SoC)
- **Model** - `Vehicle.cs`, `Owner.cs`
- **Data Logic** - `DataManager.cs`
- **View** - XAML soubory (MainWindow, AddVehicleWindow, EditVehicleWindow, VehicleDetailWindow)
- **View Logic** - Code-behind soubory (.xaml.cs)
### <20>istota k<>du
- Jasn<73> pojmenov<6F>n<EFBFBD> prom<6F>nn<6E>ch a metod
- Validace vstup<75> (PreviewTextInput pro <20><>seln<6C> hodnoty)
- O<>et<65>en<65> chyb (try-catch bloky p<>i pr<70>ci s obr<62>zky)
- Odd<64>len<65> logiky od prezentace
## Instalace a spu<70>t<EFBFBD>n<EFBFBD>
1. Otev<65>ete projekt v **Visual Studio 2022** nebo nov<6F>j<EFBFBD><6A>m
2. Ujist<73>te se, <20>e m<>te nainstalovan<61> **.NET 8.0 SDK**
3. Stiskn<6B>te **F5** nebo klikn<6B>te na **Start** pro spu<70>t<EFBFBD>n<EFBFBD> aplikace
4. Data se automaticky ukl<6B>daj<61> do souboru `vehicles.json` ve stejn<6A> slo<6C>ce jako aplikace
## Ovl<76>d<EFBFBD>n<EFBFBD> aplikace
### P<>id<69>n<EFBFBD> vozidla
1. Klikn<6B>te na tla<6C><61>tko **"P<>idat vozidlo"**
2. Vypl<70>te <20>daje o vozidle
3. Vyberte barvu pomoc<6F> tla<6C><61>tka **"Vybrat barvu"**
4. (Voliteln<6C>) Vyberte fotografii
5. (Voliteln<6C>) Vypl<70>te <20>daje o vlastn<74>kovi
6. Klikn<6B>te na **"Ulozit"**
### Zobrazen<65> detailu
- **Double-click** na vozidlo v seznamu, nebo
- Vyberte vozidlo a klikn<6B>te na **"Detail"**
### <20>prava vozidla
1. Vyberte vozidlo v seznamu
2. Klikn<6B>te na **"Upravit"**
3. Zm<5A><6D>te po<70>adovan<61> <20>daje
4. Klikn<6B>te na **"Ulozit"**
### Smaz<61>n<EFBFBD> vozidla
1. Vyberte vozidlo v seznamu
2. Klikn<6B>te na **"Smazat"**
3. Potvr<76>te smaz<61>n<EFBFBD>
## Ukl<6B>d<EFBFBD>n<EFBFBD> dat
Data jsou ulo<6C>ena v souboru **`vehicles.json`** ve form<72>tu:
```json
[
{
"Spz": "1A2 3456",
"Znacka": "Skoda",
"Model": "Octavia",
"Barva": "#FF0000",
"RokVyroby": 2020,
"Palivo": "Benz<6E>n",
"NajeteKm": 50000,
"Cena": 350000,
"Fotografie": "base64_string...",
"Vlastnik": {
"Jmeno": "Jan",
"Prijmeni": "Novak",
"Adresa": "Praha 1",
"Telefon": "+420123456789",
"Email": "jan.novak@email.cz"
}
}
]
```
## Autor
Vytvo<EFBFBD>eno pro p<>edm<64>t PTA25 - Programov<6F>n<EFBFBD> v C#
## Term<72>n odevzd<7A>n<EFBFBD>
**1. 3. 2026**

View File

@@ -9,7 +9,10 @@ namespace dealer
public class DataManager
{
private List<Vehicle> vehicles = new List<Vehicle>();
private List<Owner> owners = new List<Owner>();
private List<Image> images = new List<Image>();
// Vehicle CRUD
public void AddVehicle(Vehicle vehicle)
{
vehicles.Add(vehicle);
@@ -25,23 +28,260 @@ namespace dealer
vehicles.Remove(vehicle);
}
// Owner CRUD
public void AddOwner(Owner owner)
{
owners.Add(owner);
}
public IEnumerable<Owner> GetAllOwners()
{
return owners;
}
public Owner? GetOwnerById(Guid? id)
{
if (id == null) return null;
return owners.FirstOrDefault(o => o.Id == id);
}
public void RemoveOwner(Owner owner)
{
// Remove owner reference from all vehicles
foreach (var vehicle in vehicles.Where(v => v.VlastnikId == owner.Id))
{
vehicle.VlastnikId = null;
vehicle.Vlastnik = null;
}
owners.Remove(owner);
}
public IEnumerable<Owner> SearchOwners(string searchText)
{
if (string.IsNullOrWhiteSpace(searchText))
return owners;
searchText = searchText.ToLower();
return owners.Where(o =>
(o.Jmeno?.ToLower().Contains(searchText) ?? false) ||
(o.Prijmeni?.ToLower().Contains(searchText) ?? false) ||
(o.Email?.ToLower().Contains(searchText) ?? false) ||
(o.Telefon?.Contains(searchText) ?? false) ||
(o.CeleJmeno?.ToLower().Contains(searchText) ?? false));
}
// Image CRUD
public void AddImage(Image image)
{
images.Add(image);
}
public IEnumerable<Image> GetAllImages()
{
return images;
}
public Image? GetImageById(Guid? id)
{
if (id == null) return null;
return images.FirstOrDefault(i => i.Id == id);
}
public void RemoveImage(Image image)
{
// Remove image reference from all vehicles
foreach (var vehicle in vehicles.Where(v => v.FotografieId == image.Id))
{
vehicle.FotografieId = null;
vehicle.Fotografie = null;
}
images.Remove(image);
}
// Link owners and images to vehicles after loading
private void LinkRelationsToVehicles()
{
foreach (var vehicle in vehicles)
{
if (vehicle.VlastnikId.HasValue)
{
vehicle.Vlastnik = GetOwnerById(vehicle.VlastnikId);
}
if (vehicle.FotografieId.HasValue)
{
vehicle.Fotografie = GetImageById(vehicle.FotografieId);
}
}
}
public void Save()
{
// Implementace ukládání dat do souboru - JSON
var json = System.Text.Json.JsonSerializer.Serialize(vehicles);
System.IO.File.WriteAllText("vehicles.json", json);
// Save vehicles
var vehiclesJson = System.Text.Json.JsonSerializer.Serialize(vehicles);
System.IO.File.WriteAllText("vehicles.json", vehiclesJson);
// Save owners
var ownersJson = System.Text.Json.JsonSerializer.Serialize(owners);
System.IO.File.WriteAllText("owners.json", ownersJson);
// Save images
var imagesJson = System.Text.Json.JsonSerializer.Serialize(images);
System.IO.File.WriteAllText("images.json", imagesJson);
}
public void Load()
{
string path = "vehicles.json";
// Implementace načítání dat ze souboru - JSON
if (System.IO.File.Exists(path))
// Load owners first
string ownersPath = "owners.json";
if (System.IO.File.Exists(ownersPath))
{
var json = System.IO.File.ReadAllText(path);
var json = System.IO.File.ReadAllText(ownersPath);
owners = System.Text.Json.JsonSerializer.Deserialize<List<Owner>>(json) ?? new List<Owner>();
}
// Load images
string imagesPath = "images.json";
if (System.IO.File.Exists(imagesPath))
{
var json = System.IO.File.ReadAllText(imagesPath);
images = System.Text.Json.JsonSerializer.Deserialize<List<Image>>(json) ?? new List<Image>();
}
// Load vehicles
string vehiclesPath = "vehicles.json";
if (System.IO.File.Exists(vehiclesPath))
{
var json = System.IO.File.ReadAllText(vehiclesPath);
vehicles = System.Text.Json.JsonSerializer.Deserialize<List<Vehicle>>(json) ?? new List<Vehicle>();
}
// Link relations to vehicles
LinkRelationsToVehicles();
// If no data exists, seed with sample data
if (!vehicles.Any() && !owners.Any())
{
SeedData();
}
}
private void SeedData()
{
// Seed owners
var owner1 = new Owner
{
Id = Guid.NewGuid(),
Jmeno = "Jan",
Prijmeni = "Novak",
Adresa = "Praha 1, Vaclavske namesti 1",
Telefon = "+420 123 456 789",
Email = "jan.novak@email.cz"
};
var owner2 = new Owner
{
Id = Guid.NewGuid(),
Jmeno = "Marie",
Prijmeni = "Svobodova",
Adresa = "Brno, Husova 23",
Telefon = "+420 987 654 321",
Email = "marie.svobodova@email.cz"
};
var owner3 = new Owner
{
Id = Guid.NewGuid(),
Jmeno = "Petr",
Prijmeni = "Dvorak",
Adresa = "Ostrava, Hlavni 45",
Telefon = "+420 777 888 999",
Email = "petr.dvorak@email.cz"
};
owners.Add(owner1);
owners.Add(owner2);
owners.Add(owner3);
// Seed images (1x1 pixel placeholder images in different colors)
var image1 = new Image
{
Id = Guid.NewGuid(),
Data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPj/HwADBwIAMCbHYQAAAABJRU5ErkJggg==",
FileName = "skoda_octavia.png",
ContentType = "image/png"
};
var image2 = new Image
{
Id = Guid.NewGuid(),
Data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M/wHwAEBgIApD5fRAAAAABJRU5ErkJggg==",
FileName = "bmw_x5.png",
ContentType = "image/png"
};
var image3 = new Image
{
Id = Guid.NewGuid(),
Data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==",
FileName = "tesla_model3.png",
ContentType = "image/png"
};
images.Add(image1);
images.Add(image2);
images.Add(image3);
// Seed vehicles
vehicles.Add(new Vehicle
{
Spz = "1A2 3456",
Znacka = "Skoda",
Model = "Octavia",
Barva = "#0055AA",
RokVyroby = 2020,
Palivo = "Benzín",
NajeteKm = 45000,
Cena = 350000,
VlastnikId = owner1.Id,
Vlastnik = owner1,
FotografieId = image1.Id,
Fotografie = image1
});
vehicles.Add(new Vehicle
{
Spz = "7B8 9012",
Znacka = "BMW",
Model = "X5",
Barva = "#000000",
RokVyroby = 2019,
Palivo = "Nafta",
NajeteKm = 78000,
Cena = 850000,
VlastnikId = owner2.Id,
Vlastnik = owner2,
FotografieId = image2.Id,
Fotografie = image2
});
vehicles.Add(new Vehicle
{
Spz = "3C4 5678",
Znacka = "Tesla",
Model = "Model 3",
Barva = "#FFFFFF",
RokVyroby = 2022,
Palivo = "Elektro",
NajeteKm = 15000,
Cena = 1200000,
VlastnikId = owner3.Id,
Vlastnik = owner3,
FotografieId = image3.Id,
Fotografie = image3
});
// Save the seeded data
Save();
}
}
}

12
dealer/Image.cs Normal file
View File

@@ -0,0 +1,12 @@
using System;
namespace dealer
{
public class Image
{
public Guid Id { get; set; } = Guid.NewGuid();
public string? Data { get; set; } // Base64 encoded image data or file path
public string? FileName { get; set; }
public string? ContentType { get; set; }
}
}

26
dealer/Owner.cs Normal file
View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace dealer
{
public class Owner
{
public Guid Id { get; set; } = Guid.NewGuid();
public string? Jmeno { get; set; }
public string? Prijmeni { get; set; }
public string? Adresa { get; set; }
public string? Telefon { get; set; }
public string? Email { get; set; }
public string CeleJmeno => $"{Jmeno} {Prijmeni}".Trim();
public string DisplayText => string.IsNullOrEmpty(CeleJmeno)
? Email ?? Telefon ?? "Neznamy vlastnik"
: CeleJmeno;
public override string ToString() => DisplayText;
}
}

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace dealer
@@ -9,11 +10,26 @@ namespace dealer
public class Vehicle
{
public string? Spz { get; set; }
public string? Znacka { get; set; }
public string? Model { get; set; }
public string? Barva { get; set; }
public int? RokVyroby { get; set; }
public string? Palivo { get; set; }
public int? NajeteKm { get; set; }
public decimal? Cena { get; set; }
public string? Fotografie { get; set; }
public Guid? FotografieId { get; set; }
[JsonIgnore]
public Image? Fotografie { get; set; }
public Guid? VlastnikId { get; set; }
[JsonIgnore]
public Owner? Vlastnik { get; set; }
public string ZnackaModel => !string.IsNullOrEmpty(Znacka) && !string.IsNullOrEmpty(Model)
? $"{Znacka} {Model}"
: Model ?? Znacka ?? "Nezadano";
}
}

View File

@@ -0,0 +1,84 @@
<Window x:Class="dealer.AddOwnerWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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:local="clr-namespace:dealer"
mc:Ignorable="d"
Title="Pridat vlastnika" Height="400" Width="400"
WindowStartupLocation="CenterOwner"
ResizeMode="NoResize">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="20">
<TextBlock Text="Novy vlastnik"
FontSize="20"
FontWeight="Bold"
Margin="0,0,0,20"
HorizontalAlignment="Center" />
<TextBlock Text="Jmeno:" FontSize="14" Margin="0,5" />
<TextBox Name="JmenoTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Prijmeni:" FontSize="14" Margin="0,5" />
<TextBox Name="PrijmeniTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Telefon:" FontSize="14" Margin="0,5" />
<TextBox Name="TelefonTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Email:" FontSize="14" Margin="0,5" />
<TextBox Name="EmailTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Adresa:" FontSize="14" Margin="0,5" />
<TextBox Name="AdresaTextBox"
FontSize="14"
Padding="5"
TextWrapping="Wrap"
AcceptsReturn="True"
Height="60"
Margin="0,0,0,10" />
</StackPanel>
</ScrollViewer>
<Border Grid.Row="1"
BorderBrush="LightGray"
BorderThickness="0,1,0,0"
Background="WhiteSmoke">
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Center"
Margin="0,15">
<Button Name="SaveButton"
Content="Ulozit"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="SaveButton_Click" />
<Button Name="CancelButton"
Content="Zrusit"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="CancelButton_Click" />
</StackPanel>
</Border>
</Grid>
</Window>

View File

@@ -0,0 +1,49 @@
using System.Windows;
namespace dealer
{
public partial class AddOwnerWindow : Window
{
private DataManager dataManager;
/// <summary>
/// Gets the owner that was created when the user saved, or null if cancelled.
/// </summary>
public Owner? CreatedOwner { get; private set; }
public AddOwnerWindow(DataManager dataManager)
{
InitializeComponent();
this.dataManager = dataManager;
}
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(JmenoTextBox.Text) && string.IsNullOrWhiteSpace(PrijmeniTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte alespon jmeno nebo prijmeni.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
var owner = new Owner
{
Jmeno = JmenoTextBox.Text.Trim(),
Prijmeni = PrijmeniTextBox.Text.Trim(),
Telefon = TelefonTextBox.Text.Trim(),
Email = EmailTextBox.Text.Trim(),
Adresa = AdresaTextBox.Text.Trim()
};
dataManager.AddOwner(owner);
dataManager.Save();
CreatedOwner = owner;
this.DialogResult = true;
this.Close();
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}
}

View File

@@ -5,7 +5,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:dealer"
mc:Ignorable="d"
Title="Pridat vozidlo" Height="550" Width="450"
Title="Pridat vozidlo" Height="700" Width="500"
WindowStartupLocation="CenterOwner"
ResizeMode="NoResize">
<Grid>
@@ -30,6 +30,12 @@
CharacterCasing="Upper"
Margin="0,0,0,10" />
<TextBlock Text="Znacka:" FontSize="14" Margin="0,5" />
<TextBox Name="ZnackaTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Model:" FontSize="14" Margin="0,5" />
<TextBox Name="ModelTextBox"
FontSize="14"
@@ -66,6 +72,19 @@
PreviewTextInput="NumericOnly_PreviewTextInput"
Margin="0,0,0,10" />
<TextBlock Text="Palivo:" FontSize="14" Margin="0,5" />
<ComboBox Name="PalivoComboBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10">
<ComboBoxItem Content="Benzin" />
<ComboBoxItem Content="Nafta" />
<ComboBoxItem Content="Elektro" />
<ComboBoxItem Content="Hybrid" />
<ComboBoxItem Content="LPG" />
<ComboBoxItem Content="CNG" />
</ComboBox>
<TextBlock Text="Najete km:" FontSize="14" Margin="0,5" />
<TextBox Name="MileageTextBox"
FontSize="14"
@@ -94,6 +113,44 @@
Foreground="Gray"
Margin="0,0,0,10"
TextWrapping="Wrap" />
<Separator Margin="0,15,0,15" />
<TextBlock Text="Vlastnik" FontSize="16" FontWeight="Bold" Margin="0,0,0,10" />
<TextBlock Text="Vybrat vlastnika:" FontSize="14" Margin="0,5" />
<Grid Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ComboBox Name="OwnerComboBox"
FontSize="14"
Padding="5"
IsEditable="True"
IsTextSearchEnabled="False"
StaysOpenOnEdit="True"
DisplayMemberPath="DisplayText"
TextBoxBase.TextChanged="OwnerComboBox_TextChanged"
SelectionChanged="OwnerComboBox_SelectionChanged" />
<Button Name="AddNewOwnerButton"
Grid.Column="1"
Content="+"
Width="35"
Height="35"
Margin="5,0,0,0"
FontSize="18"
FontWeight="Bold"
ToolTip="Pridat noveho vlastnika"
Click="AddNewOwnerButton_Click" />
</Grid>
<TextBlock Name="SelectedOwnerInfo"
Text=""
FontStyle="Italic"
Foreground="Gray"
TextWrapping="Wrap"
Margin="0,0,0,10" />
</StackPanel>
</ScrollViewer>

View File

@@ -1,6 +1,8 @@
using Microsoft.Win32;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using WinForms = System.Windows.Forms;
@@ -13,12 +15,76 @@ namespace dealer
public System.Windows.Media.Color SelectedColor { get; private set; } = Colors.White;
private DataManager dataManager;
private Owner? selectedOwner;
private bool isUpdatingOwnerComboBox = false;
public AddVehicleWindow(DataManager dataManager)
{
InitializeComponent();
this.dataManager = dataManager;
LoadOwners();
}
private void LoadOwners()
{
OwnerComboBox.ItemsSource = dataManager.GetAllOwners().ToList();
}
private void OwnerComboBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (isUpdatingOwnerComboBox) return;
var comboBox = sender as System.Windows.Controls.ComboBox;
if (comboBox == null) return;
string searchText = comboBox.Text;
var filteredOwners = dataManager.SearchOwners(searchText).ToList();
isUpdatingOwnerComboBox = true;
comboBox.ItemsSource = filteredOwners;
comboBox.IsDropDownOpen = true;
isUpdatingOwnerComboBox = false;
}
private void OwnerComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
selectedOwner = OwnerComboBox.SelectedItem as Owner;
UpdateSelectedOwnerInfo();
}
private void UpdateSelectedOwnerInfo()
{
if (selectedOwner != null)
{
var info = selectedOwner.CeleJmeno;
if (!string.IsNullOrEmpty(selectedOwner.Telefon))
info += $"\nTel: {selectedOwner.Telefon}";
if (!string.IsNullOrEmpty(selectedOwner.Email))
info += $"\nEmail: {selectedOwner.Email}";
if (!string.IsNullOrEmpty(selectedOwner.Adresa))
info += $"\nAdresa: {selectedOwner.Adresa}";
SelectedOwnerInfo.Text = info;
}
else
{
SelectedOwnerInfo.Text = "";
}
}
private void AddNewOwnerButton_Click(object sender, RoutedEventArgs e)
{
var addOwnerWindow = new AddOwnerWindow(dataManager);
addOwnerWindow.Owner = this;
if (addOwnerWindow.ShowDialog() == true && addOwnerWindow.CreatedOwner != null)
{
LoadOwners();
OwnerComboBox.SelectedItem = dataManager.GetAllOwners().FirstOrDefault(o => o.Id == addOwnerWindow.CreatedOwner.Id);
}
else
{
LoadOwners();
}
}
private void SelectPhotoButton_Click(object sender, RoutedEventArgs e)
@@ -74,22 +140,75 @@ namespace dealer
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
string? base64Image = null;
if (string.IsNullOrWhiteSpace(SpzTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte SPZ.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrWhiteSpace(ZnackaTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte znacku.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrWhiteSpace(ModelTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte model.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrWhiteSpace(YearTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte rok vyroby.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (PalivoComboBox.SelectedItem == null)
{
System.Windows.MessageBox.Show("Vyberte palivo.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (!string.IsNullOrWhiteSpace(MileageTextBox.Text) && (!int.TryParse(MileageTextBox.Text, out int mileageVal) || mileageVal < 0))
{
System.Windows.MessageBox.Show("Najete km musi byt nezaporne cele cislo.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (!string.IsNullOrWhiteSpace(PriceTextBox.Text) && (!decimal.TryParse(PriceTextBox.Text, out decimal priceVal) || priceVal < 0))
{
System.Windows.MessageBox.Show("Cena musi byt nezaporne cislo.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
Image? image = null;
if (!string.IsNullOrEmpty(SelectedPhotoPath) && File.Exists(SelectedPhotoPath))
{
byte[] imageBytes = File.ReadAllBytes(SelectedPhotoPath);
base64Image = Convert.ToBase64String(imageBytes);
image = new Image
{
Data = Convert.ToBase64String(imageBytes),
FileName = System.IO.Path.GetFileName(SelectedPhotoPath),
ContentType = GetContentType(SelectedPhotoPath)
};
this.dataManager.AddImage(image);
}
var vehicle = new Vehicle
{
Spz = SpzTextBox.Text,
Znacka = ZnackaTextBox.Text,
Model = ModelTextBox.Text,
Barva = $"#{SelectedColor.R:X2}{SelectedColor.G:X2}{SelectedColor.B:X2}",
RokVyroby = int.TryParse(YearTextBox.Text, out int rok) ? rok : (int?)null,
Palivo = (PalivoComboBox.SelectedItem as System.Windows.Controls.ComboBoxItem)?.Content?.ToString(),
NajeteKm = int.TryParse(MileageTextBox.Text, out int km) ? km : (int?)null,
Cena = decimal.TryParse(PriceTextBox.Text, out decimal cena) ? cena : (decimal?)null,
Fotografie = base64Image
FotografieId = image?.Id,
Fotografie = image,
VlastnikId = selectedOwner?.Id,
Vlastnik = selectedOwner
};
this.dataManager.AddVehicle(vehicle);
@@ -102,5 +221,19 @@ namespace dealer
{
this.Close();
}
private static string GetContentType(string filePath)
{
var extension = System.IO.Path.GetExtension(filePath)?.ToLowerInvariant();
return extension switch
{
".jpg" or ".jpeg" => "image/jpeg",
".png" => "image/png",
".gif" => "image/gif",
".bmp" => "image/bmp",
".webp" => "image/webp",
_ => "application/octet-stream"
};
}
}
}

View File

@@ -0,0 +1,84 @@
<Window x:Class="dealer.EditOwnerWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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:local="clr-namespace:dealer"
mc:Ignorable="d"
Title="Upravit vlastnika" Height="400" Width="400"
WindowStartupLocation="CenterOwner"
ResizeMode="NoResize">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="20">
<TextBlock Text="Upravit vlastnika"
FontSize="20"
FontWeight="Bold"
Margin="0,0,0,20"
HorizontalAlignment="Center" />
<TextBlock Text="Jmeno:" FontSize="14" Margin="0,5" />
<TextBox Name="JmenoTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Prijmeni:" FontSize="14" Margin="0,5" />
<TextBox Name="PrijmeniTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Telefon:" FontSize="14" Margin="0,5" />
<TextBox Name="TelefonTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Email:" FontSize="14" Margin="0,5" />
<TextBox Name="EmailTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Adresa:" FontSize="14" Margin="0,5" />
<TextBox Name="AdresaTextBox"
FontSize="14"
Padding="5"
TextWrapping="Wrap"
AcceptsReturn="True"
Height="60"
Margin="0,0,0,10" />
</StackPanel>
</ScrollViewer>
<Border Grid.Row="1"
BorderBrush="LightGray"
BorderThickness="0,1,0,0"
Background="WhiteSmoke">
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Center"
Margin="0,15">
<Button Name="SaveButton"
Content="Ulozit"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="SaveButton_Click" />
<Button Name="CancelButton"
Content="Zrusit"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="CancelButton_Click" />
</StackPanel>
</Border>
</Grid>
</Window>

View File

@@ -0,0 +1,74 @@
using System.Windows;
namespace dealer
{
public partial class EditOwnerWindow : Window
{
private Owner owner;
private DataManager dataManager;
public EditOwnerWindow(Owner owner, DataManager dataManager)
{
InitializeComponent();
this.owner = owner;
this.dataManager = dataManager;
LoadOwnerData();
}
private void LoadOwnerData()
{
JmenoTextBox.Text = owner.Jmeno ?? "";
PrijmeniTextBox.Text = owner.Prijmeni ?? "";
TelefonTextBox.Text = owner.Telefon ?? "";
EmailTextBox.Text = owner.Email ?? "";
AdresaTextBox.Text = owner.Adresa ?? "";
}
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(JmenoTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte jmeno.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrWhiteSpace(PrijmeniTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte prijmeni.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrWhiteSpace(TelefonTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte telefon.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrWhiteSpace(EmailTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte email.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrWhiteSpace(AdresaTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte adresu.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
owner.Jmeno = JmenoTextBox.Text.Trim();
owner.Prijmeni = PrijmeniTextBox.Text.Trim();
owner.Telefon = TelefonTextBox.Text.Trim();
owner.Email = EmailTextBox.Text.Trim();
owner.Adresa = AdresaTextBox.Text.Trim();
dataManager.Save();
this.Close();
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}
}

View File

@@ -5,7 +5,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:dealer"
mc:Ignorable="d"
Title="Upravit vozidlo" Height="600" Width="450"
Title="Upravit vozidlo" Height="700" Width="500"
WindowStartupLocation="CenterOwner"
ResizeMode="NoResize">
<Grid>
@@ -30,6 +30,12 @@
CharacterCasing="Upper"
Margin="0,0,0,10" />
<TextBlock Text="Znacka:" FontSize="14" Margin="0,5" />
<TextBox Name="ZnackaTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Model:" FontSize="14" Margin="0,5" />
<TextBox Name="ModelTextBox"
FontSize="14"
@@ -66,6 +72,19 @@
PreviewTextInput="NumericOnly_PreviewTextInput"
Margin="0,0,0,10" />
<TextBlock Text="Palivo:" FontSize="14" Margin="0,5" />
<ComboBox Name="PalivoComboBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10">
<ComboBoxItem Content="Benzin" />
<ComboBoxItem Content="Nafta" />
<ComboBoxItem Content="Elektro" />
<ComboBoxItem Content="Hybrid" />
<ComboBoxItem Content="LPG" />
<ComboBoxItem Content="CNG" />
</ComboBox>
<TextBlock Text="Najete km:" FontSize="14" Margin="0,5" />
<TextBox Name="MileageTextBox"
FontSize="14"
@@ -100,6 +119,44 @@
Foreground="Gray"
Margin="0,0,0,10"
TextWrapping="Wrap" />
<Separator Margin="0,15,0,15" />
<TextBlock Text="Vlastnik" FontSize="16" FontWeight="Bold" Margin="0,0,0,10" />
<TextBlock Text="Vybrat vlastnika:" FontSize="14" Margin="0,5" />
<Grid Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ComboBox Name="OwnerComboBox"
FontSize="14"
Padding="5"
IsEditable="True"
IsTextSearchEnabled="False"
StaysOpenOnEdit="True"
DisplayMemberPath="DisplayText"
TextBoxBase.TextChanged="OwnerComboBox_TextChanged"
SelectionChanged="OwnerComboBox_SelectionChanged" />
<Button Name="AddNewOwnerButton"
Grid.Column="1"
Content="+"
Width="35"
Height="35"
Margin="5,0,0,0"
FontSize="18"
FontWeight="Bold"
ToolTip="Pridat noveho vlastnika"
Click="AddNewOwnerButton_Click" />
</Grid>
<TextBlock Name="SelectedOwnerInfo"
Text=""
FontStyle="Italic"
Foreground="Gray"
TextWrapping="Wrap"
Margin="0,0,0,10" />
</StackPanel>
</ScrollViewer>

View File

@@ -1,7 +1,9 @@
using Microsoft.Win32;
using System;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
@@ -18,6 +20,8 @@ namespace dealer
private DataManager dataManager;
private Vehicle vehicle;
private bool photoChanged = false;
private Owner? selectedOwner;
private bool isUpdatingOwnerComboBox = false;
public EditVehicleWindow(Vehicle vehicle, DataManager dataManager)
{
@@ -26,14 +30,72 @@ namespace dealer
this.dataManager = dataManager;
this.vehicle = vehicle;
LoadOwners();
LoadVehicleData();
}
private void LoadOwners()
{
OwnerComboBox.ItemsSource = dataManager.GetAllOwners().ToList();
}
private void OwnerComboBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (isUpdatingOwnerComboBox) return;
var comboBox = sender as System.Windows.Controls.ComboBox;
if (comboBox == null) return;
string searchText = comboBox.Text;
var filteredOwners = dataManager.SearchOwners(searchText).ToList();
isUpdatingOwnerComboBox = true;
comboBox.ItemsSource = filteredOwners;
comboBox.IsDropDownOpen = true;
isUpdatingOwnerComboBox = false;
}
private void OwnerComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
selectedOwner = OwnerComboBox.SelectedItem as Owner;
UpdateSelectedOwnerInfo();
}
private void UpdateSelectedOwnerInfo()
{
if (selectedOwner != null)
{
var info = selectedOwner.CeleJmeno;
if (!string.IsNullOrEmpty(selectedOwner.Telefon))
info += $"\nTel: {selectedOwner.Telefon}";
if (!string.IsNullOrEmpty(selectedOwner.Email))
info += $"\nEmail: {selectedOwner.Email}";
if (!string.IsNullOrEmpty(selectedOwner.Adresa))
info += $"\nAdresa: {selectedOwner.Adresa}";
SelectedOwnerInfo.Text = info;
}
else
{
SelectedOwnerInfo.Text = "";
}
}
private void AddNewOwnerButton_Click(object sender, RoutedEventArgs e)
{
var addOwnerWindow = new AddOwnerWindow(dataManager);
addOwnerWindow.Owner = this;
addOwnerWindow.ShowDialog();
LoadOwners();
}
private void LoadVehicleData()
{
// SPZ
SpzTextBox.Text = vehicle.Spz ?? "";
// Zna<6E>ka
ZnackaTextBox.Text = vehicle.Znacka ?? "";
// Model
ModelTextBox.Text = vehicle.Model ?? "";
@@ -57,18 +119,42 @@ namespace dealer
// Rok vyroby
YearTextBox.Text = vehicle.RokVyroby?.ToString() ?? "";
// Palivo
if (!string.IsNullOrEmpty(vehicle.Palivo))
{
foreach (System.Windows.Controls.ComboBoxItem item in PalivoComboBox.Items)
{
if (item.Content?.ToString() == vehicle.Palivo)
{
PalivoComboBox.SelectedItem = item;
break;
}
}
}
// Najete km
MileageTextBox.Text = vehicle.NajeteKm?.ToString() ?? "";
// Cena
PriceTextBox.Text = vehicle.Cena?.ToString() ?? "";
// Vlastnik - select from combobox
if (vehicle.VlastnikId.HasValue)
{
selectedOwner = dataManager.GetOwnerById(vehicle.VlastnikId);
if (selectedOwner != null)
{
OwnerComboBox.SelectedItem = selectedOwner;
UpdateSelectedOwnerInfo();
}
}
// Fotografie (base64)
if (!string.IsNullOrEmpty(vehicle.Fotografie))
if (vehicle.Fotografie != null && !string.IsNullOrEmpty(vehicle.Fotografie.Data))
{
try
{
byte[] imageBytes = Convert.FromBase64String(vehicle.Fotografie);
byte[] imageBytes = Convert.FromBase64String(vehicle.Fotografie.Data);
using (var ms = new MemoryStream(imageBytes))
{
var bitmap = new BitmapImage();
@@ -155,19 +241,75 @@ namespace dealer
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(SpzTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte SPZ.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrWhiteSpace(ZnackaTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte znacku.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrWhiteSpace(ModelTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte model.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (string.IsNullOrWhiteSpace(YearTextBox.Text))
{
System.Windows.MessageBox.Show("Vyplnte rok vyroby.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (PalivoComboBox.SelectedItem == null)
{
System.Windows.MessageBox.Show("Vyberte palivo.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (!string.IsNullOrWhiteSpace(MileageTextBox.Text) && (!int.TryParse(MileageTextBox.Text, out int mileageVal) || mileageVal < 0))
{
System.Windows.MessageBox.Show("Najete km musi byt nezaporne cele cislo.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (!string.IsNullOrWhiteSpace(PriceTextBox.Text) && (!decimal.TryParse(PriceTextBox.Text, out decimal priceVal) || priceVal < 0))
{
System.Windows.MessageBox.Show("Cena musi byt nezaporne cislo.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
// Update vehicle properties
vehicle.Spz = SpzTextBox.Text;
vehicle.Znacka = ZnackaTextBox.Text;
vehicle.Model = ModelTextBox.Text;
vehicle.Barva = $"#{SelectedColor.R:X2}{SelectedColor.G:X2}{SelectedColor.B:X2}";
vehicle.RokVyroby = int.TryParse(YearTextBox.Text, out int rok) ? rok : (int?)null;
vehicle.Palivo = (PalivoComboBox.SelectedItem as System.Windows.Controls.ComboBoxItem)?.Content?.ToString();
vehicle.NajeteKm = int.TryParse(MileageTextBox.Text, out int km) ? km : (int?)null;
vehicle.Cena = decimal.TryParse(PriceTextBox.Text, out decimal cena) ? cena : (decimal?)null;
// Update owner reference
vehicle.VlastnikId = selectedOwner?.Id;
vehicle.Vlastnik = selectedOwner;
// Update photo only if changed
if (photoChanged && !string.IsNullOrEmpty(SelectedPhotoPath) && File.Exists(SelectedPhotoPath))
{
byte[] imageBytes = File.ReadAllBytes(SelectedPhotoPath);
vehicle.Fotografie = Convert.ToBase64String(imageBytes);
var image = new Image
{
Data = Convert.ToBase64String(imageBytes),
FileName = System.IO.Path.GetFileName(SelectedPhotoPath),
ContentType = GetContentType(SelectedPhotoPath)
};
this.dataManager.AddImage(image);
vehicle.FotografieId = image.Id;
vehicle.Fotografie = image;
}
this.dataManager.Save();
@@ -180,5 +322,19 @@ namespace dealer
{
this.Close();
}
private static string GetContentType(string filePath)
{
var extension = System.IO.Path.GetExtension(filePath)?.ToLowerInvariant();
return extension switch
{
".jpg" or ".jpeg" => "image/jpeg",
".png" => "image/png",
".gif" => "image/gif",
".bmp" => "image/bmp",
".webp" => "image/webp",
_ => "application/octet-stream"
};
}
}
}

View File

@@ -28,10 +28,10 @@
MouseDoubleClick="VehiclesListView_MouseDoubleClick">
<ListView.View>
<GridView>
<GridViewColumn Header="SPZ" Width="150" DisplayMemberBinding="{Binding Spz}" />
<GridViewColumn Header="Model" Width="250"
DisplayMemberBinding="{Binding Model}" />
<GridViewColumn Header="Barva" Width="150">
<GridViewColumn Header="SPZ" Width="120" DisplayMemberBinding="{Binding Spz}" />
<GridViewColumn Header="Značka a Model" Width="200"
DisplayMemberBinding="{Binding ZnackaModel}" />
<GridViewColumn Header="Barva" Width="130">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
@@ -45,16 +45,18 @@
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Rok" Width="70" DisplayMemberBinding="{Binding RokVyroby}" />
<GridViewColumn Header="Palivo" Width="100" DisplayMemberBinding="{Binding Palivo}" />
</GridView>
</ListView.View>
</ListView>
<!-- Tlačítka -->
<!-- Tlacitka -->
<StackPanel Grid.Row="2"
Orientation="Horizontal"
HorizontalAlignment="Center">
<Button Name="AddButton"
Content="Přidat vozidlo"
Content="Pridat vozidlo"
Width="120"
Height="35"
Margin="5"
@@ -62,25 +64,33 @@
Click="AddButton_Click" />
<Button Name="DetailButton"
Content="Detail"
Width="120"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="DetailButton_Click" />
<Button Name="EditButton"
Content="Upravit"
Width="120"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="EditButton_Click" />
<Button Name="DeleteButton"
Content="Smazat"
Width="120"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="DeleteButton_Click" />
<Button Name="OwnersButton"
Content="Vlastnici"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Background="#FFE0E0FF"
Click="OwnersButton_Click" />
</StackPanel>
</Grid>
</Window>

View File

@@ -79,7 +79,7 @@ namespace dealer
if (selectedVehicle == null)
{
System.Windows.MessageBox.Show("Vyberte vozidlo, které chcete zobrazit.", "Upozornění", MessageBoxButton.OK, MessageBoxImage.Warning);
System.Windows.MessageBox.Show("Vyberte vozidlo, ktere chcete zobrazit.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
@@ -99,13 +99,13 @@ namespace dealer
if (selectedVehicle == null)
{
System.Windows.MessageBox.Show("Vyberte vozidlo, které chcete smazat.", "Upozornění", MessageBoxButton.OK, MessageBoxImage.Warning);
System.Windows.MessageBox.Show("Vyberte vozidlo, ktere chcete smazat.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
var result = System.Windows.MessageBox.Show(
$"Opravdu chcete smazat vozidlo {selectedVehicle.Model} (SPZ: {selectedVehicle.Spz})?",
"Potvrzení smazání",
"Potvrzeni smazani",
MessageBoxButton.YesNo,
MessageBoxImage.Question);
@@ -117,5 +117,16 @@ namespace dealer
this.VehiclesListView.ItemsSource = this.dataManager.GetAllVehicles();
}
}
private void OwnersButton_Click(object sender, RoutedEventArgs e)
{
var ownersWindow = new OwnersWindow(this.dataManager);
ownersWindow.Owner = this;
ownersWindow.ShowDialog();
// Refresh vehicles list to update owner references
this.VehiclesListView.ItemsSource = null;
this.VehiclesListView.ItemsSource = this.dataManager.GetAllVehicles();
}
}
}

View File

@@ -0,0 +1,85 @@
<Window x:Class="dealer.OwnersWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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:local="clr-namespace:dealer"
mc:Ignorable="d"
Title="Sprava vlastniku" Height="500" Width="700"
WindowStartupLocation="CenterOwner">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0"
Text="Evidence vlastniku"
FontSize="24"
FontWeight="Bold"
Margin="0,0,0,10"
HorizontalAlignment="Center" />
<Grid Grid.Row="1" Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Hledat:" VerticalAlignment="Center" Margin="0,0,10,0" />
<TextBox Name="SearchTextBox"
Grid.Column="1"
Padding="5"
TextChanged="SearchTextBox_TextChanged" />
</Grid>
<ListView Grid.Row="2"
Name="OwnersListView"
Margin="0,0,0,10"
MouseDoubleClick="OwnersListView_MouseDoubleClick">
<ListView.View>
<GridView>
<GridViewColumn Header="Jmeno" Width="120" DisplayMemberBinding="{Binding Jmeno}" />
<GridViewColumn Header="Prijmeni" Width="120" DisplayMemberBinding="{Binding Prijmeni}" />
<GridViewColumn Header="Telefon" Width="120" DisplayMemberBinding="{Binding Telefon}" />
<GridViewColumn Header="Email" Width="180" DisplayMemberBinding="{Binding Email}" />
<GridViewColumn Header="Adresa" Width="150" DisplayMemberBinding="{Binding Adresa}" />
</GridView>
</ListView.View>
</ListView>
<StackPanel Grid.Row="3"
Orientation="Horizontal"
HorizontalAlignment="Center">
<Button Name="AddButton"
Content="Pridat vlastnika"
Width="130"
Height="35"
Margin="5"
FontSize="14"
Click="AddButton_Click" />
<Button Name="EditButton"
Content="Upravit"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="EditButton_Click" />
<Button Name="DeleteButton"
Content="Smazat"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="DeleteButton_Click" />
<Button Name="CloseButton"
Content="Zavrit"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="CloseButton_Click" />
</StackPanel>
</Grid>
</Window>

View File

@@ -0,0 +1,91 @@
using System.Windows;
using System.Windows.Input;
namespace dealer
{
public partial class OwnersWindow : Window
{
private DataManager dataManager;
public OwnersWindow(DataManager dataManager)
{
InitializeComponent();
this.dataManager = dataManager;
RefreshOwnersList();
}
private void RefreshOwnersList()
{
string searchText = SearchTextBox?.Text ?? "";
OwnersListView.ItemsSource = null;
OwnersListView.ItemsSource = dataManager.SearchOwners(searchText);
}
private void SearchTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
RefreshOwnersList();
}
private void AddButton_Click(object sender, RoutedEventArgs e)
{
var addWindow = new AddOwnerWindow(dataManager);
addWindow.Owner = this;
addWindow.ShowDialog();
RefreshOwnersList();
}
private void EditButton_Click(object sender, RoutedEventArgs e)
{
var selectedOwner = OwnersListView.SelectedItem as Owner;
if (selectedOwner == null)
{
System.Windows.MessageBox.Show("Vyberte vlastnika, ktereho chcete upravit.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
var editWindow = new EditOwnerWindow(selectedOwner, dataManager);
editWindow.Owner = this;
editWindow.ShowDialog();
RefreshOwnersList();
}
private void DeleteButton_Click(object sender, RoutedEventArgs e)
{
var selectedOwner = OwnersListView.SelectedItem as Owner;
if (selectedOwner == null)
{
System.Windows.MessageBox.Show("Vyberte vlastnika, ktereho chcete smazat.", "Upozorneni", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
var result = System.Windows.MessageBox.Show(
$"Opravdu chcete smazat vlastnika {selectedOwner.CeleJmeno}?\n\nVozidla tohoto vlastnika zustanou, ale nebudou mit prirazeneho vlastnika.",
"Potvrzeni smazani",
MessageBoxButton.YesNo,
MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
dataManager.RemoveOwner(selectedOwner);
dataManager.Save();
RefreshOwnersList();
}
}
private void OwnersListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var selectedOwner = OwnersListView.SelectedItem as Owner;
if (selectedOwner == null) return;
var editWindow = new EditOwnerWindow(selectedOwner, dataManager);
editWindow.Owner = this;
editWindow.ShowDialog();
RefreshOwnersList();
}
private void CloseButton_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}
}

View File

@@ -47,6 +47,16 @@
<TextBlock Name="SpzTextBlock" Grid.Column="1" FontSize="14" />
</Grid>
<!-- Znacka -->
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Znacka:" FontSize="14" FontWeight="SemiBold" />
<TextBlock Name="ZnackaTextBlock" Grid.Column="1" FontSize="14" />
</Grid>
<!-- Model -->
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
@@ -85,6 +95,16 @@
<TextBlock Name="YearTextBlock" Grid.Column="1" FontSize="14" />
</Grid>
<!-- Palivo -->
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Palivo:" FontSize="14" FontWeight="SemiBold" />
<TextBlock Name="PalivoTextBlock" Grid.Column="1" FontSize="14" />
</Grid>
<!-- Najete km -->
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
@@ -104,6 +124,50 @@
<TextBlock Text="Cena:" FontSize="14" FontWeight="SemiBold" />
<TextBlock Name="PriceTextBlock" Grid.Column="1" FontSize="14" />
</Grid>
<Separator Margin="0,15,0,15" />
<TextBlock Text="Vlastnik" FontSize="16" FontWeight="Bold" Margin="0,0,0,10" />
<!-- Vlastnik Jmeno -->
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Jmeno a Prijmeni:" FontSize="14" FontWeight="SemiBold" />
<TextBlock Name="OwnerNameTextBlock" Grid.Column="1" FontSize="14" />
</Grid>
<!-- Adresa -->
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Adresa:" FontSize="14" FontWeight="SemiBold" />
<TextBlock Name="AddressTextBlock" Grid.Column="1" FontSize="14" TextWrapping="Wrap" />
</Grid>
<!-- Telefon -->
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Telefon:" FontSize="14" FontWeight="SemiBold" />
<TextBlock Name="PhoneTextBlock" Grid.Column="1" FontSize="14" />
</Grid>
<!-- Email -->
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Email:" FontSize="14" FontWeight="SemiBold" />
<TextBlock Name="EmailTextBlock" Grid.Column="1" FontSize="14" />
</Grid>
</StackPanel>
</ScrollViewer>
@@ -139,3 +203,5 @@
</Border>
</Grid>
</Window>

View File

@@ -29,6 +29,9 @@ namespace dealer
// SPZ
SpzTextBlock.Text = vehicle.Spz ?? "Nezadano";
// Znacka
ZnackaTextBlock.Text = vehicle.Znacka ?? "Nezadano";
// Model
ModelTextBlock.Text = vehicle.Model ?? "Nezadano";
@@ -50,6 +53,9 @@ namespace dealer
// Rok vyroby
YearTextBlock.Text = vehicle.RokVyroby?.ToString() ?? "Nezadano";
// Palivo
PalivoTextBlock.Text = vehicle.Palivo ?? "Nezadano";
// Najete km
if (vehicle.NajeteKm != null)
MileageTextBlock.Text = vehicle.NajeteKm.Value.ToString("N0") + " km";
@@ -62,12 +68,28 @@ namespace dealer
else
PriceTextBlock.Text = "Nezadano";
// Vlastnik
if (vehicle.Vlastnik != null)
{
OwnerNameTextBlock.Text = vehicle.Vlastnik.CeleJmeno;
AddressTextBlock.Text = vehicle.Vlastnik.Adresa ?? "Nezadano";
PhoneTextBlock.Text = vehicle.Vlastnik.Telefon ?? "Nezadano";
EmailTextBlock.Text = vehicle.Vlastnik.Email ?? "Nezadano";
}
else
{
OwnerNameTextBlock.Text = "Nezadano";
AddressTextBlock.Text = "Nezadano";
PhoneTextBlock.Text = "Nezadano";
EmailTextBlock.Text = "Nezadano";
}
// Fotografie (base64)
if (!string.IsNullOrEmpty(vehicle.Fotografie))
if (vehicle.Fotografie != null && !string.IsNullOrEmpty(vehicle.Fotografie.Data))
{
try
{
byte[] imageBytes = Convert.FromBase64String(vehicle.Fotografie);
byte[] imageBytes = Convert.FromBase64String(vehicle.Fotografie.Data);
using (var ms = new MemoryStream(imageBytes))
{
var bitmap = new BitmapImage();
@@ -129,3 +151,4 @@ namespace dealer
}
}
}

14
images.example.json Normal file

File diff suppressed because one or more lines are too long

26
owners.example.json Normal file
View File

@@ -0,0 +1,26 @@
[
{
"Id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"Jmeno": "Jan",
"Prijmeni": "Novak",
"Adresa": "Praha 1, Vaclavske namesti 1",
"Telefon": "+420 123 456 789",
"Email": "jan.novak@email.cz"
},
{
"Id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
"Jmeno": "Marie",
"Prijmeni": "Svobodova",
"Adresa": "Brno, Husova 23",
"Telefon": "+420 987 654 321",
"Email": "marie.svobodova@email.cz"
},
{
"Id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
"Jmeno": "Petr",
"Prijmeni": "Dvorak",
"Adresa": "Ostrava, Hlavni 45",
"Telefon": "+420 777 888 999",
"Email": "petr.dvorak@email.cz"
}
]

181
temp_add.txt Normal file
View File

@@ -0,0 +1,181 @@
<Window x:Class="dealer.AddVehicleWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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:local="clr-namespace:dealer"
mc:Ignorable="d"
Title="Pridat vozidlo" Height="700" Width="500"
WindowStartupLocation="CenterOwner"
ResizeMode="NoResize">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="20">
<TextBlock Text="Nove vozidlo"
FontSize="20"
FontWeight="Bold"
Margin="0,0,0,20"
HorizontalAlignment="Center" />
<TextBlock Text="SPZ:" FontSize="14" Margin="0,5" />
<TextBox Name="SpzTextBox"
FontSize="14"
Padding="5"
MaxLength="10"
CharacterCasing="Upper"
Margin="0,0,0,10" />
<TextBlock Text="Znacka:" FontSize="14" Margin="0,5" />
<TextBox Name="ZnackaTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Model:" FontSize="14" Margin="0,5" />
<TextBox Name="ModelTextBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10" />
<TextBlock Text="Barva:" FontSize="14" Margin="0,5" />
<StackPanel Orientation="Horizontal" Margin="0,0,0,10">
<Border Name="ColorPreviewBorder"
Width="40"
Height="32"
BorderBrush="Gray"
BorderThickness="1"
Background="White"
Margin="0,0,10,0" />
<Button Name="SelectColorButton"
Content="Vybrat barvu"
Width="120"
Height="32"
Click="SelectColorButton_Click" />
<TextBlock Name="ColorNameTextBlock"
Text="Nevybrano"
VerticalAlignment="Center"
Margin="10,0,0,0"
FontStyle="Italic"
Foreground="Gray" />
</StackPanel>
<TextBlock Text="Rok vyroby:" FontSize="14" Margin="0,5" />
<TextBox Name="YearTextBox"
FontSize="14"
Padding="5"
MaxLength="4"
PreviewTextInput="NumericOnly_PreviewTextInput"
Margin="0,0,0,10" />
<TextBlock Text="Palivo:" FontSize="14" Margin="0,5" />
<ComboBox Name="PalivoComboBox"
FontSize="14"
Padding="5"
Margin="0,0,0,10">
<ComboBoxItem Content="Benz<6E>n" />
<ComboBoxItem Content="Nafta" />
<ComboBoxItem Content="Elektro" />
<ComboBoxItem Content="Hybrid" />
<ComboBoxItem Content="LPG" />
<ComboBoxItem Content="CNG" />
</ComboBox>
<TextBlock Text="Najete km:" FontSize="14" Margin="0,5" />
<TextBox Name="MileageTextBox"
FontSize="14"
Padding="5"
PreviewTextInput="NumericOnly_PreviewTextInput"
Margin="0,0,0,10" />
<TextBlock Text="Cena (Kc):" FontSize="14" Margin="0,5" />
<TextBox Name="PriceTextBox"
FontSize="14"
Padding="5"
PreviewTextInput="DecimalOnly_PreviewTextInput"
Margin="0,0,0,10" />
<TextBlock Text="Fotografie:" FontSize="14" Margin="0,15,0,5" />
<Button Name="SelectPhotoButton"
Content="Vybrat fotografii"
Width="150"
Height="30"
HorizontalAlignment="Left"
Margin="0,0,0,5"
Click="SelectPhotoButton_Click" />
<TextBlock Name="PhotoPathTextBlock"
Text="Zadna fotografie nevybrana"
FontStyle="Italic"
Foreground="Gray"
Margin="0,0,0,10"
TextWrapping="Wrap" />
<Separator Margin="0,15,0,15" />
<TextBlock Text="Vlastnik" FontSize="16" FontWeight="Bold" Margin="0,0,0,10" />
<TextBlock Text="Vybrat vlastnika:" FontSize="14" Margin="0,5" />
<Grid Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ComboBox Name="OwnerComboBox"
FontSize="14"
Padding="5"
IsEditable="True"
IsTextSearchEnabled="False"
StaysOpenOnEdit="True"
DisplayMemberPath="DisplayText"
TextBoxBase.TextChanged="OwnerComboBox_TextChanged"
SelectionChanged="OwnerComboBox_SelectionChanged" />
<Button Name="AddNewOwnerButton"
Grid.Column="1"
Content="+"
Width="35"
Height="35"
Margin="5,0,0,0"
FontSize="18"
FontWeight="Bold"
ToolTip="Pridat noveho vlastnika"
Click="AddNewOwnerButton_Click" />
</Grid>
<TextBlock Name="SelectedOwnerInfo"
Text=""
FontStyle="Italic"
Foreground="Gray"
TextWrapping="Wrap"
Margin="0,0,0,10" />
</StackPanel>
</ScrollViewer>
<Border Grid.Row="1"
BorderBrush="LightGray"
BorderThickness="0,1,0,0"
Background="WhiteSmoke">
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Center"
Margin="0,15">
<Button Name="SaveButton"
Content="Ulozit"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="SaveButton_Click" />
<Button Name="CancelButton"
Content="Zrusit"
Width="100"
Height="35"
Margin="5"
FontSize="14"
Click="CancelButton_Click" />
</StackPanel>
</Border>
</Grid>
</Window>

38
vehicles.example.json Normal file
View File

@@ -0,0 +1,38 @@
[
{
"Spz": "1A2 3456",
"Znacka": "Skoda",
"Model": "Octavia",
"Barva": "#0055AA",
"RokVyroby": 2020,
"Palivo": "Benz<6E>n",
"NajeteKm": 45000,
"Cena": 350000,
"FotografieId": null,
"VlastnikId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
},
{
"Spz": "7B8 9012",
"Znacka": "BMW",
"Model": "X5",
"Barva": "#000000",
"RokVyroby": 2019,
"Palivo": "Nafta",
"NajeteKm": 78000,
"Cena": 850000,
"FotografieId": "11111111-2222-3333-4444-555555555555",
"VlastnikId": "b2c3d4e5-f6a7-8901-bcde-f23456789012"
},
{
"Spz": "3C4 5678",
"Znacka": "Tesla",
"Model": "Model 3",
"Barva": "#FFFFFF",
"RokVyroby": 2022,
"Palivo": "Elektro",
"NajeteKm": 15000,
"Cena": 1200000,
"FotografieId": null,
"VlastnikId": "c3d4e5f6-a7b8-9012-cdef-345678901234"
}
]