#134 - fixes
This commit is contained in:
parent
c74fc16acd
commit
7158e07920
@ -35,5 +35,6 @@ class AuthServiceProvider extends ServiceProvider
|
||||
Gate::define("manageVacationLimits", fn(User $user): bool => $user->role === Role::AdministrativeApprover);
|
||||
Gate::define("generateTimesheet", fn(User $user): bool => $user->role === Role::AdministrativeApprover);
|
||||
Gate::define("listMonthlyUsage", fn(User $user): bool => $user->role === Role::AdministrativeApprover);
|
||||
Gate::define("manageResumes", fn(User $user): bool => $user->role === Role::AdministrativeApprover);
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,8 @@ class ResumeController extends Controller
|
||||
{
|
||||
public function index(): Response
|
||||
{
|
||||
$this->authorize("manageResumes");
|
||||
|
||||
$resumes = Resume::query()
|
||||
->paginate();
|
||||
|
||||
@ -30,6 +32,8 @@ class ResumeController extends Controller
|
||||
|
||||
public function create(): Response
|
||||
{
|
||||
$this->authorize("manageResumes");
|
||||
|
||||
$users = User::query()
|
||||
->orderByProfileField("last_name")
|
||||
->orderByProfileField("first_name")
|
||||
@ -43,6 +47,8 @@ class ResumeController extends Controller
|
||||
|
||||
public function show(Resume $resume, ResumeGenerator $generator): BinaryFileResponseAlias
|
||||
{
|
||||
$this->authorize("manageResumes");
|
||||
|
||||
$path = $generator->generate($resume);
|
||||
|
||||
return response()
|
||||
@ -52,6 +58,8 @@ class ResumeController extends Controller
|
||||
|
||||
public function store(ResumeRequest $request): RedirectResponse
|
||||
{
|
||||
$this->authorize("manageResumes");
|
||||
|
||||
$resume = new Resume();
|
||||
|
||||
if ($request->hasEmployee()) {
|
||||
@ -76,6 +84,8 @@ class ResumeController extends Controller
|
||||
|
||||
public function edit(Resume $resume): Response
|
||||
{
|
||||
$this->authorize("manageResumes");
|
||||
|
||||
$users = User::query()
|
||||
->orderByProfileField("last_name")
|
||||
->orderByProfileField("first_name")
|
||||
@ -90,6 +100,8 @@ class ResumeController extends Controller
|
||||
|
||||
public function update(Resume $resume, ResumeRequest $request): RedirectResponse
|
||||
{
|
||||
$this->authorize("manageResumes");
|
||||
|
||||
if ($request->hasEmployee()) {
|
||||
$resume->user()->associate($request->getEmployee());
|
||||
} else {
|
||||
@ -113,6 +125,8 @@ class ResumeController extends Controller
|
||||
|
||||
public function destroy(Resume $resume): RedirectResponse
|
||||
{
|
||||
$this->authorize("manageResumes");
|
||||
|
||||
$resume->delete();
|
||||
|
||||
return redirect()
|
||||
|
@ -39,6 +39,7 @@ class HandleInertiaRequests extends Middleware
|
||||
"manageUsers" => $user ? $user->can("manageUsers") : false,
|
||||
"listAllVacationRequests" => $user ? $user->can("listAll", VacationRequest::class) : false,
|
||||
"listMonthlyUsage" => $user ? $user->can("listMonthlyUsage") : false,
|
||||
"manageResumes" => $user ? $user->can("manageResumes") : false,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ return [
|
||||
VacationTypeConfigRetriever::KEY_IS_VACATION => true,
|
||||
],
|
||||
VacationType::Absence->value => [
|
||||
VacationTypeConfigRetriever::KEY_TECHNICAL_APPROVAL => true,
|
||||
VacationTypeConfigRetriever::KEY_TECHNICAL_APPROVAL => false,
|
||||
VacationTypeConfigRetriever::KEY_ADMINISTRATIVE_APPROVAL => false,
|
||||
VacationTypeConfigRetriever::KEY_BILLABLE => false,
|
||||
VacationTypeConfigRetriever::KEY_HAS_LIMIT => false,
|
||||
|
@ -35,6 +35,7 @@ const technologyLevels = [
|
||||
textColor: 'text-blumilk-400',
|
||||
},
|
||||
]
|
||||
|
||||
const languageLevels = [
|
||||
{
|
||||
level: 1,
|
||||
@ -74,9 +75,9 @@ const languageLevels = [
|
||||
{
|
||||
level: 6,
|
||||
name: 'C2',
|
||||
activeColor: 'bg-gray-600',
|
||||
activeColor: 'bg-gray-700',
|
||||
backgroundColor: 'bg-gray-200',
|
||||
textColor: 'text-gray-600',
|
||||
textColor: 'text-gray-700',
|
||||
},
|
||||
]
|
||||
|
||||
|
@ -309,7 +309,7 @@
|
||||
<DynamicSection
|
||||
v-model="form.technologies"
|
||||
header="Technologie"
|
||||
add-label="Dodaj technologie"
|
||||
add-label="Dodaj technologię"
|
||||
@add-item="addTechnology"
|
||||
@remove-item="(index) => form.technologies.splice(index, 1)"
|
||||
>
|
||||
@ -545,7 +545,7 @@ const languages = [
|
||||
'German',
|
||||
]
|
||||
|
||||
const form = useForm({
|
||||
const form = useForm('createResume',{
|
||||
user: props.users.data[0],
|
||||
name: null,
|
||||
educations: [],
|
||||
@ -597,7 +597,7 @@ function hasAnyErrorInSection(section, index) {
|
||||
function submitResume() {
|
||||
form
|
||||
.transform((data) => ({
|
||||
user: data.user.id,
|
||||
user: data.user?.id,
|
||||
name: data.name,
|
||||
education: data.educations,
|
||||
languages: data.languages.map(language => ({
|
||||
|
@ -309,7 +309,7 @@
|
||||
<DynamicSection
|
||||
v-model="form.technologies"
|
||||
header="Technologie"
|
||||
add-label="Dodaj technologie"
|
||||
add-label="Dodaj technologię"
|
||||
@add-item="addTechnology"
|
||||
@remove-item="(index) => form.technologies.splice(index, 1)"
|
||||
>
|
||||
@ -444,10 +444,10 @@
|
||||
:class="{ 'border-red-300 text-red-900 focus:outline-none focus:ring-red-500 focus:border-red-500': form.errors[`educations.${index}.startDate`], 'focus:ring-blumilk-500 focus:border-blumilk-500 sm:text-sm border-gray-300': !form.errors[`educations.${index}.startDate`] }"
|
||||
/>
|
||||
<p
|
||||
v-if="form.errors[`educations.${index}.startDate`]"
|
||||
v-if="form.errors[`projects.${index}.startDate`]"
|
||||
class="mt-2 text-sm text-red-600"
|
||||
>
|
||||
{{ form.errors[`educations.${index}.startDate`] }}
|
||||
{{ form.errors[`projects.${index}.startDate`] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -467,10 +467,10 @@
|
||||
:class="{ 'border-red-300 text-red-900 focus:outline-none focus:ring-red-500 focus:border-red-500': form.errors[`educations.${index}.endDate`], 'focus:ring-blumilk-500 focus:border-blumilk-500 sm:text-sm border-gray-300': !form.errors[`educations.${index}.endDate`] }"
|
||||
/>
|
||||
<p
|
||||
v-if="form.errors[`educations.${index}.endDate`]"
|
||||
v-if="form.errors[`projects.${index}.endDate`]"
|
||||
class="mt-2 text-sm text-red-600"
|
||||
>
|
||||
{{ form.errors[`educations.${index}.endDate`] }}
|
||||
{{ form.errors[`projects.${index}.endDate`] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -546,7 +546,7 @@ const languages = [
|
||||
'German',
|
||||
]
|
||||
|
||||
const form = useForm({
|
||||
const form = useForm(`EditResume:${props.resume.id}`,{
|
||||
user: props.users.data.find((user) => user.id === props.resume.user) ?? null,
|
||||
name: props.resume.name ?? null ,
|
||||
educations: props.resume.education ?? [],
|
||||
@ -604,7 +604,7 @@ function hasAnyErrorInSection(section, index) {
|
||||
function submitResume() {
|
||||
form
|
||||
.transform((data) => ({
|
||||
user: data.user.id,
|
||||
user: data.user?.id,
|
||||
name: data.name,
|
||||
education: data.educations,
|
||||
languages: data.languages.map(language => ({
|
||||
|
@ -378,7 +378,7 @@ const navigation = computed(() =>
|
||||
href: '/resumes',
|
||||
section: 'Resumes',
|
||||
icon: TemplateIcon,
|
||||
can: true,
|
||||
can: props.auth.can.manageResumes,
|
||||
},
|
||||
|
||||
].filter(item => item.can))
|
||||
|
@ -73,5 +73,8 @@
|
||||
"Key no :number has been taken from :user.": "Klucz nr :number został zabrany użytkownikowi :user.",
|
||||
"Key no :number has been given to :user.": "Klucz nr :number został przekazany użytkownikowi :user.",
|
||||
":sender gives key no :key to :recipient": ":sender przekazuje klucz nr :key :recipient",
|
||||
":recipient takes key no :key from :sender": ":recipient zabiera klucz nr :key :sender"
|
||||
":recipient takes key no :key from :sender": ":recipient zabiera klucz nr :key :sender",
|
||||
"Resume has been updated.": "CV zostało zaktualizowane.",
|
||||
"Resume has been deleted.": "CV zostało usunięte.",
|
||||
"Resume has been created.": "CV zostało utworzone."
|
||||
}
|
||||
|
@ -114,6 +114,43 @@ return [
|
||||
"uploaded" => "Nie udało się wgrać pliku :attribute.",
|
||||
"url" => "Format pola :attribute jest nieprawidłowy.",
|
||||
"uuid" => "Pole :attribute musi być poprawnym identyfikatorem UUID.",
|
||||
"custom" => [
|
||||
"education.*.school" => [
|
||||
"required" => "Nazwa szkoły jest wymagana.",
|
||||
],
|
||||
"education.*.degree" => [
|
||||
"required" => "Stopień jest wymagany.",
|
||||
],
|
||||
"education.*.fieldOfStudy" => [
|
||||
"required" => "Kierunek jest wymagany.",
|
||||
],
|
||||
"education.*.startDate" => [
|
||||
"required" => "Data rozpoczęcia jest wymagana.",
|
||||
],
|
||||
"education.*.endDate" => [
|
||||
"required" => "Data zakończenia jest wymagana.",
|
||||
],
|
||||
"languages.*.name" => [
|
||||
"distinct" => "Języki nie mogą się powtarzać.",
|
||||
"required" => "Język jest wymagany.",
|
||||
],
|
||||
"technologies.*.name" => [
|
||||
"distinct" => "Technologie nie mogą się powtarzać.",
|
||||
"required" => "Technologia jest wymagana.",
|
||||
],
|
||||
"projects.*.description" => [
|
||||
"required" => "Opis projektu jest wymagany.",
|
||||
],
|
||||
"projects.*.startDate" => [
|
||||
"required" => "Data rozpoczęcia jest wymagana.",
|
||||
],
|
||||
"projects.*.endDate" => [
|
||||
"required" => "Data zakończenia jest wymagana.",
|
||||
],
|
||||
"projects.*.tasks" => [
|
||||
"required" => "Zadania w projekcie są wymagane.",
|
||||
],
|
||||
],
|
||||
"attributes" => [
|
||||
"to" => "do",
|
||||
"from" => "od",
|
||||
|
Loading…
x
Reference in New Issue
Block a user