mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-27 11:41:09 -04:00
195 lines
4.9 KiB
Vue
195 lines
4.9 KiB
Vue
<template>
|
|
<table class="text-center item-table min-w-full">
|
|
<colgroup>
|
|
<col style="width: 40%; min-width: 280px" />
|
|
<col style="width: 10%; min-width: 120px" />
|
|
<col style="width: 15%; min-width: 120px" />
|
|
<col
|
|
v-if="store[storeProp].discount_per_item === 'YES'"
|
|
style="width: 15%; min-width: 160px"
|
|
/>
|
|
<col style="width: 15%; min-width: 120px" />
|
|
</colgroup>
|
|
<thead class="bg-white border border-gray-200 border-solid">
|
|
<tr>
|
|
<th
|
|
class="
|
|
px-5
|
|
py-3
|
|
text-sm
|
|
not-italic
|
|
font-medium
|
|
leading-5
|
|
text-left text-gray-700
|
|
border-t border-b border-gray-200 border-solid
|
|
"
|
|
>
|
|
<BaseContentPlaceholders v-if="isLoading">
|
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
|
</BaseContentPlaceholders>
|
|
<span v-else class="pl-7">
|
|
{{ $tc('items.item', 2) }}
|
|
</span>
|
|
</th>
|
|
<th
|
|
class="
|
|
px-5
|
|
py-3
|
|
text-sm
|
|
not-italic
|
|
font-medium
|
|
leading-5
|
|
text-right text-gray-700
|
|
border-t border-b border-gray-200 border-solid
|
|
"
|
|
>
|
|
<BaseContentPlaceholders v-if="isLoading">
|
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
|
</BaseContentPlaceholders>
|
|
<span v-else>
|
|
{{ $t('invoices.item.quantity') }}
|
|
</span>
|
|
</th>
|
|
<th
|
|
class="
|
|
px-5
|
|
py-3
|
|
text-sm
|
|
not-italic
|
|
font-medium
|
|
leading-5
|
|
text-left text-gray-700
|
|
border-t border-b border-gray-200 border-solid
|
|
"
|
|
>
|
|
<BaseContentPlaceholders v-if="isLoading">
|
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
|
</BaseContentPlaceholders>
|
|
<span v-else>
|
|
{{ $t('invoices.item.price') }}
|
|
</span>
|
|
</th>
|
|
<th
|
|
v-if="store[storeProp].discount_per_item === 'YES'"
|
|
class="
|
|
px-5
|
|
py-3
|
|
text-sm
|
|
not-italic
|
|
font-medium
|
|
leading-5
|
|
text-left text-gray-700
|
|
border-t border-b border-gray-200 border-solid
|
|
"
|
|
>
|
|
<BaseContentPlaceholders v-if="isLoading">
|
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
|
</BaseContentPlaceholders>
|
|
<span v-else>
|
|
{{ $t('invoices.item.discount') }}
|
|
</span>
|
|
</th>
|
|
<th
|
|
class="
|
|
px-5
|
|
py-3
|
|
text-sm
|
|
not-italic
|
|
font-medium
|
|
leading-5
|
|
text-right text-gray-700
|
|
border-t border-b border-gray-200 border-solid
|
|
"
|
|
>
|
|
<BaseContentPlaceholders v-if="isLoading">
|
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
|
</BaseContentPlaceholders>
|
|
<span v-else class="pr-10 column-heading">
|
|
{{ $t('invoices.item.amount') }}
|
|
</span>
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
<draggable
|
|
v-model="store[storeProp].items"
|
|
item-key="id"
|
|
tag="tbody"
|
|
handle=".handle"
|
|
>
|
|
<template #item="{ element, index }">
|
|
<Item
|
|
:key="element.id"
|
|
:index="index"
|
|
:item-data="element"
|
|
:loading="isLoading"
|
|
:currency="defaultCurrency"
|
|
:item-validation-scope="itemValidationScope"
|
|
:invoice-items="store[storeProp].items"
|
|
:store="store"
|
|
:store-prop="storeProp"
|
|
/>
|
|
</template>
|
|
</draggable>
|
|
</table>
|
|
|
|
<div
|
|
class="
|
|
flex
|
|
items-center
|
|
justify-center
|
|
w-full
|
|
px-6
|
|
py-3
|
|
text-base
|
|
border border-t-0 border-gray-200 border-solid
|
|
cursor-pointer
|
|
text-primary-400
|
|
hover:bg-primary-100
|
|
"
|
|
@click="store.addItem"
|
|
>
|
|
<BaseIcon name="PlusCircleIcon" class="mr-2" />
|
|
{{ $t('general.add_new_item') }}
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
|
import { computed } from 'vue'
|
|
import draggable from 'vuedraggable'
|
|
import Item from './CreateItemRow.vue'
|
|
|
|
const props = defineProps({
|
|
store: {
|
|
type: Object,
|
|
default: null,
|
|
},
|
|
storeProp: {
|
|
type: String,
|
|
default: '',
|
|
},
|
|
currency: {
|
|
type: [Object, String, null],
|
|
required: true,
|
|
},
|
|
isLoading: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
itemValidationScope: {
|
|
type: String,
|
|
default: '',
|
|
},
|
|
})
|
|
|
|
const companyStore = useCompanyStore()
|
|
|
|
const defaultCurrency = computed(() => {
|
|
if (props.currency) {
|
|
return props.currency
|
|
} else {
|
|
return companyStore.selectedCompanyCurrency
|
|
}
|
|
})
|
|
</script>
|