Update WarehouseShippingNote.js
This commit is contained in:
@@ -306,25 +306,12 @@ Vue.component('warehouse-shipping-note-see-through', {
|
|||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="calendarEventType" style="margin-top: 10px; font-style: italic; color: #555;">
|
<div v-if="calendarEventType" style="margin-top: 10px; font-style: italic; color: #555;">
|
||||||
<i class="fas fa-calendar-alt" style="margin-right: 5px;"></i>
|
<i class="fas fa-calendar-alt" style="margin-right: 5px;"></i>
|
||||||
Erstellt aus Kalendereintrag: {{ calendarEventType }}
|
Erstellt aus Kalendereintrag: {{ calendarEventType }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="currentRow" style="margin-top: 10px; font-style: italic; color: #555;">
|
|
||||||
<div>
|
|
||||||
<i class="fas fa-clock" style="margin-right: 5px;"></i>
|
|
||||||
Erstellt am: {{ formatDate(currentRow.create) }}
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<i class="fas fa-user" style="margin-right: 5px;"></i>
|
|
||||||
Erstellt von:
|
|
||||||
<span v-if="creatorLoading"><i class="fa fa-spinner fa-spin"></i></span>
|
|
||||||
<span v-else>{{ creatorName || 'Unbekannt' }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div v-if="activeTab === 'Editieren'" style="flex: 1; overflow: auto;" class="see-through-test-modal">
|
<div v-if="activeTab === 'Editieren'" style="flex: 1; overflow: auto;" class="see-through-test-modal">
|
||||||
<warehouse-shipping-note-modal v-if="currentRow" :id="currentRow.id" @close="fetchData" ref="modal">
|
<warehouse-shipping-note-modal v-if="currentRow" :id="currentRow.id" @close="fetchData" ref="modal">
|
||||||
@@ -353,9 +340,7 @@ Vue.component('warehouse-shipping-note-see-through', {
|
|||||||
perPage: 1,
|
perPage: 1,
|
||||||
rows: [],
|
rows: [],
|
||||||
activeTab: 'Editieren',
|
activeTab: 'Editieren',
|
||||||
window: window,
|
window: window
|
||||||
creatorName: null,
|
|
||||||
creatorLoading: false,
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -378,35 +363,7 @@ Vue.component('warehouse-shipping-note-see-through', {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
|
||||||
currentRow(newVal) {
|
|
||||||
if (newVal && newVal.createBy) {
|
|
||||||
this.fetchCreatorInfo(newVal.createBy);
|
|
||||||
} else {
|
|
||||||
this.creatorName = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
formatDate(timestamp) {
|
|
||||||
return window.moment(timestamp * 1000).format('DD.MM.YYYY HH:mm');
|
|
||||||
},
|
|
||||||
async fetchCreatorInfo(userId) {
|
|
||||||
if (!userId) {
|
|
||||||
this.creatorName = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.creatorLoading = true;
|
|
||||||
try {
|
|
||||||
const response = await axios.get(`/User/getById?id=${userId}`);
|
|
||||||
this.creatorName = response.data?.name || 'Unbekannt';
|
|
||||||
} catch (error) {
|
|
||||||
console.error(`Failed to fetch user with ID ${userId}`, error);
|
|
||||||
this.creatorName = 'Fehler';
|
|
||||||
} finally {
|
|
||||||
this.creatorLoading = false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
tabStyle(tab) {
|
tabStyle(tab) {
|
||||||
return {
|
return {
|
||||||
padding: '10px 20px',
|
padding: '10px 20px',
|
||||||
@@ -464,9 +421,222 @@ Vue.component('warehouse-shipping-note-see-through', {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Vue.component('warehouse-shipping-note', {
|
||||||
|
//language=Vue
|
||||||
|
template: `
|
||||||
|
<tt-card>
|
||||||
|
<tt-fullscreen-viewer
|
||||||
|
v-if="viewerItem"
|
||||||
|
:item="viewerItem"
|
||||||
|
:url="viewerUrl"
|
||||||
|
@close="viewerItem = null; viewerUrl = null"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<warehouse-shipping-note-see-through
|
||||||
|
@close="shippingNoteSeeThrough = false;$refs.table.$refs.table.refreshTable()"
|
||||||
|
v-if="shippingNoteSeeThrough !== false"
|
||||||
|
:wanted-state="shippingNoteSeeThrough"
|
||||||
|
@status_to_progress="changeStatus($event.id, 'in_progress')"
|
||||||
|
@status_to_new="changeStatus($event.id, 'new')"
|
||||||
|
@status_to_on_hold="changeStatus($event.id, 'on_hold')"
|
||||||
|
@status_to_cancelled="changeStatus($event.id, 'cancelled')"
|
||||||
|
@status_to_invoiced="changeStatus($event.id, 'invoiced')"
|
||||||
|
@status_to_accepted="changeStatus($event.id, 'accepted')"/>
|
||||||
|
<warehouse-shipping-note-modal v-if="shippingNoteModalId" :id="shippingNoteModalId"
|
||||||
|
ref="modal"
|
||||||
|
@close="shippingNoteModalId = null;$refs.table.$refs.table.refreshTable()"
|
||||||
|
@open-article-modal="articleModalId = true;window.console.log($event)"
|
||||||
|
@open-signing-modal="signingShippingNoteId = $event"/>
|
||||||
|
|
||||||
|
<warehouse-article-modal
|
||||||
|
v-if="articleModalId"
|
||||||
|
:id="articleModalId"
|
||||||
|
@close="articleModalId = null"
|
||||||
|
@article-selected="$refs.modal.$refs.positionsManager.updateField('article', $event.id);"/>
|
||||||
|
|
||||||
|
<warehouse-history-modal :show.sync="historyModal" :id="historyModalId"/>
|
||||||
|
<warehouse-shipping-note-signature-pad v-if="signingShippingNoteId" :shipping-note-id="signingShippingNoteId"
|
||||||
|
@close="signingShippingNoteId = null;shippingNoteModalId = null;$refs.table.$refs.table.refreshTable()"/>
|
||||||
|
<add-log-modal-sn v-if="addLogModalId" :shipping-note-id="addLogModalId" @close="addLogModalId = null"/>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<button @click="shippingNoteModalId = 'create'" class="btn btn-primary">Lieferschein erstellen</button>
|
||||||
|
|
||||||
|
<div class="dropdown" style="display: inline-block; margin-left: 10px;">
|
||||||
|
<button class="btn btn-info dropdown-toggle" type="button" @click.stop="showCalendarDropdown = !showCalendarDropdown">
|
||||||
|
Aus Kalendereintrag erstellen
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu" :class="{'show': showCalendarDropdown}" style="cursor: pointer; max-height: 500px; overflow-y: auto;">
|
||||||
|
<a v-if="!calendarEvents.length" class="dropdown-item disabled">Lade Termine...</a>
|
||||||
|
<a v-for="event in calendarEvents" class="dropdown-item" @click="createFromEvent(event)">
|
||||||
|
<div style="white-space: normal;">
|
||||||
|
<strong>{{ event.category }}</strong><br>
|
||||||
|
<small>{{ event.location }}</small><br>
|
||||||
|
<small class="text-muted">{{ formatEventDate(event.date) }}</small>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dropdown" style="display: inline-block; margin-left: 10px;"
|
||||||
|
v-if="window.TT_CONFIG['WAREHOUSE_ADMIN'] === '1'">
|
||||||
|
<button class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown"
|
||||||
|
aria-haspopup="true" aria-expanded="false">
|
||||||
|
Durchschau-Modus
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton" style="cursor: pointer;">
|
||||||
|
<a class="dropdown-item" @click="shippingNoteSeeThrough = 'new'">Neue</a>
|
||||||
|
<a class="dropdown-item" @click="shippingNoteSeeThrough = 'in_progress'">In Bearbeitung</a>
|
||||||
|
<a class="dropdown-item" @click="shippingNoteSeeThrough = 'accepted'">Akzeptierte</a>
|
||||||
|
<a class="dropdown-item" @click="shippingNoteSeeThrough = 'on_hold'">On Hold</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<tt-table-crud emit-edit
|
||||||
|
@openHistory="historyModal = true; historyModalId = $event.id"
|
||||||
|
@print="showPrintPreview($event)"
|
||||||
|
@status_to_progress="changeStatus($event.id, 'in_progress')"
|
||||||
|
@status_to_accepted="changeStatus($event.id, 'accepted')"
|
||||||
|
@status_to_invoiced="changeStatus($event.id, 'invoiced')"
|
||||||
|
@status_to_on_hold="changeStatus($event.id, 'on_hold')"
|
||||||
|
@status_to_cancelled="changeStatus($event.id, 'cancelled')"
|
||||||
|
@status_to_new="changeStatus($event.id, 'new')"
|
||||||
|
@add_log="addLogModalId = $event.id"
|
||||||
|
@edit="shippingNoteModalId = $event.id"
|
||||||
|
ref="table">
|
||||||
|
|
||||||
|
<template v-slot:expandedRow="{ row }">
|
||||||
|
<warehouse-shipping-note-positions :positions="JSON.parse(row.positions)"
|
||||||
|
:hours-entries="JSON.parse(row.hoursEntries)"/>
|
||||||
|
<warehouse-shipping-note-logs :shipping-note-id="row.id"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</tt-table-crud>
|
||||||
|
</tt-card>
|
||||||
|
`,
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
window: window,
|
||||||
|
historyModal: false,
|
||||||
|
historyModalId: null,
|
||||||
|
shippingNoteModalId: null,
|
||||||
|
signingShippingNoteId: null,
|
||||||
|
addLogModalId: null,
|
||||||
|
viewerItem: null,
|
||||||
|
viewerUrl: null,
|
||||||
|
shippingNoteSeeThrough: false,
|
||||||
|
articleModalId: null,
|
||||||
|
calendarEvents: [],
|
||||||
|
showCalendarDropdown: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
if (window.location.search.includes('doAction=createNew')) {
|
||||||
|
this.shippingNoteModalId = 'create';
|
||||||
|
}
|
||||||
|
this.fetchCalendarEvents();
|
||||||
|
document.addEventListener('click', this.closeDropdown);
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
document.removeEventListener('click', this.closeDropdown);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async fetchCalendarEvents() {
|
||||||
|
try {
|
||||||
|
const response = await axios.get(window.TT_CONFIG.BASE_PATH + '/WarehouseShippingNote/getRecentCalendarEvents');
|
||||||
|
this.calendarEvents = response.data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Could not fetch calendar events", error);
|
||||||
|
window.notify('error', 'Kalendereinträge konnten nicht geladen werden.');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showPrintPreview(row) {
|
||||||
|
this.viewerUrl = `${window.TT_CONFIG['BASE_PATH']}/WarehouseShippingNote/createPDF?id=${row.id}`;
|
||||||
|
this.viewerItem = { mimetype: 'application/pdf' };
|
||||||
|
},
|
||||||
|
formatEventDate(dateString) {
|
||||||
|
return window.moment(dateString).format('DD.MM.YYYY HH:mm');
|
||||||
|
},
|
||||||
|
async createFromEvent(event) {
|
||||||
|
this.showCalendarDropdown = false;
|
||||||
|
this.shippingNoteModalId = 'create';
|
||||||
|
|
||||||
|
await this.$nextTick(); // Wait for the modal component to be created
|
||||||
|
|
||||||
|
if (this.$refs.modal) {
|
||||||
|
// Parse address string
|
||||||
|
const locationParts = event.location.split(',');
|
||||||
|
const line = locationParts[0].trim();
|
||||||
|
const plzCityRaw = locationParts[1].trim();
|
||||||
|
const plzMatch = plzCityRaw.match(/^(\d+)/);
|
||||||
|
const plz = plzMatch ? plzMatch[1] : '';
|
||||||
|
const city = plzCityRaw.replace(/^\d+\s*/, '').trim();
|
||||||
|
|
||||||
|
// Create metadata object
|
||||||
|
const eventTypeMap = {
|
||||||
|
'2': 'Xinon Inbetriebnahmen',
|
||||||
|
'3': 'ESTMK Inbetriebnahmen',
|
||||||
|
'7': 'Sbidi Inbetriebnahmen',
|
||||||
|
'4': 'SNOPP',
|
||||||
|
'5': 'Störungen',
|
||||||
|
'6': 'Support Gespräch'
|
||||||
|
};
|
||||||
|
const eventTypeText = eventTypeMap[event.event_type] || 'Unbekannter Termintyp';
|
||||||
|
|
||||||
|
const metadata = {
|
||||||
|
from_calendar: true,
|
||||||
|
event_type_id: event.event_type,
|
||||||
|
event_type_text: eventTypeText
|
||||||
|
};
|
||||||
|
|
||||||
|
// Check for default positions for SBIDI event type
|
||||||
|
let defaultPositions = [];
|
||||||
|
if (event.event_type === '7') {
|
||||||
|
defaultPositions = [
|
||||||
|
{"article": 56, "amount": "1", "isEnergieMaterial": 1},
|
||||||
|
{"article": 71, "amount": "1", "isEnergieMaterial": 1},
|
||||||
|
{"article": 134, "amount": "1", "isEnergieMaterial": 1},
|
||||||
|
{"article": 324, "isEnergieMaterial": 1, "amount": "1"},
|
||||||
|
{"article": 325, "amount": "1", "isEnergieMaterial": 1},
|
||||||
|
{"article": 539, "amount": "1", "isEnergieMaterial": 1},
|
||||||
|
{"article": 660, "amount": "1", "isEnergieMaterial": 1}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Directly set the data in the modal's `shippingNote` object
|
||||||
|
const modalData = this.$refs.modal.shippingNote;
|
||||||
|
this.$set(modalData, 'deliveryAddressName', event.category);
|
||||||
|
this.$set(modalData, 'deliveryAddressLine', line);
|
||||||
|
this.$set(modalData, 'deliveryAddressPLZ', plz);
|
||||||
|
this.$set(modalData, 'deliveryAddressCity', city);
|
||||||
|
this.$set(modalData, 'metadata', metadata); // Set metadata
|
||||||
|
|
||||||
|
if (defaultPositions.length > 0) {
|
||||||
|
this.$set(modalData, 'positions', defaultPositions); // Set default positions
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
closeDropdown(event) {
|
||||||
|
if (!event.target.closest('.dropdown')) {
|
||||||
|
this.showCalendarDropdown = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async changeStatus(id, status) {
|
||||||
|
const response = await axios.post(window.TT_CONFIG.BASE_PATH + '/WarehouseShippingNote/changeStatus', {
|
||||||
|
id,
|
||||||
|
status
|
||||||
|
});
|
||||||
|
if (response.data.success) {
|
||||||
|
this.window.notify('success', response.data.message || 'Erfolgreich aktualisiert');
|
||||||
|
this.$refs.table.$refs.table.refreshTable();
|
||||||
|
} else {
|
||||||
|
this.window.notify('error', response.data.message || 'Ein Fehler ist aufgetreten');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
let hiddenTime = null;
|
let hiddenTime = null;
|
||||||
const RELOAD_AFTER_SECONDS = 300;
|
const RELOAD_AFTER_SECONDS = 300;
|
||||||
|
|||||||
Reference in New Issue
Block a user