Director hiring added

This commit is contained in:
Torsten Schulz
2025-01-09 15:31:55 +01:00
parent 6f7d97672e
commit 2f60741116
30 changed files with 2368 additions and 751 deletions

View File

@@ -0,0 +1,162 @@
<template>
<DialogWidget ref="dialog" :title="$t('factset.newdirector.title')" :show-close="true" :buttons="buttons"
@close="closeDialog" name="FalukantNewDirector" :modal="true" :isTitleTranslated="true">
<div class="director-dialog">
<div class="proposal-list">
<ul>
<li v-for="proposal in proposals" :key="proposal.id" @click="selectProposal(proposal)"
:class="{ selected: selectedProposal && selectedProposal.id === proposal.id }">
{{ $t('falukant.titles.' + proposal.character.gender + '.' + proposal.character.title) }} {{ proposal.character.name }} ({{ proposal.character.age }} Jahre)
</li>
</ul>
</div>
<div class="proposal-details" v-if="selectedProposal">
<h3>{{ selectedProposal.character.name }}</h3>
<p><strong>{{ $t('falukant.newdirector.age') }}</strong> {{ selectedProposal.character.age }} Jahre</p>
<p><strong>{{ $t('falukant.newdirector.salary') }}</strong> {{ selectedProposal.proposedIncome }} $</p>
<h4>{{ $t('falukant.newdirector.skills') }}</h4>
<table>
<thead>
<tr>
<th>{{ $t('falukant.newdirector.product') }}</th>
<th>{{ $t('falukant.newdirector.knowledge') }}</th>
</tr>
</thead>
<tbody>
<tr v-for="knowledge in selectedProposal.character.knowledge" :key="knowledge.id">
<td>{{ $t('falukant.product.' + knowledge.labelTr) }}</td>
<td>{{ mapKnowledgeToText(knowledge.value) }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</DialogWidget>
</template>
<script>
import apiClient from '@/utils/axios.js';
import DialogWidget from '@/components/DialogWidget.vue';
import { mapKnowledgeToText } from '@/utils/knowledgeHelper.js';
export default {
name: 'FalukantNewDirector',
components: {
DialogWidget,
},
data() {
return {
dialog: null,
proposals: [],
selectedProposal: null,
products: [],
buttons: [
{ text: 'Einstellen', action: this.hireDirector },
{ text: 'Abbrechen', action: 'close' },
],
};
},
methods: {
async open(branchId) {
this.dialog.open();
await this.loadProposals(branchId);
},
closeDialog() {
this.dialog.close();
this.proposals = [];
this.selectedProposal = null;
},
async loadProposals(branchId) {
try {
const response = await apiClient.post('/api/falukant/director/proposal', { branchId });
this.proposals = response.data.map((proposal) => {
return {
...proposal,
knowledge: proposal.knowledge || [],
};
});
} catch (error) {
console.error('Error loading proposals:', error);
}
},
selectProposal(proposal) {
this.selectedProposal = proposal;
},
async hireDirector() {
if (!this.selectedProposal) return;
try {
await apiClient.post('/api/falukant/director/convertproposal', { proposalId: this.selectedProposal.id });
this.closeDialog();
this.$emit('directorHired');
} catch (error) {
console.error('Error hiring director:', error);
}
},
mapKnowledgeToText(value) {
return mapKnowledgeToText(value, this.$t);
},
},
mounted() {
this.dialog = this.$refs.dialog;
},
beforeUnmount() { },
};
</script>
<style scoped>
.director-dialog {
display: flex;
gap: 20px;
}
.proposal-list {
width: 40%;
border-right: 1px solid #ddd;
padding-right: 20px;
}
.proposal-list ul {
list-style: none;
padding: 0;
}
.proposal-list li {
padding: 10px;
cursor: pointer;
border: 1px solid transparent;
margin-bottom: 10px;
border-radius: 4px;
}
.proposal-list li:hover {
background-color: #f9f9f9;
}
.proposal-list li.selected {
border-color: #f9a22c;
background-color: #fdf1db;
}
.proposal-details {
width: 60%;
}
.proposal-details table {
width: 100%;
border-collapse: collapse;
}
.proposal-details table th,
.proposal-details table td {
padding: 10px;
border: 1px solid #ddd;
text-align: left;
}
</style>