Files
thetool/public/mobile/modules/lager/shippingnote/ShippingNoteModule.js
2026-01-17 12:48:08 +00:00

165 lines
6.0 KiB
JavaScript

import { createModuleApi } from '/mobile/shared/api.js';
import ShippingNoteForm from '/mobile/modules/lager/shippingnote/ShippingNoteForm.js';
import ShippingNoteList from '/mobile/modules/lager/shippingnote/ShippingNoteList.js';
import SignaturePad from '/mobile/modules/lager/shippingnote/SignaturePad.js';
const shippingNoteApi = createModuleApi('Lager/ShippingNote');
export { shippingNoteApi };
export default {
name: 'ShippingNoteModule',
emits: ['navigate', 'toast'],
props: {
user: Object,
submodule: String
},
components: {
ShippingNoteForm,
ShippingNoteList,
SignaturePad
},
setup(props, { emit }) {
const { ref, computed, watch, onMounted } = Vue;
// Current view: 'create' | 'list' | 'sign'
const currentTab = ref('create');
// Signature modal state
const showSignatureModal = ref(false);
const signatureShippingNoteId = ref(null);
const signatureShippingNote = ref(null);
// Last created shipping note (for immediate signing)
const lastCreatedId = ref(null);
// Open signature modal for a shipping note
const openSignature = (shippingNote) => {
signatureShippingNoteId.value = shippingNote.id;
signatureShippingNote.value = shippingNote;
showSignatureModal.value = true;
};
// Close signature modal
const closeSignature = () => {
showSignatureModal.value = false;
signatureShippingNoteId.value = null;
signatureShippingNote.value = null;
};
// Handle successful signature
const handleSignatureComplete = () => {
closeSignature();
emit('toast', 'Unterschrift gespeichert', 'success');
// Haptic feedback
navigator.vibrate?.([100, 50, 100]);
};
// Handle shipping note created
const handleCreated = (shippingNote) => {
lastCreatedId.value = shippingNote.id;
emit('toast', 'Lieferschein erstellt', 'success');
// Haptic feedback
navigator.vibrate?.([100]);
};
// Handle immediate sign after create
const handleCreateAndSign = (shippingNote) => {
handleCreated(shippingNote);
// Open signature modal immediately
openSignature(shippingNote);
};
// Show toast
const showToast = (message, type) => {
emit('toast', message, type);
};
// Switch tab
const switchTab = (tab) => {
currentTab.value = tab;
};
return {
currentTab,
showSignatureModal,
signatureShippingNoteId,
signatureShippingNote,
lastCreatedId,
openSignature,
closeSignature,
handleSignatureComplete,
handleCreated,
handleCreateAndSign,
showToast,
switchTab
};
},
template: `
<div class="flex flex-col h-full">
<!-- Tabs -->
<div class="flex bg-slate-100 dark:bg-slate-900 border-b border-slate-200 dark:border-slate-700 px-3 py-2">
<button
@click="switchTab('create')"
:class="[
'flex-1 py-2.5 text-sm font-medium rounded-lg transition flex items-center justify-center gap-2',
currentTab === 'create' ? 'bg-white dark:bg-slate-800 shadow-sm text-primary' : 'text-slate-500 dark:text-slate-400'
]"
>
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4" />
</svg>
Neu erstellen
</button>
<button
@click="switchTab('list')"
:class="[
'flex-1 py-2.5 text-sm font-medium rounded-lg transition flex items-center justify-center gap-2 ml-1',
currentTab === 'list' ? 'bg-white dark:bg-slate-800 shadow-sm text-primary' : 'text-slate-500 dark:text-slate-400'
]"
>
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
</svg>
Unterschreiben
</button>
</div>
<!-- Content -->
<main class="flex-1 overflow-y-auto bg-slate-50 dark:bg-slate-900">
<!-- Create Form -->
<ShippingNoteForm
v-if="currentTab === 'create'"
:user="user"
@created="handleCreated"
@createAndSign="handleCreateAndSign"
@toast="showToast"
/>
<!-- List of unsigned notes -->
<ShippingNoteList
v-else-if="currentTab === 'list'"
:user="user"
@sign="openSignature"
@toast="showToast"
/>
</main>
<!-- Signature Modal -->
<transition name="slide-up">
<div v-if="showSignatureModal" class="fixed inset-0 z-50 flex flex-col bg-white dark:bg-slate-900">
<SignaturePad
:shipping-note-id="signatureShippingNoteId"
:shipping-note="signatureShippingNote"
@close="closeSignature"
@signed="handleSignatureComplete"
@toast="showToast"
/>
</div>
</transition>
</div>
`
};