mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-11-04 06:23:17 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			171 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <header
 | 
						|
    class="fixed top-0 left-0 z-20 flex items-center justify-between w-full px-4 py-3 md:h-16 md:px-8 bg-gradient-to-r from-primary-500 to-primary-400"
 | 
						|
  >
 | 
						|
    <router-link
 | 
						|
      to="/admin/dashboard"
 | 
						|
      class="float-none text-lg not-italic font-black tracking-wider text-white brand-main md:float-left font-base hidden md:block"
 | 
						|
    >
 | 
						|
      <img
 | 
						|
        id="logo-white"
 | 
						|
        src="/img/logo-white.png"
 | 
						|
        alt="Crater Logo"
 | 
						|
        class="h-6"
 | 
						|
      />
 | 
						|
    </router-link>
 | 
						|
 | 
						|
    <!-- toggle button-->
 | 
						|
    <div
 | 
						|
      :class="{ 'is-active': globalStore.isSidebarOpen }"
 | 
						|
      class="flex float-left p-1 overflow-visible text-sm ease-linear bg-white border-0 rounded cursor-pointer md:hidden md:ml-0 hover:bg-gray-100"
 | 
						|
      @click.prevent="onToggle"
 | 
						|
    >
 | 
						|
      <BaseIcon name="MenuIcon" class="!w-6 !h-6 text-gray-500" />
 | 
						|
    </div>
 | 
						|
 | 
						|
    <ul class="flex float-right h-8 m-0 list-none md:h-9">
 | 
						|
      <li
 | 
						|
        v-if="hasCreateAbilities"
 | 
						|
        class="relative hidden float-left m-0 md:block"
 | 
						|
      >
 | 
						|
        <BaseDropdown width-class="w-48">
 | 
						|
          <template #activator>
 | 
						|
            <div
 | 
						|
              class="flex items-center justify-center w-8 h-8 ml-2 text-sm text-black bg-white rounded md:h-9 md:w-9"
 | 
						|
            >
 | 
						|
              <BaseIcon name="PlusIcon" class="w-5 h-5 text-gray-600" />
 | 
						|
            </div>
 | 
						|
          </template>
 | 
						|
 | 
						|
          <router-link to="/admin/invoices/create">
 | 
						|
            <BaseDropdownItem
 | 
						|
              v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
 | 
						|
            >
 | 
						|
              <BaseIcon
 | 
						|
                name="DocumentTextIcon"
 | 
						|
                class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
 | 
						|
                aria-hidden="true"
 | 
						|
              />
 | 
						|
              {{ $t('invoices.new_invoice') }}
 | 
						|
            </BaseDropdownItem>
 | 
						|
          </router-link>
 | 
						|
          <router-link to="/admin/estimates/create">
 | 
						|
            <BaseDropdownItem
 | 
						|
              v-if="userStore.hasAbilities(abilities.CREATE_ESTIMATE)"
 | 
						|
            >
 | 
						|
              <BaseIcon
 | 
						|
                name="DocumentIcon"
 | 
						|
                class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
 | 
						|
                aria-hidden="true"
 | 
						|
              />
 | 
						|
              {{ $t('estimates.new_estimate') }}
 | 
						|
            </BaseDropdownItem>
 | 
						|
          </router-link>
 | 
						|
 | 
						|
          <router-link to="/admin/customers/create">
 | 
						|
            <BaseDropdownItem
 | 
						|
              v-if="userStore.hasAbilities(abilities.CREATE_CUSTOMER)"
 | 
						|
            >
 | 
						|
              <BaseIcon
 | 
						|
                name="UserIcon"
 | 
						|
                class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
 | 
						|
                aria-hidden="true"
 | 
						|
              />
 | 
						|
              {{ $t('customers.new_customer') }}
 | 
						|
            </BaseDropdownItem>
 | 
						|
          </router-link>
 | 
						|
        </BaseDropdown>
 | 
						|
      </li>
 | 
						|
 | 
						|
      <li class="ml-2">
 | 
						|
        <GlobalSearchBar
 | 
						|
          v-if="
 | 
						|
            userStore.currentUser.is_owner ||
 | 
						|
            userStore.hasAbilities(abilities.VIEW_CUSTOMER)
 | 
						|
          "
 | 
						|
        />
 | 
						|
      </li>
 | 
						|
 | 
						|
      <li>
 | 
						|
        <CompanySwitcher />
 | 
						|
      </li>
 | 
						|
 | 
						|
      <!-- User Dropdown-->
 | 
						|
      <li class="relative block float-left ml-2">
 | 
						|
        <BaseDropdown width-class="w-48">
 | 
						|
          <template #activator>
 | 
						|
            <img
 | 
						|
              :src="previewAvatar"
 | 
						|
              class="block w-8 h-8 rounded md:h-9 md:w-9"
 | 
						|
            />
 | 
						|
          </template>
 | 
						|
 | 
						|
          <router-link to="/admin/settings/account-settings">
 | 
						|
            <BaseDropdownItem>
 | 
						|
              <BaseIcon
 | 
						|
                name="CogIcon"
 | 
						|
                class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
 | 
						|
                aria-hidden="true"
 | 
						|
              />
 | 
						|
              {{ $t('navigation.settings') }}
 | 
						|
            </BaseDropdownItem>
 | 
						|
          </router-link>
 | 
						|
 | 
						|
          <BaseDropdownItem @click="logout">
 | 
						|
            <BaseIcon
 | 
						|
              name="LogoutIcon"
 | 
						|
              class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
 | 
						|
              aria-hidden="true"
 | 
						|
            />
 | 
						|
            Logout
 | 
						|
          </BaseDropdownItem>
 | 
						|
        </BaseDropdown>
 | 
						|
      </li>
 | 
						|
    </ul>
 | 
						|
  </header>
 | 
						|
</template>
 | 
						|
 | 
						|
<script setup>
 | 
						|
import { useAuthStore } from '@/scripts/stores/auth'
 | 
						|
import { useRouter } from 'vue-router'
 | 
						|
import { computed } from 'vue'
 | 
						|
import { useUserStore } from '@/scripts/stores/user'
 | 
						|
import { useGlobalStore } from '@/scripts/stores/global'
 | 
						|
import CompanySwitcher from '@/scripts/components/CompanySwitcher.vue'
 | 
						|
import GlobalSearchBar from '@/scripts/components/GlobalSearchBar.vue'
 | 
						|
import abilities from '@/scripts/stub/abilities'
 | 
						|
 | 
						|
const authStore = useAuthStore()
 | 
						|
const userStore = useUserStore()
 | 
						|
const globalStore = useGlobalStore()
 | 
						|
const router = useRouter()
 | 
						|
 | 
						|
const previewAvatar = computed(() => {
 | 
						|
  return userStore.currentUser && userStore.currentUser.avatar !== 0
 | 
						|
    ? userStore.currentUser.avatar
 | 
						|
    : getDefaultAvatar()
 | 
						|
})
 | 
						|
 | 
						|
function getDefaultAvatar() {
 | 
						|
  const imgUrl = new URL('/img/default-avatar.jpg', import.meta.url)
 | 
						|
  return imgUrl
 | 
						|
}
 | 
						|
 | 
						|
function hasCreateAbilities() {
 | 
						|
  return userStore.hasAbilities([
 | 
						|
    abilities.CREATE_INVOICE,
 | 
						|
    abilities.CREATE_ESTIMATE,
 | 
						|
    abilities.CREATE_CUSTOMER,
 | 
						|
  ])
 | 
						|
}
 | 
						|
 | 
						|
async function logout() {
 | 
						|
  await authStore.logout()
 | 
						|
  router.push('/login')
 | 
						|
}
 | 
						|
 | 
						|
function onToggle() {
 | 
						|
  globalStore.setSidebarVisibility(true)
 | 
						|
}
 | 
						|
</script>
 |