Last commit before showcase.

This commit is contained in:
Simon Pocrnjič 2024-11-14 21:02:10 +01:00
parent 953ff38d64
commit ad8b3c07e1
16 changed files with 302 additions and 143 deletions

View File

@ -30,10 +30,10 @@ public function build($options = null)
$newCases = $data->pluck('count')->toArray(); $newCases = $data->pluck('count')->toArray();
return $this->chart->areaChart() return $this->chart->areaChart()
->setTitle('Cases during last six months.') ->setTitle('Novi primeri zadnjih šest mesecev.')
->addData('New cases', $newCases) ->addData('Primeri', $newCases)
//->addData('Completed', [7, 2, 7, 2, 5, 4]) //->addData('Completed', [7, 2, 7, 2, 5, 4])
->setColors(['#1A56DB', '#ff6384']) ->setColors(['#ff6384'])
->setXAxis($months) ->setXAxis($months)
->setToolbar(true) ->setToolbar(true)
->toVue(); ->toVue();

View File

@ -60,9 +60,9 @@ public function store(Request $request)
'full_name' => $pq['full_name'], 'full_name' => $pq['full_name'],
'gender' => null, 'gender' => null,
'birthday' => null, 'birthday' => null,
'tax_number' => null, 'tax_number' => $pq['tax_number'],
'social_security_number' => null, 'social_security_number' => $pq['social_security_number'],
'description' => 'sdwwf', 'description' => $pq['description'],
'group_id' => 2, 'group_id' => 2,
'type_id' => 1 'type_id' => 1
]); ]);
@ -73,6 +73,12 @@ public function store(Request $request)
'type_id' => $pq['address']['type_id'] 'type_id' => $pq['address']['type_id']
]); ]);
$person->phones()->create([
'nu' => $pq['phone']['nu'],
'country_code' => $pq['phone']['country_code'],
'type_id' => $pq['phone']['type_id']
]);
$person->clientCase()->create([ $person->clientCase()->create([
'client_id' => $client->id 'client_id' => $client->id
]); ]);
@ -147,11 +153,11 @@ public function deleteContract(ClientCase $clientCase, String $uuid, Request $re
public function show(ClientCase $clientCase) public function show(ClientCase $clientCase)
{ {
$case = $clientCase::with([ $case = $clientCase::with([
'person' => fn($que) => $que->with('addresses') 'person' => fn($que) => $que->with(['addresses', 'phones'])
])->where('active', 1)->findOrFail($clientCase->id); ])->where('active', 1)->findOrFail($clientCase->id);
return Inertia::render('Cases/Show', [ return Inertia::render('Cases/Show', [
'client' => $case->client()->with('person', fn($q) => $q->with(['addresses']))->firstOrFail(), 'client' => $case->client()->with('person', fn($q) => $q->with(['addresses', 'phones']))->firstOrFail(),
'client_case' => $case, 'client_case' => $case,
'contracts' => $case->contracts() 'contracts' => $case->contracts()
->with(['type']) ->with(['type'])

View File

@ -30,7 +30,7 @@ public function index(Client $client, Request $request){
public function show(Client $client, Request $request) { public function show(Client $client, Request $request) {
$data = $client::query() $data = $client::query()
->with(['person' => fn($que) => $que->with('addresses')]) ->with(['person' => fn($que) => $que->with(['addresses','phones'])])
->findOrFail($client->id); ->findOrFail($client->id);
return Inertia::render('Client/Show', [ return Inertia::render('Client/Show', [
@ -56,6 +56,7 @@ public function store(Request $request)
DB::transaction(function() use ($request){ DB::transaction(function() use ($request){
$address = $request->input('address'); $address = $request->input('address');
$phone = $request->input('phone');
$person = \App\Models\Person\Person::create([ $person = \App\Models\Person\Person::create([
'nu' => rand(100000,200000), 'nu' => rand(100000,200000),
'first_name' => $request->input('first_name'), 'first_name' => $request->input('first_name'),
@ -63,9 +64,9 @@ public function store(Request $request)
'full_name' => $request->input('full_name'), 'full_name' => $request->input('full_name'),
'gender' => null, 'gender' => null,
'birthday' => null, 'birthday' => null,
'tax_number' => null, 'tax_number' => $request->input('tax_number'),
'social_security_number' => null, 'social_security_number' => $request->input('social_security_number'),
'description' => 'sdwwf', 'description' => $request->input('description'),
'group_id' => 1, 'group_id' => 1,
'type_id' => 2 'type_id' => 2
]); ]);
@ -76,6 +77,12 @@ public function store(Request $request)
'type_id' => $address['type_id'] 'type_id' => $address['type_id']
]); ]);
$person->phones()->create([
'nu' => $phone['nu'],
'country_code' => $phone['country_code'],
'type_id' => $phone['type_id']
]);
$person->client()->create(); $person->client()->create();
}); });

View File

@ -12,12 +12,29 @@ class PersonPhone extends Model
/** @use HasFactory<\Database\Factories\Person/PersonPhoneFactory> */ /** @use HasFactory<\Database\Factories\Person/PersonPhoneFactory> */
use HasFactory; use HasFactory;
protected $fillable = [
'nu',
'country_code',
'type_id',
'description',
'person_id',
'user_id'
];
protected $hidden = [ protected $hidden = [
'user_id', 'user_id',
'person_id', 'person_id',
'deleted' 'deleted'
]; ];
protected static function booted(){
static::creating(function (PersonPhone $personPhone) {
if(!isset($personPhone->user_id)){
$personPhone->user_id = auth()->id();
}
});
}
public function person(): BelongsTo public function person(): BelongsTo
{ {
return $this->belongsTo(\App\Models\Person\Person::class); return $this->belongsTo(\App\Models\Person\Person::class);

View File

@ -24,8 +24,8 @@ public function run(): void
]; ];
$personGroups = [ $personGroups = [
[ 'name' => 'client', 'description' => '', 'color_tag' => 'blue-400'], [ 'name' => 'naročnik', 'description' => '', 'color_tag' => 'blue-400'],
[ 'name' => 'client case', 'description' => '', 'color_tag' => 'red-400'] [ 'name' => 'primer naročnika', 'description' => '', 'color_tag' => 'red-400']
]; ];
$phoneTypes = [ $phoneTypes = [

View File

@ -24,11 +24,18 @@ const props = defineProps({
<p class="text-sm leading-5 md:text-sm text-gray-500">Social security NU.</p> <p class="text-sm leading-5 md:text-sm text-gray-500">Social security NU.</p>
<p class="text-sm md:text-base leading-7 text-gray-900">{{ person.social_security_number }}</p> <p class="text-sm md:text-base leading-7 text-gray-900">{{ person.social_security_number }}</p>
</div> </div>
<div class="md:col-span-full lg:col-span-2 rounded p-2 shadow">
</div>
<div class="grid grid-rows-* grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2 mt-1">
<div class="rounded p-2 shadow">
<p class="text-sm leading-5 md:text-sm text-gray-500">Address</p> <p class="text-sm leading-5 md:text-sm text-gray-500">Address</p>
<p class="text-sm md:text-base leading-7 text-gray-900">{{ person.address }}</p> <p class="text-sm md:text-base leading-7 text-gray-900">{{ person.main_address }}</p>
</div> </div>
<div class="md:col-span-full lg:col-span-2 rounded p-2 shadow"> <div class="rounded p-2 shadow">
<p class="text-sm leading-5 md:text-sm text-gray-500">Phone</p>
<p class="text-sm md:text-base leading-7 text-gray-900">{{ person.main_phone }}</p>
</div>
<div class="md:col-span-full lg:col-span-1 rounded p-2 shadow">
<p class="text-sm leading-5 md:text-sm text-gray-500">Description</p> <p class="text-sm leading-5 md:text-sm text-gray-500">Description</p>
<p class="text-sm md:text-base leading-7 text-gray-900">{{ person.description }}</p> <p class="text-sm md:text-base leading-7 text-gray-900">{{ person.description }}</p>
</div> </div>

View File

@ -21,5 +21,5 @@ watch(search, debounce((value) => {
</script> </script>
<template> <template>
<TextInput v-model="search" title="Search" placeholder="Search..." /> <TextInput v-model="search" title="Search" placeholder="Iskanje..." />
</template> </template>

View File

@ -42,23 +42,23 @@ const logout = () => {
<!-- Navigation Links --> <!-- Navigation Links -->
<div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex"> <div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
<NavLink :href="route('dashboard')" :active="route().current('dashboard')"> <NavLink :href="route('dashboard')" :active="route().current('dashboard')">
Dashboard Nadzorna plošča
</NavLink> </NavLink>
</div> </div>
<div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex"> <div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
<NavLink :href="route('client')" :active="route().current('client') || route().current('client.*')"> <NavLink :href="route('client')" :active="route().current('client') || route().current('client.*')">
Clients Naročniki
</NavLink> </NavLink>
</div> </div>
<div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex"> <div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
<NavLink :href="route('clientCase')" :active="route().current('clientCase') || route().current('clientCase.*')"> <NavLink :href="route('clientCase')" :active="route().current('clientCase') || route().current('clientCase.*')">
Cases Primeri
</NavLink> </NavLink>
</div> </div>
<div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex"> <div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
<NavLink :href="route('settings')" :active="route().current('settings') || route().current('settings.*')"> <NavLink :href="route('settings')" :active="route().current('settings') || route().current('settings.*')">
Settings Nastavitve
</NavLink> </NavLink>
</div> </div>
</div> </div>
@ -85,11 +85,11 @@ const logout = () => {
<template #content> <template #content>
<!-- Account Management --> <!-- Account Management -->
<div class="block px-4 py-2 text-xs text-gray-400"> <div class="block px-4 py-2 text-xs text-gray-400">
Manage Account Nastavitve računa
</div> </div>
<DropdownLink :href="route('profile.show')"> <DropdownLink :href="route('profile.show')">
Profile Profil
</DropdownLink> </DropdownLink>
<DropdownLink v-if="$page.props.jetstream.hasApiFeatures" :href="route('api-tokens.index')"> <DropdownLink v-if="$page.props.jetstream.hasApiFeatures" :href="route('api-tokens.index')">
@ -101,7 +101,7 @@ const logout = () => {
<!-- Authentication --> <!-- Authentication -->
<form @submit.prevent="logout"> <form @submit.prevent="logout">
<DropdownLink as="button"> <DropdownLink as="button">
Log Out Izpis
</DropdownLink> </DropdownLink>
</form> </form>
</template> </template>

View File

@ -72,16 +72,16 @@ const store = () => {
:show="show" :show="show"
@close="close" @close="close"
> >
<template #title>Add activity</template> <template #title>Dodaj aktivnost</template>
<template #content> <template #content>
<form @submit.prevent="store"> <form @submit.prevent="store">
<SectionTitle class="mt-4 border-b mb-4"> <SectionTitle class="mt-4 border-b mb-4">
<template #title> <template #title>
Activity Aktivnost
</template> </template>
</SectionTitle> </SectionTitle>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="activityDueDate" value="Due date"/> <InputLabel for="activityDueDate" value="Datum zapadlosti"/>
<vue-date-picker <vue-date-picker
id="activityDueDate" id="activityDueDate"
:enable-time-picker="false" :enable-time-picker="false"
@ -91,7 +91,7 @@ const store = () => {
/> />
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="activityAmount" value="Amount"/> <InputLabel for="activityAmount" value="Znesek"/>
<TextInput <TextInput
id="activityAmount" id="activityAmount"
ref="activityAmountinput" ref="activityAmountinput"
@ -102,7 +102,7 @@ const store = () => {
/> />
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="activityAction" value="Action"/> <InputLabel for="activityAction" value="Akcija"/>
<select <select
class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm" class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
id="activityAction" id="activityAction"
@ -114,7 +114,7 @@ const store = () => {
</select> </select>
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="activityDecision" value="Decision"/> <InputLabel for="activityDecision" value="Odločitev"/>
<select <select
class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm" class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
id="activityDecision" id="activityDecision"
@ -127,7 +127,7 @@ const store = () => {
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<FwbTextarea <FwbTextarea
label="Note" label="Opomba"
id="activityNote" id="activityNote"
ref="activityNoteTextarea" ref="activityNoteTextarea"
v-model="form.note" v-model="form.note"

View File

@ -10,12 +10,12 @@ const props = defineProps({
let header = [ let header = [
C_TD.make('Date', 'header'), C_TD.make('Datum', 'header'),
C_TD.make('Action', 'header'), C_TD.make('Akcija', 'header'),
C_TD.make('Decision', 'header'), C_TD.make('Odločitev', 'header'),
C_TD.make('Note', 'header'), C_TD.make('Opomba', 'header'),
C_TD.make('Due date', 'header'), C_TD.make('Datum zapadlosti', 'header'),
C_TD.make('Amount', 'header') C_TD.make('Znesek obljube', 'header')
]; ];
const createBody = (data) => { const createBody = (data) => {

View File

@ -52,16 +52,16 @@ const storeContract = () => {
:show="show" :show="show"
@close="close" @close="close"
> >
<template #title>Add contract</template> <template #title>Dodaj pogodbo</template>
<template #content> <template #content>
<form @submit.prevent="storeContract"> <form @submit.prevent="storeContract">
<SectionTitle class="mt-4 border-b mb-4"> <SectionTitle class="mt-4 border-b mb-4">
<template #title> <template #title>
Contract Pogodba
</template> </template>
</SectionTitle> </SectionTitle>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="contractRef" value="Reference"/> <InputLabel for="contractRef" value="Referenca"/>
<TextInput <TextInput
id="contractRef" id="contractRef"
ref="contractRefInput" ref="contractRefInput"
@ -72,11 +72,11 @@ const storeContract = () => {
/> />
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="contractStartDate" value="Start date"/> <InputLabel for="contractStartDate" value="Datum pričetka"/>
<vue-date-picker id="contractStartDate" :enable-time-picker="false" format="dd.MM.yyyy" class="mt-1 block w-full" v-model="formContract.start_date"></vue-date-picker> <vue-date-picker id="contractStartDate" :enable-time-picker="false" format="dd.MM.yyyy" class="mt-1 block w-full" v-model="formContract.start_date"></vue-date-picker>
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="contractTypeSelect" value="Contract type"/> <InputLabel for="contractTypeSelect" value="Tip"/>
<select <select
class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm" class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
id="contractTypeSelect" id="contractTypeSelect"
@ -88,11 +88,11 @@ const storeContract = () => {
</div> </div>
<div class="flex justify-end mt-4"> <div class="flex justify-end mt-4">
<ActionMessage :on="formContract.recentlySuccessful" class="me-3"> <ActionMessage :on="formContract.recentlySuccessful" class="me-3">
Saved. Shranjuje.
</ActionMessage> </ActionMessage>
<PrimaryButton :class="{ 'opacity-25': formContract.processing }" :disabled="formContract.processing"> <PrimaryButton :class="{ 'opacity-25': formContract.processing }" :disabled="formContract.processing">
Save Shrani
</PrimaryButton> </PrimaryButton>
</div> </div>
</form> </form>

View File

@ -12,8 +12,8 @@ const props = defineProps({
//Contract table //Contract table
let tableContractHeader = [ let tableContractHeader = [
C_TD.make('Ref.', 'header'), C_TD.make('Ref.', 'header'),
C_TD.make('Start date', 'header'), C_TD.make('Datum začetka', 'header'),
C_TD.make('Type', 'header') C_TD.make('Tip', 'header')
]; ];
const tableOptions = { const tableOptions = {
@ -34,7 +34,7 @@ const tableOptions = {
ref: 'contractRefUInput', ref: 'contractRefUInput',
bind: 'reference', bind: 'reference',
type: 'text', type: 'text',
label: 'Reference', label: 'Referenca',
autocomplete: 'contract-reference' autocomplete: 'contract-reference'
}, },
{ {
@ -42,7 +42,7 @@ const tableOptions = {
ref: 'contractTypeSelectU', ref: 'contractTypeSelectU',
bind: 'type_id', bind: 'type_id',
type: 'select', type: 'select',
label: 'Type', label: 'Tip',
selectOptions: props.contract_types.map(item => new Object({val: item.id, desc: item.name})) selectOptions: props.contract_types.map(item => new Object({val: item.id, desc: item.name}))
} }
] ]

View File

@ -21,14 +21,23 @@ const props = defineProps({
console.log(props.actions); console.log(props.actions);
//Client and case person info card const getMainAddress = (adresses) => {
const clientMainAddress = props.client.person.addresses.filter( a => a.type.id === 1 )[0] ?? ''; const addr = adresses.filter( a => a.type.id === 1 )[0] ?? '';
const personMainAddress = props.client_case.person.addresses.filter( a => a.type.id === 1 )[0] ?? ''; const country = addr.country !== '' ? ` - ${addr.country}` : '';
return addr.address !== '' ? addr.address + country : '';
}
const getMainPhone = (phones) => {
const pho = phones.filter( a => a.type.id === 1 )[0] ?? '';
const countryCode = pho.country_code !== null ? `+${pho.country_code} ` : '';
return pho.nu !== '' ? countryCode + pho.nu: '';
}
const clientInfo = new Object({ const clientInfo = new Object({
nu: props.client.person.nu, nu: props.client.person.nu,
full_name: props.client.person.full_name, full_name: props.client.person.full_name,
main_address: (clientMainAddress.country !== '') ? `${clientMainAddress.address} - ${clientMainAddress.country}` : clientMainAddress.address, main_address: getMainAddress(props.client.person.addresses),
main_phone: getMainPhone(props.client.person.phones),
tax_number: props.client.person.tax_number, tax_number: props.client.person.tax_number,
social_security_number: props.client.person.social_security_number, social_security_number: props.client.person.social_security_number,
description: props.client.person.description description: props.client.person.description
@ -37,7 +46,8 @@ const clientInfo = new Object({
const casePersonInfo = new Object({ const casePersonInfo = new Object({
nu: props.client_case.person.nu, nu: props.client_case.person.nu,
full_name: props.client_case.person.full_name, full_name: props.client_case.person.full_name,
main_address: (personMainAddress.country !== '') ? `${personMainAddress.address} - ${personMainAddress.country}` : personMainAddress.address, main_address: getMainAddress(props.client_case.person.addresses),
main_phone: getMainPhone(props.client_case.person.phones),
tax_number: props.client_case.person.tax_number, tax_number: props.client_case.person.tax_number,
social_security_number: props.client_case.person.social_security_number, social_security_number: props.client_case.person.social_security_number,
description: props.client_case.person.description description: props.client_case.person.description
@ -77,7 +87,7 @@ const closeDrawer = () => {
<SectionTitle> <SectionTitle>
<template #title> <template #title>
<FwbA class= "hover:text-blue-500" :href="route('client.show', client)"> <FwbA class= "hover:text-blue-500" :href="route('client.show', client)">
Client {{ clientInfo.full_name }}
</FwbA> </FwbA>
</template> </template>
@ -101,7 +111,7 @@ const closeDrawer = () => {
<div class="mx-auto max-w-4x1 p-3"> <div class="mx-auto max-w-4x1 p-3">
<SectionTitle> <SectionTitle>
<template #title> <template #title>
Case Primer - oseba
</template> </template>
</SectionTitle> </SectionTitle>
@ -125,10 +135,10 @@ const closeDrawer = () => {
<div class="flex justify-between p-3"> <div class="flex justify-between p-3">
<SectionTitle> <SectionTitle>
<template #title> <template #title>
Contracts Pogodbe
</template> </template>
</SectionTitle> </SectionTitle>
<FwbButton @click="openDrawerCreateContract">Add new</FwbButton> <FwbButton @click="openDrawerCreateContract">Nova</FwbButton>
</div> </div>
<ContractTable <ContractTable
:client_case="client_case" :client_case="client_case"
@ -146,10 +156,10 @@ const closeDrawer = () => {
<div class="flex justify-between p-3"> <div class="flex justify-between p-3">
<SectionTitle> <SectionTitle>
<template #title> <template #title>
Activities Aktivnosti
</template> </template>
</SectionTitle> </SectionTitle>
<FwbButton @click="openDrawerAddActivity">Add new</FwbButton> <FwbButton @click="openDrawerAddActivity">Nova</FwbButton>
</div> </div>
<ActivityTable <ActivityTable
:client_case="client_case" :client_case="client_case"

View File

@ -23,11 +23,21 @@ const Address = {
type_id: 1 type_id: 1
}; };
const Phone = {
nu: '',
country_code: '00386',
type_id: 1
}
const formClient = useForm({ const formClient = useForm({
first_name: '', first_name: '',
last_name: '', last_name: '',
full_name: '', full_name: '',
address: Address tax_number: '',
social_security_number: '',
description: '',
address: Address,
phone: Phone
}); });
//Create client drawer //Create client drawer
@ -72,7 +82,7 @@ const storeClient = () => {
<AppLayout title="Client"> <AppLayout title="Client">
<template #header> <template #header>
<h2 class="font-semibold text-xl text-gray-800 leading-tight"> <h2 class="font-semibold text-xl text-gray-800 leading-tight">
Clients Naročniki
</h2> </h2>
</template> </template>
<div class="py-12"> <div class="py-12">
@ -80,7 +90,7 @@ const storeClient = () => {
<div class="px-3 bg-white overflow-hidden shadow-xl sm:rounded-lg"> <div class="px-3 bg-white overflow-hidden shadow-xl sm:rounded-lg">
<div class="mx-auto max-w-4x1 py-3"> <div class="mx-auto max-w-4x1 py-3">
<div class="flex justify-between"> <div class="flex justify-between">
<PrimaryButton @click="openDrawerCreateClient" class="bg-blue-400">Add client</PrimaryButton> <PrimaryButton @click="openDrawerCreateClient" class="bg-blue-400">Dodaj</PrimaryButton>
<SearchInput :options="search" /> <SearchInput :options="search" />
</div> </div>
<List class="mt-2"> <List class="mt-2">
@ -95,7 +105,7 @@ const storeClient = () => {
<div class="hidden shrink-0 sm:flex sm:flex-col sm:items-end"> <div class="hidden shrink-0 sm:flex sm:flex-col sm:items-end">
<p class="text-sm leading-6 text-gray-900">{{ client.person.tax_number }}</p> <p class="text-sm leading-6 text-gray-900">{{ client.person.tax_number }}</p>
<div class="mt-1 flex items-center gap-x-1.5"> <div class="mt-1 flex items-center gap-x-1.5">
<p class="text-xs leading-5 text-gray-500">Client</p> <p class="text-xs leading-5 text-gray-500">Naročnik</p>
</div> </div>
</div> </div>
</div> </div>
@ -111,36 +121,13 @@ const storeClient = () => {
:show="drawerCreateClient" :show="drawerCreateClient"
@close="drawerCreateClient = false" @close="drawerCreateClient = false"
> >
<template #title>Add client</template> <template #title>Novi naročnik</template>
<template #content> <template #content>
<form @submit.prevent="storeClient"> <form @submit.prevent="storeClient">
<div> <div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="firstname" value="First name"/>
<TextInput
id="firstname"
ref="firstnameInput"
v-model="formClient.first_name"
type="text"
class="mt-1 block w-full"
autocomplete="first-name"
/>
</div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="lastname" value="Last name"/> <InputLabel for="fullname" value="Naziv"/>
<TextInput
id="lastname"
ref="lastnameInput"
v-model="formClient.last_name"
type="text"
class="mt-1 block w-full"
autocomplete="last-name"
/>
</div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="fullname" value="Full name"/>
<TextInput <TextInput
id="fullname" id="fullname"
ref="fullnameInput" ref="fullnameInput"
@ -152,7 +139,31 @@ const storeClient = () => {
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="address" value="Address"/> <InputLabel for="taxnumber" value="Davčna"/>
<TextInput
id="taxnumber"
ref="taxnumberInput"
v-model="formClient.tax_number"
type="text"
class="mt-1 block w-full"
autocomplete="tax-number"
/>
</div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="socialSecurityNumber" value="Matična / Emšo"/>
<TextInput
id="socialSecurityNumber"
ref="socialSecurityNumberInput"
v-model="formClient.social_security_number"
type="text"
class="mt-1 block w-full"
autocomplete="social-security-number"
/>
</div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="address" value="Naslov"/>
<TextInput <TextInput
id="address" id="address"
ref="addressInput" ref="addressInput"
@ -164,7 +175,7 @@ const storeClient = () => {
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="addressCountry" value="Country"/> <InputLabel for="addressCountry" value="Država"/>
<TextInput <TextInput
id="addressCountry" id="addressCountry"
ref="addressCountryInput" ref="addressCountryInput"
@ -176,25 +187,65 @@ const storeClient = () => {
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="addressType" value="Address type"/> <InputLabel for="addressType" value="Vrsta naslova"/>
<select <select
class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm" class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
id="addressType" id="addressType"
v-model="formClient.address.type_id" v-model="formClient.address.type_id"
> >
<option value="1">Permanent</option> <option value="1">Stalni</option>
<option value="2">Temporary</option> <option value="2">Začasni</option>
<!-- ... --> <!-- ... -->
</select> </select>
</div> </div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="phoneCountyCode" value="Koda države tel."/>
<select
class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
id="phoneCountyCode"
v-model="formClient.phone.country_code"
>
<option value="00386">+386 (Slovenija)</option>
<option value="00385">+385 (Hrvaška)</option>
<option value="0039">+39 (Italija)</option>
<option value="0036">+39 (Madžarska)</option>
<option value="0043">+43 (Avstrija)</option>
<option value="00381">+381 (Srbija)</option>
<option value="00387">+387 (Bosna in Hercegovina)</option>
<option value="00382">+382 (Črna gora)</option>
<!-- ... -->
</select>
</div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="phoneNu" value="Telefonska št."/>
<TextInput
id="phoneNu"
ref="phoneNuInput"
v-model="formClient.phone.nu"
type="text"
class="mt-1 block w-full"
autocomplete="phone-nu"
/>
</div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="description" value="Opis"/>
<TextInput
id="description"
ref="descriptionInput"
v-model="formClient.description"
type="text"
class="mt-1 block w-full"
autocomplete="description"
/>
</div>
</div> </div>
<div class="flex justify-end mt-4"> <div class="flex justify-end mt-4">
<ActionMessage :on="formClient.recentlySuccessful" class="me-3"> <ActionMessage :on="formClient.recentlySuccessful" class="me-3">
Saved. Shranjeno.
</ActionMessage> </ActionMessage>
<PrimaryButton :class="{ 'opacity-25': formClient.processing }" :disabled="formClient.processing"> <PrimaryButton :class="{ 'opacity-25': formClient.processing }" :disabled="formClient.processing">
Save Shrani
</PrimaryButton> </PrimaryButton>
</div> </div>
</form> </form>

View File

@ -29,11 +29,21 @@ const Address = {
type_id: 1 type_id: 1
} }
const Phone = {
nu: '',
country_code: '00386',
type_id: 1
}
const Person = { const Person = {
first_name: '', first_name: '',
last_name: '', last_name: '',
full_name: '', full_name: '',
address: Address tax_number: '',
social_security_number: '',
description: '',
address: Address,
phone: Phone
} }
const formCreateCase = useForm({ const formCreateCase = useForm({
@ -59,12 +69,22 @@ const closeDrawer = () => {
drawerCreateCase.value = false drawerCreateCase.value = false
} }
const mainAddress = props.client.person.addresses.filter( a => a.type.id === 1 )[0] ?? ''; const getMainAddress = (adresses) => {
const addr = adresses.filter( a => a.type.id === 1 )[0] ?? '';
const country = addr.country !== '' ? ` - ${addr.country}` : '';
return addr.address !== '' ? addr.address + country : '';
}
const getMainPhone = (phones) => {
const pho = phones.filter( a => a.type.id === 1 )[0] ?? '';
const countryCode = pho.country_code !== null ? `+${pho.country_code} ` : '';
return pho.nu !== '' ? countryCode + pho.nu: '';
}
const clientInfo = new Object({ const clientInfo = new Object({
nu: props.client.person.nu, nu: props.client.person.nu,
full_name: props.client.person.full_name, full_name: props.client.person.full_name,
main_address: (mainAddress.country !== '') ? `${mainAddress.address} - ${mainAddress.country}` : mainAddress.address, main_address: getMainAddress(props.client.person.addresses),
main_phone: getMainPhone(props.client.person.phones),
tax_number: props.client.person.tax_number, tax_number: props.client.person.tax_number,
social_security_number: props.client.person.social_security_number, social_security_number: props.client.person.social_security_number,
description: props.client.person.description description: props.client.person.description
@ -92,7 +112,7 @@ const storeCase = () => {
<div class="mx-auto max-w-4x1 p-3"> <div class="mx-auto max-w-4x1 p-3">
<SectionTitle> <SectionTitle>
<template #title> <template #title>
{{ client.person.full_name }} - client {{ client.person.full_name }}
</template> </template>
</SectionTitle> </SectionTitle>
@ -115,7 +135,7 @@ const storeCase = () => {
<div class="px-3 bg-white overflow-hidden shadow-xl sm:rounded-lg"> <div class="px-3 bg-white overflow-hidden shadow-xl sm:rounded-lg">
<div class="mx-auto max-w-4x1 py-3"> <div class="mx-auto max-w-4x1 py-3">
<div class="flex justify-between"> <div class="flex justify-between">
<PrimaryButton @click="openDrawerCreateCase" class="bg-blue-400">Add Case</PrimaryButton> <PrimaryButton @click="openDrawerCreateCase" class="bg-blue-400">Dodaj</PrimaryButton>
<SearchInput :options="search" /> <SearchInput :options="search" />
</div> </div>
<List class="mt-2"> <List class="mt-2">
@ -130,7 +150,7 @@ const storeCase = () => {
<div class="hidden shrink-0 sm:flex sm:flex-col sm:items-end"> <div class="hidden shrink-0 sm:flex sm:flex-col sm:items-end">
<p class="text-sm leading-6 text-gray-900">{{ clientCase.person.nu }}</p> <p class="text-sm leading-6 text-gray-900">{{ clientCase.person.nu }}</p>
<div class="mt-1 flex items-center gap-x-1.5"> <div class="mt-1 flex items-center gap-x-1.5">
<p class="text-xs leading-5 text-gray-500">Client case</p> <p class="text-xs leading-5 text-gray-500">Primer naročnika</p>
</div> </div>
</div> </div>
</div> </div>
@ -146,40 +166,17 @@ const storeCase = () => {
:show="drawerCreateCase" :show="drawerCreateCase"
@close="drawerCreateCase = false"> @close="drawerCreateCase = false">
<template #title>Add case</template> <template #title>Nova primer</template>
<template #content> <template #content>
<form @submit.prevent="storeCase"> <form @submit.prevent="storeCase">
<SectionTitle class="border-b mb-4"> <SectionTitle class="border-b mb-4">
<template #title> <template #title>
Person Oseba
</template> </template>
</SectionTitle> </SectionTitle>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="firstname" value="First name"/>
<TextInput
id="firstname"
ref="firstnameInput"
v-model="formCreateCase.person.first_name"
type="text"
class="mt-1 block w-full"
autocomplete="first-name"
/>
</div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="lastname" value="Last name"/> <InputLabel for="fullname" value="Naziv"/>
<TextInput
id="lastname"
ref="lastnameInput"
v-model="formCreateCase.person.last_name"
type="text"
class="mt-1 block w-full"
autocomplete="last-name"
/>
</div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="fullname" value="Full name"/>
<TextInput <TextInput
id="fullname" id="fullname"
ref="fullnameInput" ref="fullnameInput"
@ -191,7 +188,31 @@ const storeCase = () => {
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="address" value="Address"/> <InputLabel for="taxnumber" value="Davčna"/>
<TextInput
id="taxnumber"
ref="taxnumberInput"
v-model="formCreateCase.tax_number"
type="text"
class="mt-1 block w-full"
autocomplete="tax-number"
/>
</div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="socialSecurityNumber" value="Matična / Emšo"/>
<TextInput
id="socialSecurityNumber"
ref="socialSecurityNumberInput"
v-model="formCreateCase.social_security_number"
type="text"
class="mt-1 block w-full"
autocomplete="social-security-number"
/>
</div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="address" value="Naslov"/>
<TextInput <TextInput
id="address" id="address"
ref="addressInput" ref="addressInput"
@ -203,7 +224,7 @@ const storeCase = () => {
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="addressCountry" value="Country"/> <InputLabel for="addressCountry" value="Država"/>
<TextInput <TextInput
id="addressCountry" id="addressCountry"
ref="addressCountryInput" ref="addressCountryInput"
@ -215,24 +236,64 @@ const storeCase = () => {
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<InputLabel for="addressType" value="Address type"/> <InputLabel for="addressType" value="Vrsta naslova"/>
<select <select
class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm" class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
id="addressType" id="addressType"
v-model="formCreateCase.person.address.type_id" v-model="formCreateCase.person.address.type_id"
> >
<option value="1">Permanent</option> <option value="1">Stalni</option>
<option value="2">Temporary</option> <option value="2">Začasni</option>
<!-- ... --> <!-- ... -->
</select> </select>
</div> </div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="phoneCountyCode" value="Koda države tel."/>
<select
class="block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
id="phoneCountyCode"
v-model="formCreateCase.person.phone.country_code"
>
<option value="00386">+386 (Slovenija)</option>
<option value="00385">+385 (Hrvaška)</option>
<option value="0039">+39 (Italija)</option>
<option value="0036">+39 (Madžarska)</option>
<option value="0043">+43 (Avstrija)</option>
<option value="00381">+381 (Srbija)</option>
<option value="00387">+387 (Bosna in Hercegovina)</option>
<option value="00382">+382 (Črna gora)</option>
<!-- ... -->
</select>
</div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="phoneNu" value="Telefonska št."/>
<TextInput
id="phoneNu"
ref="phoneNuInput"
v-model="formCreateCase.person.phone.nu"
type="text"
class="mt-1 block w-full"
autocomplete="phone-nu"
/>
</div>
<div class="col-span-6 sm:col-span-4">
<InputLabel for="description" value="Opis"/>
<TextInput
id="description"
ref="descriptionInput"
v-model="formCreateCase.description"
type="text"
class="mt-1 block w-full"
autocomplete="description"
/>
</div>
<div class="flex justify-end mt-4"> <div class="flex justify-end mt-4">
<ActionMessage :on="formCreateCase.recentlySuccessful" class="me-3"> <ActionMessage :on="formCreateCase.recentlySuccessful" class="me-3">
Saved. Shranjeno.
</ActionMessage> </ActionMessage>
<PrimaryButton :class="{ 'opacity-25': formCreateCase.processing }" :disabled="formCreateCase.processing"> <PrimaryButton :class="{ 'opacity-25': formCreateCase.processing }" :disabled="formCreateCase.processing">
Save Shrani
</PrimaryButton> </PrimaryButton>
</div> </div>
</form> </form>

View File

@ -13,9 +13,9 @@ console.log(props.people)
const tablePersonHeader = [ const tablePersonHeader = [
C_TD.make('Nu.', 'header'), C_TD.make('Št.', 'header'),
C_TD.make('Name', 'header'), C_TD.make('Naziv', 'header'),
C_TD.make('Group', 'header') C_TD.make('Skupina', 'header')
]; ];
let tablePersonBody = []; let tablePersonBody = [];
@ -46,7 +46,7 @@ props.people.forEach((p) => {
<AppLayout title="Dashboard"> <AppLayout title="Dashboard">
<template #header> <template #header>
<h2 class="font-semibold text-xl text-gray-800 leading-tight"> <h2 class="font-semibold text-xl text-gray-800 leading-tight">
Dashboard Nadzorna plošča
</h2> </h2>
</template> </template>
<div class="pt-12 hidden md:block"> <div class="pt-12 hidden md:block">
@ -61,10 +61,10 @@ props.people.forEach((p) => {
<div class="bg-white overflow-hidden shadow-xl sm:rounded-lg"> <div class="bg-white overflow-hidden shadow-xl sm:rounded-lg">
<SectionTitle class="p-4"> <SectionTitle class="p-4">
<template #title> <template #title>
Terrain Teren
</template> </template>
<template #description> <template #description>
List of new contracts for terrain work Seznam primerov za terensko delo
</template> </template>
</SectionTitle> </SectionTitle>
<BasicTable :header="tablePersonHeader" :body="tablePersonBody"></BasicTable> <BasicTable :header="tablePersonHeader" :body="tablePersonBody"></BasicTable>
@ -72,10 +72,10 @@ props.people.forEach((p) => {
<div class="bg-white overflow-hidden shadow-xl sm:rounded-lg"> <div class="bg-white overflow-hidden shadow-xl sm:rounded-lg">
<SectionTitle class="p-4"> <SectionTitle class="p-4">
<template #title> <template #title>
Last added Na novo dodano
</template> </template>
<template #description> <template #description>
List of new people Seznam novih naročnikov (modra) / primerov (rdeča)
</template> </template>
</SectionTitle> </SectionTitle>
<BasicTable :header="tablePersonHeader" :body="tablePersonBody"></BasicTable> <BasicTable :header="tablePersonHeader" :body="tablePersonBody"></BasicTable>