Compare commits

..

3 Commits

Author SHA1 Message Date
6740f66903 fix remaining label for dark mode 2023-03-30 13:43:41 +05:30
29430ccc5d fix dark issue in customer view page 2023-03-29 17:52:55 +05:30
065775633d add dark mode for label 2023-03-29 17:01:21 +05:30
69 changed files with 552 additions and 586 deletions

View File

@ -43,12 +43,6 @@
max-w-full max-w-full
left-0 left-0
top-3 top-3
bg-white
dark:border
dark:border-white/10
dark:text-white
dark:bg-gray-800
dark:shadow-glass
" "
> >
<div <div
@ -59,7 +53,7 @@
ring-1 ring-black ring-opacity-5 ring-1 ring-black ring-opacity-5
" "
> >
<div class="relative grid bg-white dark:bg-gray-800"> <div class="relative grid bg-white">
<div class="relative p-4"> <div class="relative p-4">
<BaseInput <BaseInput
v-model="textSearch" v-model="textSearch"
@ -72,7 +66,7 @@
<div <div
v-if="filteredNotes.length > 0" v-if="filteredNotes.length > 0"
class="relative flex flex-col overflow-auto list max-h-36 dark:border-white/10" class="relative flex flex-col overflow-auto list max-h-36"
> >
<div <div
v-for="(note, index) in filteredNotes" v-for="(note, index) in filteredNotes"
@ -85,8 +79,6 @@
cursor-pointer cursor-pointer
hover:bg-gray-100 hover:cursor-pointer hover:bg-gray-100 hover:cursor-pointer
last:border-b-0 last:border-b-0
dark:border-gray-600
dark:border-white/10 dark:hover:bg-gray-700/30
" "
@click="selectNote(index, close)" @click="selectNote(index, close)"
> >
@ -127,10 +119,6 @@
bg-gray-200 bg-gray-200
border-none border-none
outline-none outline-none
dark:bg-gray-600/70
dark:backdrop-blur-xl
dark:shadow-glass
dark:hover:bg-gray-600/80
" "
@click="openNoteModal" @click="openNoteModal"
> >

View File

@ -1,13 +1,5 @@
<template> <template>
<tr <tr class="box-border bg-white border border-gray-200 border-solid rounded-b">
class="
box-border
bg-white
border border-gray-200 border-solid
rounded-b
dark:shadow-glass dark:border dark:border-white/10 dark:bg-gray-800/70
"
>
<td colspan="5" class="p-0 text-left align-top"> <td colspan="5" class="p-0 text-left align-top">
<table class="w-full"> <table class="w-full">
<colgroup> <colgroup>
@ -138,7 +130,7 @@
<div class="flex items-center justify-center w-6 h-10 mx-2"> <div class="flex items-center justify-center w-6 h-10 mx-2">
<BaseIcon <BaseIcon
v-if="showRemoveButton" v-if="showRemoveButton"
class="h-5 dark:text-red-400 cursor-pointer" class="h-5 text-gray-700 cursor-pointer"
name="TrashIcon" name="TrashIcon"
@click="store.removeItem(index)" @click="store.removeItem(index)"
/> />

View File

@ -30,22 +30,7 @@
<template v-if="userStore.hasAbilities(ability)" #action> <template v-if="userStore.hasAbilities(ability)" #action>
<button <button
type="button" type="button"
class=" class="flex items-center justify-center w-full px-2 py-2 bg-gray-200 border-none outline-none cursor-pointer "
flex
items-center
justify-center
w-full
px-2
py-2
bg-gray-200
border-none
outline-none
cursor-pointer
dark:bg-gray-600/70
dark:backdrop-blur-xl
dark:shadow-glass
dark:hover:bg-gray-600/80
"
@click="openTaxModal" @click="openTaxModal"
> >
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" /> <BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
@ -68,7 +53,7 @@
<BaseIcon <BaseIcon
v-if="taxes.length && index !== taxes.length - 1" v-if="taxes.length && index !== taxes.length - 1"
name="TrashIcon" name="TrashIcon"
class="h-5 text-gray-700 dark:text-red-400 cursor-pointer" class="h-5 text-gray-700 cursor-pointer"
@click="removeTax(index)" @click="removeTax(index)"
/> />
</div> </div>

View File

@ -1,6 +1,4 @@
<template> <template>
<div class="relative" >
<BaseDarkHighlight class="z-[-1]" />
<table class="text-center item-table min-w-full"> <table class="text-center item-table min-w-full">
<colgroup> <colgroup>
<col style="width: 40%; min-width: 280px" /> <col style="width: 40%; min-width: 280px" />
@ -12,15 +10,7 @@
/> />
<col style="width: 15%; min-width: 120px" /> <col style="width: 15%; min-width: 120px" />
</colgroup> </colgroup>
<thead <thead class="bg-white border border-gray-200 border-solid">
class="
bg-white
border
border-gray-200
border-solid
dark:shadow-glass dark:border dark:border-white/10 dark:bg-gray-800/70
"
>
<tr> <tr>
<th <th
class=" class="
@ -32,7 +22,6 @@
leading-5 leading-5
text-left text-gray-700 text-left text-gray-700
border-t border-b border-gray-200 border-solid border-t border-b border-gray-200 border-solid
dark:text-white dark:border-white/10
" "
> >
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
@ -52,7 +41,6 @@
leading-5 leading-5
text-right text-gray-700 text-right text-gray-700
border-t border-b border-gray-200 border-solid border-t border-b border-gray-200 border-solid
dark:text-white dark:border-white/10
" "
> >
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
@ -72,7 +60,6 @@
leading-5 leading-5
text-left text-gray-700 text-left text-gray-700
border-t border-b border-gray-200 border-solid border-t border-b border-gray-200 border-solid
dark:text-white dark:border-white/10
" "
> >
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
@ -93,7 +80,6 @@
leading-5 leading-5
text-left text-gray-700 text-left text-gray-700
border-t border-b border-gray-200 border-solid border-t border-b border-gray-200 border-solid
dark:text-white dark:border-white/10
" "
> >
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
@ -113,7 +99,6 @@
leading-5 leading-5
text-right text-gray-700 text-right text-gray-700
border-t border-b border-gray-200 border-solid border-t border-b border-gray-200 border-solid
dark:text-white dark:border-white/10
" "
> >
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
@ -160,14 +145,12 @@
cursor-pointer cursor-pointer
text-primary-400 text-primary-400
hover:bg-primary-100 hover:bg-primary-100
dark:bg-gray-900/50 dark:border-white/10 dark:hover:bg-gray-900/80
" "
@click="store.addItem" @click="store.addItem"
> >
<BaseIcon name="PlusCircleIcon" class="mr-2" /> <BaseIcon name="PlusCircleIcon" class="mr-2" />
{{ $t('general.add_new_item') }} {{ $t('general.add_new_item') }}
</div> </div>
</div>
</template> </template>
<script setup> <script setup>

View File

@ -6,7 +6,6 @@
mt-6 mt-6
bg-white bg-white
border border-gray-200 border-solid border border-gray-200 border-solid
dark:bg-gray-800/50 dark:border-white/10
rounded rounded
md:min-w-[390px] md:min-w-[390px]
min-w-[300px] min-w-[300px]
@ -193,7 +192,6 @@
pt-2 pt-2
mt-5 mt-5
border-t border-gray-200 border-solid border-t border-gray-200 border-solid
dark:border-gray-600
" "
> >
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
@ -201,7 +199,7 @@
</BaseContentPlaceholders> </BaseContentPlaceholders>
<label <label
v-else v-else
class="m-0 text-sm font-semibold leading-5 text-gray-400 uppercase dark:text-gray-400" class="m-0 text-sm font-semibold leading-5 text-gray-400 uppercase"
>{{ $t('estimates.total') }} {{ $t('estimates.amount') }}:</label >{{ $t('estimates.total') }} {{ $t('estimates.amount') }}:</label
> >

View File

@ -17,7 +17,7 @@
<BaseIcon <BaseIcon
name="TrashIcon" name="TrashIcon"
class="h-5 ml-2 cursor-pointer dark:text-red-400" class="h-5 ml-2 cursor-pointer"
@click="$emit('remove', tax.id)" @click="$emit('remove', tax.id)"
/> />
</label> </label>

View File

@ -44,7 +44,7 @@
> >
<!-- Tax Search Input --> <!-- Tax Search Input -->
<div class="relative bg-white dark:bg-gray-800"> <div class="relative bg-white">
<div class="relative p-4"> <div class="relative p-4">
<BaseInput <BaseInput
v-model="textSearch" v-model="textSearch"
@ -65,14 +65,13 @@
list list
max-h-36 max-h-36
border-t border-gray-200 border-t border-gray-200
dark:border-gray-600
" "
> >
<div <div
v-for="(taxType, index) in filteredTaxType" v-for="(taxType, index) in filteredTaxType"
:key="index" :key="index"
:class="{ :class="{
'bg-gray-100 cursor-not-allowed opacity-50 pointer-events-none dark:bg-gray-900': 'bg-gray-100 cursor-not-allowed opacity-50 pointer-events-none':
taxes.find((val) => { taxes.find((val) => {
return val.tax_type_id === taxType.id return val.tax_type_id === taxType.id
}), }),
@ -85,7 +84,6 @@
cursor-pointer cursor-pointer
hover:bg-gray-100 hover:cursor-pointer hover:bg-gray-100 hover:cursor-pointer
last:border-b-0 last:border-b-0
dark:border-gray-600 dark:hover:bg-gray-700/20
" "
@click="selectTaxType(taxType, close)" @click="selectTaxType(taxType, close)"
> >
@ -142,10 +140,6 @@
bg-gray-200 bg-gray-200
border-none border-none
outline-none outline-none
dark:bg-gray-600/70
dark:backdrop-blur-xl
dark:shadow-glass
dark:hover:bg-gray-600/80
" "
@click="openTaxTypeModal" @click="openTaxTypeModal"
> >

View File

@ -40,7 +40,6 @@
px-4 px-4
md:px-8 md:px-8
py-1.5 py-1.5
dark:text-gray-200
" "
> >
{{ $tc('settings.roles.permission', 2) }} {{ $tc('settings.roles.permission', 2) }}

View File

@ -1,8 +1,8 @@
<template> <template>
<div class="h-screen overflow-y-auto text-base dark:bg-gray-800/80 dark:text-white"> <div class="h-screen overflow-y-auto text-base">
<NotificationRoot /> <NotificationRoot />
<div class="container px-4 mx-auto"> <div class="container mx-auto px-4">
<router-view /> <router-view />
</div> </div>
</div> </div>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="grid h-screen grid-cols-12 overflow-y-hidden bg-gray-100 dark:bg-gray-900"> <div class="grid h-screen grid-cols-12 overflow-y-hidden bg-gray-100">
<NotificationRoot /> <NotificationRoot />
<div <div

View File

@ -68,8 +68,10 @@
</TransitionChild> </TransitionChild>
<div class="flex-1 h-0 pt-5 pb-4 overflow-y-auto"> <div class="flex-1 h-0 pt-5 pb-4 overflow-y-auto">
<div class="flex items-center shrink-0 px-4 mb-10"> <div class="flex items-center shrink-0 px-4 mb-10">
<img class="h-auto max-w-full w-36 hidden dark:block" :src="getDarkLogo"/> <MainLogo
<img class="h-auto max-w-full w-36 block dark:hidden" :src="getLightLogo"/> class="block h-auto max-w-full w-36 text-primary-400"
alt="Crater Logo"
/>
</div> </div>
<nav <nav
@ -93,7 +95,7 @@
:name="item.icon" :name="item.icon"
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'text-primary-500 dark:text-primary-400' ? 'text-primary-500 '
: 'text-gray-400', : 'text-gray-400',
'mr-4 shrink-0 h-5 w-5', 'mr-4 shrink-0 h-5 w-5',
]" ]"
@ -149,7 +151,7 @@
:name="item.icon" :name="item.icon"
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'text-primary-500 dark:text-primary-400' ? 'text-primary-500 group-hover:text-primary-500 dark:text-primary-400 dark:group-hover:text-primary-500 '
: 'text-gray-400 group-hover:text-black dark:text-gray-400 dark:group-hover:text-white', : 'text-gray-400 group-hover:text-black dark:text-gray-400 dark:group-hover:text-white',
'mr-4 shrink-0 h-5 w-5 ', 'mr-4 shrink-0 h-5 w-5 ',
]" ]"
@ -165,7 +167,8 @@
</template> </template>
<script setup> <script setup>
import { computed } from 'vue' import MainLogo from '@/scripts/components/icons/MainLogo.vue'
import { import {
Dialog, Dialog,
DialogOverlay, DialogOverlay,
@ -180,9 +183,6 @@ import LightDarkSwitch from '@/scripts/components/LightDarkSwitcher.vue'
const route = useRoute() const route = useRoute()
const globalStore = useGlobalStore() const globalStore = useGlobalStore()
const getDarkLogo = computed(() => new URL('/img/logo-white.png', import.meta.url))
const getLightLogo = computed(() => new URL('/img/crater-logo.png', import.meta.url))
function hasActiveUrl(url) { function hasActiveUrl(url) {
return route.path.indexOf(url) > -1 return route.path.indexOf(url) > -1
} }

View File

@ -34,7 +34,8 @@ export const useGlobalStore = (useWindow = false) => {
isAppLoaded: false, isAppLoaded: false,
isSidebarOpen: false, isSidebarOpen: false,
areCurrenciesLoading: false, areCurrenciesLoading: false,
isDarkModeOn: localStorage.getItem('theme') === 'dark' || document.documentElement.classList.contains('dark'), isDarkModeOn: false,
downloadReport: null, downloadReport: null,
}), }),

View File

@ -32,7 +32,7 @@
<div class="mt-4 mb-4 text-sm"> <div class="mt-4 mb-4 text-sm">
<router-link <router-link
to="/login" to="/login"
class="text-sm text-primary-400 hover:text-gray-700 dark:hover:text-primary-500" class="text-sm text-primary-400 hover:text-gray-700"
> >
{{ $t('general.back_to_login') }} {{ $t('general.back_to_login') }}
</router-link> </router-link>

View File

@ -49,7 +49,7 @@
<div class="mb-4"> <div class="mb-4">
<router-link <router-link
to="forgot-password" to="forgot-password"
class="text-sm text-primary-400 hover:text-gray-700 dark:hover:text-primary-500" class="text-sm text-primary-400 hover:text-gray-700"
> >
{{ $t('login.forgot_password') }} {{ $t('login.forgot_password') }}
</router-link> </router-link>

View File

@ -113,7 +113,7 @@
</span> </span>
</template> </template>
<BaseDropdownItem @click="removeMultipleCustomers"> <BaseDropdownItem @click="removeMultipleCustomers">
<BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" />
{{ $t('general.delete') }} {{ $t('general.delete') }}
</BaseDropdownItem> </BaseDropdownItem>
</BaseDropdown> </BaseDropdown>
@ -154,7 +154,7 @@
:text="row.data.name" :text="row.data.name"
:length="30" :length="30"
tag="span" tag="span"
class="font-medium text-primary-500 flex flex-col dark:text-primary-400" class="font-medium text-primary-500 flex flex-col"
/> />
<BaseText <BaseText
:text="row.data.contact_name ? row.data.contact_name : ''" :text="row.data.contact_name ? row.data.contact_name : ''"

View File

@ -34,8 +34,8 @@
v-if="userStore.hasAbilities(abilities.CREATE_ESTIMATE)" v-if="userStore.hasAbilities(abilities.CREATE_ESTIMATE)"
:to="`/admin/estimates/create?customer=${$route.params.id}`" :to="`/admin/estimates/create?customer=${$route.params.id}`"
> >
<BaseDropdownItem v-slot="slotProps"> <BaseDropdownItem class="">
<BaseIcon name="DocumentIcon" :class="slotProps.class" /> <BaseIcon name="DocumentIcon" class="mr-3 text-gray-600" />
{{ $t('estimates.new_estimate') }} {{ $t('estimates.new_estimate') }}
</BaseDropdownItem> </BaseDropdownItem>
</router-link> </router-link>
@ -44,8 +44,8 @@
v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)" v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
:to="`/admin/invoices/create?customer=${$route.params.id}`" :to="`/admin/invoices/create?customer=${$route.params.id}`"
> >
<BaseDropdownItem v-slot="slotProps"> <BaseDropdownItem>
<BaseIcon name="DocumentTextIcon" :class="slotProps.class" /> <BaseIcon name="DocumentTextIcon" class="mr-3 text-gray-600" />
{{ $t('invoices.new_invoice') }} {{ $t('invoices.new_invoice') }}
</BaseDropdownItem> </BaseDropdownItem>
</router-link> </router-link>
@ -54,8 +54,8 @@
v-if="userStore.hasAbilities(abilities.CREATE_PAYMENT)" v-if="userStore.hasAbilities(abilities.CREATE_PAYMENT)"
:to="`/admin/payments/create?customer=${$route.params.id}`" :to="`/admin/payments/create?customer=${$route.params.id}`"
> >
<BaseDropdownItem v-slot="slotProps"> <BaseDropdownItem>
<BaseIcon name="CreditCardIcon" :class="slotProps.class" /> <BaseIcon name="CreditCardIcon" class="mr-3 text-gray-600" />
{{ $t('payments.new_payment') }} {{ $t('payments.new_payment') }}
</BaseDropdownItem> </BaseDropdownItem>
</router-link> </router-link>
@ -64,8 +64,8 @@
v-if="userStore.hasAbilities(abilities.CREATE_EXPENSE)" v-if="userStore.hasAbilities(abilities.CREATE_EXPENSE)"
:to="`/admin/expenses/create?customer=${$route.params.id}`" :to="`/admin/expenses/create?customer=${$route.params.id}`"
> >
<BaseDropdownItem v-slot="slotProps"> <BaseDropdownItem>
<BaseIcon name="CalculatorIcon" :class="slotProps.class" /> <BaseIcon name="CalculatorIcon" class="mr-3 text-gray-600" />
{{ $t('expenses.new_expense') }} {{ $t('expenses.new_expense') }}
</BaseDropdownItem> </BaseDropdownItem>
</router-link> </router-link>

View File

@ -13,7 +13,6 @@
xl:ml-64 xl:ml-64
w-88 w-88
xl:block xl:block
dark:bg-gray-800
" "
> >
<div <div
@ -26,7 +25,6 @@
pb-2 pb-2
border border-gray-200 border-solid border border-gray-200 border-solid
height-full height-full
dark:border-gray-600
" "
> >
<BaseInput <BaseInput
@ -61,7 +59,6 @@
mb-2 mb-2
text-sm text-sm
border-b border-gray-200 border-solid border-b border-gray-200 border-solid
dark:border-gray-600
" "
> >
{{ $t('general.sort_by') }} {{ $t('general.sort_by') }}
@ -117,7 +114,6 @@
border-l border-gray-200 border-solid border-l border-gray-200 border-solid
sidebar sidebar
base-scroll base-scroll
dark:border-gray-600
" "
> >
<div v-for="(customer, index) in customerList" :key="index"> <div v-for="(customer, index) in customerList" :key="index">
@ -126,9 +122,9 @@
:id="'customer-' + customer.id" :id="'customer-' + customer.id"
:to="`/admin/customers/${customer.id}/view`" :to="`/admin/customers/${customer.id}/view`"
:class="[ :class="[
'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent dark:hover:bg-gray-700', 'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent',
{ {
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:border-primary-400 dark:bg-gray-700': 'bg-gray-100 border-l-4 border-primary-500 border-solid':
hasActiveUrl(customer.id), hasActiveUrl(customer.id),
}, },
]" ]"
@ -147,7 +143,6 @@
text-black text-black
capitalize capitalize
truncate truncate
dark:text-white
" "
/> />
@ -162,7 +157,6 @@
font-medium font-medium
leading-5 leading-5
text-gray-600 text-gray-600
dark:text-gray-400
" "
/> />
</div> </div>
@ -181,7 +175,7 @@
</div> </div>
<p <p
v-if="!customerList?.length && !isFetching" v-if="!customerList?.length && !isFetching"
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300" class="flex justify-center px-4 mt-5 text-sm text-gray-600"
> >
{{ $t('customers.no_matching_customers') }} {{ $t('customers.no_matching_customers') }}
</p> </p>

View File

@ -28,7 +28,7 @@
<template #cell-user="{ row }"> <template #cell-user="{ row }">
<router-link <router-link
:to="{ path: `invoices/${row.data.id}/view` }" :to="{ path: `invoices/${row.data.id}/view` }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.customer.name }} {{ row.data.customer.name }}
</router-link> </router-link>
@ -78,7 +78,7 @@
<template #cell-user="{ row }"> <template #cell-user="{ row }">
<router-link <router-link
:to="{ path: `estimates/${row.data.id}/view` }" :to="{ path: `estimates/${row.data.id}/view` }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.customer.name }} {{ row.data.customer.name }}
</router-link> </router-link>

View File

@ -164,7 +164,7 @@
</template> </template>
<BaseDropdownItem @click="removeMultipleEstimates"> <BaseDropdownItem @click="removeMultipleEstimates">
<BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" />
{{ $t('general.delete') }} {{ $t('general.delete') }}
</BaseDropdownItem> </BaseDropdownItem>
</BaseDropdown> </BaseDropdown>
@ -205,7 +205,7 @@
<template #cell-estimate_number="{ row }"> <template #cell-estimate_number="{ row }">
<router-link <router-link
:to="{ path: `estimates/${row.data.id}/view` }" :to="{ path: `estimates/${row.data.id}/view` }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.estimate_number }} {{ row.data.estimate_number }}
</router-link> </router-link>

View File

@ -50,7 +50,6 @@
xl:ml-64 xl:ml-64
w-88 w-88
xl:block xl:block
dark:bg-gray-800
" "
> >
<div <div
@ -63,7 +62,6 @@
pb-2 pb-2
border border-gray-200 border-solid border border-gray-200 border-solid
height-full height-full
dark:border-gray-600
" "
> >
<div class="mb-6"> <div class="mb-6">
@ -98,10 +96,9 @@
px-4 px-4
py-1 py-1
pb-2 pb-2
mb-2 mb-1 mb-2
text-sm text-sm
border-b border-gray-200 border-solid border-b border-gray-200 border-solid
dark:border-gray-600
" "
> >
{{ $t('general.sort_by') }} {{ $t('general.sort_by') }}
@ -164,7 +161,6 @@
overflow-y-scroll overflow-y-scroll
border-l border-gray-200 border-solid border-l border-gray-200 border-solid
base-scroll base-scroll
dark:border-gray-600
" "
> >
<div v-for="(estimate, index) in estimateList" :key="index"> <div v-for="(estimate, index) in estimateList" :key="index">
@ -173,9 +169,9 @@
:id="'estimate-' + estimate.id" :id="'estimate-' + estimate.id"
:to="`/admin/estimates/${estimate.id}/view`" :to="`/admin/estimates/${estimate.id}/view`"
:class="[ :class="[
'flex justify-between side-estimate p-4 cursor-pointer hover:bg-gray-100 items-center border-l-4 border-transparent dark:hover:bg-gray-700', 'flex justify-between side-estimate p-4 cursor-pointer hover:bg-gray-100 items-center border-l-4 border-transparent',
{ {
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:border-primary-400 dark:bg-gray-700': 'bg-gray-100 border-l-4 border-primary-500 border-solid':
hasActiveUrl(estimate.id), hasActiveUrl(estimate.id),
}, },
]" ]"
@ -195,7 +191,6 @@
text-black text-black
capitalize capitalize
truncate truncate
dark:text-white
" "
/> />
@ -208,7 +203,6 @@
font-medium font-medium
leading-5 leading-5
text-gray-600 text-gray-600
dark:text-gray-400
" "
> >
{{ estimate.estimate_number }} {{ estimate.estimate_number }}
@ -234,7 +228,6 @@
font-semibold font-semibold
leading-8 leading-8
text-right text-gray-900 text-right text-gray-900
dark:text-white
" "
/> />
@ -246,7 +239,6 @@
leading-5 leading-5
text-right text-gray-600 text-right text-gray-600
est-date est-date
dark:text-gray-400
" "
> >
{{ estimate.formatted_estimate_date }} {{ estimate.formatted_estimate_date }}
@ -259,7 +251,7 @@
</div> </div>
<p <p
v-if="!estimateList?.length && !isLoading" v-if="!estimateList?.length && !isLoading"
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300" class="flex justify-center px-4 mt-5 text-sm text-gray-600"
> >
{{ $t('estimates.no_matching_estimates') }} {{ $t('estimates.no_matching_estimates') }}
</p> </p>

View File

@ -135,7 +135,7 @@
v-if="userStore.hasAbilities(abilities.DELETE_EXPENSE)" v-if="userStore.hasAbilities(abilities.DELETE_EXPENSE)"
@click="removeMultipleExpenses" @click="removeMultipleExpenses"
> >
<BaseIcon name="TrashIcon" class="h-5 mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> <BaseIcon name="TrashIcon" class="h-5 mr-3 text-gray-600" />
{{ $t('general.delete') }} {{ $t('general.delete') }}
</BaseDropdownItem> </BaseDropdownItem>
</BaseDropdown> </BaseDropdown>
@ -171,7 +171,7 @@
<template #cell-name="{ row }"> <template #cell-name="{ row }">
<router-link <router-link
:to="{ path: `expenses/${row.data.id}/edit` }" :to="{ path: `expenses/${row.data.id}/edit` }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.expense_category.name }} {{ row.data.expense_category.name }}
</router-link> </router-link>

View File

@ -1,6 +1,5 @@
<template> <template>
<div class="flex flex-col items-center justify-between w-full pt-10"> <div class="flex flex-col items-center justify-between w-full pt-10">
<LightDarkButton class="absolute z-10 top-2 right-2"/>
<img <img
id="logo-crater" id="logo-crater"
src="/img/crater-logo.png" src="/img/crater-logo.png"
@ -30,7 +29,6 @@ import Step7CompanyInfo from './Step7CompanyInfo.vue'
import Step8CompanyPreferences from './Step8CompanyPreferences.vue' import Step8CompanyPreferences from './Step8CompanyPreferences.vue'
import { useInstallationStore } from '@/scripts/admin/stores/installation' import { useInstallationStore } from '@/scripts/admin/stores/installation'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import LightDarkButton from '@/scripts/components/LightDarkButton.vue'
export default { export default {
components: { components: {
@ -42,7 +40,6 @@ export default {
step_6: Step6AccountSettings, step_6: Step6AccountSettings,
step_7: Step7CompanyInfo, step_7: Step7CompanyInfo,
step_8: Step8CompanyPreferences, step_8: Step8CompanyPreferences,
LightDarkButton
}, },
setup() { setup() {

View File

@ -7,7 +7,7 @@
<div class="mb-6"> <div class="mb-6">
<div <div
v-if="phpSupportInfo" v-if="phpSupportInfo"
class="grid grid-flow-row grid-cols-3 p-3 border border-gray-200 lg:gap-24 sm:gap-4 dark:border-white/10" class="grid grid-flow-row grid-cols-3 p-3 border border-gray-200 lg:gap-24 sm:gap-4"
> >
<div class="col-span-2 text-sm"> <div class="col-span-2 text-sm">
{{ {{
@ -32,7 +32,7 @@
<div <div
v-for="(requirement, index) in requirements" v-for="(requirement, index) in requirements"
:key="index" :key="index"
class="grid grid-flow-row grid-cols-3 p-3 border border-gray-200 dark:border-gray-600 lg:gap-24 sm:gap-4" class="grid grid-flow-row grid-cols-3 p-3 border border-gray-200 lg:gap-24 sm:gap-4"
> >
<div class="col-span-2 text-sm"> <div class="col-span-2 text-sm">
{{ index }} {{ index }}

View File

@ -8,7 +8,12 @@
<div <div
v-for="(permission, index) in 3" v-for="(permission, index) in 3"
:key="index" :key="index"
class="grid grid-flow-row grid-cols-3 border border-gray-200 lg:gap-24 sm:gap-4 dark:border-gray-600" class="
grid grid-flow-row grid-cols-3
lg:gap-24
sm:gap-4
border border-gray-200
"
> >
<BaseContentPlaceholdersText :lines="1" class="col-span-4 p-3" /> <BaseContentPlaceholdersText :lines="1" class="col-span-4 p-3" />
</div> </div>
@ -24,7 +29,7 @@
<div <div
v-for="(permission, index) in permissions" v-for="(permission, index) in permissions"
:key="index" :key="index"
class="border border-gray-200 dark:border-gray-600" class="border border-gray-200"
> >
<div class="grid grid-flow-row grid-cols-3 lg:gap-24 sm:gap-4"> <div class="grid grid-flow-row grid-cols-3 lg:gap-24 sm:gap-4">
<div class="col-span-2 p-3"> <div class="col-span-2 p-3">
@ -33,11 +38,11 @@
<div class="p-3 text-right"> <div class="p-3 text-right">
<span <span
v-if="permission.isSet" v-if="permission.isSet"
class="inline-block w-4 h-4 ml-3 mr-2 bg-green-500 rounded-full" class="inline-block w-4 h-4 ml-3 mr-2 rounded-full bg-green-500"
/> />
<span <span
v-else v-else
class="inline-block w-4 h-4 ml-3 mr-2 bg-red-500 rounded-full" class="inline-block w-4 h-4 ml-3 mr-2 rounded-full bg-red-500"
/> />
<span>{{ permission.permission }}</span> <span>{{ permission.permission }}</span>
</div> </div>

View File

@ -2,6 +2,7 @@
<BaseWizardStep <BaseWizardStep
:title="$t('wizard.database.database')" :title="$t('wizard.database.database')"
:description="$t('wizard.database.desc')" :description="$t('wizard.database.desc')"
step-container="w-full p-8 mb-8 bg-white border border-gray-200 border-solid rounded md:w-full"
> >
<component <component
:is="databaseData.database_connection" :is="databaseData.database_connection"

View File

@ -18,18 +18,18 @@
</BaseInputGroup> </BaseInputGroup>
</div> </div>
<p class="mt-4 mb-0 text-sm text-gray-600 dark:text-white">Notes:</p> <p class="mt-4 mb-0 text-sm text-gray-600">Notes:</p>
<ul class="w-full text-gray-600 list-disc list-inside dark:text-gray-300"> <ul class="w-full text-gray-600 list-disc list-inside">
<li class="text-sm leading-8"> <li class="text-sm leading-8">
App domain should not contain App domain should not contain
<b class="inline-block px-1 bg-gray-100 rounded-md dark:bg-gray-400 dark:text-gray-600">https://</b> or <b class="inline-block px-1 bg-gray-100 rounded-sm">https://</b> or
<b class="inline-block px-1 bg-gray-100 rounded-md dark:bg-gray-400 dark:text-gray-600">http</b> in front of <b class="inline-block px-1 bg-gray-100 rounded-sm">http</b> in front of
the domain. the domain.
</li> </li>
<li class="text-sm leading-8"> <li class="text-sm leading-8">
If you're accessing the website on a different port, please mention the If you're accessing the website on a different port, please mention the
port. For example: port. For example:
<b class="inline-block px-1 bg-gray-100 rounded-md dark:bg-gray-400 dark:text-gray-600">localhost:8080</b> <b class="inline-block px-1 bg-gray-100">localhost:8080</b>
</li> </li>
</ul> </ul>

View File

@ -68,15 +68,13 @@
@input="v$.userForm.password.$touch()" @input="v$.userForm.password.$touch()"
> >
<template #right> <template #right>
<BaseIcon <EyeOffIcon
v-if="isShowPassword" v-if="isShowPassword"
name="EyeOffIcon"
class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" class="w-5 h-5 mr-1 text-gray-500 cursor-pointer"
@click="isShowPassword = !isShowPassword" @click="isShowPassword = !isShowPassword"
/> />
<BaseIcon <EyeIcon
v-else v-else
name="EyeIcon"
class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" class="w-5 h-5 mr-1 text-gray-500 cursor-pointer"
@click="isShowPassword = !isShowPassword" @click="isShowPassword = !isShowPassword"
/> />

View File

@ -2,6 +2,7 @@
<BaseWizardStep <BaseWizardStep
:title="$t('wizard.company_info')" :title="$t('wizard.company_info')"
:description="$t('wizard.company_info_desc')" :description="$t('wizard.company_info_desc')"
step-container="bg-white border border-gray-200 border-solid mb-8 md:w-full p-8 rounded w-full"
> >
<form action="" @submit.prevent="next"> <form action="" @submit.prevent="next">
<div class="grid grid-cols-1 mb-4 md:grid-cols-2 md:mb-6"> <div class="grid grid-cols-1 mb-4 md:grid-cols-2 md:mb-6">

View File

@ -2,6 +2,7 @@
<BaseWizardStep <BaseWizardStep
:title="$t('wizard.preferences')" :title="$t('wizard.preferences')"
:description="$t('wizard.preferences_desc')" :description="$t('wizard.preferences_desc')"
step-container="bg-white border border-gray-200 border-solid mb-8 md:w-full p-8 rounded w-full"
> >
<form action="" @submit.prevent="next"> <form action="" @submit.prevent="next">
<div> <div>

View File

@ -178,7 +178,7 @@
</template> </template>
<BaseDropdownItem @click="removeMultipleInvoices"> <BaseDropdownItem @click="removeMultipleInvoices">
<BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" />
{{ $t('general.delete') }} {{ $t('general.delete') }}
</BaseDropdownItem> </BaseDropdownItem>
</BaseDropdown> </BaseDropdown>
@ -220,7 +220,7 @@
<template #cell-invoice_number="{ row }"> <template #cell-invoice_number="{ row }">
<router-link <router-link
:to="{ path: `invoices/${row.data.id}/view` }" :to="{ path: `invoices/${row.data.id}/view` }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.invoice_number }} {{ row.data.invoice_number }}
</router-link> </router-link>

View File

@ -299,7 +299,6 @@ onSearched = debounce(onSearched, 500)
xl:ml-64 xl:ml-64
w-88 w-88
xl:block xl:block
dark:bg-gray-800
" "
> >
<div <div
@ -312,7 +311,6 @@ onSearched = debounce(onSearched, 500)
pb-2 pb-2
border border-gray-200 border-solid border border-gray-200 border-solid
height-full height-full
dark:border-gray-600
" "
> >
<div class="mb-6"> <div class="mb-6">
@ -341,10 +339,9 @@ onSearched = debounce(onSearched, 500)
px-2 px-2
py-1 py-1
pb-2 pb-2
mb-2 mb-1 mb-2
text-sm text-sm
border-b border-gray-200 border-solid border-b border-gray-200 border-solid
dark:border-gray-600
" "
> >
{{ $t('general.sort_by') }} {{ $t('general.sort_by') }}
@ -407,7 +404,6 @@ onSearched = debounce(onSearched, 500)
overflow-y-scroll overflow-y-scroll
border-l border-gray-200 border-solid border-l border-gray-200 border-solid
base-scroll base-scroll
dark:border-gray-600
" "
> >
<div v-for="(invoice, index) in invoiceList" :key="index"> <div v-for="(invoice, index) in invoiceList" :key="index">
@ -416,9 +412,9 @@ onSearched = debounce(onSearched, 500)
:id="'invoice-' + invoice.id" :id="'invoice-' + invoice.id"
:to="`/admin/invoices/${invoice.id}/view`" :to="`/admin/invoices/${invoice.id}/view`"
:class="[ :class="[
'flex justify-between side-invoice p-4 cursor-pointer hover:bg-gray-100 items-center border-l-4 border-transparent dark:hover:bg-gray-700', 'flex justify-between side-invoice p-4 cursor-pointer hover:bg-gray-100 items-center border-l-4 border-transparent',
{ {
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:bg-gray-700': 'bg-gray-100 border-l-4 border-primary-500 border-solid':
hasActiveUrl(invoice.id), hasActiveUrl(invoice.id),
}, },
]" ]"
@ -438,7 +434,6 @@ onSearched = debounce(onSearched, 500)
text-black text-black
capitalize capitalize
truncate truncate
dark:text-white
" "
/> />
@ -451,17 +446,16 @@ onSearched = debounce(onSearched, 500)
font-medium font-medium
leading-5 leading-5
text-gray-600 text-gray-600
dark:text-gray-400
" "
> >
{{ invoice.invoice_number }} {{ invoice.invoice_number }}
</div> </div>
<BaseInvoiceStatusBadge <BaseEstimateStatusBadge
:status="invoice.status" :status="invoice.status"
class="px-1 text-xs" class="px-1 text-xs"
> >
{{ invoice.status }} {{ invoice.status }}
</BaseInvoiceStatusBadge> </BaseEstimateStatusBadge>
</div> </div>
<div class="flex-1 whitespace-nowrap right"> <div class="flex-1 whitespace-nowrap right">
@ -474,7 +468,6 @@ onSearched = debounce(onSearched, 500)
leading-8 leading-8
text-right text-gray-900 text-right text-gray-900
block block
dark:text-white
" "
:amount="invoice.total" :amount="invoice.total"
:currency="invoice.customer.currency" :currency="invoice.customer.currency"
@ -487,7 +480,6 @@ onSearched = debounce(onSearched, 500)
leading-5 leading-5
text-right text-gray-600 text-right text-gray-600
est-date est-date
dark:text-gray-400
" "
> >
{{ invoice.formatted_invoice_date }} {{ invoice.formatted_invoice_date }}
@ -500,7 +492,7 @@ onSearched = debounce(onSearched, 500)
</div> </div>
<p <p
v-if="!invoiceList?.length && !isLoading" v-if="!invoiceList?.length && !isLoading"
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300" class="flex justify-center px-4 mt-5 text-sm text-gray-600"
> >
{{ $t('invoices.no_matching_invoices') }} {{ $t('invoices.no_matching_invoices') }}
</p> </p>

View File

@ -117,7 +117,7 @@
</span> </span>
</template> </template>
<BaseDropdownItem @click="removeMultipleItems"> <BaseDropdownItem @click="removeMultipleItems">
<BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" />
{{ $t('general.delete') }} {{ $t('general.delete') }}
</BaseDropdownItem> </BaseDropdownItem>
</BaseDropdown> </BaseDropdown>
@ -153,7 +153,7 @@
<template #cell-name="{ row }"> <template #cell-name="{ row }">
<router-link <router-link
:to="{ path: `items/${row.data.id}/edit` }" :to="{ path: `items/${row.data.id}/edit` }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.name }} {{ row.data.name }}
</router-link> </router-link>

View File

@ -116,7 +116,7 @@
</span> </span>
</template> </template>
<BaseDropdownItem @click="removeMultiplePayments"> <BaseDropdownItem @click="removeMultiplePayments">
<BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" />
{{ $t('general.delete') }} {{ $t('general.delete') }}
</BaseDropdownItem> </BaseDropdownItem>
</BaseDropdown> </BaseDropdown>
@ -158,7 +158,7 @@
<template #cell-payment_number="{ row }"> <template #cell-payment_number="{ row }">
<router-link <router-link
:to="{ path: `payments/${row.data.id}/view` }" :to="{ path: `payments/${row.data.id}/view` }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.payment_number }} {{ row.data.payment_number }}
</router-link> </router-link>

View File

@ -35,7 +35,6 @@
xl:ml-64 xl:ml-64
w-88 w-88
xl:block xl:block
dark:bg-gray-800
" "
> >
<div <div
@ -47,7 +46,6 @@
pt-8 pt-8
pb-6 pb-6
border border-gray-200 border-solid border border-gray-200 border-solid
dark:border-gray-600
" "
> >
<BaseInput <BaseInput
@ -79,7 +77,6 @@
mb-2 mb-2
text-sm text-sm
border-b border-gray-200 border-solid border-b border-gray-200 border-solid
dark:border-gray-600
" "
> >
{{ $t('general.sort_by') }} {{ $t('general.sort_by') }}
@ -142,7 +139,7 @@
<div <div
ref="paymentListSection" ref="paymentListSection"
class="h-full overflow-y-scroll border-l border-gray-200 border-solid dark:border-gray-600" class="h-full overflow-y-scroll border-l border-gray-200 border-solid"
> >
<div v-for="(payment, index) in paymentList" :key="index"> <div v-for="(payment, index) in paymentList" :key="index">
<router-link <router-link
@ -150,9 +147,9 @@
:id="'payment-' + payment.id" :id="'payment-' + payment.id"
:to="`/admin/payments/${payment.id}/view`" :to="`/admin/payments/${payment.id}/view`"
:class="[ :class="[
'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent dark:hover:bg-gray-700', 'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent',
{ {
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:bg-gray-700': 'bg-gray-100 border-l-4 border-primary-500 border-solid':
hasActiveUrl(payment.id), hasActiveUrl(payment.id),
}, },
]" ]"
@ -172,7 +169,6 @@
text-black text-black
capitalize capitalize
truncate truncate
dark:text-white
" "
/> />
@ -185,7 +181,6 @@
leading-5 leading-5
text-gray-500 text-gray-500
capitalize capitalize
dark:text-gray-400
" "
> >
{{ payment?.payment_number }} {{ payment?.payment_number }}
@ -216,13 +211,12 @@
font-semibold font-semibold
leading-8 leading-8
text-right text-gray-900 text-right text-gray-900
dark:text-white
" "
:amount="payment?.amount" :amount="payment?.amount"
:currency="payment.customer?.currency" :currency="payment.customer?.currency"
/> />
<div class="text-sm text-right text-gray-500 non-italic dark:text-gray-400"> <div class="text-sm text-right text-gray-500 non-italic">
{{ payment.formatted_payment_date }} {{ payment.formatted_payment_date }}
</div> </div>
</div> </div>
@ -233,7 +227,7 @@
</div> </div>
<p <p
v-if="!paymentList?.length && !isLoading" v-if="!paymentList?.length && !isLoading"
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300" class="flex justify-center px-4 mt-5 text-sm text-gray-600"
> >
{{ $t('payments.no_matching_payments') }} {{ $t('payments.no_matching_payments') }}
</p> </p>

View File

@ -151,12 +151,12 @@
" "
> >
{{ $t('general.actions') }} {{ $t('general.actions') }}
<BaseIcon name="ChevronDownIcon"/> <BaseIcon name="ChevronDownIcon" class="h-5" />
</span> </span>
</template> </template>
<BaseDropdownItem @click="removeMultipleRecurringInvoices()"> <BaseDropdownItem @click="removeMultipleRecurringInvoices()">
<BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" />
{{ $t('general.delete') }} {{ $t('general.delete') }}
</BaseDropdownItem> </BaseDropdownItem>
</BaseDropdown> </BaseDropdown>
@ -204,7 +204,7 @@
:text="row.data.customer.name" :text="row.data.customer.name"
:length="30" :length="30"
tag="span" tag="span"
class="font-medium text-primary-500 flex flex-col dark:text-primary-400" class="font-medium text-primary-500 flex flex-col"
/> />
<BaseText <BaseText

View File

@ -152,7 +152,6 @@ onSearched = debounce(onSearched, 500)
xl:ml-64 xl:ml-64
w-88 w-88
xl:block xl:block
dark:bg-gray-800
" "
> >
<div <div
@ -165,7 +164,6 @@ onSearched = debounce(onSearched, 500)
pb-2 pb-2
border border-gray-200 border-solid border border-gray-200 border-solid
height-full height-full
dark:border-gray-600
" "
> >
<div class="mb-6"> <div class="mb-6">
@ -194,10 +192,9 @@ onSearched = debounce(onSearched, 500)
px-2 px-2
py-1 py-1
pb-2 pb-2
mb-2 mb-1 mb-2
text-sm text-sm
border-b border-gray-200 border-solid border-b border-gray-200 border-solid
dark:border-gray-600
" "
> >
{{ $t('general.sort_by') }} {{ $t('general.sort_by') }}
@ -246,7 +243,6 @@ onSearched = debounce(onSearched, 500)
overflow-y-scroll overflow-y-scroll
border-l border-gray-200 border-solid border-l border-gray-200 border-solid
base-scroll base-scroll
dark:border-gray-600
" "
> >
<div v-for="(invoice, index) in invoiceList" :key="index"> <div v-for="(invoice, index) in invoiceList" :key="index">
@ -255,9 +251,9 @@ onSearched = debounce(onSearched, 500)
:id="'recurring-invoice-' + invoice.id" :id="'recurring-invoice-' + invoice.id"
:to="`/admin/recurring-invoices/${invoice.id}/view`" :to="`/admin/recurring-invoices/${invoice.id}/view`"
:class="[ :class="[
'flex justify-between side-invoice p-4 cursor-pointer hover:bg-gray-100 items-center border-l-4 border-transparent dark:hover:bg-gray-700', 'flex justify-between side-invoice p-4 cursor-pointer hover:bg-gray-100 items-center border-l-4 border-transparent',
{ {
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:bg-gray-700': 'bg-gray-100 border-l-4 border-primary-500 border-solid':
hasActiveUrl(invoice.id), hasActiveUrl(invoice.id),
}, },
]" ]"
@ -277,7 +273,6 @@ onSearched = debounce(onSearched, 500)
text-black text-black
capitalize capitalize
truncate truncate
dark:text-white
" "
/> />
@ -290,7 +285,6 @@ onSearched = debounce(onSearched, 500)
font-medium font-medium
leading-5 leading-5
text-gray-600 text-gray-600
dark:text-gray-400
" "
> >
{{ invoice.invoice_number }} {{ invoice.invoice_number }}
@ -313,7 +307,6 @@ onSearched = debounce(onSearched, 500)
font-semibold font-semibold
leading-8 leading-8
text-right text-gray-900 text-right text-gray-900
dark:text-white
" "
:amount="invoice.total" :amount="invoice.total"
:currency="invoice.customer.currency" :currency="invoice.customer.currency"
@ -327,7 +320,6 @@ onSearched = debounce(onSearched, 500)
leading-5 leading-5
text-right text-gray-600 text-right text-gray-600
est-date est-date
dark:text-gray-400
" "
> >
{{ invoice.formatted_starts_at }} {{ invoice.formatted_starts_at }}
@ -340,7 +332,7 @@ onSearched = debounce(onSearched, 500)
</div> </div>
<p <p
v-if="!invoiceList?.length && !isLoading" v-if="!invoiceList?.length && !isLoading"
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300" class="flex justify-center px-4 mt-5 text-sm text-gray-600"
> >
{{ $t('invoices.no_matching_invoices') }} {{ $t('invoices.no_matching_invoices') }}
</p> </p>

View File

@ -92,7 +92,7 @@
<tr <tr
v-for="(ext, i) in requiredExtentions" v-for="(ext, i) in requiredExtentions"
:key="i" :key="i"
class="p-2 border-2 border-gray-200 dark:border-gray-600" class="p-2 border-2 border-gray-200"
> >
<td width="70%" class="p-2 text-sm truncate"> <td width="70%" class="p-2 text-sm truncate">
{{ i }} {{ i }}
@ -121,7 +121,7 @@
{{ $t('settings.update_app.update_progress') }} {{ $t('settings.update_app.update_progress') }}
</h6> </h6>
<p <p
class="mb-8 text-sm leading-snug text-gray-500 dark:text-gray-400" class="mb-8 text-sm leading-snug text-gray-500"
style="max-width: 480px" style="max-width: 480px"
> >
{{ $t('settings.update_app.progress_text') }} {{ $t('settings.update_app.progress_text') }}
@ -135,11 +135,11 @@
<li <li
v-for="step in updateSteps" v-for="step in updateSteps"
:key="step.stepUrl" :key="step.stepUrl"
class="flex justify-between w-full py-3 border-b border-gray-200 dark:border-gray-600 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 dark:text-gray-300 leading-8">{{ $t(step.translationKey) }}</p> <p class="m-0 text-sm leading-8">{{ $t(step.translationKey) }}</p>
<div class="flex flex-row items-center"> <div class="flex flex-row items-center">
<span v-if="step.time" class="mr-3 text-xs text-gray-500 dark:text-gray-300"> <span v-if="step.time" class="mr-3 text-xs text-gray-500">
{{ step.time }} {{ step.time }}
</span> </span>
<span <span
@ -275,7 +275,7 @@ function statusClass(step) {
case 'running': case 'running':
return 'text-blue-400 bg-blue-100' return 'text-blue-400 bg-blue-100'
case 'error': case 'error':
return 'text-red-400 bg-red-200' return 'text-danger bg-red-200'
default: default:
return '' return ''
} }

View File

@ -51,12 +51,27 @@
<BaseInput <BaseInput
v-model.trim="mailDriverStore.mailgunConfig.mail_mailgun_secret" v-model.trim="mailDriverStore.mailgunConfig.mail_mailgun_secret"
:content-loading="isFetchingInitialData" :content-loading="isFetchingInitialData"
type="password" :type="getInputType"
name="mailgun_secret" name="mailgun_secret"
autocomplete="off" autocomplete="off"
:invalid="v$.mailgunConfig.mail_mailgun_secret.$error" :invalid="v$.mailgunConfig.mail_mailgun_secret.$error"
@input="v$.mailgunConfig.mail_mailgun_secret.$touch()" @input="v$.mailgunConfig.mail_mailgun_secret.$touch()"
>
<template #right>
<BaseIcon
v-if="isShowPassword"
class="mr-1 text-gray-500 cursor-pointer"
name="EyeOffIcon"
@click="isShowPassword = !isShowPassword"
/> />
<BaseIcon
v-else
class="mr-1 text-gray-500 cursor-pointer"
name="EyeIcon"
@click="isShowPassword = !isShowPassword"
/>
</template>
</BaseInput>
</BaseInputGroup> </BaseInputGroup>
<BaseInputGroup <BaseInputGroup
@ -169,6 +184,15 @@ const emit = defineEmits(['submit-data', 'on-change-driver'])
const mailDriverStore = useMailDriverStore() const mailDriverStore = useMailDriverStore()
const { t } = useI18n() const { t } = useI18n()
let isShowPassword = ref(false)
const getInputType = computed(() => {
if (isShowPassword.value) {
return 'text'
}
return 'password'
})
const rules = computed(() => { const rules = computed(() => {
return { return {
mailgunConfig: { mailgunConfig: {

View File

@ -146,12 +146,27 @@
<BaseInput <BaseInput
v-model.trim="mailDriverStore.sesConfig.mail_ses_secret" v-model.trim="mailDriverStore.sesConfig.mail_ses_secret"
:content-loading="isFetchingInitialData" :content-loading="isFetchingInitialData"
type="password" :type="getInputType"
name="mail_ses_secret" name="mail_ses_secret"
autocomplete="off" autocomplete="off"
:invalid="v$.sesConfig.mail_ses_secret.$error" :invalid="v$.sesConfig.mail_ses_secret.$error"
@input="v$.sesConfig.mail_ses_secret.$touch()" @input="v$.sesConfig.mail_ses_secret.$touch()"
>
<template #right>
<BaseIcon
v-if="isShowPassword"
class="mr-1 text-gray-500 cursor-pointer"
name="EyeOffIcon"
@click="isShowPassword = !isShowPassword"
/> />
<BaseIcon
v-else
class="mr-1 text-gray-500 cursor-pointer"
name="EyeIcon"
@click="isShowPassword = !isShowPassword"
/>
</template>
</BaseInput>
</BaseInputGroup> </BaseInputGroup>
</BaseInputGrid> </BaseInputGrid>
@ -208,6 +223,7 @@ const emit = defineEmits(['submit-data', 'on-change-driver'])
const mailDriverStore = useMailDriverStore() const mailDriverStore = useMailDriverStore()
const { t } = useI18n() const { t } = useI18n()
let isShowPassword = ref(false)
const encryptions = reactive(['tls', 'ssl', 'starttls']) const encryptions = reactive(['tls', 'ssl', 'starttls'])
const rules = computed(() => { const rules = computed(() => {
@ -248,6 +264,13 @@ const v$ = useVuelidate(
computed(() => mailDriverStore) computed(() => mailDriverStore)
) )
const getInputType = computed(() => {
if (isShowPassword.value) {
return 'text'
}
return 'password'
})
onMounted(() => { onMounted(() => {
for (const key in mailDriverStore.sesConfig) { for (const key in mailDriverStore.sesConfig) {
if (props.configData.hasOwnProperty(key)) { if (props.configData.hasOwnProperty(key)) {

View File

@ -58,9 +58,24 @@
<BaseInput <BaseInput
v-model.trim="mailDriverStore.smtpConfig.mail_password" v-model.trim="mailDriverStore.smtpConfig.mail_password"
:content-loading="isFetchingInitialData" :content-loading="isFetchingInitialData"
type="password" :type="getInputType"
name="password" name="password"
>
<template #right>
<BaseIcon
v-if="isShowPassword"
class="mr-1 text-gray-500 cursor-pointer"
name="EyeOffIcon"
@click="isShowPassword = !isShowPassword"
/> />
<BaseIcon
v-else
class="mr-1 text-gray-500 cursor-pointer"
name="EyeIcon"
@click="isShowPassword = !isShowPassword"
/>
</template>
</BaseInput>
</BaseInputGroup> </BaseInputGroup>
<BaseInputGroup <BaseInputGroup
@ -194,8 +209,17 @@ const emit = defineEmits(['submit-data', 'on-change-driver'])
const mailDriverStore = useMailDriverStore() const mailDriverStore = useMailDriverStore()
const { t } = useI18n() const { t } = useI18n()
let isShowPassword = ref(false)
const encryptions = reactive(['tls', 'ssl', 'starttls']) const encryptions = reactive(['tls', 'ssl', 'starttls'])
const getInputType = computed(() => {
if (isShowPassword.value) {
return 'text'
}
return 'password'
})
const rules = computed(() => { const rules = computed(() => {
return { return {
smtpConfig: { smtpConfig: {

View File

@ -118,11 +118,11 @@
" "
> >
{{ $t('general.actions') }} {{ $t('general.actions') }}
<BaseIcon name="ChevronDownIcon"/> <BaseIcon name="ChevronDownIcon" class="h-5" />
</span> </span>
</template> </template>
<BaseDropdownItem @click="removeMultipleUsers"> <BaseDropdownItem @click="removeMultipleUsers">
<BaseIcon name="TrashIcon" class="h-5 mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> <BaseIcon name="TrashIcon" class="h-5 mr-3 text-gray-600" />
{{ $t('general.delete') }} {{ $t('general.delete') }}
</BaseDropdownItem> </BaseDropdownItem>
</BaseDropdown> </BaseDropdown>
@ -158,7 +158,7 @@
<template #cell-name="{ row }"> <template #cell-name="{ row }">
<router-link <router-link
:to="{ path: `users/${row.data.id}/edit` }" :to="{ path: `users/${row.data.id}/edit` }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.name }} {{ row.data.name }}
</router-link> </router-link>

View File

@ -93,7 +93,6 @@
rounded-full rounded-full
text-primary-500 text-primary-500
dark:bg-gray-600 dark:bg-gray-600
dark:text-primary-400
" "
> >
{{ initGenerator(customer.name) }} {{ initGenerator(customer.name) }}
@ -142,7 +141,6 @@
bg-gray-200 bg-gray-200
rounded-full rounded-full
text-primary-500 text-primary-500
dark:text-primary-400
dark:bg-gray-600 dark:bg-gray-600
" "
> >

View File

@ -1,41 +0,0 @@
<template>
<button
type="button"
class="
flex
h-8
w-8
items-center
justify-center
rounded-md
transition
hover:bg-zinc-900/5
dark:hover:bg-white/5
"
@click="onChange"
>
<BaseIcon v-if="!globalStore.isDarkModeOn" class="h-5 w-5 text-yellow-500" name="SunIcon" />
<BaseIcon v-else class="h-5 w-5 text-white" name="MoonIcon" />
</button>
</template>
<script setup>
import { computed } from 'vue'
import { useGlobalStore } from '@/scripts/customer/stores/global'
const globalStore = useGlobalStore()
function onChange() {
globalStore.isDarkModeOn = !globalStore.isDarkModeOn
if (globalStore.isDarkModeOn) {
localStorage.theme = 'dark'
document.documentElement.classList.add('dark')
document.documentElement.style.setProperty('color-scheme', 'dark')
} else {
localStorage.theme = 'light'
document.documentElement.classList.remove('dark')
document.documentElement.style.setProperty('color-scheme', 'light')
}
}
</script>

View File

@ -16,21 +16,26 @@ defineProps({
const globalStore = useGlobalStore() const globalStore = useGlobalStore()
const enabled = computed({ const enabled = ref(
get: () => globalStore.isDarkModeOn, localStorage.getItem('theme') === 'dark' ||
set: (value) => { document.documentElement.classList.contains('dark')
if (value) { )
globalStore.isDarkModeOn = enabled
function onChange(val) {
if (val) {
localStorage.theme = 'dark' localStorage.theme = 'dark'
document.documentElement.classList.add('dark') document.documentElement.classList.add('dark')
document.documentElement.style.setProperty('color-scheme', 'dark') document.documentElement.style.setProperty('color-scheme', 'dark')
globalStore.isDarkModeOn = true
} else { } else {
localStorage.theme = 'light' localStorage.theme = 'light'
document.documentElement.classList.remove('dark') document.documentElement.classList.remove('dark')
document.documentElement.style.setProperty('color-scheme', 'light') document.documentElement.style.setProperty('color-scheme', 'light')
globalStore.isDarkModeOn = false
}
} }
globalStore.isDarkModeOn = value
},
})
</script> </script>
<template> <template>
@ -44,6 +49,7 @@ const enabled = computed({
v-model="enabled" v-model="enabled"
class="relative inline-flex 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 dark:ring-offset-gray-700" class="relative inline-flex 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 dark:ring-offset-gray-700"
:class="[enabled ? 'bg-primary-600' : 'bg-gray-200']" :class="[enabled ? 'bg-primary-600' : 'bg-gray-200']"
@update:modelValue="onChange"
> >
<span class="sr-only">Use setting</span> <span class="sr-only">Use setting</span>
<span <span

View File

@ -28,7 +28,6 @@
:attributes="attrs" :attributes="attrs"
:model-config="config" :model-config="config"
:masks="masks" :masks="masks"
:is-dark="isDarkModeOn"
:locale="global.locale" :locale="global.locale"
> >
<template <template
@ -73,7 +72,7 @@
<template v-if="showExtraOptions" #footer> <template v-if="showExtraOptions" #footer>
<div <div
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" class="bg-gray-100 grid grid-cols-3 gap-2 p-2 border-t rounded-b-lg"
> >
<button type="button" class="extra-button" @click="moveToDate(sourceDate)"> <button type="button" class="extra-button" @click="moveToDate(sourceDate)">
{{ global.t('date_picker.same_day') }} {{ global.t('date_picker.same_day') }}
@ -147,7 +146,7 @@ const props = defineProps({
defaultInputClass: { defaultInputClass: {
type: String, type: String,
default: default:
'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', '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',
}, },
time24hr: { time24hr: {
type: Boolean, type: Boolean,
@ -164,7 +163,7 @@ const props = defineProps({
sourceDate: { sourceDate: {
type: [String, Date], type: [String, Date],
default: () => new Date(), default: () => new Date(),
}, }
}) })
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
@ -176,9 +175,6 @@ const vCalendar = ref(null)
const hasIconSlot = computed(() => { const hasIconSlot = computed(() => {
return !!slots.icon return !!slots.icon
}) })
const isDarkModeOn = computed(() =>
document.documentElement.classList.contains('dark')
)
const computedContainerClass = computed(() => { const computedContainerClass = computed(() => {
let containerClass = `${props.containerClass} ` let containerClass = `${props.containerClass} `

View File

@ -90,7 +90,7 @@
<input <input
v-bind="$attrs" v-bind="$attrs"
:type="getType" :type="type"
:value="modelValue" :value="modelValue"
:disabled="disabled" :disabled="disabled"
:class="[ :class="[
@ -144,44 +144,6 @@
> >
<slot name="right" :class="iconRightClass" /> <slot name="right" :class="iconRightClass" />
</div> </div>
<div
v-if="loading && loadingPosition === 'right'" class="
absolute
inset-y-0
right-0
flex
items-center
pr-3
pointer-events-none
"
>
<svg
class="animate-spin !text-primary-500" :class="[iconRightClass]" xmlns="http://www.w3.org/2000/svg"
fill="none" viewBox="0 0 24 24"
>
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4" />
<path
class="opacity-75" fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
/>
</svg>
</div>
<div v-if="hasRightIconSlot" class="absolute inset-y-0 right-0 flex items-center pr-3">
<slot name="right" :class="iconRightClass" />
</div>
<div v-if="type == 'password'" class="absolute inset-y-0 right-0 flex items-center pr-3">
<a
v-if="isShowPassword" href="#" class="block" data-cy="eye" tabindex="-1"
@click.prevent="isShowPassword = !isShowPassword"
>
<BaseIcon name="EyeOffIcon" class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" />
</a>
<a v-else href="#" class="block" data-cy="eye" tabindex="-1" @click.prevent="isShowPassword = !isShowPassword">
<BaseIcon name="EyeIcon" class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" />
</a>
</div>
</div> </div>
</template> </template>
@ -257,15 +219,6 @@ const slots = useSlots()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const isShowPassword = ref(false)
const getType = computed(() => {
if (props.type === 'password')
return isShowPassword.value ? 'text' : 'password'
return props.type
})
const hasLeftIconSlot = computed(() => { const hasLeftIconSlot = computed(() => {
return !!slots.left || (props.loading && props.loadingPosition === 'left') return !!slots.left || (props.loading && props.loadingPosition === 'left')
}) })

View File

@ -29,12 +29,14 @@
text-left text-left
bg-white bg-white
dark:bg-gray-700 dark:bg-gray-700
border border-gray-200
rounded-md rounded-md
shadow-sm shadow-sm
cursor-default cursor-default
focus:outline-none focus:outline-none
focus:ring-1 focus:ring-1
focus:ring-primary-400 focus:border-primary-400 focus:ring-primary-500
focus:border-primary-500
sm:text-sm sm:text-sm
" "
> >

View File

@ -1,7 +1,16 @@
<template> <template>
<div <div
:class="containerClass" :class="containerClass"
class="relative after:bg-gray-200 dark:after:bg-gray-700 after:absolute after:transform after:top-1/2 after:-translate-y-1/2 after:h-2 after:w-full" class="
relative
after:bg-gray-200
after:absolute
after:transform
after:top-1/2
after:-translate-y-1/2
after:h-2
after:w-full
"
> >
<a <a
v-for="(number, index) in steps" v-for="(number, index) in steps"
@ -49,21 +58,21 @@ export default {
}, },
currentStepClass: { currentStepClass: {
type: String, type: String,
default: 'bg-white border-primary-500 dark:bg-gray-600 dark:border-gray-500 dark:border-primary-600', default: 'bg-white border-primary-500',
}, },
nextStepClass: { nextStepClass: {
type: String, type: String,
default: 'border-gray-200 bg-white dark:bg-gray-600 dark:border-gray-500', default: 'border-gray-200 bg-white',
}, },
previousStepClass: { previousStepClass: {
type: String, type: String,
default: default:
'bg-primary-500 dark:bg-primary-600 border-primary-500 flex justify-center items-center dark:border-primary-600', 'bg-primary-500 border-primary-500 flex justify-center items-center',
}, },
iconClass: { iconClass: {
type: String, type: String,
default: default:
'flex items-center justify-center w-full h-full text-sm font-black text-center text-white dark:text-gray-400', 'flex items-center justify-center w-full h-full text-sm font-black text-center text-white',
}, },
}, },

View File

@ -9,7 +9,6 @@
</p> </p>
</div> </div>
<slot /> <slot />
<BaseDarkHighlight class="z-[-1]"/>
</div> </div>
</template> </template>
@ -26,16 +25,16 @@ const props = defineProps({
stepContainerClass: { stepContainerClass: {
type: String, type: String,
default: default:
'w-full p-8 mb-8 bg-white border border-gray-200 border-solid rounded dark:from-gray-700/70 dark:to-gray-800/70 dark:bg-transparent dark:backdrop-blur-xl dark:shadow-glass dark:border dark:border-white/10', 'w-full p-8 mb-8 bg-white border border-gray-200 border-solid rounded',
}, },
stepTitleClass: { stepTitleClass: {
type: String, type: String,
default: 'text-2xl not-italic font-semibold leading-7 text-black dark:text-white', default: 'text-2xl not-italic font-semibold leading-7 text-black',
}, },
stepDescriptionClass: { stepDescriptionClass: {
type: String, type: String,
default: default:
'w-full mt-2.5 mb-8 text-sm not-italic leading-snug text-gray-500 dark:text-gray-300 lg:w-7/12 md:w-7/12 sm:w-7/12', 'w-full mt-2.5 mb-8 text-sm not-italic leading-snug text-gray-500 lg:w-7/12 md:w-7/12 sm:w-7/12',
}, },
}) })
</script> </script>

View File

@ -5,30 +5,27 @@
viewBox="0 0 50 50" viewBox="0 0 50 50"
fill="none" fill="none"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
:class="colorClass"
> >
<circle cx="25" cy="25" r="25" :class="bgColor" /> <circle cx="25" cy="25" r="25" fill="#EAF1FB" />
<path <path
d="M17.8 17.8C17.1635 17.8 16.5531 18.0529 16.103 18.503C15.6529 18.9531 15.4 19.5635 15.4 20.2V21.4H34.6V20.2C34.6 19.5635 34.3472 18.9531 33.8971 18.503C33.447 18.0529 32.8365 17.8 32.2 17.8H17.8Z" d="M17.8 17.8C17.1635 17.8 16.5531 18.0529 16.103 18.503C15.6529 18.9531 15.4 19.5635 15.4 20.2V21.4H34.6V20.2C34.6 19.5635 34.3472 18.9531 33.8971 18.503C33.447 18.0529 32.8365 17.8 32.2 17.8H17.8Z"
:class="color" fill="currentColor"
/> />
<path <path
fill-rule="evenodd" fill-rule="evenodd"
clip-rule="evenodd" clip-rule="evenodd"
d="M34.6 23.8H15.4V29.8C15.4 30.4366 15.6529 31.047 16.103 31.4971C16.5531 31.9472 17.1635 32.2 17.8 32.2H32.2C32.8365 32.2 33.447 31.9472 33.8971 31.4971C34.3472 31.047 34.6 30.4366 34.6 29.8V23.8ZM17.8 28.6C17.8 28.2818 17.9265 27.9766 18.1515 27.7515C18.3765 27.5265 18.6818 27.4 19 27.4H20.2C20.5183 27.4 20.8235 27.5265 21.0486 27.7515C21.2736 27.9766 21.4 28.2818 21.4 28.6C21.4 28.9183 21.2736 29.2235 21.0486 29.4486C20.8235 29.6736 20.5183 29.8 20.2 29.8H19C18.6818 29.8 18.3765 29.6736 18.1515 29.4486C17.9265 29.2235 17.8 28.9183 17.8 28.6ZM23.8 27.4C23.4818 27.4 23.1765 27.5265 22.9515 27.7515C22.7265 27.9766 22.6 28.2818 22.6 28.6C22.6 28.9183 22.7265 29.2235 22.9515 29.4486C23.1765 29.6736 23.4818 29.8 23.8 29.8H25C25.3183 29.8 25.6235 29.6736 25.8486 29.4486C26.0736 29.2235 26.2 28.9183 26.2 28.6C26.2 28.2818 26.0736 27.9766 25.8486 27.7515C25.6235 27.5265 25.3183 27.4 25 27.4H23.8Z" d="M34.6 23.8H15.4V29.8C15.4 30.4366 15.6529 31.047 16.103 31.4971C16.5531 31.9472 17.1635 32.2 17.8 32.2H32.2C32.8365 32.2 33.447 31.9472 33.8971 31.4971C34.3472 31.047 34.6 30.4366 34.6 29.8V23.8ZM17.8 28.6C17.8 28.2818 17.9265 27.9766 18.1515 27.7515C18.3765 27.5265 18.6818 27.4 19 27.4H20.2C20.5183 27.4 20.8235 27.5265 21.0486 27.7515C21.2736 27.9766 21.4 28.2818 21.4 28.6C21.4 28.9183 21.2736 29.2235 21.0486 29.4486C20.8235 29.6736 20.5183 29.8 20.2 29.8H19C18.6818 29.8 18.3765 29.6736 18.1515 29.4486C17.9265 29.2235 17.8 28.9183 17.8 28.6ZM23.8 27.4C23.4818 27.4 23.1765 27.5265 22.9515 27.7515C22.7265 27.9766 22.6 28.2818 22.6 28.6C22.6 28.9183 22.7265 29.2235 22.9515 29.4486C23.1765 29.6736 23.4818 29.8 23.8 29.8H25C25.3183 29.8 25.6235 29.6736 25.8486 29.4486C26.0736 29.2235 26.2 28.9183 26.2 28.6C26.2 28.2818 26.0736 27.9766 25.8486 27.7515C25.6235 27.5265 25.3183 27.4 25 27.4H23.8Z"
:class="color" fill="currentColor"
/> />
</svg> </svg>
</template> </template>
<script setup> <script setup>
const props = defineProps({ const props = defineProps({
color: { colorClass: {
type: String, type: String,
default: 'fill-primary-500 dark:fill-white', default: 'text-primary-500',
},
bgColor: {
type: String,
default: 'fill-gray-100 dark:fill-primary-400',
}, },
}) })
</script> </script>

View File

@ -3,7 +3,6 @@
<path <path
d="M690 4.08004C518 -9.91998 231 4.08004 -6 176.361L231 197.08L1170 219.08C1113.33 175.747 909.275 21.928 690 4.08004Z" d="M690 4.08004C518 -9.91998 231 4.08004 -6 176.361L231 197.08L1170 219.08C1113.33 175.747 909.275 21.928 690 4.08004Z"
fill="white" fill="white"
class="dark:fill-gray-900"
fill-opacity="0.1" fill-opacity="0.1"
/> />
</svg> </svg>

View File

@ -6,7 +6,7 @@
<!-- <SiteSidebar /> --> <!-- <SiteSidebar /> -->
<main class="h-screen min-h-0 pb-16 mt-16 overflow-y-auto"> <main class="mt-16 pb-16 h-screen overflow-y-auto min-h-0">
<router-view /> <router-view />
</main> </main>
</div> </div>

View File

@ -1,24 +1,31 @@
<template> <template>
<div <div
class="flex flex-col justify-center h-full min-h-screen py-12 overflow-hidden bg-gray-100 sm:px-6 lg:px-8 dark:bg-gray-800/80 dark:text-white font-base " class="
min-h-screen
bg-gray-200
flex flex-col
justify-center
py-12
sm:px-6
lg:px-8
"
> >
<NotificationRoot /> <NotificationRoot />
<div class="px-4 sm:mx-auto sm:w-full sm:max-w-md sm:px-0"> <div class="sm:mx-auto sm:w-full sm:max-w-md px-4 sm:px-0">
<MainLogo <MainLogo
v-if="!customerLogo" v-if="!customerLogo"
class="block w-48 h-auto max-w-full mx-auto text-primary-400" class="block w-48 h-auto max-w-full text-primary-400 mx-auto"
/> />
<img <img
v-else v-else
:src="customerLogo" :src="customerLogo"
class="block w-48 h-auto max-w-full mx-auto text-primary-400" class="block w-48 h-auto max-w-full text-primary-400 mx-auto"
/> />
</div> </div>
<div class="px-4 mt-8 sm:mx-auto sm:w-full sm:max-w-md sm:px-0"> <div class="mt-8 sm:mx-auto sm:w-full sm:max-w-md px-4 sm:px-0">
<div class="px-4 py-8 bg-white rounded-lg shadow sm:px-10 dark:from-gray-700/70 dark:to-gray-800/70 dark:bg-transparent dark:backdrop-blur-xl dark:shadow-glass dark:border dark:border-white/10"> <div class="bg-white py-8 px-4 shadow rounded-lg sm:px-10">
<BaseDarkHighlight/>
<router-view /> <router-view />
</div> </div>
</div> </div>

View File

@ -2,9 +2,8 @@
<Disclosure <Disclosure
v-slot="{ open }" v-slot="{ open }"
as="nav" as="nav"
class="bg-white shadow-sm fixed top-0 left-0 z-20 w-full dark:bg-gray-800" class="bg-white shadow-sm fixed top-0 left-0 z-20 w-full"
> >
<BaseDarkHighlight />
<div class="mx-auto px-8"> <div class="mx-auto px-8">
<div class="flex justify-between h-16 w-full"> <div class="flex justify-between h-16 w-full">
<div class="flex"> <div class="flex">
@ -34,8 +33,8 @@
:to="`/${globalStore.companySlug}${item.link}`" :to="`/${globalStore.companySlug}${item.link}`"
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'text-primary-600 border-primary-600 dark:border-primary-400 dark:text-primary-400' ? 'border-primary-500 text-primary-600'
: 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-gray-200', : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300',
'inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium', 'inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium',
]" ]"
> >
@ -44,8 +43,20 @@
</div> </div>
</div> </div>
<div class="hidden sm:ml-6 sm:flex sm:items-center"> <div class="hidden sm:ml-6 sm:flex sm:items-center">
<!-- Dark mode Toggle --> <button
<LightDarkButton/> type="button"
class="
bg-white
p-1
rounded-full
text-gray-400
hover:text-gray-500
focus:outline-none
focus:ring-2
focus:ring-offset-2
focus:ring-primary-500
"
></button>
<!-- Profile dropdown --> <!-- Profile dropdown -->
@ -74,7 +85,7 @@
<router-link :to="{ name: 'customer.profile' }"> <router-link :to="{ name: 'customer.profile' }">
<BaseDropdownItem> <BaseDropdownItem>
<CogIcon <CogIcon
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500 dark:group-hover:text-gray-200" class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
aria-hidden="true" aria-hidden="true"
/> />
{{ $t('navigation.settings') }} {{ $t('navigation.settings') }}
@ -83,7 +94,7 @@
<BaseDropdownItem @click="logout"> <BaseDropdownItem @click="logout">
<LogoutIcon <LogoutIcon
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500 dark:group-hover:text-gray-200" class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
aria-hidden="true" aria-hidden="true"
/> />
{{ $t('navigation.logout') }} {{ $t('navigation.logout') }}
@ -107,8 +118,6 @@
focus:ring-2 focus:ring-2
focus:ring-offset-2 focus:ring-offset-2
focus:ring-primary-500 focus:ring-primary-500
dark:bg-gray-700
dark:focus:ring-offset-gray-900
" "
> >
<span class="sr-only">Open main menu</span> <span class="sr-only">Open main menu</span>
@ -127,16 +136,15 @@
:to="`/${globalStore.companySlug}${item.link}`" :to="`/${globalStore.companySlug}${item.link}`"
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'bg-primary-50 border-primary-500 text-primary-700 dark:bg-gray-700 dark:text-primary-400' ? 'bg-primary-50 border-primary-500 text-primary-700'
: 'border-transparent text-gray-600 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-800 dark:text-gray-200 dark:hover:bg-gray-700', : 'border-transparent text-gray-600 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-800',
'block pl-3 pr-4 py-2 border-l-4 text-base font-medium', 'block pl-3 pr-4 py-2 border-l-4 text-base font-medium',
]" ]"
:aria-current="item.current ? 'page' : undefined" :aria-current="item.current ? 'page' : undefined"
>{{ item.title }} >{{ item.title }}
</router-link> </router-link>
</div> </div>
<div class="pt-4 pb-3 border-t border-gray-200 dark:border-gray-500"> <div class="pt-4 pb-3 border-t border-gray-200">
<div class="flex items-center justify-between pr-5">
<div class="flex items-center px-4"> <div class="flex items-center px-4">
<div class="shrink-0"> <div class="shrink-0">
<img class="h-10 w-10 rounded-full" :src="previewAvatar" alt="" /> <img class="h-10 w-10 rounded-full" :src="previewAvatar" alt="" />
@ -145,13 +153,26 @@
<div class="text-base font-medium text-gray-800"> <div class="text-base font-medium text-gray-800">
{{ globalStore.currentUser.title }} {{ globalStore.currentUser.title }}
</div> </div>
<div class="text-sm font-medium text-gray-500 dark:text-gray-200"> <div class="text-sm font-medium text-gray-500">
{{ globalStore.currentUser.email }} {{ globalStore.currentUser.email }}
</div> </div>
</div> </div>
</div> <button
<!-- Dark mode Toggle --> type="button"
<LightDarkButton/> class="
ml-auto
bg-white
shrink-0
p-1
rounded-full
text-gray-400
hover:text-gray-500
focus:outline-none
focus:ring-2
focus:ring-offset-2
focus:ring-primary-500
"
></button>
</div> </div>
<div class="mt-3 space-y-1"> <div class="mt-3 space-y-1">
<router-link <router-link
@ -161,7 +182,7 @@
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'bg-primary-50 border-primary-500 text-primary-700' ? 'bg-primary-50 border-primary-500 text-primary-700'
: 'border-transparent text-gray-600 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-800 dark:text-gray-200 dark:hover:bg-gray-700', : 'border-transparent text-gray-600 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-800',
'block pl-3 pr-4 py-2 border-l-4 text-base font-medium', 'block pl-3 pr-4 py-2 border-l-4 text-base font-medium',
]" ]"
>{{ item.title }}</router-link >{{ item.title }}</router-link
@ -178,7 +199,6 @@ import { useRoute, useRouter } from 'vue-router'
import { ref, watch, computed } from 'vue' import { ref, watch, computed } from 'vue'
import { useGlobalStore } from '@/scripts/customer/stores/global' import { useGlobalStore } from '@/scripts/customer/stores/global'
import MainLogo from '@/scripts/components/icons/MainLogo.vue' import MainLogo from '@/scripts/components/icons/MainLogo.vue'
import LightDarkButton from '@/scripts/components/LightDarkButton.vue'
import { import {
Disclosure, Disclosure,
DisclosureButton, DisclosureButton,

View File

@ -13,8 +13,7 @@ export const useGlobalStore = defineStore({
currentUser: null, currentUser: null,
companySlug: '', companySlug: '',
mainMenu: null, mainMenu: null,
enabledModules: [], enabledModules: []
isDarkModeOn: localStorage.getItem('theme') === 'dark' || document.documentElement.classList.contains('dark')
}), }),
actions: { actions: {

View File

@ -31,7 +31,7 @@
<div class="mt-4 mb-4 text-sm"> <div class="mt-4 mb-4 text-sm">
<router-link <router-link
to="login" to="login"
class="text-sm text-primary-400 hover:text-gray-700 dark:hover:text-primary-500" class="text-sm text-primary-400 hover:text-gray-700"
> >
{{ $t('general.back_to_login') }} {{ $t('general.back_to_login') }}
</router-link> </router-link>

View File

@ -32,15 +32,30 @@
> >
<BaseInput <BaseInput
v-model="authStore.loginData.password" v-model="authStore.loginData.password"
:type="getInputType"
:invalid="v$.loginData.password.$error" :invalid="v$.loginData.password.$error"
type="password"
@input="v$.loginData.password.$touch()" @input="v$.loginData.password.$touch()"
>
<template #right>
<BaseIcon
v-if="isShowPassword"
name="EyeOffIcon"
class="w-5 h-5 mr-1 text-gray-500 cursor-pointer"
@click="isShowPassword = !isShowPassword"
/> />
<BaseIcon
v-else
name="EyeIcon"
class="w-5 h-5 mr-1 text-gray-500 cursor-pointer"
@click="isShowPassword = !isShowPassword"
/>
</template>
</BaseInput>
</BaseInputGroup> </BaseInputGroup>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<router-link <router-link
:to="{ name: 'customer.forgot-password' }" :to="{ name: 'customer.forgot-password' }"
class="text-sm text-primary-400 hover:text-gray-500 dark:hover:text-primary-500" class="text-sm text-primary-600 hover:text-gray-500"
> >
{{ $t('login.forgot_password') }} {{ $t('login.forgot_password') }}
</router-link> </router-link>
@ -76,6 +91,14 @@ const authStore = useAuthStore()
const { t } = useI18n() const { t } = useI18n()
let isLoading = ref(false) let isLoading = ref(false)
const isShowPassword = ref(false)
const getInputType = computed(() => {
if (isShowPassword.value) {
return 'text'
}
return 'password'
})
const rules = computed(() => { const rules = computed(() => {
return { return {

View File

@ -23,11 +23,23 @@
> >
<BaseInput <BaseInput
v-model="loginData.password" v-model="loginData.password"
type="password" :type="isShowPassword ? 'text' : 'password'"
name="password" name="password"
:invalid="v$.password.$error" :invalid="v$.password.$error"
@input="v$.password.$touch()" @input="v$.password.$touch()"
>
<template #right>
<EyeOffIcon
v-if="isShowPassword"
class="w-5 h-5 mr-1 text-gray-500 cursor-pointer"
@click="isShowPassword = !isShowPassword"
/> />
<EyeIcon
v-else
class="w-5 h-5 mr-1 text-gray-500 cursor-pointer"
@click="isShowPassword = !isShowPassword"
/> </template
></BaseInput>
</BaseInputGroup> </BaseInputGroup>
<BaseInputGroup <BaseInputGroup
@ -81,6 +93,7 @@ const loginData = reactive({
const globalStore = useGlobalStore() const globalStore = useGlobalStore()
let isShowPassword = ref(false)
let isLoading = ref(false) let isLoading = ref(false)
const rules = computed(() => { const rules = computed(() => {

View File

@ -12,24 +12,18 @@
hover:bg-gray-50 hover:bg-gray-50
xl:p-4 xl:p-4
lg:col-span-2 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 }" :class="{ 'lg:!col-span-3': large }"
:to="route" :to="route"
> >
<div> <div>
<span class="text-xl font-semibold leading-tight text-black xl:text-3xl dark:text-white"> <span class="text-xl font-semibold leading-tight text-black xl:text-3xl">
<slot /> <slot />
</span> </span>
<span class="block mt-1 text-sm leading-tight text-gray-500 xl:text-lg dark:text-gray-300"> <span class="block mt-1 text-sm leading-tight text-gray-500 xl:text-lg">
{{ label }} {{ label }}
</span> </span>
</div> </div>
<BaseDarkHighlight class="!bg-highlight/[.17] !top-5" />
<div class="flex items-center"> <div class="flex items-center">
<component :is="iconComponent" class="w-10 h-10 xl:w-12 xl:h-12" /> <component :is="iconComponent" class="w-10 h-10 xl:w-12 xl:h-12" />
</div> </div>

View File

@ -1,7 +1,7 @@
<template> <template>
<BaseContentPlaceholders <BaseContentPlaceholders
:rounded="true" :rounded="true"
class="relative flex justify-between w-full p-3 bg-white rounded shadow lg:col-span-3 xl:p-4 dark:bg-gray-800" class="relative flex justify-between w-full p-3 bg-white rounded shadow lg:col-span-3 xl:p-4"
> >
<div> <div>
<BaseContentPlaceholdersText <BaseContentPlaceholdersText

View File

@ -12,7 +12,6 @@
shadow shadow
lg:col-span-2 lg:col-span-2
xl:p-4 xl:p-4
dark:bg-gray-800
" "
> >
<div> <div>

View File

@ -26,7 +26,7 @@
:to="{ :to="{
path: `/${globalStore.companySlug}/customer/invoices/${row.data.id}/view`, path: `/${globalStore.companySlug}/customer/invoices/${row.data.id}/view`,
}" }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.invoice_number }} {{ row.data.invoice_number }}
</router-link> </router-link>
@ -73,7 +73,7 @@
:to="{ :to="{
path: `/${globalStore.companySlug}/customer/estimates/${row.data.id}/view`, path: `/${globalStore.companySlug}/customer/estimates/${row.data.id}/view`,
}" }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.estimate_number }} {{ row.data.estimate_number }}
</router-link> </router-link>

View File

@ -100,7 +100,7 @@
<template #cell-estimate_number="{ row }"> <template #cell-estimate_number="{ row }">
<router-link <router-link
:to="{ path: `estimates/${row.data.id}/view` }" :to="{ path: `estimates/${row.data.id}/view` }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.estimate_number }} {{ row.data.estimate_number }}
</router-link> </router-link>
@ -119,11 +119,11 @@
<template #cell-actions="{ row }"> <template #cell-actions="{ row }">
<BaseDropdown> <BaseDropdown>
<template #activator> <template #activator>
<BaseIcon name="DotsHorizontalIcon" class="h-5 text-gray-500 dark:text-gray-200" /> <BaseIcon name="DotsHorizontalIcon" class="h-5 text-gray-500" />
</template> </template>
<router-link :to="`estimates/${row.data.id}/view`"> <router-link :to="`estimates/${row.data.id}/view`">
<BaseDropdownItem> <BaseDropdownItem>
<BaseIcon name="EyeIcon" class="h-5 mr-3 text-gray-600 dark:text-gray-200" /> <BaseIcon name="EyeIcon" class="h-5 mr-3 text-gray-600" />
{{ $t('general.view') }} {{ $t('general.view') }}
</BaseDropdownItem> </BaseDropdownItem>
</router-link> </router-link>

View File

@ -25,7 +25,7 @@
<!-- Sidebar --> <!-- Sidebar -->
<div <div
class="fixed top-0 left-0 hidden h-full pt-16 pb-4 bg-white w-88 xl:block dark:bg-gray-800" class="fixed top-0 left-0 hidden h-full pt-16 pb-4 bg-white w-88 xl:block"
> >
<div <div
class=" class="
@ -36,7 +36,6 @@
pt-8 pt-8
pb-6 pb-6
border border-gray-200 border-solid border border-gray-200 border-solid
dark:border-gray-600
" "
> >
<BaseInput <BaseInput
@ -71,7 +70,6 @@
mb-2 mb-2
text-sm text-sm
border-b border-gray-200 border-solid border-b border-gray-200 border-solid
dark:border-gray-600
" "
> >
{{ $t('general.sort_by') }} {{ $t('general.sort_by') }}
@ -126,7 +124,7 @@
</div> </div>
</BaseDropdown> </BaseDropdown>
<BaseButton class="ml-1" variant="gray" @click="sortData"> <BaseButton class="ml-1" variant="white" @click="sortData">
<BaseIcon v-if="getOrderBy" name="SortAscendingIcon" class="h-5" /> <BaseIcon v-if="getOrderBy" name="SortAscendingIcon" class="h-5" />
<BaseIcon v-else name="SortDescendingIcon" class="h-5" /> <BaseIcon v-else name="SortDescendingIcon" class="h-5" />
</BaseButton> </BaseButton>
@ -140,7 +138,6 @@
overflow-y-scroll overflow-y-scroll
border-l border-gray-200 border-solid border-l border-gray-200 border-solid
sw-scroll sw-scroll
dark:border-gray-600
" "
> >
<router-link <router-link
@ -149,9 +146,9 @@
:key="index" :key="index"
:to="`/${globalStore.companySlug}/customer/estimates/${estimate.id}/view`" :to="`/${globalStore.companySlug}/customer/estimates/${estimate.id}/view`"
:class="[ :class="[
'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent dark:hover:bg-gray-700', 'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent',
{ {
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:bg-gray-700': 'bg-gray-100 border-l-4 border-primary-500 border-solid':
hasActiveUrl(estimate.id), hasActiveUrl(estimate.id),
}, },
]" ]"
@ -167,7 +164,6 @@
leading-5 leading-5
text-gray-500 text-gray-500
capitalize capitalize
dark:text-gray-400
" "
> >
{{ estimate.estimate_number }} {{ estimate.estimate_number }}
@ -188,12 +184,11 @@
leading-8 leading-8
text-right text-gray-900 text-right text-gray-900
block block
dark:text-white
" "
:amount="estimate.total" :amount="estimate.total"
:currency="estimate.currency" :currency="estimate.currency"
/> />
<div class="text-sm text-right text-gray-500 dark:text-gray-400 non-italic"> <div class="text-sm text-right text-gray-500 non-italic">
{{ estimate.formatted_estimate_date }} {{ estimate.formatted_estimate_date }}
</div> </div>
</div> </div>
@ -201,7 +196,7 @@
<p <p
v-if="!estimateStore.estimates.length" v-if="!estimateStore.estimates.length"
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300" class="flex justify-center px-4 mt-5 text-sm text-gray-600"
> >
{{ $t('estimates.no_matching_estimates') }} {{ $t('estimates.no_matching_estimates') }}
</p> </p>

View File

@ -95,7 +95,7 @@
<template #cell-invoice_number="{ row }"> <template #cell-invoice_number="{ row }">
<router-link <router-link
:to="{ path: `invoices/${row.data.id}/view` }" :to="{ path: `invoices/${row.data.id}/view` }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.invoice_number }} {{ row.data.invoice_number }}
</router-link> </router-link>
@ -126,11 +126,11 @@
<template #cell-actions="{ row }"> <template #cell-actions="{ row }">
<BaseDropdown> <BaseDropdown>
<template #activator> <template #activator>
<BaseIcon name="DotsHorizontalIcon" class="h-5 text-gray-500 dark:text-gray-200" /> <BaseIcon name="DotsHorizontalIcon" class="h-5 text-gray-500" />
</template> </template>
<router-link :to="`invoices/${row.data.id}/view`"> <router-link :to="`invoices/${row.data.id}/view`">
<BaseDropdownItem> <BaseDropdownItem>
<BaseIcon name="EyeIcon" class="h-5 mr-3 text-gray-600 dark:text-gray-200" /> <BaseIcon name="EyeIcon" class="h-5 mr-3 text-gray-600" />
{{ $t('general.view') }} {{ $t('general.view') }}
</BaseDropdownItem> </BaseDropdownItem>
</router-link> </router-link>

View File

@ -31,7 +31,7 @@
<!-- Sidebar --> <!-- Sidebar -->
<div <div
class="fixed top-0 left-0 hidden h-full pt-16 pb-4 bg-white w-88 xl:block dark:bg-gray-800" class="fixed top-0 left-0 hidden h-full pt-16 pb-4 bg-white w-88 xl:block"
> >
<div <div
class=" class="
@ -42,7 +42,6 @@
pt-8 pt-8
pb-6 pb-6
border border-gray-200 border-solid border border-gray-200 border-solid
dark:border-gray-600
" "
> >
<BaseInput <BaseInput
@ -77,7 +76,6 @@
mb-2 mb-2
text-sm text-sm
border-b border-gray-200 border-solid border-b border-gray-200 border-solid
dark:border-gray-600
" "
> >
{{ $t('general.sort_by') }} {{ $t('general.sort_by') }}
@ -132,7 +130,7 @@
</div> </div>
</BaseDropdown> </BaseDropdown>
<BaseButton class="ml-1" variant="gray" @click="sortData"> <BaseButton class="ml-1" variant="white" @click="sortData">
<BaseIcon v-if="getOrderBy" name="SortAscendingIcon" class="h-5" /> <BaseIcon v-if="getOrderBy" name="SortAscendingIcon" class="h-5" />
<BaseIcon v-else name="SortDescendingIcon" class="h-5" /> <BaseIcon v-else name="SortDescendingIcon" class="h-5" />
</BaseButton> </BaseButton>
@ -146,7 +144,6 @@
overflow-y-scroll overflow-y-scroll
border-l border-gray-200 border-solid border-l border-gray-200 border-solid
sw-scroll sw-scroll
dark:border-gray-600
" "
> >
<router-link <router-link
@ -155,9 +152,9 @@
:key="index" :key="index"
:to="`/${globalStore.companySlug}/customer/invoices/${invoice.id}/view`" :to="`/${globalStore.companySlug}/customer/invoices/${invoice.id}/view`"
:class="[ :class="[
'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent dark:hover:bg-gray-700', 'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent',
{ {
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:bg-gray-700': 'bg-gray-100 border-l-4 border-primary-500 border-solid':
hasActiveUrl(invoice.id), hasActiveUrl(invoice.id),
}, },
]" ]"
@ -173,7 +170,6 @@
text-gray-500 text-gray-500
capitalize capitalize
text-md text-md
dark:text-gray-400
" "
> >
{{ invoice.invoice_number }} {{ invoice.invoice_number }}
@ -193,13 +189,12 @@
leading-8 leading-8
text-right text-gray-900 text-right text-gray-900
block block
dark:text-white
" "
:amount="invoice.total" :amount="invoice.total"
:currency="invoice.currency" :currency="invoice.currency"
/> />
<div class="text-sm text-right text-gray-500 dark:text-gray-400 non-italic"> <div class="text-sm text-right text-gray-500 non-italic">
{{ invoice.formatted_invoice_date }} {{ invoice.formatted_invoice_date }}
</div> </div>
</div> </div>
@ -207,7 +202,7 @@
<p <p
v-if="!invoiceStore.invoices.length" v-if="!invoiceStore.invoices.length"
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300" class="flex justify-center px-4 mt-5 text-sm text-gray-600"
> >
{{ $t('invoices.no_matching_invoices') }} {{ $t('invoices.no_matching_invoices') }}
</p> </p>

View File

@ -78,7 +78,7 @@
:to="{ :to="{
path: `payments/${row.data.id}/view`, path: `payments/${row.data.id}/view`,
}" }"
class="font-medium text-primary-500 dark:text-primary-400" class="font-medium text-primary-500"
> >
{{ row.data.payment_number }} {{ row.data.payment_number }}
</router-link> </router-link>
@ -111,11 +111,11 @@
<template #cell-actions="{ row }"> <template #cell-actions="{ row }">
<BaseDropdown> <BaseDropdown>
<template #activator> <template #activator>
<BaseIcon name="DotsHorizontalIcon" class="w-5 text-gray-500 dark:text-gray-200" /> <BaseIcon name="DotsHorizontalIcon" class="w-5 text-gray-500" />
</template> </template>
<router-link :to="`payments/${row.data.id}/view`"> <router-link :to="`payments/${row.data.id}/view`">
<BaseDropdownItem> <BaseDropdownItem>
<BaseIcon name="EyeIcon" class="h-5 mr-3 text-gray-600 dark:text-gray-200" /> <BaseIcon name="EyeIcon" class="h-5 mr-3 text-gray-600" />
{{ $t('general.view') }} {{ $t('general.view') }}
</BaseDropdownItem> </BaseDropdownItem>
</router-link> </router-link>

View File

@ -19,7 +19,7 @@
<!-- Sidebar --> <!-- Sidebar -->
<div <div
class="fixed top-0 left-0 hidden h-full pt-16 pb-4 bg-white w-88 xl:block dark:bg-gray-800" class="fixed top-0 left-0 hidden h-full pt-16 pb-4 bg-white w-88 xl:block"
> >
<div <div
class=" class="
@ -30,7 +30,6 @@
pt-8 pt-8
pb-6 pb-6
border border-gray-200 border-solid border border-gray-200 border-solid
dark:border-gray-600
" "
> >
<BaseInput <BaseInput
@ -65,7 +64,6 @@
mb-2 mb-2
text-sm text-sm
border-b border-gray-200 border-solid border-b border-gray-200 border-solid
dark:border-gray-600
" "
> >
{{ $t('general.sort_by') }} {{ $t('general.sort_by') }}
@ -120,7 +118,7 @@
</div> </div>
</BaseDropdown> </BaseDropdown>
<BaseButton class="ml-1" variant="gray" @click="sortData"> <BaseButton class="ml-1" variant="white" @click="sortData">
<BaseIcon v-if="getOrderBy" name="SortAscendingIcon" class="h-5" /> <BaseIcon v-if="getOrderBy" name="SortAscendingIcon" class="h-5" />
<BaseIcon v-else name="SortDescendingIcon" class="h-5" /> <BaseIcon v-else name="SortDescendingIcon" class="h-5" />
</BaseButton> </BaseButton>
@ -134,7 +132,6 @@
overflow-y-scroll overflow-y-scroll
border-l border-gray-200 border-solid border-l border-gray-200 border-solid
sw-scroll sw-scroll
dark:border-gray-600
" "
> >
<router-link <router-link
@ -143,9 +140,9 @@
:key="index" :key="index"
:to="`/${globalStore.companySlug}/customer/payments/${payment.id}/view`" :to="`/${globalStore.companySlug}/customer/payments/${payment.id}/view`"
:class="[ :class="[
'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent dark:hover:bg-gray-700', 'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent',
{ {
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:bg-gray-700': 'bg-gray-100 border-l-4 border-primary-500 border-solid':
hasActiveUrl(payment.id), hasActiveUrl(payment.id),
}, },
]" ]"
@ -161,7 +158,6 @@
leading-5 leading-5
text-gray-500 text-gray-500
capitalize capitalize
dark:text-gray-400
" "
> >
{{ payment.payment_number }} {{ payment.payment_number }}
@ -178,13 +174,12 @@
leading-8 leading-8
text-right text-gray-900 text-right text-gray-900
block block
dark:text-white
" "
:amount="payment.amount" :amount="payment.amount"
:currency="payment.currency" :currency="payment.currency"
/> />
<div class="text-sm text-right text-gray-500 dark:text-gray-400 non-italic"> <div class="text-sm text-right text-gray-500 non-italic">
{{ payment.formatted_payment_date }} {{ payment.formatted_payment_date }}
</div> </div>
</div> </div>
@ -192,7 +187,7 @@
<p <p
v-if="!paymentStore.payments.length" v-if="!paymentStore.payments.length"
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300" class="flex justify-center px-4 mt-5 text-sm text-gray-600"
> >
{{ $t('payments.no_matching_payments') }} {{ $t('payments.no_matching_payments') }}
</p> </p>

View File

@ -66,10 +66,24 @@
> >
<BaseInput <BaseInput
v-model="userStore.userForm.password" v-model="userStore.userForm.password"
type="password" :type="isShowPassword ? 'text' : 'password'"
:invalid="v$.userForm.password.$error" :invalid="v$.userForm.password.$error"
@input="v$.userForm.password.$touch()" @input="v$.userForm.password.$touch()"
>
<template #right>
<BaseIcon
v-if="isShowPassword"
name="EyeOffIcon"
class="w-5 h-5 mr-1 text-gray-500 cursor-pointer"
@click="isShowPassword = !isShowPassword"
/> />
<BaseIcon
v-else
name="EyeIcon"
class="w-5 h-5 mr-1 text-gray-500 cursor-pointer"
@click="isShowPassword = !isShowPassword"
/> </template
></BaseInput>
</BaseInputGroup> </BaseInputGroup>
<BaseInputGroup <BaseInputGroup
@ -81,10 +95,24 @@
> >
<BaseInput <BaseInput
v-model="userStore.userForm.confirm_password" v-model="userStore.userForm.confirm_password"
type="password" :type="isShowConfirmPassword ? 'text' : 'password'"
:invalid="v$.userForm.confirm_password.$error" :invalid="v$.userForm.confirm_password.$error"
@input="v$.userForm.confirm_password.$touch()" @input="v$.userForm.confirm_password.$touch()"
>
<template #right>
<BaseIcon
v-if="isShowConfirmPassword"
name="EyeOffIcon"
class="w-5 h-5 mr-1 text-gray-500 cursor-pointer"
@click="isShowConfirmPassword = !isShowConfirmPassword"
/> />
<BaseIcon
v-else
name="EyeIcon"
class="w-5 h-5 mr-1 text-gray-500 cursor-pointer"
@click="isShowConfirmPassword = !isShowConfirmPassword"
/> </template
></BaseInput>
</BaseInputGroup> </BaseInputGroup>
</div> </div>
@ -123,6 +151,8 @@ const { t, tm } = useI18n()
let imgFiles = ref([]) let imgFiles = ref([])
let isSaving = ref(false) let isSaving = ref(false)
let avatarFileBlob = ref(null) let avatarFileBlob = ref(null)
let isShowPassword = ref(false)
let isShowConfirmPassword = ref(false)
const isCustomerAvatarRemoved = ref(false) const isCustomerAvatarRemoved = ref(false)
if (userStore.userForm.avatar) { if (userStore.userForm.avatar) {