mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-28 04:01:10 -04:00
Compare commits
42 Commits
dark-base-
...
dark-date-
| Author | SHA1 | Date | |
|---|---|---|---|
| 55da562a42 | |||
| 3b3da13218 | |||
| 5440b0f354 | |||
| 9249105ad6 | |||
| 238cdb3c25 | |||
| 55bf70c868 | |||
| 0c5adff9b4 | |||
| 3d5732ee26 | |||
| 5aa7decdbe | |||
| 5c67780870 | |||
| ba7f619c67 | |||
| 82efad71c0 | |||
| 826ef72faa | |||
| 2adaa7a84a | |||
| 13557ea075 | |||
| ce88c772d1 | |||
| a32d36363d | |||
| f874b3507d | |||
| c36d25931f | |||
| 1e6c3b287f | |||
| 0462ff60a0 | |||
| 29a135adaf | |||
| 1aceb2c672 | |||
| fb9fab641d | |||
| 8f2edc220b | |||
| d14ab013ad | |||
| f6639f5863 | |||
| c5acf1343e | |||
| 0321ca5515 | |||
| bd345949e5 | |||
| b4b00ebdd6 | |||
| 43316dae28 | |||
| 80e2548b38 | |||
| e8d92cd641 | |||
| 2c8bb38531 | |||
| 04c7ae39a2 | |||
| af2482a69c | |||
| cac35826c2 | |||
| 18b5705372 | |||
| c61fbad5ce | |||
| 2e93082282 | |||
| ca55221c4f |
@ -7,6 +7,7 @@
|
||||
py-2
|
||||
rounded-lg
|
||||
bg-opacity-40 bg-gray-300
|
||||
dark:bg-gray-700 dark:border-gray-600
|
||||
whitespace-nowrap
|
||||
flex-col
|
||||
mt-1
|
||||
@ -19,6 +20,7 @@
|
||||
text-sm
|
||||
font-medium
|
||||
text-black
|
||||
dark:text-white
|
||||
truncate
|
||||
select-all select-color
|
||||
"
|
||||
|
||||
@ -91,6 +91,7 @@
|
||||
leading-tight
|
||||
text-gray-700
|
||||
cursor-pointer
|
||||
dark:text-gray-400
|
||||
"
|
||||
>
|
||||
{{ note.name }}
|
||||
|
||||
@ -6,8 +6,17 @@
|
||||
|
||||
<script setup>
|
||||
import Chart from 'chart.js'
|
||||
import { ref, reactive, computed, onMounted, watchEffect, inject } from 'vue'
|
||||
import {
|
||||
ref,
|
||||
reactive,
|
||||
computed,
|
||||
onMounted,
|
||||
watchEffect,
|
||||
inject,
|
||||
watch,
|
||||
} from 'vue'
|
||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||
|
||||
const utils = inject('utils')
|
||||
|
||||
@ -44,9 +53,11 @@ const props = defineProps({
|
||||
},
|
||||
})
|
||||
|
||||
const isDarkModeOn = document.documentElement.classList.contains('dark')
|
||||
let myLineChart = null
|
||||
const graph = ref(null)
|
||||
const companyStore = useCompanyStore()
|
||||
const globalStore = useGlobalStore()
|
||||
const defaultCurrency = computed(() => {
|
||||
return companyStore.selectedCompanyCurrency
|
||||
})
|
||||
@ -60,6 +71,14 @@ watchEffect(() => {
|
||||
}
|
||||
})
|
||||
|
||||
watch(
|
||||
() => globalStore.isDarkModeOn,
|
||||
() => {
|
||||
myLineChart.reset()
|
||||
updateColors()
|
||||
}
|
||||
)
|
||||
|
||||
onMounted(() => {
|
||||
let context = graph.value.getContext('2d')
|
||||
let options = reactive({
|
||||
@ -81,6 +100,8 @@ onMounted(() => {
|
||||
},
|
||||
})
|
||||
|
||||
const salesColor = globalStore.isDarkModeOn ? '#ffffff' : '#040405'
|
||||
|
||||
let data = reactive({
|
||||
labels: props.labels,
|
||||
datasets: [
|
||||
@ -89,16 +110,16 @@ onMounted(() => {
|
||||
fill: false,
|
||||
lineTension: 0.3,
|
||||
backgroundColor: 'rgba(230, 254, 249)',
|
||||
borderColor: '#040405',
|
||||
borderColor: salesColor,
|
||||
borderCapStyle: 'butt',
|
||||
borderDash: [],
|
||||
borderDashOffset: 0.0,
|
||||
borderJoinStyle: 'miter',
|
||||
pointBorderColor: '#040405',
|
||||
pointBorderColor: salesColor,
|
||||
pointBackgroundColor: '#fff',
|
||||
pointBorderWidth: 1,
|
||||
pointHoverRadius: 5,
|
||||
pointHoverBackgroundColor: '#040405',
|
||||
pointHoverBackgroundColor: salesColor,
|
||||
pointHoverBorderColor: 'rgba(220,220,220,1)',
|
||||
pointHoverBorderWidth: 2,
|
||||
pointRadius: 4,
|
||||
@ -194,4 +215,12 @@ function update() {
|
||||
lazy: true,
|
||||
})
|
||||
}
|
||||
|
||||
function updateColors() {
|
||||
const newColor = globalStore.isDarkModeOn ? '#ffffff' : '#040405'
|
||||
|
||||
myLineChart.data.datasets[0].borderColor = newColor
|
||||
myLineChart.data.datasets[0].pointBorderColor = newColor
|
||||
myLineChart.data.datasets[0].pointHoverBackgroundColor = newColor
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -7,11 +7,12 @@
|
||||
<!-- edit customField -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.EDIT_CUSTOM_FIELDS)"
|
||||
v-slot="slotProps"
|
||||
@click="editCustomField(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
@ -19,11 +20,12 @@
|
||||
<!-- delete customField -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.DELETE_CUSTOM_FIELDS)"
|
||||
v-slot="slotProps"
|
||||
@click="removeCustomField(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -12,10 +12,10 @@
|
||||
v-if="userStore.hasAbilities(abilities.EDIT_CUSTOMER)"
|
||||
:to="`/admin/customers/${row.id}/edit`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
@ -29,10 +29,10 @@
|
||||
"
|
||||
:to="`customers/${row.id}/view`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="EyeIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.view') }}
|
||||
</BaseDropdownItem>
|
||||
@ -41,11 +41,12 @@
|
||||
<!-- Delete Customer -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.DELETE_CUSTOMER)"
|
||||
v-slot="slotProps"
|
||||
@click="removeCustomer(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -10,11 +10,12 @@
|
||||
<!-- Copy PDF url -->
|
||||
<BaseDropdownItem
|
||||
v-if="route.name === 'estimates.view'"
|
||||
v-slot="slotProps"
|
||||
@click="copyPdfUrl"
|
||||
>
|
||||
<BaseIcon
|
||||
name="LinkIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.copy_pdf_url') }}
|
||||
</BaseDropdownItem>
|
||||
@ -24,10 +25,10 @@
|
||||
v-if="userStore.hasAbilities(abilities.EDIT_ESTIMATE)"
|
||||
:to="`/admin/estimates/${row.id}/edit`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
@ -36,11 +37,12 @@
|
||||
<!-- Delete Estimate -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.DELETE_ESTIMATE)"
|
||||
v-slot="slotProps"
|
||||
@click="removeEstimate(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
@ -53,10 +55,10 @@
|
||||
"
|
||||
:to="`estimates/${row.id}/view`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="EyeIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.view') }}
|
||||
</BaseDropdownItem>
|
||||
@ -65,11 +67,12 @@
|
||||
<!-- Convert into Invoice -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
|
||||
v-slot="slotProps"
|
||||
@click="convertInToinvoice(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="DocumentTextIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('estimates.convert_to_invoice') }}
|
||||
</BaseDropdownItem>
|
||||
@ -81,11 +84,12 @@
|
||||
route.name !== 'estimates.view' &&
|
||||
userStore.hasAbilities(abilities.SEND_ESTIMATE)
|
||||
"
|
||||
v-slot="slotProps"
|
||||
@click="onMarkAsSent(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="CheckCircleIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('estimates.mark_as_sent') }}
|
||||
</BaseDropdownItem>
|
||||
@ -97,20 +101,21 @@
|
||||
route.name !== 'estimates.view' &&
|
||||
userStore.hasAbilities(abilities.SEND_ESTIMATE)
|
||||
"
|
||||
v-slot="slotProps"
|
||||
@click="sendEstimate(row)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="PaperAirplaneIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('estimates.send_estimate') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
<!-- Resend Estimate -->
|
||||
<BaseDropdownItem v-if="canResendEstimate(row)" @click="sendEstimate(row)">
|
||||
<BaseDropdownItem v-if="canResendEstimate(row)" v-slot="slotProps" @click="sendEstimate(row)">
|
||||
<BaseIcon
|
||||
name="PaperAirplaneIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('estimates.resend_estimate') }}
|
||||
</BaseDropdownItem>
|
||||
@ -121,11 +126,12 @@
|
||||
row.status !== 'ACCEPTED' &&
|
||||
userStore.hasAbilities(abilities.EDIT_ESTIMATE)
|
||||
"
|
||||
v-slot="slotProps"
|
||||
@click="onMarkAsAccepted(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="CheckCircleIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('estimates.mark_as_accepted') }}
|
||||
</BaseDropdownItem>
|
||||
@ -136,11 +142,12 @@
|
||||
row.status !== 'REJECTED' &&
|
||||
userStore.hasAbilities(abilities.EDIT_ESTIMATE)
|
||||
"
|
||||
v-slot="slotProps"
|
||||
@click="onMarkAsRejected(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="XCircleIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('estimates.mark_as_rejected') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -13,11 +13,12 @@
|
||||
<!-- edit expenseCategory -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.EDIT_EXPENSE)"
|
||||
v-slot="slotProps"
|
||||
@click="editExpenseCategory(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
@ -25,11 +26,12 @@
|
||||
<!-- delete expenseCategory -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.DELETE_EXPENSE)"
|
||||
v-slot="slotProps"
|
||||
@click="removeExpenseCategory(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -12,10 +12,10 @@
|
||||
v-if="userStore.hasAbilities(abilities.EDIT_EXPENSE)"
|
||||
:to="`/admin/expenses/${row.id}/edit`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
@ -24,11 +24,12 @@
|
||||
<!-- delete expense -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.DELETE_EXPENSE)"
|
||||
v-slot="slotProps"
|
||||
@click="removeExpense(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -12,20 +12,20 @@
|
||||
v-if="userStore.hasAbilities(abilities.EDIT_INVOICE)"
|
||||
:to="`/admin/invoices/${row.id}/edit`"
|
||||
>
|
||||
<BaseDropdownItem v-show="row.allow_edit">
|
||||
<BaseDropdownItem v-show="row.allow_edit" v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
</router-link>
|
||||
|
||||
<!-- Copy PDF url -->
|
||||
<BaseDropdownItem v-if="route.name === 'invoices.view'" @click="copyPdfUrl">
|
||||
<BaseDropdownItem v-if="route.name === 'invoices.view'" v-slot="slotProps" @click="copyPdfUrl">
|
||||
<BaseIcon
|
||||
name="LinkIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.copy_pdf_url') }}
|
||||
</BaseDropdownItem>
|
||||
@ -38,29 +38,29 @@
|
||||
"
|
||||
:to="`/admin/invoices/${row.id}/view`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="EyeIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.view') }}
|
||||
</BaseDropdownItem>
|
||||
</router-link>
|
||||
|
||||
<!-- Send Invoice Mail -->
|
||||
<BaseDropdownItem v-if="canSendInvoice(row)" @click="sendInvoice(row)">
|
||||
<BaseDropdownItem v-if="canSendInvoice(row)" v-slot="slotProps" @click="sendInvoice(row)">
|
||||
<BaseIcon
|
||||
name="PaperAirplaneIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('invoices.send_invoice') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
<!-- Resend Invoice -->
|
||||
<BaseDropdownItem v-if="canReSendInvoice(row)" @click="sendInvoice(row)">
|
||||
<BaseDropdownItem v-if="canReSendInvoice(row)" v-slot="slotProps" @click="sendInvoice(row)">
|
||||
<BaseIcon
|
||||
name="PaperAirplaneIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('invoices.resend_invoice') }}
|
||||
</BaseDropdownItem>
|
||||
@ -69,20 +69,21 @@
|
||||
<router-link :to="`/admin/payments/${row.id}/create`">
|
||||
<BaseDropdownItem
|
||||
v-if="row.status == 'SENT' && route.name !== 'invoices.view'"
|
||||
v-slot="slotProps"
|
||||
>
|
||||
<BaseIcon
|
||||
name="CreditCardIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('invoices.record_payment') }}
|
||||
</BaseDropdownItem>
|
||||
</router-link>
|
||||
|
||||
<!-- Mark as sent Invoice -->
|
||||
<BaseDropdownItem v-if="canSendInvoice(row)" @click="onMarkAsSent(row.id)">
|
||||
<BaseDropdownItem v-if="canSendInvoice(row)" v-slot="slotProps" @click="onMarkAsSent(row.id)">
|
||||
<BaseIcon
|
||||
name="CheckCircleIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('invoices.mark_as_sent') }}
|
||||
</BaseDropdownItem>
|
||||
@ -90,11 +91,12 @@
|
||||
<!-- Clone Invoice into new invoice -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
|
||||
v-slot="slotProps"
|
||||
@click="cloneInvoiceData(row)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="DocumentTextIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('invoices.clone_invoice') }}
|
||||
</BaseDropdownItem>
|
||||
@ -102,11 +104,12 @@
|
||||
<!-- Delete Invoice -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.DELETE_INVOICE)"
|
||||
v-slot="slotProps"
|
||||
@click="removeInvoice(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -12,11 +12,8 @@
|
||||
v-if="userStore.hasAbilities(abilities.EDIT_ITEM)"
|
||||
:to="`/admin/items/${row.id}/edit`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
/>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon name="PencilIcon" :class="slotProps.class" />
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
</router-link>
|
||||
@ -24,12 +21,10 @@
|
||||
<!-- delete item -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.DELETE_ITEM)"
|
||||
v-slot="slotProps"
|
||||
@click="removeItem(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
/>
|
||||
<BaseIcon name="TrashIcon" :class="slotProps.class" />
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
</BaseDropdown>
|
||||
|
||||
@ -10,11 +10,12 @@
|
||||
<!-- edit note -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.MANAGE_NOTE)"
|
||||
v-slot="slotProps"
|
||||
@click="editNote(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
@ -22,11 +23,12 @@
|
||||
<!-- delete note -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.MANAGE_NOTE)"
|
||||
v-slot="slotProps"
|
||||
@click="removeNote(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -8,30 +8,31 @@
|
||||
</template>
|
||||
|
||||
<!-- Copy pdf url -->
|
||||
<BaseDropdown-item
|
||||
<BaseDropdownItem
|
||||
v-if="
|
||||
route.name === 'payments.view' &&
|
||||
userStore.hasAbilities(abilities.VIEW_PAYMENT)
|
||||
"
|
||||
v-slot="slotProps"
|
||||
class="rounded-md"
|
||||
@click="copyPdfUrl"
|
||||
>
|
||||
<BaseIcon
|
||||
name="LinkIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.copy_pdf_url') }}
|
||||
</BaseDropdown-item>
|
||||
</BaseDropdownItem>
|
||||
|
||||
<!-- edit payment -->
|
||||
<router-link
|
||||
v-if="userStore.hasAbilities(abilities.EDIT_PAYMENT)"
|
||||
:to="`/admin/payments/${row.id}/edit`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
@ -45,10 +46,10 @@
|
||||
"
|
||||
:to="`/admin/payments/${row.id}/view`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="EyeIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.view') }}
|
||||
</BaseDropdownItem>
|
||||
@ -61,11 +62,12 @@
|
||||
route.name !== 'payments.view' &&
|
||||
userStore.hasAbilities(abilities.SEND_PAYMENT)
|
||||
"
|
||||
v-slot="slotProps"
|
||||
@click="sendPayment(row)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="PaperAirplaneIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('payments.send_payment') }}
|
||||
</BaseDropdownItem>
|
||||
@ -73,11 +75,12 @@
|
||||
<!-- delete payment -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.DELETE_PAYMENT)"
|
||||
v-slot="slotProps"
|
||||
@click="removePayment(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -8,19 +8,19 @@
|
||||
</template>
|
||||
|
||||
<!-- edit paymentMode -->
|
||||
<BaseDropdownItem @click="editPaymentMode(row.id)">
|
||||
<BaseDropdownItem v-slot="slotProps" @click="editPaymentMode(row.id)">
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
<!-- delete paymentMode -->
|
||||
<BaseDropdownItem @click="removePaymentMode(row.id)">
|
||||
<BaseDropdownItem v-slot="slotProps" @click="removePaymentMode(row.id)">
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -15,10 +15,10 @@
|
||||
v-if="userStore.hasAbilities(abilities.EDIT_RECURRING_INVOICE)"
|
||||
:to="`/admin/recurring-invoices/${row.id}/edit`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
@ -32,10 +32,10 @@
|
||||
"
|
||||
:to="`recurring-invoices/${row.id}/view`"
|
||||
>
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="EyeIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.view') }}
|
||||
</BaseDropdownItem>
|
||||
@ -44,11 +44,12 @@
|
||||
<!-- Delete Recurring Invoice -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.DELETE_RECURRING_INVOICE)"
|
||||
v-slot="slotProps"
|
||||
@click="removeMultipleRecurringInvoices(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -10,11 +10,12 @@
|
||||
<!-- edit role -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.currentUser.is_owner"
|
||||
v-slot="slotProps"
|
||||
@click="editRole(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
@ -22,11 +23,12 @@
|
||||
<!-- delete role -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.currentUser.is_owner"
|
||||
v-slot="slotProps"
|
||||
@click="removeRole(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -10,11 +10,12 @@
|
||||
<!-- edit tax-type -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.EDIT_TAX_TYPE)"
|
||||
v-slot="slotProps"
|
||||
@click="editTaxType(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
@ -22,11 +23,12 @@
|
||||
<!-- delete tax-type -->
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.DELETE_TAX_TYPE)"
|
||||
v-slot="slotProps"
|
||||
@click="removeTaxType(row.id)"
|
||||
>
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -9,20 +9,20 @@
|
||||
|
||||
<!-- edit user -->
|
||||
<router-link :to="`/admin/users/${row.id}/edit`">
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="PencilIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
</router-link>
|
||||
|
||||
<!-- delete user -->
|
||||
<BaseDropdownItem @click="removeUser(row.id)">
|
||||
<BaseDropdownItem v-slot="slotProps" @click="removeUser(row.id)">
|
||||
<BaseIcon
|
||||
name="TrashIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
/>
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
>
|
||||
<SelectNotePopup :type="type" @select="onSelectNote" />
|
||||
</div>
|
||||
<label class="text-gray-800 font-medium mb-4 text-sm">
|
||||
<label class="text-gray-800 font-medium mb-4 text-sm dark:text-gray-300">
|
||||
{{ $t('invoices.notes') }}
|
||||
</label>
|
||||
<BaseCustomInput
|
||||
|
||||
@ -29,7 +29,16 @@
|
||||
|
||||
<label
|
||||
v-else
|
||||
class="flex items-center justify-center m-0 text-lg text-black uppercase "
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
m-0
|
||||
text-lg
|
||||
text-black
|
||||
dark:text-white
|
||||
uppercase
|
||||
"
|
||||
>
|
||||
<BaseFormatMoney
|
||||
:amount="store.getSubTotal"
|
||||
@ -59,7 +68,16 @@
|
||||
|
||||
<label
|
||||
v-else-if="store[storeProp].tax_per_item === 'YES'"
|
||||
class="flex items-center justify-center m-0 text-lg text-black uppercase "
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
m-0
|
||||
text-lg
|
||||
text-black
|
||||
dark:text-white
|
||||
uppercase
|
||||
"
|
||||
>
|
||||
<BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" />
|
||||
</label>
|
||||
@ -166,7 +184,15 @@
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="flex items-center justify-between w-full pt-2 mt-5 border-t border-gray-200 border-solid "
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-between
|
||||
w-full
|
||||
pt-2
|
||||
mt-5
|
||||
border-t border-gray-200 border-solid
|
||||
"
|
||||
>
|
||||
<BaseContentPlaceholders v-if="isLoading">
|
||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||
|
||||
@ -1,9 +1,18 @@
|
||||
<template>
|
||||
<div class="flex items-center justify-between w-full mt-2 text-sm">
|
||||
<label class="font-semibold leading-5 text-gray-500 uppercase">
|
||||
<label class="font-semibold leading-5 text-gray-500 uppercase dark:text-gray-300">
|
||||
{{ tax.name }} ({{ tax.percent }} %)
|
||||
</label>
|
||||
<label class="flex items-center justify-center text-lg text-black">
|
||||
<label
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
text-lg
|
||||
text-black
|
||||
dark:text-white
|
||||
"
|
||||
>
|
||||
<BaseFormatMoney :amount="tax.amount" :currency="currency" />
|
||||
|
||||
<BaseIcon
|
||||
|
||||
@ -96,6 +96,7 @@
|
||||
leading-tight
|
||||
text-gray-700
|
||||
cursor-pointer
|
||||
dark:text-gray-300
|
||||
"
|
||||
>
|
||||
{{ taxType.name }}
|
||||
@ -108,6 +109,7 @@
|
||||
font-semibold
|
||||
text-gray-700
|
||||
cursor-pointer
|
||||
dark:text-gray-300
|
||||
"
|
||||
>
|
||||
{{ taxType.percent }} %
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<label class="flex text-gray-800 font-medium text-sm mb-2">
|
||||
<label class="flex text-gray-800 font-medium text-sm mb-2 dark:text-gray-300">
|
||||
{{ $t('general.select_template') }}
|
||||
<span class="text-sm text-red-500"> *</span>
|
||||
</label>
|
||||
|
||||
@ -122,7 +122,7 @@
|
||||
<BaseTab :title="$t('customers.portal_access')">
|
||||
<BaseInputGrid class="col-span-5 lg:col-span-4">
|
||||
<div class="md:col-span-2">
|
||||
<p class="text-sm text-gray-500">
|
||||
<p class="text-sm text-gray-500 dark:text-gray-300">
|
||||
{{ $t('customers.portal_access_text') }}
|
||||
</p>
|
||||
|
||||
|
||||
@ -24,6 +24,8 @@
|
||||
dark:border-white/10
|
||||
"
|
||||
>
|
||||
<BaseDarkHighlight />
|
||||
|
||||
<router-link
|
||||
to="/admin/dashboard"
|
||||
class="
|
||||
@ -72,7 +74,7 @@
|
||||
v-if="hasCreateAbilities"
|
||||
class="relative hidden float-left m-0 md:block"
|
||||
>
|
||||
<BaseDropdown width-class="w-48">
|
||||
<BaseDropdown width-class="w-48" >
|
||||
<template #activator>
|
||||
<div
|
||||
class="
|
||||
@ -86,19 +88,21 @@
|
||||
bg-white
|
||||
rounded
|
||||
md:h-9 md:w-9
|
||||
dark:bg-gray-700 dark:border-gray-500 dark:border
|
||||
"
|
||||
>
|
||||
<BaseIcon name="PlusIcon" class="w-5 h-5 text-gray-600" />
|
||||
<BaseIcon name="PlusIcon" class="w-5 h-5 text-gray-600 dark:text-white" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<router-link to="/admin/invoices/create">
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
|
||||
v-slot="slotProps"
|
||||
>
|
||||
<BaseIcon
|
||||
name="DocumentTextIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{{ $t('invoices.new_invoice') }}
|
||||
@ -107,10 +111,11 @@
|
||||
<router-link to="/admin/estimates/create">
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.CREATE_ESTIMATE)"
|
||||
v-slot="slotProps"
|
||||
>
|
||||
<BaseIcon
|
||||
name="DocumentIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{{ $t('estimates.new_estimate') }}
|
||||
@ -120,10 +125,11 @@
|
||||
<router-link to="/admin/customers/create">
|
||||
<BaseDropdownItem
|
||||
v-if="userStore.hasAbilities(abilities.CREATE_CUSTOMER)"
|
||||
v-slot="slotProps"
|
||||
>
|
||||
<BaseIcon
|
||||
name="UserIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{{ $t('customers.new_customer') }}
|
||||
@ -156,20 +162,20 @@
|
||||
</template>
|
||||
|
||||
<router-link to="/admin/settings/account-settings">
|
||||
<BaseDropdownItem>
|
||||
<BaseDropdownItem v-slot="slotProps">
|
||||
<BaseIcon
|
||||
name="CogIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{{ $t('navigation.settings') }}
|
||||
</BaseDropdownItem>
|
||||
</router-link>
|
||||
|
||||
<BaseDropdownItem @click="logout">
|
||||
<BaseDropdownItem v-slot="slotProps" @click="logout">
|
||||
<BaseIcon
|
||||
name="LogoutIcon"
|
||||
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||
:class="slotProps.class"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{{ $t('navigation.logout') }}
|
||||
|
||||
@ -171,7 +171,7 @@
|
||||
|
||||
<BaseInputGrid class="col-span-5 lg:col-span-4">
|
||||
<div class="md:col-span-2">
|
||||
<p class="text-sm text-gray-500">
|
||||
<p class="text-sm text-gray-500 dark:text-gray-300">
|
||||
{{ $t('customers.portal_access_text') }}
|
||||
</p>
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="pt-6 mt-5 border-t border-solid lg:pt-8 md:pt-4 border-gray-200">
|
||||
<div class="pt-6 mt-5 border-t border-solid lg:pt-8 md:pt-4 border-gray-200 dark:border-gray-600">
|
||||
<!-- Basic Info -->
|
||||
<BaseHeading>
|
||||
{{ $t('customers.basic_info') }}
|
||||
|
||||
@ -2,8 +2,23 @@
|
||||
<div>
|
||||
<div
|
||||
v-if="dashboardStore.isDashboardDataLoaded"
|
||||
class="grid grid-cols-10 mt-8 bg-white rounded shadow"
|
||||
class="
|
||||
grid
|
||||
grid-cols-10
|
||||
mt-8
|
||||
bg-white
|
||||
rounded shadow
|
||||
dark:text-white
|
||||
dark:backdrop-blur-xl
|
||||
dark:shadow-glass
|
||||
dark:border
|
||||
dark:bg-opacity-70
|
||||
dark:border-white/10
|
||||
dark:bg-gray-800
|
||||
relative
|
||||
"
|
||||
>
|
||||
<BaseDarkHighlight />
|
||||
<!-- Chart -->
|
||||
<div
|
||||
class="
|
||||
@ -54,6 +69,7 @@
|
||||
lg:border-t-0 lg:text-right lg:col-span-3
|
||||
xl:col-span-2
|
||||
lg:grid-cols-1
|
||||
dark:border-white/10
|
||||
"
|
||||
>
|
||||
<div class="p-6">
|
||||
@ -96,15 +112,7 @@
|
||||
</span>
|
||||
<br />
|
||||
<span
|
||||
class="
|
||||
block
|
||||
mt-1
|
||||
text-xl
|
||||
font-semibold
|
||||
leading-8
|
||||
lg:text-2xl
|
||||
text-red-400
|
||||
"
|
||||
class="block mt-1 text-xl font-semibold leading-8 lg:text-2xl text-red-400"
|
||||
>
|
||||
<BaseFormatMoney
|
||||
:amount="dashboardStore.totalExpenses"
|
||||
@ -116,8 +124,10 @@
|
||||
class="
|
||||
col-span-3
|
||||
p-6
|
||||
border-t border-gray-200 border-solid
|
||||
border-t
|
||||
border-gray-200 border-solid
|
||||
lg:col-span-1
|
||||
dark:border-white/10
|
||||
"
|
||||
>
|
||||
<span class="text-xs leading-5 lg:text-sm">
|
||||
@ -132,7 +142,7 @@
|
||||
font-semibold
|
||||
leading-8
|
||||
lg:text-2xl
|
||||
text-primary-500
|
||||
text-primary-500 dark:text-primary-400
|
||||
"
|
||||
>
|
||||
<BaseFormatMoney
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<BaseContentPlaceholders
|
||||
class="grid grid-cols-10 mt-8 bg-white rounded shadow"
|
||||
class="grid grid-cols-10 mt-8 bg-white rounded shadow dark:bg-gray-800"
|
||||
>
|
||||
<!-- Chart -->
|
||||
<div
|
||||
@ -29,6 +29,7 @@
|
||||
text-center
|
||||
border-t border-l border-gray-200 border-solid
|
||||
lg:border-t-0 lg:text-right lg:col-span-3
|
||||
dark:border-gray-600
|
||||
xl:col-span-2
|
||||
lg:grid-cols-1
|
||||
"
|
||||
@ -77,6 +78,7 @@
|
||||
col-span-3
|
||||
p-6
|
||||
border-t border-gray-200 border-solid
|
||||
dark:border-gray-600
|
||||
lg:justify-end lg:items-end lg:col-span-1
|
||||
"
|
||||
>
|
||||
|
||||
@ -12,18 +12,24 @@
|
||||
hover:bg-gray-50
|
||||
xl:p-4
|
||||
lg:col-span-2
|
||||
dark:backdrop-blur-xl
|
||||
dark:shadow-glass
|
||||
dark:border
|
||||
dark:border-white/10
|
||||
dark:bg-gray-800/70
|
||||
"
|
||||
:class="{ 'lg:!col-span-3': large }"
|
||||
:to="route"
|
||||
>
|
||||
<div>
|
||||
<span class="text-xl font-semibold leading-tight text-black xl:text-3xl">
|
||||
<span class="text-xl font-semibold leading-tight text-black xl:text-3xl dark:text-white">
|
||||
<slot />
|
||||
</span>
|
||||
<span class="block mt-1 text-sm leading-tight text-gray-500 xl:text-lg">
|
||||
<span class="block mt-1 text-sm leading-tight text-gray-500 xl:text-lg dark:text-gray-300">
|
||||
{{ label }}
|
||||
</span>
|
||||
</div>
|
||||
<BaseDarkHighlight class="!bg-highlight/[.17] !top-5" />
|
||||
<div class="flex items-center">
|
||||
<component :is="iconComponent" class="w-10 h-10 xl:w-12 xl:h-12" />
|
||||
</div>
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<BaseContentPlaceholders
|
||||
:rounded="true"
|
||||
class="relative flex justify-between w-full p-3 bg-white rounded shadow lg:col-span-3 xl:p-4"
|
||||
class="relative flex justify-between w-full p-3 bg-white rounded shadow lg:col-span-3 xl:p-4 dark:bg-gray-800"
|
||||
>
|
||||
<div>
|
||||
<BaseContentPlaceholdersText
|
||||
|
||||
@ -12,6 +12,7 @@
|
||||
shadow
|
||||
lg:col-span-2
|
||||
xl:p-4
|
||||
dark:bg-gray-800
|
||||
"
|
||||
>
|
||||
<div>
|
||||
|
||||
@ -130,6 +130,7 @@
|
||||
mt-5
|
||||
list-none
|
||||
border-b-2 border-gray-200 border-solid
|
||||
dark:border-gray-600
|
||||
"
|
||||
>
|
||||
<!-- Tabs -->
|
||||
|
||||
@ -127,6 +127,7 @@
|
||||
mt-5
|
||||
list-none
|
||||
border-b-2 border-gray-200 border-solid
|
||||
dark:border-gray-600
|
||||
"
|
||||
>
|
||||
<!-- Tabs -->
|
||||
|
||||
@ -53,7 +53,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="mt-24">
|
||||
<label class="flex items-center justify-center text-gray-500">
|
||||
<label class="flex items-center justify-center text-gray-500 dark:text-gray-300">
|
||||
{{ $t('modules.no_modules_installed') }}
|
||||
</label>
|
||||
</div>
|
||||
@ -61,10 +61,10 @@
|
||||
</div>
|
||||
|
||||
<BaseCard v-else class="mt-6">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<h6 class="text-gray-900 text-lg font-medium dark:text-white">
|
||||
{{ $t('modules.connect_installation') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
<p class="mt-1 text-sm text-gray-500 dark:text-gray-400">
|
||||
{{
|
||||
$t('modules.api_token_description', {
|
||||
url: globalStore.config.base_url.replace(/^http:\/\//, ''),
|
||||
|
||||
@ -215,7 +215,7 @@
|
||||
<SelectNotePopup type="Payment" @select="onSelectNote" />
|
||||
</div>
|
||||
|
||||
<label class="mb-4 text-sm font-medium text-gray-800">
|
||||
<label class="mb-4 text-sm font-medium text-gray-800 dark:text-gray-300">
|
||||
{{ $t('estimates.notes') }}
|
||||
</label>
|
||||
|
||||
|
||||
@ -121,6 +121,7 @@
|
||||
mt-5
|
||||
list-none
|
||||
border-b-2 border-gray-200 border-solid
|
||||
dark:border-gray-600
|
||||
"
|
||||
>
|
||||
<!-- Tabs -->
|
||||
|
||||
@ -16,11 +16,11 @@
|
||||
</div>
|
||||
|
||||
<div class="ml-2">
|
||||
<p class="p-0 mb-1 leading-snug text-left text-black">
|
||||
<p class="p-0 mb-1 leading-snug text-left text-black dark:text-white">
|
||||
{{ $t('recurring_invoices.send_automatically') }}
|
||||
</p>
|
||||
<p
|
||||
class="p-0 m-0 text-xs leading-tight text-left text-gray-500"
|
||||
class="p-0 m-0 text-xs leading-tight text-left text-gray-500 dark:text-gray-400"
|
||||
style="max-width: 480px"
|
||||
>
|
||||
{{ $t('recurring_invoices.send_automatically_desc') }}
|
||||
|
||||
@ -51,14 +51,14 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<BaseDropdownItem @click="onDownloadBckup(row.data)">
|
||||
<BaseIcon name="CloudDownloadIcon" class="mr-3 text-gray-600" />
|
||||
<BaseDropdownItem v-slot="slotProps" @click="onDownloadBckup(row.data)">
|
||||
<BaseIcon name="CloudDownloadIcon" :class="slotProps.class" />
|
||||
|
||||
{{ $t('general.download') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
<BaseDropdownItem @click="onRemoveBackup(row.data)">
|
||||
<BaseIcon name="TrashIcon" class="mr-3 text-gray-600" />
|
||||
<BaseDropdownItem v-slot="slotProps" @click="onRemoveBackup(row.data)">
|
||||
<BaseIcon name="TrashIcon" :class="slotProps.class" />
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
</BaseDropdown>
|
||||
|
||||
@ -113,10 +113,10 @@
|
||||
|
||||
<div v-if="companyStore.companies.length !== 1" class="py-5">
|
||||
<BaseDivider class="my-4" />
|
||||
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||
<h3 class="text-lg leading-6 font-medium text-gray-900 dark:text-white">
|
||||
{{ $tc('settings.company_info.delete_company') }}
|
||||
</h3>
|
||||
<div class="mt-2 max-w-xl text-sm text-gray-500">
|
||||
<div class="mt-2 max-w-xl text-sm text-gray-500 dark:text-gray-400">
|
||||
<p>
|
||||
{{ $tc('settings.company_info.delete_company_description') }}
|
||||
</p>
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
>
|
||||
<template #cell-name="{ row }">
|
||||
{{ row.data.name }}
|
||||
<span class="text-xs text-gray-500"> ({{ row.data.slug }})</span>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400"> ({{ row.data.slug }})</span>
|
||||
</template>
|
||||
|
||||
<template #cell-is_required="{ row }">
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
{{ $t('settings.menu_title.exchange_rate') }}
|
||||
</h6>
|
||||
<p
|
||||
class="mt-2 text-sm leading-snug text-left text-gray-500"
|
||||
class="mt-2 text-sm leading-snug text-left text-gray-500 dark:text-gray-400"
|
||||
style="max-width: 680px"
|
||||
>
|
||||
{{ $t('settings.exchange_rate.providers_description') }}
|
||||
|
||||
@ -45,27 +45,30 @@
|
||||
|
||||
<BaseDropdownItem
|
||||
v-if="!row.data.set_as_default"
|
||||
v-slot="slotProps"
|
||||
@click="setDefaultDiskData(row.data.id)"
|
||||
>
|
||||
<BaseIcon class="mr-3 tetx-gray-600" name="CheckCircleIcon" />
|
||||
<BaseIcon :class="slotProps.class" name="CheckCircleIcon" />
|
||||
|
||||
{{ $t('settings.disk.set_default_disk') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
<BaseDropdownItem
|
||||
v-if="row.data.type !== 'SYSTEM'"
|
||||
v-slot="slotProps"
|
||||
@click="openEditDiskModal(row.data)"
|
||||
>
|
||||
<BaseIcon name="PencilIcon" class="mr-3 text-gray-600" />
|
||||
<BaseIcon name="PencilIcon" :class="slotProps.class" />
|
||||
|
||||
{{ $t('general.edit') }}
|
||||
</BaseDropdownItem>
|
||||
|
||||
<BaseDropdownItem
|
||||
v-if="row.data.type !== 'SYSTEM' && !row.data.set_as_default"
|
||||
v-slot="slotProps"
|
||||
@click="removeDisk(row.data.id)"
|
||||
>
|
||||
<BaseIcon name="TrashIcon" class="mr-3 text-gray-600" />
|
||||
<BaseIcon name="TrashIcon" :class="slotProps.class" />
|
||||
{{ $t('general.delete') }}
|
||||
</BaseDropdownItem>
|
||||
</BaseDropdown>
|
||||
|
||||
@ -4,23 +4,14 @@
|
||||
:description="$t('settings.update_app.description')"
|
||||
>
|
||||
<div class="pb-8 ml-0">
|
||||
<label class="text-sm not-italic font-medium input-label">
|
||||
<label
|
||||
class="text-sm not-italic font-medium input-label dark:text-gray-300"
|
||||
>
|
||||
{{ $t('settings.update_app.current_version') }}
|
||||
</label>
|
||||
|
||||
<div
|
||||
class="
|
||||
box-border
|
||||
flex
|
||||
w-16
|
||||
p-3
|
||||
my-2
|
||||
text-sm text-gray-600
|
||||
bg-gray-200
|
||||
border border-gray-200 border-solid
|
||||
rounded-md
|
||||
version
|
||||
"
|
||||
class="box-border flex w-16 p-3 my-2 text-sm text-gray-600 bg-gray-200 border border-gray-200 border-solid dark:bg-gray-600 dark:text-gray-200 dark:border-gray-500 rounded-md version"
|
||||
>
|
||||
{{ currentVersion }}
|
||||
</div>
|
||||
@ -42,20 +33,20 @@
|
||||
{{ $t('settings.update_app.avail_update') }}
|
||||
</BaseHeading>
|
||||
|
||||
<div class="rounded-md bg-primary-50 p-4 mb-3">
|
||||
<div class="rounded-md bg-primary-50 p-4 mb-3 dark:bg-gray-600">
|
||||
<div class="flex">
|
||||
<div class="shrink-0">
|
||||
<BaseIcon
|
||||
name="InformationCircleIcon"
|
||||
class="h-5 w-5 text-primary-400"
|
||||
class="h-5 w-5 text-primary-400 dark:text-primary-300"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<h3 class="text-sm font-medium text-primary-800">
|
||||
<h3 class="text-sm font-medium text-primary-800 dark:text-primary-300">
|
||||
{{ $t('general.note') }}
|
||||
</h3>
|
||||
<div class="mt-2 text-sm text-primary-700">
|
||||
<div class="mt-2 text-sm text-primary-700 dark:text-primary-400">
|
||||
<p>
|
||||
{{ $t('settings.update_app.update_warning') }}
|
||||
</p>
|
||||
@ -75,26 +66,20 @@
|
||||
w-16
|
||||
p-3
|
||||
my-2
|
||||
text-sm text-gray-600
|
||||
bg-gray-200
|
||||
text-sm
|
||||
text-gray-600 bg-gray-200
|
||||
border border-gray-200 border-solid
|
||||
rounded-md
|
||||
version
|
||||
dark:bg-gray-600 dark:text-gray-200
|
||||
dark:border-gray-500
|
||||
"
|
||||
>
|
||||
{{ updateData.version }}
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="
|
||||
pl-5
|
||||
mt-4
|
||||
mb-8
|
||||
text-sm
|
||||
leading-snug
|
||||
text-gray-500
|
||||
update-description
|
||||
"
|
||||
class="pl-5 mt-4 mb-8 text-sm leading-snug text-gray-500 update-description"
|
||||
style="white-space: pre-wrap; max-width: 480px"
|
||||
v-html="description"
|
||||
></div>
|
||||
@ -150,14 +135,7 @@
|
||||
<li
|
||||
v-for="step in updateSteps"
|
||||
:key="step.stepUrl"
|
||||
class="
|
||||
flex
|
||||
justify-between
|
||||
w-full
|
||||
py-3
|
||||
border-b border-gray-200 border-solid
|
||||
last:border-b-0
|
||||
"
|
||||
class="flex justify-between w-full py-3 border-b border-gray-200 border-solid last:border-b-0"
|
||||
>
|
||||
<p class="m-0 text-sm leading-8">{{ $t(step.translationKey) }}</p>
|
||||
<div class="flex flex-row items-center">
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
<template>
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
{{ $t(`settings.customization.${type}s.${type}_number_format`) }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
{{
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t(`settings.customization.${type}s.${type}_number_format_description`)
|
||||
}}
|
||||
</p>
|
||||
"
|
||||
>
|
||||
{{ $t(`settings.customization.${type}s.${type}_number_format`) }}
|
||||
</BaseHeading>
|
||||
|
||||
<div class="overflow-x-auto">
|
||||
<table class="w-full mt-6 table-fixed">
|
||||
@ -29,6 +29,7 @@
|
||||
leading-5
|
||||
text-left text-gray-700
|
||||
border-t border-b border-gray-200 border-solid
|
||||
dark:border-gray-600
|
||||
"
|
||||
></th>
|
||||
<th
|
||||
@ -41,6 +42,7 @@
|
||||
leading-5
|
||||
text-left text-gray-700
|
||||
border-t border-b border-gray-200 border-solid
|
||||
dark:text-gray-300 dark:border-gray-600
|
||||
"
|
||||
>
|
||||
Component
|
||||
@ -55,6 +57,7 @@
|
||||
leading-5
|
||||
text-left text-gray-700
|
||||
border-t border-b border-gray-200 border-solid
|
||||
dark:text-gray-300 dark:border-gray-600
|
||||
"
|
||||
>
|
||||
Parameter
|
||||
@ -69,13 +72,14 @@
|
||||
leading-5
|
||||
text-left text-gray-700
|
||||
border-t border-b border-gray-200 border-solid
|
||||
dark:border-gray-600
|
||||
"
|
||||
></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<draggable
|
||||
v-model="selectedFields"
|
||||
class="divide-y divide-gray-200"
|
||||
class="divide-y divide-gray-200 dark:divide-gray-600"
|
||||
item-key="id"
|
||||
tag="tbody"
|
||||
handle=".handle"
|
||||
@ -97,12 +101,13 @@
|
||||
whitespace-nowrap
|
||||
mr-2
|
||||
min-w-[200px]
|
||||
dark:text-primary-400
|
||||
"
|
||||
>
|
||||
{{ element.label }}
|
||||
</label>
|
||||
|
||||
<p class="text-xs text-gray-500 mt-1">
|
||||
<p class="text-xs text-gray-500 dark:text-gray-400 mt-1">
|
||||
{{ element.description }}
|
||||
</p>
|
||||
</td>
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
<template>
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.estimates.convert_estimate_description')
|
||||
"
|
||||
>
|
||||
{{ $tc('settings.customization.estimates.convert_estimate_options') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
{{ $t('settings.customization.estimates.convert_estimate_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseInputGroup required>
|
||||
<BaseRadio
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.estimates.default_formats_description')
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.estimates.default_formats') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500 mb-2">
|
||||
{{ $t('settings.customization.estimates.default_formats_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseInputGroup
|
||||
:label="
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.estimates.expiry_date_description')
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.estimates.expiry_date') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500 mb-2">
|
||||
{{ $t('settings.customization.estimates.expiry_date_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseSwitchSection
|
||||
v-model="expiryDateAutoField"
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.invoices.default_formats_description')
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.invoices.default_formats') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500 mb-2">
|
||||
{{ $t('settings.customization.invoices.default_formats_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseInputGroup
|
||||
:label="$t('settings.customization.invoices.default_invoice_email_body')"
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
{{ $t('settings.customization.invoices.due_date') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500 mb-2">
|
||||
{{ $t('settings.customization.invoices.due_date_description') }}
|
||||
</p>
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.invoices.due_date_description')
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.invoices.due_date') }}
|
||||
</BaseHeading>
|
||||
|
||||
<BaseSwitchSection
|
||||
v-model="dueDateAutoField"
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
<template>
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.invoices.retrospective_edits_description')
|
||||
"
|
||||
>
|
||||
{{ $tc('settings.customization.invoices.retrospective_edits') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
{{ $t('settings.customization.invoices.retrospective_edits_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseInputGroup required>
|
||||
<BaseRadio
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.payments.default_formats_description')
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.payments.default_formats') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500 mb-2">
|
||||
{{ $t('settings.customization.payments.default_formats_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseInputGroup
|
||||
:label="$t('settings.customization.payments.default_payment_email_body')"
|
||||
|
||||
@ -1,21 +1,23 @@
|
||||
<template>
|
||||
<div ref="companySwitchBar" class="relative rounded">
|
||||
<div ref="companySwitchBar" class="relative rounded dark:text-white">
|
||||
<CompanyModal />
|
||||
|
||||
<div
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
px-3
|
||||
h-8
|
||||
md:h-9
|
||||
ml-2
|
||||
text-sm text-white
|
||||
bg-white
|
||||
rounded
|
||||
cursor-pointer
|
||||
bg-opacity-20
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
px-3
|
||||
h-8
|
||||
md:h-9
|
||||
ml-2
|
||||
text-sm
|
||||
text-white
|
||||
bg-white
|
||||
rounded
|
||||
cursor-pointer
|
||||
bg-opacity-20
|
||||
dark:bg-gray-700
|
||||
"
|
||||
@click="isShow = !isShow"
|
||||
>
|
||||
@ -38,28 +40,42 @@
|
||||
>
|
||||
<div
|
||||
v-if="isShow"
|
||||
class="absolute right-0 mt-2 bg-white rounded-md shadow-lg"
|
||||
class="
|
||||
absolute
|
||||
right-0
|
||||
mt-2
|
||||
bg-white
|
||||
rounded-md
|
||||
shadow-lg
|
||||
dark:border
|
||||
dark:border-white/10
|
||||
dark:text-white
|
||||
dark:bg-gray-800/[.95]
|
||||
dark:shadow-glass
|
||||
dark:backdrop-blur-xl
|
||||
"
|
||||
>
|
||||
<BaseDarkHighlight class="z-[-1] top-0 left-0" />
|
||||
<div
|
||||
class="
|
||||
overflow-y-auto
|
||||
scrollbar-thin scrollbar-thumb-rounded-full
|
||||
w-[250px]
|
||||
max-h-[350px]
|
||||
scrollbar-thumb-gray-300 scrollbar-track-gray-10
|
||||
pb-4
|
||||
overflow-y-auto
|
||||
scrollbar-thin
|
||||
scrollbar-thumb-rounded-full
|
||||
w-[250px] max-h-[350px]
|
||||
scrollbar-thumb-gray-300
|
||||
scrollbar-track-gray-10
|
||||
pb-4
|
||||
"
|
||||
>
|
||||
<label
|
||||
class="
|
||||
px-3
|
||||
py-2
|
||||
text-xs
|
||||
font-semibold
|
||||
text-gray-400
|
||||
mb-0.5
|
||||
block
|
||||
uppercase
|
||||
px-3
|
||||
py-2
|
||||
text-xs
|
||||
font-semibold
|
||||
text-gray-400
|
||||
mb-0.5
|
||||
block uppercase
|
||||
"
|
||||
>
|
||||
{{ $t('company_switcher.label') }}
|
||||
@ -68,13 +84,13 @@
|
||||
<div
|
||||
v-if="companyStore.companies.length < 1"
|
||||
class="
|
||||
flex flex-col
|
||||
items-center
|
||||
justify-center
|
||||
p-2
|
||||
px-3
|
||||
mt-4
|
||||
text-base text-gray-400
|
||||
flex flex-col
|
||||
items-center
|
||||
justify-center
|
||||
p-2
|
||||
px-3
|
||||
mt-4
|
||||
text-base text-gray-400
|
||||
"
|
||||
>
|
||||
<BaseIcon name="ExclamationCircleIcon" class="h-5 text-gray-400" />
|
||||
@ -86,14 +102,17 @@
|
||||
v-for="(company, index) in companyStore.companies"
|
||||
:key="index"
|
||||
class="
|
||||
p-2
|
||||
px-3
|
||||
rounded-md
|
||||
cursor-pointer
|
||||
hover:bg-gray-100 hover:text-primary-500
|
||||
p-2
|
||||
px-3
|
||||
rounded-md
|
||||
cursor-pointer
|
||||
hover:bg-gray-100 hover:text-primary-500
|
||||
dark:hover:bg-gray-700
|
||||
text-gray-900
|
||||
dark:text-white
|
||||
"
|
||||
:class="{
|
||||
'bg-gray-100 text-primary-500':
|
||||
'bg-gray-100 text-primary-500 dark:bg-gray-700':
|
||||
companyStore.selectedCompany.id === company.id,
|
||||
}"
|
||||
@click="changeCompany(company)"
|
||||
@ -101,18 +120,19 @@
|
||||
<div class="flex items-center">
|
||||
<span
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
mr-3
|
||||
overflow-hidden
|
||||
text-base
|
||||
font-semibold
|
||||
bg-gray-200
|
||||
rounded-md
|
||||
w-9
|
||||
h-9
|
||||
text-primary-500
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
mr-3
|
||||
overflow-hidden
|
||||
text-sm
|
||||
font-semibold
|
||||
bg-gray-200
|
||||
rounded-md
|
||||
w-9
|
||||
h-9
|
||||
text-primary-500
|
||||
dark:bg-gray-900
|
||||
"
|
||||
>
|
||||
<span v-if="!company.logo">
|
||||
@ -136,15 +156,17 @@
|
||||
<div
|
||||
v-if="userStore.currentUser.is_owner"
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
p-4
|
||||
pl-3
|
||||
border-t-2 border-gray-100
|
||||
cursor-pointer
|
||||
text-primary-400
|
||||
hover:text-primary-500
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
p-4
|
||||
pl-3
|
||||
border-t-2
|
||||
border-gray-100
|
||||
cursor-pointer
|
||||
text-primary-400
|
||||
hover:text-primary-500
|
||||
dark:border-gray-600
|
||||
"
|
||||
@click="addNewCompany"
|
||||
>
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div ref="searchBar" class="hidden rounded md:block relative">
|
||||
<div ref="searchBar" class="hidden rounded md:block relative dark:text-white">
|
||||
<div>
|
||||
<BaseInput
|
||||
v-model="name"
|
||||
@ -41,6 +41,11 @@
|
||||
w-[300px]
|
||||
h-[200px]
|
||||
right-0
|
||||
dark:border-white/10
|
||||
dark:text-white
|
||||
dark:bg-gray-800/[.95]
|
||||
dark:shadow-glass
|
||||
dark:backdrop-blur-xl
|
||||
"
|
||||
>
|
||||
<div
|
||||
@ -68,7 +73,7 @@
|
||||
<div
|
||||
v-for="(customer, index) in usersStore.customerList"
|
||||
:key="index"
|
||||
class="p-2 hover:bg-gray-100 cursor-pointer rounded-md"
|
||||
class="p-2 hover:bg-gray-100 cursor-pointer rounded-md dark:hover:bg-gray-700/40"
|
||||
>
|
||||
<router-link
|
||||
:to="{ path: `/admin/customers/${customer.id}/view` }"
|
||||
@ -87,6 +92,7 @@
|
||||
bg-gray-200
|
||||
rounded-full
|
||||
text-primary-500
|
||||
dark:bg-gray-600
|
||||
"
|
||||
>
|
||||
{{ initGenerator(customer.name) }}
|
||||
@ -116,7 +122,7 @@
|
||||
<div
|
||||
v-for="(user, index) in usersStore.userList"
|
||||
:key="index"
|
||||
class="p-2 hover:bg-gray-100 cursor-pointer rounded-md"
|
||||
class="p-2 hover:bg-gray-100 cursor-pointer rounded-md dark:hover:bg-gray-700/40"
|
||||
>
|
||||
<router-link
|
||||
:to="{ path: `/admin/users/${user.id}/edit` }"
|
||||
@ -135,6 +141,7 @@
|
||||
bg-gray-200
|
||||
rounded-full
|
||||
text-primary-500
|
||||
dark:bg-gray-600
|
||||
"
|
||||
>
|
||||
{{ initGenerator(user.name) }}
|
||||
|
||||
@ -1,33 +1,40 @@
|
||||
<template>
|
||||
<div class="bg-white shadow overflow-hidden rounded-lg mt-6">
|
||||
<div class="bg-white shadow overflow-hidden rounded-lg mt-6 dark:bg-gray-800">
|
||||
<div class="px-4 py-5 sm:px-6">
|
||||
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||
<h3 class="text-lg leading-6 font-medium text-gray-900 dark:text-gray-100">
|
||||
{{ $t('invoices.invoice_information') }}
|
||||
</h3>
|
||||
</div>
|
||||
<div v-if="invoice" class="border-t border-gray-200 px-4 py-5 sm:p-0">
|
||||
<dl class="sm:divide-y sm:divide-gray-200">
|
||||
<div v-if="invoice"
|
||||
class="
|
||||
border-t
|
||||
border-gray-200
|
||||
px-4 py-5 sm:p-0
|
||||
dark:border-gray-600
|
||||
"
|
||||
>
|
||||
<dl class="sm:divide-y sm:divide-gray-200 sm:dark:divide-gray-500">
|
||||
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
||||
<dt class="text-sm font-medium text-gray-500">
|
||||
<dt class="text-sm font-medium text-gray-500 dark:dark:text-gray-400">
|
||||
{{ $t('general.from') }}
|
||||
</dt>
|
||||
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
||||
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2 dark:text-gray-100">
|
||||
{{ invoice.company.name }}
|
||||
</dd>
|
||||
</div>
|
||||
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
||||
<dt class="text-sm font-medium text-gray-500">
|
||||
<dt class="text-sm font-medium text-gray-500 dark:dark:text-gray-400">
|
||||
{{ $t('general.to') }}
|
||||
</dt>
|
||||
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
||||
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2 dark:text-gray-100">
|
||||
{{ invoice.customer.name }}
|
||||
</dd>
|
||||
</div>
|
||||
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
||||
<dt class="text-sm font-medium text-gray-500 capitalize">
|
||||
<dt class="text-sm font-medium text-gray-500 capitalize dark:dark:text-gray-400">
|
||||
{{ $t('invoices.paid_status').toLowerCase() }}
|
||||
</dt>
|
||||
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
||||
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2 dark:text-gray-100">
|
||||
<BaseInvoiceStatusBadge
|
||||
:status="invoice.paid_status"
|
||||
class="px-3 py-1"
|
||||
@ -37,10 +44,10 @@
|
||||
</dd>
|
||||
</div>
|
||||
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
||||
<dt class="text-sm font-medium text-gray-500">
|
||||
<dt class="text-sm font-medium text-gray-500 dark:dark:text-gray-400">
|
||||
{{ $t('invoices.total') }}
|
||||
</dt>
|
||||
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
||||
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2 dark:text-gray-100">
|
||||
<BaseFormatMoney
|
||||
:currency="invoice.currency"
|
||||
:amount="invoice.total"
|
||||
|
||||
@ -437,21 +437,22 @@ export default {
|
||||
required: false,
|
||||
default: () => ({
|
||||
container:
|
||||
'p-0 relative mx-auto w-full flex items-center justify-end box-border cursor-pointer border border-gray-200 rounded-md bg-white text-sm leading-snug outline-none max-h-10',
|
||||
'p-0 relative mx-auto w-full flex items-center justify-end box-border cursor-pointer border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-sm leading-snug outline-none max-h-10',
|
||||
containerDisabled:
|
||||
'cursor-default bg-gray-200 bg-opacity-50 !text-gray-400',
|
||||
'bg-gray-200 !text-gray-800 dark:!text-gray-800 !dark:text-gray-500 !cursor-not-allowed dark:opacity-50',
|
||||
containerOpen: '',
|
||||
containerOpenTop: '',
|
||||
containerActive: 'ring-1 ring-primary-400 border-primary-400',
|
||||
containerInvalid:
|
||||
'border-red-400 ring-red-400 focus:ring-red-400 focus:border-red-400',
|
||||
containerInvalidActive: 'ring-1 border-red-400 ring-red-400',
|
||||
'border-red-500 ring-red-500 focus:ring-red-500 focus:border-red-500 dark:border-red-500 dark:ring-red-500 dark:focus:ring-red-500 dark:focus:border-red-500',
|
||||
containerInvalidActive:
|
||||
'ring-1 border-red-500 ring-red-500 dark:ring-1 dark:border-red-500 dark:ring-red-500',
|
||||
singleLabel:
|
||||
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5',
|
||||
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 dark:text-white',
|
||||
multipleLabel:
|
||||
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5',
|
||||
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 dark:text-white',
|
||||
search:
|
||||
'w-full absolute inset-0 outline-none appearance-none box-border border-0 text-sm font-sans bg-white rounded-md pl-3.5',
|
||||
'w-full absolute inset-0 outline-none appearance-none box-border border-0 text-sm font-sans bg-white rounded-md pl-3.5 border-transparent focus:border-transparent focus:ring-0 dark:bg-gray-700 dark:text-white',
|
||||
tags: 'grow shrink flex flex-wrap mt-1 pl-2',
|
||||
tag: 'bg-primary-500 text-white text-sm font-semibold py-0.5 pl-2 rounded mr-1 mb-1 flex items-center whitespace-nowrap',
|
||||
tagDisabled: 'pr-2 !bg-gray-400 text-white',
|
||||
@ -461,12 +462,12 @@ export default {
|
||||
'bg-multiselect-remove text-white bg-center bg-no-repeat opacity-30 inline-block w-3 h-3 group-hover:opacity-60',
|
||||
tagsSearchWrapper: 'inline-block relative mx-1 mb-1 grow shrink h-full',
|
||||
tagsSearch:
|
||||
'absolute inset-0 border-0 focus:outline-none !shadow-none !focus:shadow-none appearance-none p-0 text-sm font-sans box-border w-full',
|
||||
'absolute inset-0 border-0 focus:outline-none !shadow-none !focus:shadow-none appearance-none p-0 sm:text-sm font-sans box-border w-full dark:bg-gray-700',
|
||||
tagsSearchCopy: 'invisible whitespace-pre-wrap inline-block h-px',
|
||||
placeholder:
|
||||
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 text-gray-400 text-sm',
|
||||
'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 text-gray-400 sm:text-sm dark:text-gray-500',
|
||||
caret:
|
||||
'bg-multiselect-caret bg-center bg-no-repeat w-5 h-5 py-px box-content z-5 relative mr-1 opacity-40 shrink-0 grow-0 transition-transform',
|
||||
'bg-multiselect-caret-black dark:bg-multiselect-caret-white bg-center bg-no-repeat w-5 h-5 py-px box-content z-5 relative mr-1 opacity-40 shrink-0 grow-0 transition-transform dark:text-white',
|
||||
caretOpen: 'rotate-180 pointer-events-auto',
|
||||
clear:
|
||||
'pr-3.5 relative z-10 opacity-40 transition duration-300 shrink-0 grow-0 flex hover:opacity-80',
|
||||
@ -475,7 +476,7 @@ export default {
|
||||
spinner:
|
||||
'bg-multiselect-spinner bg-center bg-no-repeat w-4 h-4 z-10 mr-3.5 animate-spin shrink-0 grow-0',
|
||||
dropdown:
|
||||
'max-h-60 shadow-lg absolute -left-px -right-px -bottom-1 translate-y-full border border-gray-300 mt-1 overflow-y-auto z-50 bg-white flex flex-col rounded-md',
|
||||
'max-h-60 shadow-lg absolute -left-px -right-px -bottom-1 translate-y-full border border-gray-300 mt-1 overflow-y-auto z-50 bg-white dark:border-gray-600 flex flex-col rounded-md dark:bg-gray-800 dark:shadow-glass',
|
||||
dropdownTop:
|
||||
'-translate-y-full -top-2 bottom-auto flex-col-reverse rounded-md',
|
||||
dropdownHidden: 'hidden',
|
||||
@ -483,7 +484,7 @@ export default {
|
||||
optionsTop: 'flex-col-reverse',
|
||||
group: 'p-0 m-0',
|
||||
groupLabel:
|
||||
'flex text-sm box-border items-center justify-start text-left py-1 px-3 font-semibold bg-gray-200 cursor-default leading-normal',
|
||||
'flex text-sm box-border items-center justify-start text-left py-1 px-3 font-semibold bg-gray-200 dark:bg-gray-700 dark:text-gray-400 cursor-default leading-normal',
|
||||
groupLabelPointable: 'cursor-pointer',
|
||||
groupLabelPointed: 'bg-gray-300 text-gray-700',
|
||||
groupLabelSelected: 'bg-primary-600 text-white',
|
||||
@ -493,15 +494,18 @@ export default {
|
||||
'text-primary-100 bg-primary-600 bg-opacity-50 cursor-not-allowed',
|
||||
groupOptions: 'p-0 m-0',
|
||||
option:
|
||||
'flex items-center justify-start box-border text-left cursor-pointer text-sm leading-snug py-2 px-3',
|
||||
optionPointed: 'text-gray-800 bg-gray-100',
|
||||
'flex items-center justify-start box-border text-left cursor-pointer text-sm leading-snug py-2 px-3 dark:text-gray-200',
|
||||
optionPointed:
|
||||
'text-gray-800 bg-gray-100 dark:text-white dark:bg-gray-700/30',
|
||||
optionSelected: 'text-white bg-primary-500',
|
||||
optionDisabled: 'text-gray-300 cursor-not-allowed',
|
||||
optionDisabled: 'text-gray-300 cursor-not-allowed dark:text-gray-400',
|
||||
optionSelectedPointed: 'text-white bg-primary-500 opacity-90',
|
||||
optionSelectedDisabled:
|
||||
'text-primary-100 bg-primary-500 bg-opacity-50 cursor-not-allowed',
|
||||
noOptions: 'py-2 px-3 text-gray-600 bg-white',
|
||||
noResults: 'py-2 px-3 text-gray-600 bg-white',
|
||||
noOptions:
|
||||
'py-2 px-3 text-gray-600 bg-white dark:bg-gray-700 dark:text-gray-200',
|
||||
noResults:
|
||||
'py-2 px-3 text-gray-600 bg-white dark:bg-gray-700 dark:text-gray-200',
|
||||
fakeInput:
|
||||
'bg-transparent absolute left-0 right-0 -bottom-px w-full h-px border-0 p-0 appearance-none outline-none text-transparent',
|
||||
spacer: 'h-9 py-px box-content',
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<nav>
|
||||
<ol class="flex flex-wrap py-4 text-gray-900 rounded list-reset">
|
||||
<ol class="flex flex-wrap py-4 text-gray-900 rounded list-reset dark:text-gray-400">
|
||||
<slot />
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
@ -8,7 +8,9 @@
|
||||
font-medium
|
||||
leading-5
|
||||
text-gray-900
|
||||
dark:text-gray-400
|
||||
outline-none
|
||||
dark:focus:ring-offset-gray-900
|
||||
focus:ring-2 focus:ring-offset-2 focus:ring-primary-400
|
||||
"
|
||||
:to="to"
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
<script setup>
|
||||
import { computed, ref } from 'vue'
|
||||
import SpinnerIcon from '@/scripts/components/icons/SpinnerIcon.vue'
|
||||
|
||||
const props = defineProps({
|
||||
contentLoading: {
|
||||
type: Boolean,
|
||||
@ -9,7 +10,7 @@ const props = defineProps({
|
||||
defaultClass: {
|
||||
type: String,
|
||||
default:
|
||||
'inline-flex whitespace-nowrap items-center border font-medium focus:outline-none focus:ring-2 focus:ring-offset-2',
|
||||
'inline-flex whitespace-nowrap items-center border font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-800',
|
||||
},
|
||||
tag: {
|
||||
type: String,
|
||||
@ -27,6 +28,10 @@ const props = defineProps({
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
loadingRight: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
size: {
|
||||
type: String,
|
||||
default: 'md',
|
||||
@ -81,17 +86,17 @@ const placeHolderSize = computed(() => {
|
||||
|
||||
const variantClass = computed(() => {
|
||||
return {
|
||||
'border-transparent shadow-sm text-white bg-primary-600 hover:bg-primary-700 focus:ring-primary-500':
|
||||
'border-transparent shadow-sm text-white bg-primary-600 hover:bg-primary-700 focus:ring-primary-500 dark:bg-primary-500 dark:hover:bg-primary-600':
|
||||
props.variant === 'primary',
|
||||
'border-transparent text-primary-700 bg-primary-100 hover:bg-primary-200 focus:ring-primary-500':
|
||||
props.variant === 'secondary',
|
||||
'border-transparent border-solid border-primary-500 font-normal transition ease-in-out duration-150 text-primary-500 hover:bg-primary-200 shadow-inner focus:ring-primary-500':
|
||||
'border-transparent border-solid border-primary-500 font-normal transition ease-in-out duration-150 text-primary-500 hover:bg-primary-100 shadow-inner focus:ring-primary-500 dark:text-primary-400 dark:border-primary-400 dark:hover:bg-transparent dark:hover:text-primary-500 dark:hover:border-primary-500':
|
||||
props.variant == 'primary-outline',
|
||||
'border-gray-200 text-gray-700 bg-white hover:bg-gray-50 focus:ring-primary-500 focus:ring-offset-0':
|
||||
'border-gray-200 text-gray-700 bg-white hover:bg-gray-50 focus:ring-primary-500 focus:ring-offset-0 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-900':
|
||||
props.variant == 'white',
|
||||
'border-transparent shadow-sm text-white bg-red-600 hover:bg-red-700 focus:ring-red-500':
|
||||
props.variant === 'danger',
|
||||
'border-transparent bg-gray-200 border hover:bg-opacity-60 focus:ring-gray-500 focus:ring-offset-0':
|
||||
'border-transparent bg-gray-200 border hover:bg-opacity-60 focus:ring-gray-500 focus:ring-offset-0 dark:bg-gray-600 dark:text-white dark:hover:bg-opacity-60':
|
||||
props.variant === 'gray',
|
||||
}
|
||||
})
|
||||
@ -124,6 +129,13 @@ const iconRightClass = computed(() => {
|
||||
'ml-3 -mr-1 h-5 w-5': props.size === 'lg' || props.size === 'xl',
|
||||
}
|
||||
})
|
||||
|
||||
const buttonDisabledClass = computed(() => {
|
||||
if (props.disabled || props.loading)
|
||||
return 'cursor-not-allowed bg-opacity-70 dark:!bg-opacity-40 hover:!bg-opacity-70 pointer-event-none'
|
||||
|
||||
return ''
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@ -141,15 +153,17 @@ const iconRightClass = computed(() => {
|
||||
<BaseCustomTag
|
||||
v-else
|
||||
:tag="tag"
|
||||
:disabled="disabled"
|
||||
:class="[defaultClass, sizeClass, variantClass, roundedClass]"
|
||||
:disabled="disabled || loading"
|
||||
:class="[defaultClass, sizeClass, variantClass, roundedClass, buttonDisabledClass]"
|
||||
>
|
||||
<SpinnerIcon v-if="loading" :class="[iconLeftClass, iconVariantClass]" />
|
||||
<SpinnerIcon v-if="loading && !loadingRight" :class="[iconLeftClass, iconVariantClass]" />
|
||||
|
||||
<slot v-else name="left" :class="iconLeftClass"></slot>
|
||||
<slot v-else name="left" :class="iconLeftClass" />
|
||||
|
||||
<slot />
|
||||
|
||||
<slot name="right" :class="[iconRightClass, iconVariantClass]"></slot>
|
||||
<SpinnerIcon v-if="loading && loadingRight" :class="[iconRightClass, iconVariantClass]" />
|
||||
|
||||
<slot v-else name="right" :class="[iconRightClass, iconVariantClass]" />
|
||||
</BaseCustomTag>
|
||||
</template>
|
||||
|
||||
@ -1,5 +1,9 @@
|
||||
<template>
|
||||
<div class="bg-white rounded-lg shadow">
|
||||
<div
|
||||
class="bg-white rounded-lg shadow dark:bg-gray-800 dark:text-white dark:shadow-glass dark:border dark:border-white/10 dark:bg-gray-800/70 relative"
|
||||
>
|
||||
<BaseDarkHighlight class="z-[-1] mt-10" />
|
||||
|
||||
<div
|
||||
v-if="hasHeaderSlot"
|
||||
class="px-5 py-4 text-black border-b border-gray-100 border-solid"
|
||||
|
||||
@ -15,12 +15,12 @@
|
||||
v-if="label"
|
||||
:for="id"
|
||||
:class="`font-medium ${
|
||||
disabled ? 'text-gray-400 cursor-not-allowed' : 'text-gray-600'
|
||||
disabled ? 'text-gray-400 cursor-not-allowed' : 'text-gray-600 dark:text-white'
|
||||
} cursor-pointer `"
|
||||
>
|
||||
{{ label }}
|
||||
</label>
|
||||
<p v-if="description" class="text-gray-500">{{ description }}</p>
|
||||
<p v-if="description" class="text-gray-500 dark:text-gray-400">{{ description }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -51,7 +51,7 @@ const props = defineProps({
|
||||
},
|
||||
checkboxClass: {
|
||||
type: String,
|
||||
default: 'w-4 h-4 border-gray-300 rounded cursor-pointer',
|
||||
default: 'w-4 h-4 border-gray-300 rounded cursor-pointer dark:bg-gray-600 dark:border-gray-500',
|
||||
},
|
||||
setInitialValue: {
|
||||
type: Boolean,
|
||||
|
||||
@ -39,6 +39,8 @@ $base-content-placeholders-border-radius: 6px !default;
|
||||
$base-content-placeholders-line-height: 15px !default;
|
||||
$base-content-placeholders-spacing: 10px !default;
|
||||
|
||||
$base-content-placeholders-primary-color-dark: rgb(71, 85, 105) !default;
|
||||
$base-content-placeholders-secondary-color-dark: rgb(71, 85, 105) !default;
|
||||
// Animations
|
||||
@keyframes vueContentPlaceholdersAnimation {
|
||||
0% {
|
||||
@ -57,6 +59,10 @@ $base-content-placeholders-spacing: 10px !default;
|
||||
min-height: $base-content-placeholders-line-height;
|
||||
background: $base-content-placeholders-secondary-color;
|
||||
|
||||
.dark & {
|
||||
background: $base-content-placeholders-secondary-color-dark;
|
||||
}
|
||||
|
||||
.base-content-placeholders-is-rounded & {
|
||||
border-radius: $base-content-placeholders-border-radius;
|
||||
}
|
||||
@ -86,6 +92,15 @@ $base-content-placeholders-spacing: 10px !default;
|
||||
animation-name: vueContentPlaceholdersAnimation;
|
||||
animation-timing-function: linear;
|
||||
}
|
||||
|
||||
.dark .base-content-placeholders-is-animated &::before {
|
||||
background: linear-gradient(
|
||||
to right,
|
||||
transparent 0%,
|
||||
darken($base-content-placeholders-secondary-color-dark, 5%) 15%,
|
||||
transparent 30%
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@mixin base-content-placeholders-spacing {
|
||||
@ -156,6 +171,10 @@ $base-content-placeholders-spacing: 10px !default;
|
||||
min-height: $base-content-placeholders-line-height;
|
||||
background: $base-content-placeholders-secondary-color;
|
||||
|
||||
.dark & {
|
||||
background: $base-content-placeholders-secondary-color-dark;
|
||||
}
|
||||
|
||||
.base-content-placeholders-is-animated &::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
@ -177,6 +196,14 @@ $base-content-placeholders-spacing: 10px !default;
|
||||
animation-timing-function: linear;
|
||||
}
|
||||
|
||||
.dark .base-content-placeholders-is-animated &::before {
|
||||
background: linear-gradient(
|
||||
to right,
|
||||
transparent 0%,
|
||||
darken($base-content-placeholders-secondary-color-dark, 5%) 15%,
|
||||
transparent 30%
|
||||
);
|
||||
}
|
||||
// @include base-content-placeholders-spacing;
|
||||
}
|
||||
|
||||
|
||||
@ -40,6 +40,7 @@
|
||||
font-normal
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-700/60
|
||||
rounded
|
||||
ml-1
|
||||
py-0.5
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="address"
|
||||
class="text-sm font-bold leading-5 text-black non-italic space-y-1"
|
||||
class="text-sm font-bold leading-5 text-black non-italic space-y-1 dark:text-white"
|
||||
>
|
||||
<p v-if="address?.address_street_1">{{ address?.address_street_1 }},</p>
|
||||
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
border border-gray-200 border-solid
|
||||
min-h-[170px]
|
||||
rounded-md
|
||||
dark:border-white/10 dark:bg-gray-800/50
|
||||
"
|
||||
@click.stop
|
||||
>
|
||||
@ -27,7 +28,7 @@
|
||||
<BaseText
|
||||
:text="selectedCustomer.name"
|
||||
:length="30"
|
||||
class="flex-1 text-base font-medium text-left text-gray-900"
|
||||
class="flex-1 text-base font-medium text-left text-gray-900 dark:text-white"
|
||||
/>
|
||||
<div class="flex">
|
||||
<a
|
||||
@ -192,6 +193,7 @@
|
||||
border border-gray-200 border-solid
|
||||
rounded-md
|
||||
min-h-[170px]
|
||||
dark:border-white/10 dark:bg-gray-700/60 dark:text-white
|
||||
"
|
||||
>
|
||||
<BaseIcon
|
||||
@ -207,11 +209,12 @@
|
||||
bg-gray-200
|
||||
rounded-full
|
||||
font-base
|
||||
dark:bg-gray-700
|
||||
"
|
||||
/>
|
||||
|
||||
<div class="mt-1">
|
||||
<label class="text-lg font-medium text-gray-900">
|
||||
<label class="text-lg font-medium text-gray-900 dark:text-white">
|
||||
{{ $t('customers.new_customer') }}
|
||||
<span class="text-red-500"> * </span>
|
||||
</label>
|
||||
@ -246,6 +249,11 @@
|
||||
shadow-lg
|
||||
ring-1 ring-black ring-opacity-5
|
||||
bg-white
|
||||
dark:border
|
||||
dark:border-white/10
|
||||
dark:bg-gray-800
|
||||
dark:text-white
|
||||
dark:shadow-glass
|
||||
"
|
||||
>
|
||||
<div class="relative">
|
||||
@ -265,6 +273,7 @@
|
||||
overflow-auto
|
||||
list
|
||||
border-t border-gray-200
|
||||
dark:border-white/10
|
||||
"
|
||||
>
|
||||
<li
|
||||
@ -280,6 +289,7 @@
|
||||
hover:cursor-pointer hover:bg-gray-100
|
||||
focus:outline-none focus:bg-gray-100
|
||||
last:border-b-0
|
||||
dark:border-white/10 dark:hover:bg-gray-700/30
|
||||
"
|
||||
@click="selectNewCustomer(customer.id, close)"
|
||||
>
|
||||
@ -299,6 +309,7 @@
|
||||
bg-gray-300
|
||||
rounded-full
|
||||
avatar
|
||||
dark:bg-gray-600
|
||||
"
|
||||
>
|
||||
{{ initGenerator(customer.name) }}
|
||||
@ -333,9 +344,9 @@
|
||||
</li>
|
||||
<div
|
||||
v-if="customerStore.customers.length === 0"
|
||||
class="flex justify-center p-5 text-gray-400"
|
||||
class="flex justify-center p-5 text-gray-400 dark:text-gray-300"
|
||||
>
|
||||
<label class="text-base text-gray-500 cursor-pointer">
|
||||
<label class="text-base text-gray-500 cursor-pointer dark:text-gray-300">
|
||||
{{ $t('customers.no_customers_found') }}
|
||||
</label>
|
||||
</div>
|
||||
@ -357,6 +368,10 @@
|
||||
border-none
|
||||
outline-none
|
||||
focus:bg-gray-300
|
||||
dark:bg-gray-600/70
|
||||
dark:shadow-glass
|
||||
dark:backdrop-blur-xl
|
||||
dark:hover:bg-gray-600/80
|
||||
"
|
||||
@click="openCustomerModal"
|
||||
>
|
||||
|
||||
21
resources/scripts/components/base/BaseDarkHighlight.vue
Normal file
21
resources/scripts/components/base/BaseDarkHighlight.vue
Normal file
@ -0,0 +1,21 @@
|
||||
<template>
|
||||
<div
|
||||
class="
|
||||
hidden
|
||||
top-0
|
||||
w-full
|
||||
absolute
|
||||
ml-auto
|
||||
mr-auto
|
||||
left-0
|
||||
right-0
|
||||
text-center
|
||||
h-full
|
||||
rounded-full
|
||||
bg-highlight/[.10]
|
||||
blur-2xl
|
||||
dark:block
|
||||
z-[-1]
|
||||
"
|
||||
/>
|
||||
</template>
|
||||
@ -28,6 +28,7 @@
|
||||
:attributes="attrs"
|
||||
:model-config="config"
|
||||
:masks="masks"
|
||||
:is-dark="isDarkModeOn"
|
||||
:locale="global.locale"
|
||||
>
|
||||
<template
|
||||
@ -72,7 +73,7 @@
|
||||
|
||||
<template v-if="showExtraOptions" #footer>
|
||||
<div
|
||||
class="bg-gray-100 grid grid-cols-3 gap-2 p-2 border-t rounded-b-lg"
|
||||
class="bg-gray-100 dark:bg-gray-800 grid grid-cols-3 gap-2 p-2 border-t dark:border-gray-500 rounded-b-lg"
|
||||
>
|
||||
<button type="button" class="extra-button" @click="moveToDate(sourceDate)">
|
||||
{{ global.t('date_picker.same_day') }}
|
||||
@ -146,7 +147,7 @@ const props = defineProps({
|
||||
defaultInputClass: {
|
||||
type: String,
|
||||
default:
|
||||
'border-2 font-base pl-8 py-2 outline-none focus:ring-primary-400 focus:outline-none focus:border-primary-400 block w-full sm:text-sm border-gray-200 rounded-md text-black',
|
||||
'border-2 dark:bg-gray-700 dark:border-gray-600 dark:text-white font-base pl-8 py-2 outline-none focus:ring-primary-400 focus:outline-none focus:border-primary-400 block w-full sm:text-sm border-gray-200 rounded-md text-black',
|
||||
},
|
||||
time24hr: {
|
||||
type: Boolean,
|
||||
@ -163,7 +164,7 @@ const props = defineProps({
|
||||
sourceDate: {
|
||||
type: [String, Date],
|
||||
default: () => new Date(),
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
@ -175,6 +176,9 @@ const vCalendar = ref(null)
|
||||
const hasIconSlot = computed(() => {
|
||||
return !!slots.icon
|
||||
})
|
||||
const isDarkModeOn = computed(() =>
|
||||
document.documentElement.classList.contains('dark')
|
||||
)
|
||||
|
||||
const computedContainerClass = computed(() => {
|
||||
let containerClass = `${props.containerClass} `
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
{{ label }}
|
||||
</BaseLabel>
|
||||
|
||||
<p class="text-sm font-bold leading-5 text-black non-italic">
|
||||
<p class="text-sm font-bold leading-5 text-black non-italic dark:text-white">
|
||||
{{ value }}
|
||||
|
||||
<slot />
|
||||
|
||||
@ -30,8 +30,13 @@
|
||||
leave-to="opacity-0"
|
||||
>
|
||||
<DialogOverlay
|
||||
class="fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75"
|
||||
class="fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75 dark:backdrop-blur-xl dark:bg-gray-900/80"
|
||||
>
|
||||
<BaseDarkHighlight
|
||||
class="!bg-highlight/[.17] !top-1/2 h-60 -translate-y-1/2 mt-5"
|
||||
:class="dialogSizeClasses"
|
||||
/>
|
||||
</DialogOverlay>
|
||||
</TransitionChild>
|
||||
|
||||
<!-- This element is to trick the browser into centering the modal contents. -->
|
||||
@ -64,6 +69,11 @@
|
||||
shadow-xl
|
||||
sm:my-8 sm:align-middle sm:w-full sm:p-6
|
||||
relative
|
||||
dark:backdrop-blur-xl
|
||||
dark:shadow-glass
|
||||
dark:border
|
||||
dark:border-white/10
|
||||
dark:bg-gray-800
|
||||
"
|
||||
:class="dialogSizeClasses"
|
||||
>
|
||||
@ -80,31 +90,31 @@
|
||||
rounded-full
|
||||
"
|
||||
:class="{
|
||||
'bg-green-100': dialogStore.variant === 'primary',
|
||||
'bg-red-100': dialogStore.variant === 'danger',
|
||||
'bg-green-100 dark:bg-primary-500': dialogStore.variant === 'primary',
|
||||
'bg-red-100 dark:bg-red-500': dialogStore.variant === 'danger',
|
||||
}"
|
||||
>
|
||||
<BaseIcon
|
||||
v-if="dialogStore.variant === 'primary'"
|
||||
name="CheckIcon"
|
||||
class="w-6 h-6 text-green-600"
|
||||
class="w-6 h-6 text-green-600 dark:text-white"
|
||||
/>
|
||||
<BaseIcon
|
||||
v-else
|
||||
name="ExclamationIcon"
|
||||
class="w-6 h-6 text-red-600"
|
||||
class="w-6 h-6 text-red-600 dark:text-white"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
</div>
|
||||
<div class="mt-3 text-center sm:mt-5">
|
||||
<DialogTitle
|
||||
as="h3"
|
||||
class="text-lg font-medium leading-6 text-gray-900"
|
||||
class="text-lg font-medium leading-6 text-gray-900 dark:text-white"
|
||||
>
|
||||
{{ dialogStore.title }}
|
||||
</DialogTitle>
|
||||
<div class="mt-2">
|
||||
<p class="text-sm text-gray-500">
|
||||
<p class="text-sm text-gray-500 dark:text-gray-400">
|
||||
{{ dialogStore.message }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
<template>
|
||||
<hr class="w-full text-gray-300" />
|
||||
<div class="w-full h-px bg-gray-300 dark:bg-gray-600" />
|
||||
</template>
|
||||
|
||||
@ -69,7 +69,8 @@ const props = defineProps({
|
||||
})
|
||||
|
||||
const containerClasses = computed(() => {
|
||||
const baseClass = `origin-top-right rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 divide-y divide-gray-100 focus:outline-none`
|
||||
const baseClass = `dark:border dark:border-white/10 dark:text-white dark:bg-gray-800 dark:shadow-glass
|
||||
origin-top-right rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 divide-y divide-gray-100 focus:outline-none`
|
||||
return `${baseClass} ${props.containerClass}`
|
||||
})
|
||||
|
||||
|
||||
@ -2,16 +2,20 @@
|
||||
<MenuItem v-slot="{ active }" v-bind="$attrs">
|
||||
<a
|
||||
href="#"
|
||||
class="group flex items-center px-4 py-2 text-sm font-normal"
|
||||
:class="[
|
||||
active ? 'bg-gray-100 text-gray-900' : 'text-gray-700',
|
||||
'group flex items-center px-4 py-2 text-sm font-normal',
|
||||
active
|
||||
? 'bg-gray-100 text-gray-900 dark:text-white dark:bg-gray-700'
|
||||
: 'text-gray-700 dark:text-gray-200',
|
||||
]"
|
||||
>
|
||||
<slot :active="active" />
|
||||
<slot :active="active" :class="defaultIconClass" />
|
||||
</a>
|
||||
</MenuItem>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { MenuItem } from '@headlessui/vue'
|
||||
const defaultIconClass =
|
||||
'w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500 dark:text-gray-400 dark:group-hover:text-white'
|
||||
</script>
|
||||
|
||||
@ -1,18 +1,24 @@
|
||||
<template>
|
||||
<div class="flex flex-col items-center justify-center mt-16">
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<slot></slot>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<label class="font-medium">{{ title }}</label>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<label class="text-gray-500">
|
||||
{{ description }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="mt-6">
|
||||
<slot name="actions" />
|
||||
<div class="relative">
|
||||
<BaseDarkHighlight class="bg-highlight/[.07] top-2" />
|
||||
|
||||
<div class="relative z-5 flex flex-col items-center">
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<slot />
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<label class="font-medium">{{ title }}</label>
|
||||
</div>
|
||||
<div class="mt-2 text-center md:text-left">
|
||||
<label class="text-gray-500 dark:text-gray-400">
|
||||
{{ description }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="mt-6">
|
||||
<slot name="actions" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -1,11 +1,18 @@
|
||||
<template>
|
||||
<div class="rounded-md bg-red-50 p-4">
|
||||
<div
|
||||
class="
|
||||
rounded-md
|
||||
bg-red-50
|
||||
p-4
|
||||
dark:border dark:border-red-400 dark:bg-transparent
|
||||
"
|
||||
>
|
||||
<div class="flex">
|
||||
<div class="shrink-0">
|
||||
<XCircleIcon class="h-5 w-5 text-red-400" aria-hidden="true" />
|
||||
<XCircleIcon class="h-5 w-5 text-red-400 dark:text-red-500" aria-hidden="true" />
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<h3 class="text-sm font-medium text-red-800">
|
||||
<h3 class="text-sm font-medium text-red-800 dark:text-red-500">
|
||||
{{ errorTitle }}
|
||||
</h3>
|
||||
<div class="mt-2 text-sm text-red-700">
|
||||
|
||||
@ -18,17 +18,17 @@ const props = defineProps({
|
||||
const badgeColorClasses = computed(() => {
|
||||
switch (props.status) {
|
||||
case 'DRAFT':
|
||||
return 'bg-yellow-300 bg-opacity-25 px-2 py-1 text-sm text-yellow-800 uppercase font-normal text-center '
|
||||
return 'bg-yellow-300 bg-opacity-25 px-2 py-1 text-sm text-yellow-800 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-yellow-500 dark:text-yellow-500'
|
||||
case 'SENT':
|
||||
return ' bg-yellow-500 bg-opacity-25 px-2 py-1 text-sm text-yellow-900 uppercase font-normal text-center '
|
||||
return ' bg-yellow-500 bg-opacity-25 px-2 py-1 text-sm text-yellow-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-yellow-200 dark:text-yellow-200'
|
||||
case 'VIEWED':
|
||||
return 'bg-blue-400 bg-opacity-25 px-2 py-1 text-sm text-blue-900 uppercase font-normal text-center'
|
||||
return 'bg-blue-400 bg-opacity-25 px-2 py-1 text-sm text-blue-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-blue-300 dark:text-blue-300'
|
||||
case 'EXPIRED':
|
||||
return 'bg-red-300 bg-opacity-25 px-2 py-1 text-sm text-red-800 uppercase font-normal text-center'
|
||||
return 'bg-red-300 bg-opacity-25 px-2 py-1 text-sm text-red-800 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-red-500 dark:text-red-500'
|
||||
case 'ACCEPTED':
|
||||
return 'bg-green-400 bg-opacity-25 px-2 py-1 text-sm text-green-800 uppercase font-normal text-center'
|
||||
return 'bg-green-500 bg-opacity-25 px-2 py-1 text-sm text-green-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-green-400 dark:text-green-400'
|
||||
case 'REJECTED':
|
||||
return 'bg-purple-300 bg-opacity-25 px-2 py-1 text-sm text-purple-800 uppercase font-normal text-center'
|
||||
return 'bg-purple-300 bg-opacity-25 px-2 py-1 text-sm text-purple-800 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-purple-400 dark:text-purple-400'
|
||||
default:
|
||||
return 'bg-gray-500 bg-opacity-25 px-2 py-1 text-sm text-gray-900 uppercase font-normal text-center'
|
||||
}
|
||||
|
||||
@ -21,6 +21,7 @@
|
||||
group
|
||||
min-h-[100px]
|
||||
bg-gray-50
|
||||
dark:bg-gray-700 dark:border-gray-600
|
||||
"
|
||||
:class="avatar ? 'w-32 h-32' : 'w-full'"
|
||||
>
|
||||
@ -49,7 +50,7 @@
|
||||
|
||||
<a
|
||||
href="#"
|
||||
class="absolute z-30 bg-white rounded-full -bottom-3 -right-3 group"
|
||||
class="absolute z-30 bg-white rounded-full -bottom-3 -right-3 group dark:bg-gray-900"
|
||||
@click.prevent.stop="onBrowse"
|
||||
>
|
||||
<BaseIcon
|
||||
@ -95,7 +96,7 @@
|
||||
|
||||
<div
|
||||
v-else-if="localFiles.length && avatar && !multiple"
|
||||
class="flex w-full h-full border border-gray-200 rounded"
|
||||
class="flex w-full h-full border border-gray-200 rounded dark:border-gray-600"
|
||||
>
|
||||
<img
|
||||
v-if="localFiles[0].image"
|
||||
@ -169,10 +170,11 @@
|
||||
-right-3
|
||||
group
|
||||
hover:border-gray-300
|
||||
dark:border-gray-600 dark:bg-gray-900 dark:hover:border-gray-700
|
||||
"
|
||||
@click.prevent.stop="onAvatarRemove(localFiles[0])"
|
||||
>
|
||||
<BaseIcon name="XIcon" class="h-4 text-xl leading-6 text-black" />
|
||||
<BaseIcon name="XIcon" class="h-4 text-xl leading-6 text-black dark:text-white" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@ -195,6 +197,7 @@
|
||||
hover:border-gray-500
|
||||
relative
|
||||
max-w-md
|
||||
dark:border-gray-600 dark:bg-transparent dark:hover:border-gray-700
|
||||
"
|
||||
@click.prevent
|
||||
>
|
||||
@ -270,6 +273,7 @@
|
||||
-right-3
|
||||
group
|
||||
hover:border-gray-300
|
||||
dark:border-gray-600 dark:bg-gray-900 dark:hover:border-gray-700
|
||||
"
|
||||
@click.prevent.stop="onFileRemove(index)"
|
||||
>
|
||||
@ -293,6 +297,7 @@
|
||||
hover:border-gray-500
|
||||
relative
|
||||
max-w-md
|
||||
dark:border-gray-600 dark:bg-gray-800 dark:hover:border-gray-700
|
||||
"
|
||||
@click.prevent
|
||||
>
|
||||
@ -368,10 +373,11 @@
|
||||
-right-3
|
||||
group
|
||||
hover:border-gray-300
|
||||
dark:border-gray-600 dark:bg-gray-900 dark:hover:border-gray-700
|
||||
"
|
||||
@click.prevent.stop="onFileRemove(index)"
|
||||
>
|
||||
<BaseIcon name="XIcon" class="h-4 text-xl leading-6 text-black" />
|
||||
<BaseIcon name="XIcon" class="h-4 text-xl leading-6 text-black dark:text-white" />
|
||||
</a>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
leave-from-class="opacity-100"
|
||||
leave-to-class="opacity-0"
|
||||
>
|
||||
<div v-show="show" class="relative z-10 p-4 md:p-8 bg-gray-200 rounded">
|
||||
<div v-show="show" class="relative z-10 p-4 md:p-8 bg-gray-200 rounded dark:bg-gray-800">
|
||||
<slot name="filter-header" />
|
||||
|
||||
<label
|
||||
@ -20,6 +20,7 @@
|
||||
hover:text-gray-700
|
||||
top-2.5
|
||||
right-3.5
|
||||
dark:text-gray-300
|
||||
"
|
||||
@click="$emit('clear')"
|
||||
>
|
||||
|
||||
@ -2,6 +2,21 @@
|
||||
<h6 :class="typeClass">
|
||||
<slot />
|
||||
</h6>
|
||||
|
||||
<p
|
||||
v-if="subtitle"
|
||||
class="
|
||||
mt-2
|
||||
text-sm
|
||||
leading-snug
|
||||
text-gray-500
|
||||
dark:text-gray-400
|
||||
max-w-[680px]
|
||||
"
|
||||
>
|
||||
{{ subtitle }}
|
||||
</p>
|
||||
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@ -14,12 +29,16 @@ const props = defineProps({
|
||||
return ['section-title', 'heading-title'].indexOf(value) !== -1
|
||||
},
|
||||
},
|
||||
subtitle: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
})
|
||||
|
||||
const typeClass = computed(() => {
|
||||
return {
|
||||
'text-gray-900 text-lg font-medium': props.type === 'heading-title',
|
||||
'text-gray-500 uppercase text-base': props.type === 'section-title',
|
||||
'text-gray-900 text-lg font-medium dark:text-white': props.type === 'heading-title',
|
||||
'text-gray-500 uppercase text-base dark:text-gray-300': props.type === 'section-title',
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
@ -65,6 +65,7 @@
|
||||
rounded-l-md
|
||||
bg-gray-50
|
||||
sm:text-sm
|
||||
dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300
|
||||
"
|
||||
>
|
||||
{{ addon }}
|
||||
@ -82,7 +83,7 @@
|
||||
pointer-events-none
|
||||
"
|
||||
>
|
||||
<span class="text-gray-500 sm:text-sm">
|
||||
<span class="text-gray-500 dark:text-white sm:text-sm ">
|
||||
{{ inlineAddon }}
|
||||
</span>
|
||||
</div>
|
||||
@ -199,7 +200,7 @@ const props = defineProps({
|
||||
defaultInputClass: {
|
||||
type: String,
|
||||
default:
|
||||
'font-base block w-full sm:text-sm border-gray-200 rounded-md text-black',
|
||||
'font-base block w-full sm:text-sm border-gray-200 rounded-md text-black dark:bg-gray-700 dark:border-gray-600 dark:text-white dark:placeholder-gray-500',
|
||||
},
|
||||
iconLeftClass: {
|
||||
type: String,
|
||||
@ -250,7 +251,8 @@ const inputAddonClass = computed(() => {
|
||||
|
||||
const inputInvalidClass = computed(() => {
|
||||
if (props.invalid) {
|
||||
return 'border-red-500 ring-red-500 focus:ring-red-500 focus:border-red-500'
|
||||
return 'border-red-500 dark:border-red-500 ring-red-500 dark:ring-red-500 focus:ring-red-500 dark:focus:ring-red-500 focus:border-red-500 dark:focus:border-red-500 '
|
||||
|
||||
}
|
||||
|
||||
return 'focus:ring-primary-400 focus:border-primary-400'
|
||||
@ -258,7 +260,7 @@ const inputInvalidClass = computed(() => {
|
||||
|
||||
const inputDisabledClass = computed(() => {
|
||||
if (props.disabled) {
|
||||
return `border-gray-100 bg-gray-100 !text-gray-400 ring-gray-200 focus:ring-gray-200 focus:border-gray-100`
|
||||
return `border-gray-100 bg-gray-100 !text-gray-400 dark:!text-gray-200 ring-gray-200 focus:ring-gray-200 focus:border-gray-100 dark:opacity-25 `
|
||||
}
|
||||
|
||||
return ''
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
text-gray-800
|
||||
whitespace-nowrap
|
||||
justify-between
|
||||
dark:text-gray-300
|
||||
"
|
||||
>
|
||||
<div>
|
||||
@ -31,7 +32,7 @@
|
||||
</label>
|
||||
<div :class="inputContainerClasses">
|
||||
<slot></slot>
|
||||
<span v-if="helpText" class="text-gray-500 text-xs mt-1 font-light">
|
||||
<span v-if="helpText" class="text-gray-500 text-xs mt-1 font-light dark:text-gray-400">
|
||||
{{ helpText }}
|
||||
</span>
|
||||
<span v-if="error" class="block mt-0.5 text-sm text-red-500">
|
||||
|
||||
@ -20,25 +20,25 @@ export default {
|
||||
const badgeColorClasses = computed(() => {
|
||||
switch (props.status) {
|
||||
case 'DRAFT':
|
||||
return 'bg-yellow-300 bg-opacity-25 px-2 py-1 text-sm text-yellow-800 uppercase font-normal text-center'
|
||||
return 'bg-yellow-300 bg-opacity-25 px-2 py-1 text-sm text-yellow-800 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-yellow-500 dark:text-yellow-500'
|
||||
case 'SENT':
|
||||
return ' bg-yellow-500 bg-opacity-25 px-2 py-1 text-sm text-yellow-900 uppercase font-normal text-center '
|
||||
return ' bg-yellow-500 bg-opacity-25 px-2 py-1 text-sm text-yellow-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-lime-200 dark:text-yellow-200'
|
||||
case 'VIEWED':
|
||||
return 'bg-blue-400 bg-opacity-25 px-2 py-1 text-sm text-blue-900 uppercase font-normal text-center'
|
||||
return 'bg-blue-400 bg-opacity-25 px-2 py-1 text-sm text-blue-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-blue-300 dark:text-blue-300'
|
||||
case 'COMPLETED':
|
||||
return 'bg-green-500 bg-opacity-25 px-2 py-1 text-sm text-green-900 uppercase font-normal text-center'
|
||||
return 'bg-green-500 bg-opacity-25 px-2 py-1 text-sm text-green-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-green-400 dark:text-green-400'
|
||||
case 'DUE':
|
||||
return 'bg-yellow-500 bg-opacity-25 px-2 py-1 text-sm text-yellow-900 uppercase font-normal text-center'
|
||||
return 'bg-yellow-500 bg-opacity-25 px-2 py-1 text-sm text-yellow-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-yellow-500 dark:text-yellow-500'
|
||||
case 'OVERDUE':
|
||||
return 'bg-red-300 bg-opacity-50 px-2 py-1 text-sm text-red-900 uppercase font-normal text-center'
|
||||
return 'bg-red-300 bg-opacity-50 px-2 py-1 text-sm text-red-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-red-500 dark:text-red-500'
|
||||
case 'UNPAID':
|
||||
return 'bg-yellow-500 bg-opacity-25 px-2 py-1 text-sm text-yellow-900 uppercase font-normal text-center'
|
||||
return 'bg-yellow-500 bg-opacity-25 px-2 py-1 text-sm text-yellow-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-yellow-500 dark:text-yellow-500'
|
||||
case 'PARTIALLY_PAID':
|
||||
return 'bg-blue-400 bg-opacity-25 px-2 py-1 text-sm text-blue-900 uppercase font-normal text-center'
|
||||
return 'bg-blue-400 bg-opacity-25 px-2 py-1 text-sm text-blue-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-blue-300 dark:text-blue-300'
|
||||
case 'PAID':
|
||||
return 'bg-green-500 bg-opacity-25 px-2 py-1 text-sm text-green-900 uppercase font-normal text-center'
|
||||
return 'bg-green-500 bg-opacity-25 px-2 py-1 text-sm text-green-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-green-400 dark:text-green-400'
|
||||
default:
|
||||
return 'bg-gray-500 bg-opacity-25 px-2 py-1 text-sm text-gray-900 uppercase font-normal text-center'
|
||||
return 'bg-gray-500 bg-opacity-25 px-2 py-1 text-sm text-gray-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-gray-502 dark:text-gray-200'
|
||||
}
|
||||
})
|
||||
return { badgeColorClasses }
|
||||
|
||||
@ -12,6 +12,7 @@
|
||||
bg-gray-200
|
||||
border border-gray-200 border-solid
|
||||
rounded
|
||||
dark:bg-gray-900/70 dark:border-gray-700
|
||||
"
|
||||
>
|
||||
{{ item.name }}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<label class="text-sm not-italic font-medium leading-5 text-primary-800">
|
||||
<label class="text-sm not-italic font-medium leading-5 text-gray-500 dark:text-gray-300">
|
||||
<slot />
|
||||
</label>
|
||||
</template>
|
||||
|
||||
@ -39,7 +39,7 @@ const props = defineProps({
|
||||
inputClass: {
|
||||
type: String,
|
||||
default:
|
||||
'font-base block w-full sm:text-sm border-gray-200 rounded-md text-black',
|
||||
'font-base block w-full sm:text-sm border-gray-200 rounded-md text-black dark:bg-gray-700 dark:border-gray-600 dark:text-white dark:placeholder-gray-500',
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
@ -86,7 +86,7 @@ const currencyBindings = computed(() => {
|
||||
|
||||
const invalidClass = computed(() => {
|
||||
if (props.invalid) {
|
||||
return 'border-red-500 ring-red-500 focus:ring-red-500 focus:border-red-500'
|
||||
return 'border-red-500 dark:border-red-500 ring-red-500 dark:ring-red-500 focus:ring-red-500 dark:focus:ring-red-500 focus:border-red-500 dark:focus:border-red-500'
|
||||
}
|
||||
return 'focus:ring-primary-400 focus:border-primary-400'
|
||||
})
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="flex flex-wrap justify-between">
|
||||
<div>
|
||||
<h3 class="text-2xl font-bold text-left text-black">
|
||||
<h3 class="text-2xl font-bold text-left text-black dark:text-white">
|
||||
{{ title }}
|
||||
</h3>
|
||||
<slot />
|
||||
|
||||
@ -24,15 +24,15 @@ export default {
|
||||
const badgeColorClasses = computed(() => {
|
||||
switch (props.status) {
|
||||
case 'PAID':
|
||||
return 'bg-primary-300 bg-opacity-25 text-primary-800 uppercase font-normal text-center'
|
||||
return 'bg-primary-300 bg-opacity-25 text-primary-800 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-indigo-400 dark:text-indigo-400'
|
||||
case 'UNPAID':
|
||||
return ' bg-yellow-500 bg-opacity-25 text-yellow-900 uppercase font-normal text-center '
|
||||
return ' bg-yellow-500 bg-opacity-25 text-yellow-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-orange-300 dark:text-orange-300'
|
||||
case 'PARTIALLY_PAID':
|
||||
return 'bg-blue-400 bg-opacity-25 text-blue-900 uppercase font-normal text-center'
|
||||
return 'bg-blue-400 bg-opacity-25 text-blue-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-blue-300 dark:text-blue-300'
|
||||
case 'OVERDUE':
|
||||
return 'bg-red-300 bg-opacity-50 px-2 py-1 text-sm text-red-900 uppercase font-normal text-center'
|
||||
return 'bg-red-300 bg-opacity-50 px-2 py-1 text-sm text-red-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-red-500 dark:text-red-500'
|
||||
default:
|
||||
return 'bg-gray-500 bg-opacity-25 text-gray-900 uppercase font-normal text-center'
|
||||
return 'bg-gray-500 bg-opacity-25 text-gray-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-gray-300 dark:text-gray-300'
|
||||
}
|
||||
})
|
||||
return { badgeColorClasses }
|
||||
|
||||
@ -19,7 +19,7 @@
|
||||
]"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<span class="rounded-full bg-white w-1.5 h-1.5" />
|
||||
<span class="rounded-full w-1.5 h-1.5" :class="{ 'bg-white': checked }"/>
|
||||
</span>
|
||||
<div class="flex flex-col ml-3">
|
||||
<RadioGroupLabel
|
||||
@ -66,11 +66,11 @@ const props = defineProps({
|
||||
},
|
||||
checkedStateClass: {
|
||||
type: String,
|
||||
default: 'bg-primary-600',
|
||||
default: 'bg-primary-600 ',
|
||||
},
|
||||
unCheckedStateClass: {
|
||||
type: String,
|
||||
default: 'bg-white ',
|
||||
default: 'bg-white dark:bg-transparent',
|
||||
},
|
||||
optionGroupActiveStateClass: {
|
||||
type: String,
|
||||
@ -78,16 +78,16 @@ const props = defineProps({
|
||||
},
|
||||
checkedStateLabelClass: {
|
||||
type: String,
|
||||
default: 'text-primary-900 ',
|
||||
default: 'text-primary-900 dark:text-primary-400',
|
||||
},
|
||||
unCheckedStateLabelClass: {
|
||||
type: String,
|
||||
default: 'text-gray-900',
|
||||
default: 'text-gray-900 dark:text-white',
|
||||
},
|
||||
optionGroupClass: {
|
||||
type: String,
|
||||
default:
|
||||
'h-4 w-4 mt-0.5 cursor-pointer rounded-full border flex items-center justify-center',
|
||||
'h-4 w-4 mt-0.5 cursor-pointer rounded-full border flex items-center justify-center dark:border-gray-600',
|
||||
},
|
||||
optionGroupLabelClass: {
|
||||
type: String,
|
||||
|
||||
@ -20,11 +20,11 @@ export default {
|
||||
const badgeColorClasses = computed(() => {
|
||||
switch (props.status) {
|
||||
case 'COMPLETED':
|
||||
return 'bg-green-500 bg-opacity-25 px-2 py-1 text-sm text-green-900 uppercase font-normal text-center'
|
||||
return 'bg-green-500 bg-opacity-25 px-2 py-1 text-sm text-green-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-green-400 dark:text-green-400'
|
||||
case 'ON_HOLD':
|
||||
return 'bg-yellow-500 bg-opacity-25 px-2 py-1 text-sm text-yellow-900 uppercase font-normal text-center'
|
||||
return 'bg-yellow-500 bg-opacity-25 px-2 py-1 text-sm text-yellow-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-yellow-200 dark:text-yellow-200'
|
||||
case 'ACTIVE':
|
||||
return 'bg-blue-400 bg-opacity-25 px-2 py-1 text-sm text-blue-900 uppercase font-normal text-center'
|
||||
return 'bg-blue-400 bg-opacity-25 px-2 py-1 text-sm text-blue-900 uppercase font-normal text-center dark:bg-transparent dark:border dark:border-blue-300 dark:text-blue-300'
|
||||
default:
|
||||
return 'bg-gray-500 bg-opacity-25 px-2 py-1 text-sm text-gray-900 uppercase font-normal text-center'
|
||||
}
|
||||
|
||||
@ -11,6 +11,10 @@
|
||||
bg-gray-200
|
||||
cursor-pointer
|
||||
text-primary-400
|
||||
dark:bg-gray-600/70
|
||||
dark:backdrop-blur-xl
|
||||
dark:shadow-glass
|
||||
dark:hover:bg-gray-600/80
|
||||
"
|
||||
>
|
||||
<slot />
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
>
|
||||
<ListboxLabel
|
||||
v-if="label"
|
||||
class="block text-sm not-italic font-medium text-gray-800 mb-0.5"
|
||||
class="block text-sm not-italic font-medium text-gray-800 mb-0.5 dark:text-white"
|
||||
>
|
||||
{{ label }}
|
||||
</ListboxLabel>
|
||||
@ -28,14 +28,13 @@
|
||||
pr-10
|
||||
text-left
|
||||
bg-white
|
||||
border border-gray-200
|
||||
dark:bg-gray-700
|
||||
rounded-md
|
||||
shadow-sm
|
||||
cursor-default
|
||||
focus:outline-none
|
||||
focus:ring-1
|
||||
focus:ring-primary-500
|
||||
focus:border-primary-500
|
||||
focus:ring-primary-400 focus:border-primary-400
|
||||
sm:text-sm
|
||||
"
|
||||
>
|
||||
@ -89,6 +88,7 @@
|
||||
ring-1 ring-black ring-opacity-5
|
||||
focus:outline-none
|
||||
sm:text-sm
|
||||
dark:bg-gray-700
|
||||
"
|
||||
>
|
||||
<ListboxOption
|
||||
@ -100,7 +100,7 @@
|
||||
>
|
||||
<li
|
||||
:class="[
|
||||
active ? 'text-white bg-primary-600' : 'text-gray-900',
|
||||
active ? 'text-white bg-primary-600' : 'text-gray-900 dark:text-white',
|
||||
'cursor-default select-none relative py-2 pl-3 pr-9',
|
||||
]"
|
||||
>
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
mt-2
|
||||
text-sm
|
||||
leading-snug
|
||||
text-left text-gray-500
|
||||
text-left text-gray-500 dark:text-gray-400
|
||||
max-w-[680px]
|
||||
"
|
||||
>
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
|
||||
<Switch
|
||||
v-model="enabled"
|
||||
:class="enabled ? 'bg-primary-500' : 'bg-gray-300'"
|
||||
:class="enabled ? 'bg-primary-500' : 'bg-gray-300 dark:bg-gray-900'"
|
||||
class="
|
||||
relative
|
||||
inline-flex
|
||||
@ -21,7 +21,11 @@
|
||||
v-bind="$attrs"
|
||||
>
|
||||
<span
|
||||
:class="enabled ? 'translate-x-6' : 'translate-x-1'"
|
||||
:class="
|
||||
enabled
|
||||
? 'translate-x-6 dark:bg-white'
|
||||
: 'translate-x-1 dark:bg-gray-500'
|
||||
"
|
||||
class="
|
||||
inline-block
|
||||
w-4
|
||||
|
||||
@ -5,12 +5,12 @@
|
||||
<div class="flex flex-col">
|
||||
<SwitchLabel
|
||||
as="p"
|
||||
class="p-0 mb-1 text-sm leading-snug text-black font-medium"
|
||||
class="p-0 mb-1 text-sm leading-snug text-black font-medium dark:text-white"
|
||||
passive
|
||||
>
|
||||
{{ title }}
|
||||
</SwitchLabel>
|
||||
<SwitchDescription class="text-sm text-gray-500">
|
||||
<SwitchDescription class="text-sm text-gray-500 dark:text-gray-400">
|
||||
{{ description }}
|
||||
</SwitchDescription>
|
||||
</div>
|
||||
@ -18,7 +18,7 @@
|
||||
:disabled="disabled"
|
||||
:model-value="modelValue"
|
||||
:class="[
|
||||
modelValue ? 'bg-primary-500' : 'bg-gray-200',
|
||||
modelValue ? 'bg-primary-500' : 'bg-gray-200 dark:bg-gray-900',
|
||||
'ml-4 relative inline-flex shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500',
|
||||
]"
|
||||
@update:modelValue="onUpdate"
|
||||
@ -26,7 +26,7 @@
|
||||
<span
|
||||
aria-hidden="true"
|
||||
:class="[
|
||||
modelValue ? 'translate-x-5' : 'translate-x-0',
|
||||
modelValue ? 'translate-x-5 dark:bg-white' : 'translate-x-0 dark:bg-gray-500',
|
||||
'inline-block h-5 w-5 rounded-full bg-white shadow ring-0 transition ease-in-out duration-200',
|
||||
]"
|
||||
/>
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
>
|
||||
<TabList
|
||||
:class="[
|
||||
'flex border-b border-grey-light',
|
||||
'flex border-b border-grey-light dark:border-gray-600',
|
||||
'relative overflow-x-auto overflow-y-hidden',
|
||||
'lg:pb-0 lg:ml-0',
|
||||
]"
|
||||
@ -22,8 +22,8 @@
|
||||
:class="[
|
||||
'px-8 py-2 text-sm leading-5 font-medium flex items-center relative border-b-2 mt-4 focus:outline-none whitespace-nowrap',
|
||||
selected
|
||||
? ' border-primary-400 text-black font-medium'
|
||||
: 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300',
|
||||
? 'border-primary-400 text-black font-medium dark:text-white'
|
||||
: 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-gray-400 dark:hover:border-gray-500',
|
||||
]"
|
||||
>
|
||||
{{ tab.title }}
|
||||
|
||||
@ -45,7 +45,7 @@ const props = defineProps({
|
||||
defaultInputClass: {
|
||||
type: String,
|
||||
default:
|
||||
'box-border w-full px-3 py-2 text-sm not-italic font-normal leading-snug text-left text-black placeholder-gray-400 bg-white border border-gray-200 border-solid rounded outline-none',
|
||||
'box-border w-full px-3 py-2 text-sm not-italic font-normal leading-snug text-left text-black placeholder-gray-400 bg-white border border-gray-200 dark:border-gray-600 border-solid rounded outline-none dark:bg-gray-700 dark:text-white',
|
||||
},
|
||||
autosize: {
|
||||
type: Boolean,
|
||||
|
||||
@ -16,13 +16,15 @@
|
||||
text-left
|
||||
bg-white
|
||||
border border-gray-200
|
||||
dark:border-gray-600
|
||||
rounded-md
|
||||
min-h-[200px]
|
||||
overflow-hidden
|
||||
dark:bg-gray-700 dark:text-white
|
||||
"
|
||||
>
|
||||
<div v-if="editor" class="editor-content">
|
||||
<div class="flex justify-end p-2 border-b border-gray-200 md:hidden">
|
||||
<div class="flex justify-end p-2 border-b border-gray-200 dark:border-gray-600 md:hidden">
|
||||
<BaseDropdown width-class="w-48">
|
||||
<template #activator>
|
||||
<div
|
||||
@ -42,7 +44,7 @@
|
||||
<dots-vertical-icon class="w-6 h-6 text-gray-600" />
|
||||
</div>
|
||||
</template>
|
||||
<div class="flex flex-wrap space-x-1">
|
||||
<div class="flex flex-wrap space-x-1 dark:text-white">
|
||||
<span
|
||||
class="
|
||||
flex
|
||||
@ -53,8 +55,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('bold') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('bold') }"
|
||||
@click="editor.chain().focus().toggleBold().run()"
|
||||
>
|
||||
<bold-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -69,8 +72,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('italic') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('italic') }"
|
||||
@click="editor.chain().focus().toggleItalic().run()"
|
||||
>
|
||||
<italic-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -85,8 +89,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('strike') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('strike') }"
|
||||
@click="editor.chain().focus().toggleStrike().run()"
|
||||
>
|
||||
<strikethrough-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -101,8 +106,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('code') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('code') }"
|
||||
@click="editor.chain().focus().toggleCode().run()"
|
||||
>
|
||||
<coding-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -117,8 +123,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('paragraph') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('paragraph') }"
|
||||
@click="editor.chain().focus().setParagraph().run()"
|
||||
>
|
||||
<paragraph-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -133,9 +140,10 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{
|
||||
'bg-gray-200': editor.isActive('heading', { level: 1 }),
|
||||
'bg-gray-200 dark:bg-gray-900': editor.isActive('heading', { level: 1 }),
|
||||
}"
|
||||
@click="editor.chain().focus().toggleHeading({ level: 1 }).run()"
|
||||
>
|
||||
@ -151,9 +159,10 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{
|
||||
'bg-gray-200': editor.isActive('heading', { level: 2 }),
|
||||
'bg-gray-200 dark:bg-gray-900': editor.isActive('heading', { level: 2 }),
|
||||
}"
|
||||
@click="editor.chain().focus().toggleHeading({ level: 2 }).run()"
|
||||
>
|
||||
@ -169,9 +178,10 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{
|
||||
'bg-gray-200': editor.isActive('heading', { level: 3 }),
|
||||
'bg-gray-200 dark:bg-gray-900': editor.isActive('heading', { level: 3 }),
|
||||
}"
|
||||
@click="editor.chain().focus().toggleHeading({ level: 3 }).run()"
|
||||
>
|
||||
@ -188,8 +198,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('bulletList') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('bulletList') }"
|
||||
@click="editor.chain().focus().toggleBulletList().run()"
|
||||
>
|
||||
<list-ul-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -204,8 +215,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('orderedList') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('orderedList') }"
|
||||
@click="editor.chain().focus().toggleOrderedList().run()"
|
||||
>
|
||||
<list-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -220,8 +232,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('blockquote') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('blockquote') }"
|
||||
@click="editor.chain().focus().toggleBlockquote().run()"
|
||||
>
|
||||
<quote-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -236,8 +249,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('codeBlock') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('codeBlock') }"
|
||||
@click="editor.chain().focus().toggleCodeBlock().run()"
|
||||
>
|
||||
<code-block-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -252,8 +266,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('undo') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('undo') }"
|
||||
@click="editor.chain().focus().undo().run()"
|
||||
>
|
||||
<undo-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -268,8 +283,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('redo') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('redo') }"
|
||||
@click="editor.chain().focus().redo().run()"
|
||||
>
|
||||
<redo-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -277,7 +293,7 @@
|
||||
</div>
|
||||
</BaseDropdown>
|
||||
</div>
|
||||
<div class="hidden p-2 border-b border-gray-200 md:flex">
|
||||
<div class="hidden p-2 border-b border-gray-200 dark:border-gray-600 md:flex">
|
||||
<div class="flex flex-wrap space-x-1">
|
||||
<span
|
||||
class="
|
||||
@ -289,8 +305,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('bold') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('bold') }"
|
||||
@click="editor.chain().focus().toggleBold().run()"
|
||||
>
|
||||
<bold-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -305,8 +322,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('italic') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('italic') }"
|
||||
@click="editor.chain().focus().toggleItalic().run()"
|
||||
>
|
||||
<italic-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -321,8 +339,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('strike') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('strike') }"
|
||||
@click="editor.chain().focus().toggleStrike().run()"
|
||||
>
|
||||
<strikethrough-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -337,8 +356,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('code') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('code') }"
|
||||
@click="editor.chain().focus().toggleCode().run()"
|
||||
>
|
||||
<coding-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -353,8 +373,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('paragraph') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('paragraph') }"
|
||||
@click="editor.chain().focus().setParagraph().run()"
|
||||
>
|
||||
<paragraph-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -369,8 +390,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('heading', { level: 1 }) }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('heading', { level: 1 }) }"
|
||||
@click="editor.chain().focus().toggleHeading({ level: 1 }).run()"
|
||||
>
|
||||
H1
|
||||
@ -385,8 +407,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('heading', { level: 2 }) }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('heading', { level: 2 }) }"
|
||||
@click="editor.chain().focus().toggleHeading({ level: 2 }).run()"
|
||||
>
|
||||
H2
|
||||
@ -401,8 +424,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('heading', { level: 3 }) }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('heading', { level: 3 }) }"
|
||||
@click="editor.chain().focus().toggleHeading({ level: 3 }).run()"
|
||||
>
|
||||
H3
|
||||
@ -418,8 +442,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('bulletList') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('bulletList') }"
|
||||
@click="editor.chain().focus().toggleBulletList().run()"
|
||||
>
|
||||
<list-ul-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -434,8 +459,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('orderedList') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('orderedList') }"
|
||||
@click="editor.chain().focus().toggleOrderedList().run()"
|
||||
>
|
||||
<list-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -450,8 +476,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('blockquote') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('blockquote') }"
|
||||
@click="editor.chain().focus().toggleBlockquote().run()"
|
||||
>
|
||||
<quote-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -466,8 +493,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('codeBlock') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('codeBlock') }"
|
||||
@click="editor.chain().focus().toggleCodeBlock().run()"
|
||||
>
|
||||
<code-block-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -482,8 +510,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('undo') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('undo') }"
|
||||
@click="editor.chain().focus().undo().run()"
|
||||
>
|
||||
<undo-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -498,8 +527,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive('redo') }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive('redo') }"
|
||||
@click="editor.chain().focus().redo().run()"
|
||||
>
|
||||
<redo-icon class="h-3 cursor-pointer fill-current" />
|
||||
@ -514,8 +544,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive({ textAlign: 'left' }) }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive({ textAlign: 'left' }) }"
|
||||
@click="editor.chain().focus().setTextAlign('left').run()"
|
||||
>
|
||||
<menu-alt2-icon class="h-5 cursor-pointer fill-current" />
|
||||
@ -530,8 +561,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive({ textAlign: 'right' }) }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive({ textAlign: 'right' }) }"
|
||||
@click="editor.chain().focus().setTextAlign('right').run()"
|
||||
>
|
||||
<menu-alt3-icon class="h-5 cursor-pointer fill-current" />
|
||||
@ -546,9 +578,10 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{
|
||||
'bg-gray-200': editor.isActive({ textAlign: 'justify' }),
|
||||
'bg-gray-200 dark:bg-gray-900': editor.isActive({ textAlign: 'justify' }),
|
||||
}"
|
||||
@click="editor.chain().focus().setTextAlign('justify').run()"
|
||||
>
|
||||
@ -564,8 +597,9 @@
|
||||
rounded-sm
|
||||
cursor-pointer
|
||||
hover:bg-gray-100
|
||||
dark:hover:bg-gray-800
|
||||
"
|
||||
:class="{ 'bg-gray-200': editor.isActive({ textAlign: 'center' }) }"
|
||||
:class="{ 'bg-gray-200 dark:bg-gray-900': editor.isActive({ textAlign: 'center' }) }"
|
||||
@click="editor.chain().focus().setTextAlign('center').run()"
|
||||
>
|
||||
<menu-center-icon class="h-5 cursor-pointer fill-current" />
|
||||
|
||||
@ -7,11 +7,18 @@
|
||||
relative
|
||||
overflow-hidden
|
||||
bg-white
|
||||
border-b border-gray-200
|
||||
border-b
|
||||
border-gray-200
|
||||
shadow
|
||||
sm:rounded-lg
|
||||
"
|
||||
dark:shadow-glass
|
||||
dark:border
|
||||
dark:border-white/10
|
||||
dark:bg-gray-800/70
|
||||
"
|
||||
>
|
||||
<BaseDarkHighlight v-if="darkHighlight" class="z-[-1]" />
|
||||
|
||||
<slot name="header" />
|
||||
<table :class="tableClass">
|
||||
<thead :class="theadClass">
|
||||
@ -51,7 +58,11 @@
|
||||
<tr
|
||||
v-for="placeRow in placeholderCount"
|
||||
:key="placeRow"
|
||||
:class="placeRow % 2 === 0 ? 'bg-white' : 'bg-gray-50'"
|
||||
:class="
|
||||
placeRow % 2 === 0
|
||||
? 'bg-white dark:bg-gray-800'
|
||||
: 'bg-gray-50 dark:bg-gray-800'
|
||||
"
|
||||
>
|
||||
<td
|
||||
v-for="column in columns"
|
||||
@ -75,7 +86,11 @@
|
||||
<tr
|
||||
v-for="(row, index) in sortedRows"
|
||||
:key="index"
|
||||
:class="index % 2 === 0 ? 'bg-white' : 'bg-gray-50'"
|
||||
:class="
|
||||
index % 2 === 0
|
||||
? 'bg-white dark:bg-transparent'
|
||||
: 'bg-gray-50 dark:bg-gray-700/20 dark:border-y dark:border-gray-600'
|
||||
"
|
||||
>
|
||||
<td
|
||||
v-for="column in columns"
|
||||
@ -103,7 +118,10 @@
|
||||
justify-center
|
||||
w-full
|
||||
h-full
|
||||
bg-white bg-opacity-60
|
||||
bg-white
|
||||
bg-opacity-60
|
||||
dark:bg-gray-700
|
||||
dark:bg-opacity-60
|
||||
"
|
||||
>
|
||||
<SpinnerIcon class="w-10 h-10 text-primary-500" />
|
||||
@ -163,9 +181,12 @@ const props = defineProps({
|
||||
sortOrder: { type: String, default: '' },
|
||||
tableClass: {
|
||||
type: String,
|
||||
default: 'min-w-full divide-y divide-gray-200',
|
||||
default: 'min-w-full divide-y divide-gray-200 dark:divide-gray-600',
|
||||
},
|
||||
theadClass: {
|
||||
type: String,
|
||||
default: 'bg-gray-50 dark:bg-gray-800 dark:text-white',
|
||||
},
|
||||
theadClass: { type: String, default: 'bg-gray-50' },
|
||||
tbodyClass: { type: String, default: '' },
|
||||
noResultsMessage: {
|
||||
type: String,
|
||||
@ -186,6 +207,10 @@ const props = defineProps({
|
||||
type: Number,
|
||||
default: 3,
|
||||
},
|
||||
darkHighlight: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
})
|
||||
|
||||
let rows = reactive([])
|
||||
@ -236,7 +261,7 @@ function getColumn(columnName) {
|
||||
|
||||
function getThClass(column) {
|
||||
let classes =
|
||||
'whitespace-nowrap px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider'
|
||||
'whitespace-nowrap px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider dark:text-white'
|
||||
|
||||
if (column.defaultThClass) {
|
||||
classes = column.defaultThClass
|
||||
@ -256,7 +281,8 @@ function getThClass(column) {
|
||||
}
|
||||
|
||||
function getTdClass(column) {
|
||||
let classes = 'px-6 py-4 text-sm text-gray-500 whitespace-nowrap'
|
||||
let classes =
|
||||
'px-6 py-4 text-sm text-gray-500 whitespace-nowrap dark:text-gray-300'
|
||||
|
||||
if (column.defaultTdClass) {
|
||||
classes = column.defaultTdClass
|
||||
@ -309,6 +335,7 @@ function changeSorting(column) {
|
||||
}
|
||||
|
||||
if (!usesLocalData.value) {
|
||||
if (pagination.value) pagination.value.currentPage = 1
|
||||
mapDataToRows()
|
||||
}
|
||||
}
|
||||
@ -326,7 +353,9 @@ async function pageChange(page) {
|
||||
await mapDataToRows()
|
||||
}
|
||||
|
||||
async function refresh() {
|
||||
async function refresh(isPreservePage = false) {
|
||||
if (pagination.value && !isPreservePage) pagination.value.currentPage = 1
|
||||
|
||||
await mapDataToRows()
|
||||
}
|
||||
|
||||
|
||||
@ -10,13 +10,14 @@
|
||||
bg-white
|
||||
border-t border-gray-200
|
||||
sm:px-6
|
||||
dark:bg-transparent dark:border-white/10
|
||||
"
|
||||
>
|
||||
<div class="flex justify-between flex-1 sm:hidden">
|
||||
<a
|
||||
href="#"
|
||||
:class="{
|
||||
'disabled cursor-normal pointer-events-none !bg-gray-100 !text-gray-400':
|
||||
'disabled cursor-normal pointer-events-none !bg-gray-100 !text-gray-400 dark:!bg-gray-800 dark:!text-gray-500':
|
||||
pagination.currentPage === 1,
|
||||
}"
|
||||
class="
|
||||
@ -32,6 +33,7 @@
|
||||
border border-gray-300
|
||||
rounded-md
|
||||
hover:bg-gray-50
|
||||
dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300
|
||||
"
|
||||
@click="pageClicked(pagination.currentPage - 1)"
|
||||
>
|
||||
@ -40,7 +42,7 @@
|
||||
<a
|
||||
href="#"
|
||||
:class="{
|
||||
'disabled cursor-default pointer-events-none !bg-gray-100 !text-gray-400':
|
||||
'disabled cursor-default pointer-events-none !bg-gray-100 !text-gray-400 dark:!bg-gray-800 dark:!text-gray-500':
|
||||
pagination.currentPage === pagination.totalPages,
|
||||
}"
|
||||
class="
|
||||
@ -57,6 +59,7 @@
|
||||
border border-gray-300
|
||||
rounded-md
|
||||
hover:bg-gray-50
|
||||
dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300
|
||||
"
|
||||
@click="pageClicked(pagination.currentPage + 1)"
|
||||
>
|
||||
@ -65,12 +68,12 @@
|
||||
</div>
|
||||
<div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
|
||||
<div>
|
||||
<p class="text-sm text-gray-700">
|
||||
<p class="text-sm text-gray-700 dark:text-gray-400">
|
||||
Showing
|
||||
{{ ' ' }}
|
||||
<span
|
||||
v-if="pagination.limit && pagination.currentPage"
|
||||
class="font-medium"
|
||||
class="font-medium dark:text-gray-200"
|
||||
>
|
||||
{{
|
||||
pagination.currentPage * pagination.limit - (pagination.limit - 1)
|
||||
@ -81,7 +84,7 @@
|
||||
{{ ' ' }}
|
||||
<span
|
||||
v-if="pagination.limit && pagination.currentPage"
|
||||
class="font-medium"
|
||||
class="font-medium dark:text-gray-200"
|
||||
>
|
||||
<span
|
||||
v-if="
|
||||
@ -98,7 +101,7 @@
|
||||
{{ ' ' }}
|
||||
of
|
||||
{{ ' ' }}
|
||||
<span v-if="pagination.totalCount" class="font-medium">
|
||||
<span v-if="pagination.totalCount" class="font-medium dark:text-gray-200">
|
||||
{{ pagination.totalCount }}
|
||||
</span>
|
||||
{{ ' ' }}
|
||||
@ -113,7 +116,7 @@
|
||||
<a
|
||||
href="#"
|
||||
:class="{
|
||||
'disabled cursor-normal pointer-events-none !bg-gray-100 !text-gray-400':
|
||||
'disabled cursor-normal pointer-events-none !bg-gray-100 !text-gray-400 dark:!bg-gray-800 dark:!text-gray-500':
|
||||
pagination.currentPage === 1,
|
||||
}"
|
||||
class="
|
||||
@ -129,6 +132,7 @@
|
||||
border border-gray-300
|
||||
rounded-l-md
|
||||
hover:bg-gray-50
|
||||
dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300
|
||||
"
|
||||
@click="pageClicked(pagination.currentPage - 1)"
|
||||
>
|
||||
@ -140,9 +144,9 @@
|
||||
href="#"
|
||||
aria-current="page"
|
||||
:class="{
|
||||
'z-10 bg-primary-50 border-primary-500 text-primary-600':
|
||||
'z-10 bg-primary-50 border-primary-500 text-primary-600 dark:bg-primary-500 dark:text-white':
|
||||
isActive(1),
|
||||
'bg-white border-gray-300 text-gray-500 hover:bg-gray-50':
|
||||
'bg-white border-gray-300 text-gray-500 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300':
|
||||
!isActive(1),
|
||||
}"
|
||||
class="
|
||||
@ -173,6 +177,7 @@
|
||||
text-gray-700
|
||||
bg-white
|
||||
border border-gray-300
|
||||
dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300
|
||||
"
|
||||
>
|
||||
...
|
||||
@ -182,9 +187,9 @@
|
||||
:key="page"
|
||||
href="#"
|
||||
:class="{
|
||||
'z-10 bg-primary-50 border-primary-500 text-primary-600':
|
||||
'z-10 bg-primary-50 border-primary-500 text-primary-600 dark:bg-primary-500 dark:text-white':
|
||||
isActive(page),
|
||||
'bg-white border-gray-300 text-gray-500 hover:bg-gray-50':
|
||||
'bg-white border-gray-300 text-gray-500 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300':
|
||||
!isActive(page),
|
||||
disabled: page === '...',
|
||||
}"
|
||||
@ -220,6 +225,7 @@
|
||||
text-gray-700
|
||||
bg-white
|
||||
border border-gray-300
|
||||
dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300
|
||||
"
|
||||
>
|
||||
...
|
||||
@ -229,9 +235,9 @@
|
||||
href="#"
|
||||
aria-current="page"
|
||||
:class="{
|
||||
'z-10 bg-primary-50 border-primary-500 text-primary-600':
|
||||
'z-10 bg-primary-50 border-primary-500 text-primary-600 dark:bg-primary-500 dark:text-white':
|
||||
isActive(pagination.totalPages),
|
||||
'bg-white border-gray-300 text-gray-500 hover:bg-gray-50':
|
||||
'bg-white border-gray-300 text-gray-500 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300':
|
||||
!isActive(pagination.totalPages),
|
||||
}"
|
||||
class="
|
||||
@ -263,9 +269,10 @@
|
||||
border border-gray-300
|
||||
rounded-r-md
|
||||
hover:bg-gray-50
|
||||
dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300
|
||||
"
|
||||
:class="{
|
||||
'disabled cursor-default pointer-events-none !bg-gray-100 !text-gray-400':
|
||||
'disabled cursor-default pointer-events-none !bg-gray-100 !text-gray-400 dark:!bg-gray-800 dark:!text-gray-500':
|
||||
pagination.currentPage === pagination.totalPages,
|
||||
}"
|
||||
@click="pageClicked(pagination.currentPage + 1)"
|
||||
|
||||
@ -3,23 +3,26 @@
|
||||
width="50"
|
||||
height="50"
|
||||
viewBox="0 0 50 50"
|
||||
:class="colorClass"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<circle cx="25" cy="25" r="25" fill="#EAF1FB" />
|
||||
<circle cx="25" cy="25" r="25" :class="bgColor" />
|
||||
<path
|
||||
d="M28.2656 23.0547C27.3021 24.0182 26.1302 24.5 24.75 24.5C23.3698 24.5 22.1849 24.0182 21.1953 23.0547C20.2318 22.0651 19.75 20.8802 19.75 19.5C19.75 18.1198 20.2318 16.9479 21.1953 15.9844C22.1849 14.9948 23.3698 14.5 24.75 14.5C26.1302 14.5 27.3021 14.9948 28.2656 15.9844C29.2552 16.9479 29.75 18.1198 29.75 19.5C29.75 20.8802 29.2552 22.0651 28.2656 23.0547ZM28.2656 25.75C29.6979 25.75 30.9219 26.2708 31.9375 27.3125C32.9792 28.3281 33.5 29.5521 33.5 30.9844V32.625C33.5 33.1458 33.3177 33.5885 32.9531 33.9531C32.5885 34.3177 32.1458 34.5 31.625 34.5H17.875C17.3542 34.5 16.9115 34.3177 16.5469 33.9531C16.1823 33.5885 16 33.1458 16 32.625V30.9844C16 29.5521 16.5078 28.3281 17.5234 27.3125C18.5651 26.2708 19.8021 25.75 21.2344 25.75H21.8984C22.8099 26.1667 23.7604 26.375 24.75 26.375C25.7396 26.375 26.6901 26.1667 27.6016 25.75H28.2656Z"
|
||||
fill="currentColor"
|
||||
:class="color"
|
||||
/>
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
colorClass: {
|
||||
color: {
|
||||
type: String,
|
||||
default: 'text-primary-500',
|
||||
default: 'fill-primary-500 dark:fill-white',
|
||||
},
|
||||
bgColor: {
|
||||
type: String,
|
||||
default: 'fill-gray-100 dark:fill-primary-400',
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
@ -6,10 +6,24 @@
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<circle cx="25" cy="25" r="25" fill="#FDE4E5" />
|
||||
<circle :class="bgColor" cx="25" cy="25" r="25" />
|
||||
<path
|
||||
:class="color"
|
||||
d="M27.2031 23.6016C28.349 23.9401 29.2083 24.6562 29.7812 25.75C30.3802 26.8438 30.4714 27.9766 30.0547 29.1484C29.7422 30.0078 29.2083 30.6979 28.4531 31.2188C27.6979 31.7135 26.8516 31.974 25.9141 32V33.875C25.9141 34.0573 25.849 34.2005 25.7188 34.3047C25.6146 34.4349 25.4714 34.5 25.2891 34.5H24.0391C23.8568 34.5 23.7005 34.4349 23.5703 34.3047C23.4661 34.2005 23.4141 34.0573 23.4141 33.875V32C22.1641 32 21.0443 31.6094 20.0547 30.8281C19.8984 30.6979 19.8073 30.5417 19.7812 30.3594C19.7552 30.1771 19.8203 30.0208 19.9766 29.8906L21.3047 28.5625C21.5651 28.3281 21.8255 28.3021 22.0859 28.4844C22.4766 28.7448 22.9193 28.875 23.4141 28.875H25.9922C26.3307 28.875 26.6042 28.7708 26.8125 28.5625C27.0469 28.3281 27.1641 28.0417 27.1641 27.7031C27.1641 27.1302 26.8906 26.7656 26.3438 26.6094L22.3203 25.4375C21.4349 25.1771 20.6927 24.7083 20.0938 24.0312C19.4948 23.3542 19.1432 22.5729 19.0391 21.6875C18.9349 20.4115 19.2995 19.3177 20.1328 18.4062C20.9922 17.4688 22.0599 17 23.3359 17H23.4141V15.125C23.4141 14.9427 23.4661 14.7995 23.5703 14.6953C23.7005 14.5651 23.8568 14.5 24.0391 14.5H25.2891C25.4714 14.5 25.6146 14.5651 25.7188 14.6953C25.849 14.7995 25.9141 14.9427 25.9141 15.125V17C27.1641 17 28.2839 17.3906 29.2734 18.1719C29.4297 18.3021 29.5208 18.4583 29.5469 18.6406C29.5729 18.8229 29.5078 18.9792 29.3516 19.1094L28.0234 20.4375C27.763 20.6719 27.5026 20.6979 27.2422 20.5156C26.8516 20.2552 26.4089 20.125 25.9141 20.125H23.3359C22.9974 20.125 22.7109 20.2422 22.4766 20.4766C22.2682 20.6849 22.1641 20.9583 22.1641 21.2969C22.1641 21.5312 22.2422 21.7526 22.3984 21.9609C22.5547 22.1693 22.75 22.3125 22.9844 22.3906L27.2031 23.6016Z"
|
||||
fill="#FB7178"
|
||||
/>
|
||||
</svg>
|
||||
</template>
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
color: {
|
||||
type: String,
|
||||
default: 'fill-red-400 dark:fill-white',
|
||||
},
|
||||
bgColor: {
|
||||
type: String,
|
||||
default: 'fill-red-100 dark:fill-red-400',
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
@ -5,21 +5,24 @@
|
||||
viewBox="0 0 50 50"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
:class="colorClass"
|
||||
>
|
||||
<circle cx="25" cy="25" r="25" fill="#EAF1FB" />
|
||||
<circle cx="25" cy="25" r="25" :class="bgColor" />
|
||||
<path
|
||||
d="M26.75 19.8125C26.75 20.0729 26.8411 20.2943 27.0234 20.4766C27.2057 20.6589 27.4271 20.75 27.6875 20.75H33V33.5625C33 33.8229 32.9089 34.0443 32.7266 34.2266C32.5443 34.4089 32.3229 34.5 32.0625 34.5H18.9375C18.6771 34.5 18.4557 34.4089 18.2734 34.2266C18.0911 34.0443 18 33.8229 18 33.5625V15.4375C18 15.1771 18.0911 14.9557 18.2734 14.7734C18.4557 14.5911 18.6771 14.5 18.9375 14.5H26.75V19.8125ZM33 19.2656V19.5H28V14.5H28.2344C28.4948 14.5 28.7161 14.5911 28.8984 14.7734L32.7266 18.6016C32.9089 18.7839 33 19.0052 33 19.2656Z"
|
||||
fill="currentColor"
|
||||
:class="color"
|
||||
/>
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
colorClass: {
|
||||
color: {
|
||||
type: String,
|
||||
default: 'text-primary-500',
|
||||
default: 'fill-primary-500 dark:fill-white',
|
||||
},
|
||||
bgColor: {
|
||||
type: String,
|
||||
default: 'fill-gray-100 dark:fill-primary-400',
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user