akaunting 3.0 (the last dance)

This commit is contained in:
Burak Civan
2022-06-01 10:15:55 +03:00
parent cead09f6d4
commit d9c0764572
3812 changed files with 126831 additions and 102949 deletions

View File

@ -0,0 +1,89 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.admin.head>
@if (! empty($metaTitle))
<x-slot name="metaTitle">
{!! !empty($metaTitle->attributes->has('title')) ? $metaTitle->attributes->get('title') : $metaTitle !!}
</x-slot>
@endif
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
</x-layouts.admin.head>
@mobile
<body class="g-sidenav-hidden bg-body overflow-overlay">
@elsemobile
<body class="g-sidenav-show bg-body overflow-overlay">
@endmobile
@stack('body_start')
<x-layouts.admin.menu />
<div class="main-content xl:ltr:ml-64 xl:rtl:mr-64 transition-all ease-in-out" id="panel">
<div id="main-body">
<div class="container">
<x-layouts.admin.header>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
@if (!empty($status))
<x-slot name="status">
{!! $status ?? '' !!}
</x-slot>
@endif
@if (!empty($favorite) || (!empty($favorite) && $favorite->attributes->has('title')))
@if (! $favorite->attributes->has('title'))
<x-slot name="favorite">
{!! $favorite ?? '' !!}
</x-slot>
@else
@php
$favorite = [
'title' => $favorite->attributes->get('title'),
'icon' => $favorite->attributes->get('icon'),
'route' => !empty($favorite->attributes->has('route')) ? $favorite->attributes->get('route') : '',
'url' => !empty($favorite->attributes->has('url')) ? $favorite->attributes->get('url') : '',
];
@endphp
<x-slot name="favorite">
<x-menu.favorite
:title="$favorite['title']"
:icon="$favorite['icon']"
:route="$favorite['route']"
:url="$favorite['url']"
/>
</x-slot>
@endif
@endif
<x-slot name="buttons">
{!! $buttons ?? '' !!}
</x-slot>
<x-slot name="moreButtons">
{!! $moreButtons ?? '' !!}
</x-slot>
</x-layouts.admin.header>
<x-layouts.admin.content>
<x-layouts.admin.notifications />
{!! $content !!}
</x-layouts.admin.content>
<x-layouts.admin.footer />
</div>
</div>
</div>
@stack('body_end')
<x-layouts.admin.scripts />
</body>
</html>

View File

@ -0,0 +1,15 @@
@stack('content_start')
<div id="app">
@stack('content_content_start')
{!! $slot !!}
@stack('content_content_end')
<notifications></notifications>
<form id="form-dynamic-component" method="POST" action="#"></form>
<component v-bind:is="component"></component>
</div>
@stack('content_end')

View File

@ -0,0 +1,12 @@
@stack('footer_start')
<footer class="footer">
<div class="flex flex-col sm:flex-row items-center justify-between mt-10 lg:mt-20 py-7 text-sm font-light">
<div>
{{ trans('footer.powered') }}:
<a href="{{ trans('footer.link') }}" target="_blank">{{ trans('footer.software') }}</a>
&nbsp;<span class="material-icons align-middle text-black-300">code</span>&nbsp;
{{ trans('footer.version') }} {{ version('short') }}
</div>
</div>
</footer>
@stack('footer_end')

View File

@ -0,0 +1,61 @@
@props([
'metaTitle', 'title',
])
<head>
@stack('head_start')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8; charset=ISO-8859-1"/>
<title>{!! ! empty($metaTitle) ? $metaTitle : $title !!} - @setting('company.name')</title>
<base href="{{ config('app.url') . '/' }}">
<x-layouts.pwa.head />
<!-- Favicon -->
<link rel="icon" href="{{ asset('public/img/favicon.ico') }}" type="image/png">
<!--Icons-->
<link rel="stylesheet" href="{{ asset('public/css/fonts/material-icons/style.css?v=' . version('short')) }}" type="text/css">
<!-- Font -->
<link rel="stylesheet" href="{{ asset('public/vendor/quicksand/css/quicksand.css?v=' . version('short')) }}" type="text/css">
<!-- Css -->
<link rel="stylesheet" href="{{ asset('public/css//third_party/swiper-bundle.min.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css//third_party/vue-html-editor.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/element.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/app.css') }}" type="text/css">
@stack('css')
@stack('stylesheet')
@livewireStyles
<script type="text/javascript"><!--
var url = '{{ url("/" . company_id()) }}';
var app_url = '{{ config("app.url") }}';
var aka_currency = {!! !empty($currency) ? $currency : 'false' !!};
//--></script>
@stack('js')
<script type="text/javascript"><!--
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>;
var flash_notification = {!! (session()->has('flash_notification')) ? json_encode(session()->get('flash_notification')) : 'false' !!};
//--></script>
{{ session()->forget('flash_notification') }}
@stack('scripts')
@stack('head_end')
</head>

View File

@ -0,0 +1,37 @@
@stack('header_start')
<div id="header" class="xl:pt-6">
<div class="flex flex-col sm:flex-row flex-wrap items-start justify-between hide-empty-page">
<div class="w-full sm:w-6/12 items-center mb-3 sm:mb-0">
<div class="flex items-center">
<h1 class="flex items-center text-2xl xl:text-5xl text-black font-light -ml-0.5">
{!! $title !!}
@yield('dashboard_action')
</h1>
{!! $status ?? '' !!}
{!! $favorite ?? '' !!}
</div>
</div>
<div class="w-full sm:w-6/12">
<div class="flex flex-wrap flex-col sm:flex-row sm:items-center justify-end sm:space-x-2 sm:rtl:space-x-reverse">
@stack('header_button_start')
{!! $buttons !!}
@stack('header_button_end')
<x-suggestions />
@stack('header_suggestion_end')
{!! $moreButtons !!}
</div>
</div>
</div>
</div>
@stack('header_end')

View File

@ -0,0 +1,231 @@
@props(['companies'])
<div class="container flex items-center py-3 mb-4 border-b-2 xl:hidden">
<span class="material-icons text-black js-hamburger-menu">menu</span>
<div class="flex items-center m-auto">
<img src="{{ asset('public/img/akaunting-logo-green.svg') }}" class="w-8 m-auto" alt="Akaunting" />
<span class="ltr:ml-2 rtl:mr-2">{{ Str::limit(setting('company.name'), 22) }}</span>
</div>
@can('create-banking-transactions')
<x-dropdown id="dropdown-mobile-actions">
<x-slot name="trigger">
<span class="material-icons">more_horiz</span>
</x-slot>
<x-dropdown.link href="{{ route('transactions.create', ['type' => 'income']) }}">
{{ trans('general.title.new', ['type' => trans_choice('general.incomes', 1)]) }}
</x-dropdown.link>
<x-dropdown.link href="{{ route('transactions.create', ['type' => 'expense']) }}" kind="primary">
{{ trans('general.title.new', ['type' => trans_choice('general.expenses', 1)]) }}
</x-dropdown.link>
</x-dropdown>
@endcan
</div>
@stack('menu_start')
<div data-real-menu class="w-70 h-screen flex hidden fixed top-0 js-menu z-20 xl:z-10 transition-all ltr:-left-80 rtl:-right-80 xl:ltr:left-0 xl:rtl:right-0">
<div class="w-14 py-7 px-1 bg-lilac-900 z-10 menu-scroll overflow-y-auto overflow-x-hidden">
<div
data-tooltip-target="tooltip-profile"
data-tooltip-placement="right"
class="flex flex-col items-center justify-center mb-5 cursor-pointer menu-button"
data-menu="profile-menu"
>
<span id="menu-profile-icon-cancel" name="account_circle" class="material-icons-outlined w-8 h-8 flex items-center justify-center text-purple text-2xl hidden">
account_circle
</span>
@if (setting('default.use_gravatar', '0') == '1')
<img src="{{ user()->picture }}" alt="{{ user()->name }}" class="w-8 h-8 m-auto rounded-full" alt="{{ user()->name }}" title="{{ user()->name }}">
@elseif (is_object(user()->picture))
<img src="{{ Storage::url(user()->picture->id) }}" class="w-8 h-8 m-auto rounded-full" alt="{{ user()->name }}" title="{{ user()->name }}">
@else
<span id="menu-profile-icon" name="account_circle" class="material-icons-outlined text-purple w-8 h-8 flex items-center justify-center text-center text-2xl" alt="{{ user()->name }}" title="{{ user()->name }}">
account_circle
</span>
@endif
</div>
<div id="tooltip-profile" class="inline-block absolute z-20 py-1 px-2 text-sm font-medium rounded-lg bg-white text-gray-900 w-auto border border-gray-200 shadow-sm whitespace-nowrap tooltip-content opacity-0 invisible">
{{ trans('auth.profile') }}
<div class="absolute w-2 h-2 before:absolute before:w-2 before:h-2 before:bg-white before:border-gray-200 before:transform before:rotate-45 before:border -left-1 before:border-t-0 before:border-r-0 border-gray-200" data-popper-arrow></div>
</div>
<div class="group flex flex-col items-center justify-center menu-toggle-buttons">
@can('read-notifications')
<x-tooltip id="tooltip-notifications" placement="right" message="{{ trans_choice('general.notifications', 2) }}">
<button type="button"
@class([
'flex items-center menu-button justify-center w-8 h-8 mb-2.5 relative cursor-pointer js-menu-toggles',
'animate-vibrate' => $notification_count,
])
data-menu="notifications-menu">
<span id="menu-notification-icon" name="notifications" class="material-icons-outlined text-purple text-2xl">notifications</span>
@if ($notification_count)
<span data-notification-count class="w-2 h-2 absolute top-2 right-2 inline-flex items-center justify-center p-2.5 text-xs text-white font-bold leading-none transform translate-x-1/2 -translate-y-1/2 bg-orange rounded-full">
{{ $notification_count }}
</span>
@endif
</button>
</x-tooltip>
@endcan
<x-tooltip id="tooltip-search" placement="right" message="{{ trans('general.search') }}">
<button type="button" class="flex items-center menu-button justify-center w-8 h-8 mb-2.5 relative cursor-pointer">
<span id="menu-search-icon" name="search" class="material-icons-outlined text-purple text-2xl">search</span>
</button>
</x-tooltip>
<x-tooltip id="tooltip-new" placement="right" message="{{ trans('general.new') }}">
<button type="button" class="add-item menu-button flex items-center justify-center w-8 h-8 mb-2.5 cursor-pointer js-menu-toggles" data-menu="add-new-menu">
<span id="menu-neww-icon" name="add_circle_outline" class="material-icons-outlined text-purple text-2xl">add_circle_outline</span>
</button>
</x-tooltip>
<x-tooltip id="tooltip-settings" placement="right" message="{{ trans_choice('general.settings', 2) }}">
<button type="button" class="settings-item menu-button flex items-center justify-center w-8 h-8 mb-2.5 cursor-pointer js-menu-toggles" data-menu="settings-menu">
<span id="menu-settings-icon" name="settings" class="material-icons-outlined text-purple text-2xl">settings</span>
</button>
</x-tooltip>
<x-tooltip id="tooltip-support" placement="right" message="{{ trans('general.help') }}">
<a href="{{ url(trans('header.support_link')) }}" target="_blank" class="flex items-center justify-center w-8 h-8 mb-2.5 cursor-pointer js-menu-toggles">
<span id="menu-support-icon" class="material-icons-outlined text-purple text-2xl">support</span>
</a>
</x-tooltip>
</div>
<livewire:menu.favorites />
</div>
<nav class="menu-list js-main-menu" id="sidenav-main">
<div class="relative mb-5 cursor-pointer">
<button type="button" class="flex items-center" data-dropdown-toggle="dropdown-menu-company">
<div class="w-8 h-8 flex items-center justify-center">
<img src="{{ asset('public/img/akaunting-logo-green.svg') }}" class="w-6 h-6" alt="Akaunting" />
</div>
<div class="flex ltr:ml-2 rtl:mr-2">
<span class="w-28 text-left block text-base truncate">
<span class="border-b border-transparent transition-all hover:border-black">
{{ Str::limit(setting('company.name'), 22) }}
</span>
</span>
@can('read-common-companies')
<div class="absolute top-2 ltr:-right-1 rtl:-left-1">
<svg class="h-5 w-5 text-gray-400" x-description="Heroicon name: solid/selector" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
<path fill-rule="evenodd" d="M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z" clip-rule="evenodd"></path>
</svg>
</div>
@endcan
</div>
</button>
@can('read-common-companies')
<div id="dropdown-menu-company" class="absolute right-0 mt-3 pt-2 bg-white rounded-md shadow-xl z-20 hidden" style="left: auto; min-width: 10rem;">
@foreach($companies as $com)
<a href="{{ route('companies.switch', $com->id) }}" id="$com->id" class="h-9 leading-9 flex items-center text-sm px-2" role="menuitem" tabindex="-1">
<div class="w-full h-full flex items-center rounded-md px-2 hover:bg-lilac-100">
<span class="material-icons-outlined text-purple text-xl">business</span>
<span class="ltr:pl-2 rtl:pr-2 text-purple text-xs truncate">{{ Str::limit($com->name, 18) }}</span>
</div>
</a>
@endforeach
@can('update-common-companies')
<a href="{{ route('companies.index') }}" class="h-9 leading-9 flex items-center text-sm px-2 mt-2 border-t rounded-bl rounded-br group hover:bg-purple">
<div class="w-full h-full flex items-center rounded-md px-2">
<span class="material-icons-outlined text-purple text-xl group-hover:text-white">settings</span>
<span class="ltr:pl-2 rtl:pr-2 text-purple text-xs truncate group-hover:text-white">
{{ trans('general.title.manage', ['type' => trans_choice('general.companies', 2)]) }}
</span>
</div>
</a>
@endcan
</div>
@endcan
</div>
<div class="main-menu transform">
{!! menu('admin') !!}
</div>
</nav>
<div class="profile-menu user-menu menu-list fixed h-full ltr:-left-80 rtl:-right-80">
<div class="flex h-12.5">
@if (setting('default.use_gravatar', '0') == '1')
<img src="{{ user()->picture }}" alt="{{ user()->name }}" class="w-8 h-8 rounded-full" alt="{{ user()->name }}" title="{{ user()->name }}">
@elseif (is_object(user()->picture))
<img src="{{ Storage::url(user()->picture->id) }}" class="w-8 h-8 rounded-full" alt="{{ user()->name }}" title="{{ user()->name }}">
@else
<span name="account_circle" class="material-icons-outlined w-8 h-8 flex items-center justify-center text-purple text-2xl" alt="{{ user()->name }}" title="{{ user()->name }}">account_circle</span>
@endif
@stack('navbar_profile_welcome')
<div class="flex flex-col text-black ml-2">
<span class="text-xs">{{ trans('general.welcome') }}</span>
{{ user()->name }}
</div>
</div>
<livewire:menu.profile />
</div>
@can('read-notifications')
<div class="notifications-menu user-menu menu-list fixed h-full ltr:-left-80 rtl:-right-80">
<div class="flex items-center mb-3">
<span name="notifications" class="material-icons-outlined w-8 h-8 flex items-center justify-center text-purple text-2xl">notifications</span>
<div class="text-black ltr:ml-1 rtl:mr-1">
{{ trans_choice('general.your_notifications', 2) }}
</div>
</div>
<livewire:menu.notifications />
</div>
@endcan
<div class="settings-menu user-menu menu-list fixed h-full overflow-y-unset ltr:-left-80 rtl:-right-80">
<div class="flex items-center mb-3">
<span name="settings" class="material-icons-outlined w-8 h-8 flex items-center justify-center text-purple text-2xl">settings</span>
<div class="text-black ltr:ml-1 rtl:mr-1">
{{ trans_choice('general.settings', 2) }}
</div>
</div>
<livewire:menu.settings />
</div>
<div class="add-new-menu user-menu menu-list fixed h-full ltr:-left-80 rtl:-right-80">
<div class="flex items-center mb-3">
<span name="add_circle_outline" class="material-icons-outlined w-8 h-8 flex items-center justify-center text-purple text-2xl">add_circle_outline</span>
<div class="text-black ltr:ml-1 rtl:mr-1">
{{ trans('general.new_more') }}
</div>
</div>
<livewire:menu.neww />
</div>
<button type="button" class="toggle-button absolute ltr:-right-2 rtl:-left-2 top-8 cursor-pointer transition-opacity ease-in-out z-50">
<span class="material-icons text-lg text-purple transform ltr:rotate-90 rtl:-rotate-90">expand_circle_down</span>
</button>
<span data-menu-close id="menu-cancel" class="material-icons absolute ltr:-right-2 rtl:right-12 top-8 text-lg text-purple cursor-pointer z-10 hidden">cancel</span>
<div class="fixed w-full h-full invisible lg:hidden js-menu-background" style="background-color: rgba(0, 0, 0, 0.5); z-index: -1;"></div>
</div>
<x-loading.menu />
@stack('menu_end')

View File

@ -0,0 +1,3 @@
@foreach ($notifications as $notification)
{!! $notification !!}
@endforeach

View File

@ -0,0 +1,256 @@
<!-- Core -->
<script src="{{ asset('public/vendor/js-cookie/js.cookie.js') }}"></script>
<script type="text/javascript">
var company_currency_code = '{{ setting("default.currency") }}';
</script>
@stack('scripts_start')
@apexchartsScripts
@stack('charts')
<!-- <script type="text/javascript" src="{{ asset('public/akaunting-js/hotkeys.js') }}" defer></script> -->
<script type="text/javascript" src="{{ asset('public/akaunting-js/generalAction.js') }}"></script>
<script type="text/javascript" src="{{ asset('public/akaunting-js/popper.js') }}"></script>
<script type="text/javascript">
"use strict";
var Layout = (function() {
const toggleButton = document.querySelector(".toggle-button");
const sideBar = document.querySelector(".js-main-menu");
const navbarMenu = document.querySelector(".js-menu");
const mainContent = document.querySelector(".main-menu");
const menus = document.querySelectorAll(".user-menu");
const menuButtons = document.querySelectorAll(".menu-button");
const detailsEL = mainContent.getElementsByTagName("details");
const sectionContent = document.querySelector(".main-content");
const menuBackground = document.querySelector(".js-menu-background");
const menuClose = document.querySelector("[data-menu-close]");
if (document.querySelector('[data-menu="notifications-menu"]')) {
setTimeout(function() {
document.querySelector('[data-menu="notifications-menu"]').classList.remove("animate-vibrate");
}, 6000);
}
Array.from(detailsEL).forEach((el) => {
el.addEventListener("toggle", function(e) {
if (e.target.querySelector(".material-icons-outlined")) {
e.target.querySelector(".material-icons").classList.toggle("rotate-180");
} else {
if (e.target.querySelectorAll(".material-icons")[1]) {
e.target.querySelectorAll(".material-icons")[1].classList.toggle("rotate-180");
} else {
e.target.querySelectorAll(".material-icons")[0].classList.toggle("rotate-180");
}
}
})
}
);
function contentTransitionLeft() {
sectionContent.classList.add("xl:ltr:ml-0", "xl:rtl:mr-0");
sectionContent.classList.remove("xl:ltr:ml-64", "xl:rtl:mr-64");
toggleButton.querySelector("span").classList.add("ltr:-rotate-90", "rtl:rotate-90");
}
function contentTransitionRight() {
sectionContent.classList.remove("xl:ltr:ml-0", "xl:rtl:mr-0");
sectionContent.classList.add("xl:ltr:ml-64", "xl:rtl:mr-64");
toggleButton.querySelector("span").classList.remove("ltr:-rotate-90", "rtl:rotate-90");
}
function notificationCount(action) {
let notification_count = document.querySelector('[data-notification-count]');
if (notification_count) {
notification_count.style = `display: ${action}`
}
}
function slideMenu() {
if (document.body.clientWidth <= 1280) {
mobileMenuHidden();
} else {
if (sideBar.classList.contains("menu-list-hidden")) {
toggleButton.classList.remove("ltr:left-12", "rtl:right-12");
sideBar.classList.remove("menu-list-hidden");
if (document.body.clientWidth > "991") {
contentTransitionRight();
}
} else {
sideBar.classList.add("menu-list-hidden");
toggleButton.classList.add("ltr:left-12", "rtl:right-12");
if (document.body.clientWidth > "991") {
contentTransitionLeft();
}
}
}
}
toggleButton.addEventListener("click", function() {
slideMenu();
});
function toggleMenu(iconButton, event) {
const menuRef = iconButton.getAttribute("data-menu");
const icon = iconButton.children[0].getAttribute("name");
if (iconButton.getAttribute("data-menu") === "profile-menu") {
if (iconButton.children[0].textContent != "cancel") {
iconButton.children[0].classList.remove("hidden");
iconButton.children[1].classList.add("hidden");
} else {
iconButton.children[0].classList.add("hidden");
iconButton.children[1].classList.remove("hidden");
}
}
menuButtons.forEach((button) => {
if (icon) {
if (button.getAttribute("data-menu") !== menuRef && iconButton.children[0].textContent != "cancel") {
button.children[0].textContent = button.children[0].getAttribute("name");
button.children[0].classList.remove("active"); // inactive icon
}
}
});
menus.forEach((menu) => {
if (menu.classList.contains(menuRef) && iconButton.children[0].textContent != "cancel") {
iconButton.children[0].textContent = "cancel";
iconButton.children[0].classList.add("active");
menu.classList.remove("ltr:-left-80", "rtl:-right-80");
menu.classList.add("ltr:left-14", "rtl:right-14");
mainContent.classList.add("hidden");
toggleButton.classList.add("invisible");
menuClose.classList.remove("hidden");
notificationCount("none");
} else if (menu.classList.contains(menuRef) && iconButton.children[0].textContent == "cancel") {
iconButton.children[0].textContent = icon;
iconButton.children[0].classList.remove("active");
menu.classList.add("ltr:-left-80", "rtl:-right-80");
menu.classList.remove("ltr:left-14", "rtl:right-14");
mainContent.classList.remove("hidden");
toggleButton.classList.remove("invisible");
menuClose.classList.add("hidden");
notificationCount("flex");
} else {
menu.classList.add("ltr:-left-80", "rtl:-right-80");
menu.classList.remove("ltr:left-14", "rtl:right-14");
}
menuClose.addEventListener("click", function() {
menu.classList.add("ltr:-left-80", "rtl:-right-80");
menu.classList.remove("ltr:left-14", "rtl:right-14");
iconButton.children[0].textContent = icon;
iconButton.children[0].classList.remove("active");
mainContent.classList.remove("hidden");
this.classList.add("hidden");
toggleButton.classList.remove("invisible");
});
});
}
if (document.body.clientWidth >= 1280) {
if (is_profile_menu == 1) {
let profile_menu_html = document.querySelector(".profile-menu");
let profile_icon_html = document.querySelector("[data-menu='profile-menu']");
profile_menu_html.classList.add("ltr:left-14", "rtl:right-14");
profile_menu_html.classList.remove("ltr:-left-80", "rtl:-right-80");
profile_icon_html.children[0].textContent = "cancel";
profile_icon_html.children[0].classList.add("active");
profile_icon_html.children[0].classList.remove("hidden");
profile_icon_html.children[1].classList.add("hidden");
toggleButton.classList.add("invisible");
}
if (is_settings_menu == 1) {
let settings_menu_html = document.querySelector(".settings-menu");
let settings_icon_html = document.querySelector("[data-menu='settings-menu']");
settings_menu_html.classList.add("ltr:left-14", "rtl:right-14");
settings_menu_html.classList.remove("ltr:-left-80", "rtl:-right-80");
settings_icon_html.children[0].textContent = "cancel";
settings_icon_html.children[0].classList.add("active");
toggleButton.classList.add("invisible");
}
}
function mobileMenuActive() {
navbarMenu.classList.add("ltr:left-0", "rtl:right-0");
navbarMenu.classList.remove("ltr:-left-80", "rtl:-right-80");
menuBackground.classList.add("visible");
menuBackground.classList.remove("invisible");
}
function mobileMenuHidden() {
navbarMenu.classList.remove("ltr:left-0", "rtl:right-0");
navbarMenu.classList.add("ltr:-left-80", "rtl:-right:80");
mainContent.classList.remove("hidden");
menus.forEach((menu) => {
menu.classList.remove("ltr:left-14", "rtl:right-14");
menu.classList.add("ltr:-left-80", "rtl:-right-80");
});
menuButtons.forEach((iconButton) => {
iconButton.children[0].classList.remove("active");
iconButton.children[0].textContent = iconButton.children[0].getAttribute("name");
});
menuBackground.classList.remove("visible");
menuBackground.classList.add("invisible");
}
document.querySelector(".js-hamburger-menu").addEventListener("click", function() {
mobileMenuActive();
});
menuBackground.addEventListener("click", function() {
mobileMenuHidden();
});
menuButtons.forEach((iconButton) =>
iconButton.addEventListener("click", function() {
toggleMenu(iconButton, event);
})
);
})(500);
</script>
@stack('body_css')
@stack('body_stylesheet')
@stack('body_js')
@stack('body_scripts')
@livewireScripts
<script src="{{ asset('public/vendor/alpinejs/alpine.min.js') }}"></script>
<!-- Livewire -->
<script type="text/javascript">
window.livewire_app_url = {{ company_id() }};
</script>
@stack('scripts_end')

View File

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.auth.head>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
</x-layouts.auth.head>
@mobile
<body class="g-sidenav-hidden bg-body overflow-overlay">
@elsemobile
<body class="g-sidenav-show bg-body overflow-overlay">
@endmobile
@stack('body_start')
<div id="app" class="bg-no-repeat bg-cover bg-center" style="background-image: url({{ asset('public/img/auth/login-bg.png') }});">
<div class="relative w-full lg:max-w-7xl flex items-center m-auto">
<x-layouts.auth.slider>
{!! $slider ?? '' !!}
</x-layouts.auth.slider>
<x-layouts.auth.content>
{!! $content !!}
<x-layouts.auth.footer />
</x-layouts.auth.content>
</div>
</div>
@stack('body_end')
<x-layouts.auth.scripts />
</body>
</html>

View File

@ -0,0 +1,7 @@
@stack('content_start')
<div class="w-full lg:w-46 h-31 flex flex-col justify-center gap-12 px-6 lg:px-24 py-24 mt-12 lg:mt-0">
<div class="flex flex-col gap-4">
{!! $slot !!}
</div>
</div>
@stack('content_end')

View File

@ -0,0 +1,7 @@
@stack('footer_start')
<footer class="footer">
<div class="lg:absolute bottom-10 right-6 lg:right-24 flex flex-col sm:flex-row items-center justify-end text-sm font-light">
{{ trans('footer.powered') }}: <a href="{{ trans('footer.link') }}" target="_blank">{{ trans('footer.software') }}</a>
</div>
</footer>
@stack('footer_end')

View File

@ -0,0 +1,58 @@
@props([
'title',
])
<head>
@stack('head_start')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8; charset=ISO-8859-1"/>
<title>{!! $title !!}</title>
<base href="{{ config('app.url') . '/' }}">
<x-layouts.pwa.head />
<!-- Favicon -->
<link rel="icon" href="{{ asset('public/img/favicon.ico') }}" type="image/png">
<!--Icons-->
<link rel="stylesheet" href="{{ asset('public/css/fonts/material-icons/style.css?v=' . version('short')) }}" type="text/css">
<!-- Font -->
<link rel="stylesheet" href="{{ asset('public/vendor/quicksand/css/quicksand.css?v=' . version('short')) }}" type="text/css">
<!-- Css -->
<link rel="stylesheet" href="{{ asset('public/css//third_party/swiper-bundle.min.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/app.css') }}" type="text/css">
@stack('css')
@stack('stylesheet')
@livewireStyles
<script type="text/javascript"><!--
var url = '{{ url("/" . company_id()) }}';
var app_url = '{{ config("app.url") }}';
//--></script>
@stack('js')
<script type="text/javascript"><!--
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>;
var flash_notification = {!! (session()->has('flash_notification')) ? json_encode(session()->get('flash_notification')) : 'false' !!};
//--></script>
{{ session()->forget('flash_notification') }}
@stack('scripts')
@stack('head_end')
</head>

View File

@ -0,0 +1,17 @@
@stack('scripts_start')
<!-- <script type="text/javascript" src="{{ asset('public/akaunting-js/hotkeys.js') }}" defer></script> -->
@stack('body_css')
@stack('body_stylesheet')
@stack('body_js')
@stack('body_scripts')
@livewireScripts
<script src="{{ asset('public/vendor/alpinejs/alpine.min.js') }}"></script>
@stack('scripts_end')

View File

@ -0,0 +1,51 @@
@stack('slider_start')
<div class="hidden lg:block md:w-6/12 h-full flex-col h-fit">
<div class="swiper bg-cover bg-bottom bg-no-repeat h-screen py-24">
<div class="swiper-container h-full">
<div class="swiper-wrapper">
<div class="swiper-slide flex justify-center flex-col items-center">
<div style="width:450px; height:450px;">
<img src="{{ asset('public/img/auth/folder.png') }}" />
</div>
<h1 class="text-3xl text-black-400 font-bold">
{{ trans('auth.information.invoice') }}
</h1>
</div>
<div class="swiper-slide flex justify-center flex-col items-center">
<div style="width:450px; height:450px;">
<img src="{{ asset('public/img/auth/chart.png') }}" />
</div>
<h1 class="text-3xl text-black-400 font-bold">
{{ trans('auth.information.reports') }}
</h1>
</div>
<div class="swiper-slide flex justify-center flex-col items-center">
<div style="width:450px; height:450px;">
<img src="{{ asset('public/img/auth/client.png') }}" />
</div>
<h1 class="text-3xl text-black-400 font-bold">
{{ trans('auth.information.expense') }}
</h1>
</div>
<div class="swiper-slide flex justify-center flex-col items-center">
<div style="width:450px; height:450px;">
<img src="{{ asset('public/img/auth/layout.png') }}" />
</div>
<h1 class="text-3xl text-black-400 font-bold">
{{ trans('auth.information.customize') }}
</h1>
</div>
</div>
<div class="swiper-pagination w-full flex justify-center pb-12 gap-1"></div>
</div>
</div>
</div>
@stack('slider_end')

View File

@ -0,0 +1,32 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.admin.head>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
</x-layouts.admin.head>
@mobile
<body class="g-sidenav-hidden bg-body overflow-overlay">
@elsemobile
<body class="g-sidenav-show bg-body overflow-overlay">
@endmobile
@stack('body_start')
<div class="main-content xl:ltr:ml-64 xl:rtl:mr-64 transition-all ease-in-out" id="panel">
<div id="main-body">
<div class="container">
<x-layouts.admin.content>
{!! $content !!}
</x-layouts.admin.content>
</div>
</div>
</div>
@stack('body_end')
<x-layouts.admin.scripts />
</body>
</html>

View File

@ -0,0 +1,34 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.install.head>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
</x-layouts.install.head>
<body>
@stack('body_start')
<div class="bg-no-repeat bg-cover bg-center" style="background-image: url({{ asset('public/img/auth/login-bg.png') }});">
<div class="relative w-full lg:max-w-7xl flex items-center m-auto">
<x-layouts.auth.slider>
{!! $slider ?? '' !!}
</x-layouts.auth.slider>
<div class="w-full lg:w-46 h-31 flex flex-col justify-center gap-12 px-6 lg:px-24 py-24 mt-12 lg:mt-0">
<div class="flex flex-col gap-4">
<img src="{{ asset('public/img/akaunting-logo-green.svg') }}" class="w-16 my-3" alt="Akaunting" />
<x-layouts.install.content :title="$title">
{!! $content !!}
</x-layouts.install.content>
</div>
</div>
</div>
</div>
@stack('body_end')
<x-layouts.install.scripts />
</body>
</html>

View File

@ -0,0 +1,50 @@
@stack('content_start')
<div id="app">
@stack('content_content_start')
<x-form id="form-install" :url="url()->current()">
<div class="card-body">
<div class="text-center text-muted mt-2 mb-4">
<small>
{!! $attributes->get('title') !!}
</small>
</div>
@include('flash::message')
{!! $slot !!}
</div>
<div class="card-footer">
<div class="float-right">
@if (Request::is('install/requirements'))
<a href="{{ route('install.requirements') }}" class="btn btn-success">
{{ trans('install.refresh') }}
</a>
@else
<x-button
type="submit"
id="next-button"
::disabled="loading"
class="relative flex items-center justify-center bg-green hover:bg-green-700 text-white px-6 py-1.5 text-base rounded-lg disabled:bg-green-100 sm:col-span-6"
override="class"
data-loading-text="{{ trans('general.loading') }}"
>
<i v-if="loading" class="submit-spin absolute w-2 h-2 rounded-full left-0 right-0 -top-3.5 m-auto"></i>
<span :class="[{'opacity-0': loading}]">
{{ trans('install.next') }}
</span>
</x-button>
@endif
</div>
</div>
</x-form>
@stack('content_content_end')
<notifications></notifications>
<form id="form-dynamic-component" method="POST" action="#"></form>
<component v-bind:is="component"></component>
</div>
@stack('content_end')

View File

@ -0,0 +1,59 @@
@props([
'title',
])
<head>
@stack('head_start')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8; charset=ISO-8859-1"/>
<title>{!! $title !!} - {{ config('app.name') }}</title>
<base href="{{ config('app.url') . '/' }}">
<x-layouts.pwa.head />
<!-- Favicon -->
<link rel="icon" href="{{ asset('public/img/favicon.ico') }}" type="image/png">
<!--Icons-->
<link rel="stylesheet" href="{{ asset('public/css/fonts/material-icons/style.css?v=' . version('short')) }}" type="text/css">
<!-- Font -->
<link rel="stylesheet" href="{{ asset('public/vendor/quicksand/css/quicksand.css?v=' . version('short')) }}" type="text/css">
<!-- Css -->
<link rel="stylesheet" href="{{ asset('public/css//third_party/swiper-bundle.min.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/element.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/app.css') }}" type="text/css">
@stack('css')
@stack('stylesheet')
@livewireStyles
<script type="text/javascript"><!--
var url = '{{ url("/") }}';
var app_url = '{{ config("app.url") }}';
//--></script>
@stack('js')
<script type="text/javascript"><!--
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>;
var flash_notification = {!! (session()->has('flash_notification')) ? json_encode(session()->get('flash_notification')) : 'false' !!};
//--></script>
{{ session()->forget('flash_notification') }}
@stack('scripts')
@stack('head_end')
</head>

View File

@ -0,0 +1,13 @@
@stack('scripts_start')
<script src="{{ asset('public/js/install.min.js?v=' . version('short')) }}"></script>
@stack('body_css')
@stack('body_stylesheet')
@stack('body_js')
@stack('body_scripts')
@stack('scripts_end')

View File

@ -0,0 +1,6 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.maintenance.head></x-layouts.maintenance.head>
<x-layouts.maintenance.body></x-layouts.maintenance.body>
</html>

View File

@ -0,0 +1,9 @@
<div class="max-w-7xl m-auto h-screen flex flex-col sm:flex-row items-center justify-center sm:justify-between">
<div class="flex flex-col items-start gap-y-4 mb-10 sm:mb-0 sm:-mt-24">
<span class="text-lg">
{{ trans('maintenance.message') }}
</span>
</div>
<img src="{{ asset('public/img/empty_pages/transactions.png') }}" alt="{{ trans('maintenance.message') }}" />
</div>

View File

@ -0,0 +1,30 @@
<head>
@stack('head_start')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8; charset=ISO-8859-1"/>
<meta name="robots" content="noindex,nofollow">
<title>{{ trans('maintenance.title') }}</title>
<base href="{{ config('app.url') . '/' }}">
<link rel="stylesheet" href="{{ asset('public/css/fonts/material-icons/style.css') }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/vendor/quicksand/css/quicksand.css') }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/apps.css') }}" type="text/css">
@stack('css')
@stack('stylesheet')
<script type="text/javascript"><!--
var url = '{{ url("/" . company_id()) }}';
var app_url = '{{ config("app.url") }}';
//--></script>
@stack('js')
@stack('head_end')
</head>

View File

@ -0,0 +1,76 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.modules.head>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
</x-layouts.modules.head>
@mobile
<body class="g-sidenav-hidden bg-body overflow-overlay">
@elsemobile
<body class="g-sidenav-show bg-body overflow-overlay">
@endmobile
@stack('body_start')
<x-layouts.admin.menu />
<div class="main-content xl:ltr:ml-64 xl:rtl:mr-64 transition-all ease-in-out" id="panel">
<div id="main-body">
<div class="container">
<x-layouts.admin.header>
<div class="flex flex-row justify-items-center align-baseline">
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
@if (!empty($favorite) || (!empty($favorite) && $favorite->attributes->has('title')))
@if (! $favorite->attributes->has('title'))
<x-slot name="favorite">
{!! $favorite ?? '' !!}
</x-slot>
@else
<x-menu.favorite
title="{!! $favorite->attributes->get('title') !!}"
icon="{{ $favorite->attributes->get('icon') }}"
@if (!empty($favorite->attributes->has('route')))
route="{{ $favorite->attributes->get('route') }}"
@endif
@if (!empty($favorite->attributes->has('url')))
url="{{ $favorite->attributes->get('url') }}"
@endif
/>
@endif
@endif
<x-slot name="buttons">
{!! $buttons ?? '' !!}
</x-slot>
<x-slot name="moreButtons">
{!! $moreButtons ?? '' !!}
</x-slot>
</div>
</x-layouts.admin.header>
<x-layouts.admin.content>
@if (! $content->attributes->has('withoutBar'))
<x-layouts.modules.bar />
@endif
{!! $content !!}
</x-layouts.admin.content>
<x-layouts.admin.footer />
</div>
</div>
</div>
@stack('body_end')
<x-layouts.admin.scripts />
</body>
</html>

View File

@ -0,0 +1,107 @@
<div class="relative w-full flex border-b pt-8 mb-4">
<div class="flex flex-row items-center place-center border-r">
<button class="flex items-center" id="dropdownButton" data-dropdown-toggle="dropdown">
<i class="material-icons w-10 flex items-center aspect-square text-light-gray ltr:pl-2 rtl:pr-2 hover:text-gray-700"> apps_outlined </i>
</button>
<div id="dropdown" data-click-outside-none class="w-full px-0 hidden z-10">
<div class="flex flex-col md:flex-row">
<div class="w-full lg:w-6/12 flex flex-col shadow-md bg-white px-4 lg:pl-8 py-8 gap-2 rounded-l-xl">
<h4 class="capitalize font-thin">
{{ trans_choice('general.categories', 1) }}
</h4>
<div class="grid grid-cols-2 gap-2">
@foreach ($categories as $slug => $category)
<x-link href="{{ $categoryUrl($slug) }}" class="font-semibold text-sm ltr:pr-4 rtl:pl-4 lg:pr-0 truncate bg-transparent" override="class">
<span class="border-b border-transparent transition-all hover:border-black">
{{ $category }}
</span>
</x-link>
@endforeach
</div>
</div>
<div class="w-full lg:w-6/12 flex flex-col shadow-md bg-purple-lighter px-4 lg:px-12 py-8 gap-2 rounded-r-xl">
<h4 class="capitalize font-thin mb-2">
{{ trans('modules.popular_this_week') }}
</h4>
@if ($popular)
<div class="flex flex-col gap-4">
@foreach ($popular->data as $item)
<div class="hover:shadow-2xl rounded-lg">
<a href="{{ route('apps.app.show', $item->slug) }}" class="flex items-center p-2">
@foreach ($item->files as $file)
@if (($file->media_type == 'image') && ($file->pivot->zone == 'thumbnail'))
<img src="{{ $file->path_string }}" alt="{{ $item->name }}" class="w-28 h-20 rounded-md object-cover ltr:mr-3 rtl:ml-3" />
@endif
@endforeach
<div class="flex flex-col py-1 gap-0">
<h6 class="text-sm font-bold capitalize">
{!! $item->name !!}
</h6>
<div class="line-clamp-2">
<p class="font-thin text-xs text-left">
{!! $item->description !!}
</p>
</div>
</div>
</a>
</div>
@endforeach
</div>
@else
@endif
</div>
</div>
</div>
</div>
<div class="flex flex-col lg:flex-row w-full justify-between">
<div class="h-full relative">
<form method="GET" action="{{ url("/" . company_id()) }}/apps/search">
<div class="h-full flex items-center pl-2 gap-2">
<i class="material-icons text-light-gray">search</i>
<input
type="text"
name="keyword"
class="w-full bg-transparent text-black text-sm border-0 pr-10 pl-0 pb-2 focus:outline-none focus:ring-transparent focus:border-purple"
value="{{ isset($keyword) ? $keyword : '' }}"
placeholder="{{ trans('general.search_placeholder') }}"
autocomplete="off"
/>
</div>
</form>
</div>
<div class="flex flex-row items-end lg:items-center mb-1 divide-x divide-black-400">
<x-link href="{{ route('apps.home.index') }}" class="text-sm font-semibold px-2 sm:mt-0 sm:mb-0 leading-4" override="class">
<span class="border-b border-transparent transition-all hover:border-black-400">
{{ trans('modules.home') }}
</span>
</x-link>
<x-link href="{{ route('apps.new') }}" class="text-sm font-semibold px-2 sm:mt-0 sm:mb-0 leading-4" override="class">
<span class="border-b border-transparent transition-all hover:border-black-400">
{{ trans('modules.new') }}
</span>
</x-link>
<x-link href="{{ route('apps.paid') }}" class="text-sm font-semibold px-2 sm:mt-0 sm:mb-0 leading-4" override="class">
<span class="border-b border-transparent transition-all hover:border-black-400">
{{ trans('modules.top_paid') }}
</span>
</x-link>
<x-link href="{{ route('apps.free') }}" class="text-sm font-semibold px-2 sm:mt-0 sm:mb-0 leading-4" override="class">
<span class="border-b border-transparent transition-all hover:border-black-400">
{{ trans('modules.top_free') }}
</span>
</x-link>
</div>
</div>
</div>

View File

@ -0,0 +1,81 @@
@props([
'title',
])
<head>
@stack('head_start')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8; charset=ISO-8859-1"/>
<title>{!! $title !!} - @setting('company.name')</title>
<base href="{{ config('app.url') . '/' }}">
<x-layouts.pwa.head />
<!-- Favicon -->
<link rel="icon" href="{{ asset('public/img/favicon.ico') }}" type="image/png">
<!--Icons-->
<link rel="stylesheet" href="{{ asset('public/css/fonts/material-icons/style.css?v=' . version('short')) }}" type="text/css">
<!-- Font -->
<link rel="stylesheet" href="{{ asset('public/vendor/quicksand/css/quicksand.css?v=' . version('short')) }}" type="text/css">
<!-- Css -->
<link rel="stylesheet" href="{{ asset('public/css//third_party/swiper-bundle.min.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css//third_party/vue-html-editor.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/element.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/app.css') }}" type="text/css">
@stack('css')
@stack('stylesheet')
<style type="text/css">
.app-documentation > h1 {
text-align: center;
font-size: 1.75rem;
line-height: 2rem;
}
.app-documentation > p,
.app-documentation > li {
font-size: 1rem;
line-height: 1.5rem;
}
.app-documentation > ul {
list-style-type: disc;
list-style-position: inside;
}
</style>
@livewireStyles
<script type="text/javascript"><!--
var url = '{{ url("/" . company_id()) }}';
var app_home = '{{ route("apps.home.index") }}';
var app_url = '{{ config("app.url") }}';
var aka_currency = {!! !empty($currency) ? $currency : 'false' !!};
//--></script>
@stack('js')
<script type="text/javascript"><!--
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>;
var flash_notification = {!! (session()->has('flash_notification')) ? json_encode(session()->get('flash_notification')) : 'false' !!};
//--></script>
{{ session()->forget('flash_notification') }}
@stack('scripts')
@stack('head_end')
</head>

View File

@ -0,0 +1,63 @@
<div>
<div>
@foreach ($module->files as $file)
<a href="{{ route('apps.app.show', $module->slug) }}">
@if (($file->media_type == 'image') && ($file->pivot->zone == 'thumbnail'))
<img src="{{ $file->path_string }}" alt="{{ $module->name }}" class="rounded-md" />
@endif
</a>
@endforeach
</div>
<div class="flex flex-col py-2 justify-between align-bottom">
<div class="flex items-baseline justify-between">
<h4 class="w-36 truncate">
<a href="{{ route('apps.app.show', $module->slug) }}">
{{ $module->name }}
</a>
</h4>
<div class="text-xs">
@if ($module->price == '0.0000')
<span class="font-bold text-purple">
{{ trans('modules.free') }}
</span>
@else
{!! $module->price_prefix !!}
@if (isset($module->special_price))
<del class="text-danger">
{{ $module->price }}
</del>
{{ $module->special_price }}
@else
{{ $module->price }}
@endif
{!! $module->price_suffix !!}
@endif
</div>
</div>
<div class="flex items-baseline justify-between">
<div class="flex">
@if($module->vote > 0)
@for ($i = 1; $i <= $module->vote; $i++)
<i class="material-icons text-xs text-orange">star</i>
@endfor
@for ($i = $module->vote; $i < 5; $i++)
<i class="material-icons text-xs">star_border</i>
@endfor
@endif
</div>
<small class="text-xs">
@if ($module->total_review)
{{ $module->total_review }} {{ trans('modules.tab.reviews') }}
@endif
</small>
</div>
</div>
</div>

View File

@ -0,0 +1,59 @@
<div>
<div class="flex justify-end py-2">
@if ($module->payment_type)
@if ($module->payment_type == 'yearly')
@php
$color = 'bg-purple-100';
$text = trans('general.yearly');
@endphp
@else
@php
$color = 'bg-purple-100';
$text = trans('general.monthly');
@endphp
@endif
@endif
<span class="inline-flex items-center justify-center text-xs px-4 py-1 font-semibold leading-none rounded-md {{ $color }}">
{{ $text }}
</span>
</div>
<div>
@foreach ($module->files as $file)
<a href="{{ route('apps.app.show', $module->slug) }}">
@if (($file->media_type == 'image') && ($file->pivot->zone == 'thumbnail'))
<img src="{{ $file->path_string }}" alt="{{ $module->name }}" class="rounded-md" />
@endif
</a>
@endforeach
</div>
<div class="flex py-2 justify-between items-center">
<div class="py-2">
<h4 class="truncate font-bold text-sm">
<a href="{{ route('apps.app.show', $module->slug) }}">
{{ $module->name }}
</a>
</h4>
</div>
<div>
@if ($module->status_type == 'active')
@php
$color = 'bg-green-300';
$text = trans('general.enabled');
@endphp
@else
@php
$color = 'bg-red';
$text = trans('general.disabled');
@endphp
@endif
<span class="inline-flex items-center justify-center text-xs px-4 py-1 font-semibold leading-none rounded-md {{ $color }} text-white">
{{ $text }}
</span>
</div>
</div>
</div>

View File

@ -0,0 +1,9 @@
<div id="releases-items">
@if (! empty($releases))
@foreach ($releases->data as $release)
<p>{{ $release->version }} - <x-date :date="$release->released_at" /></p>
{!! $release->changelog !!}
@endforeach
@endif
</div>

View File

@ -0,0 +1,41 @@
<div id="review-items" class="divide-y">
@if (! empty($reviews))
@foreach ($reviews->data as $review)
<div class="flex flex-col lg:flex-row gap-2 py-4 px-2 justify-between items-start">
<div class="flex flex-col">
<h5 class="text-sm mb-0">
{{ $review->author }}
</h5>
<p class="text-xs">
<x-date date="{{ $review->created_at }}" />
</p>
</div>
<span class="flex gap-0">
@if ($review->rating)
@for ($i = 1; $i <= $review->rating; $i++)
<i class="material-icons text-xs text-orange">star</i>
@endfor
@if ($review->rating < 5)
@for ($i = 1; $i <= 5 - $review->rating; $i++)
<i class="material-icons text-xs">star_border</i>
@endfor
@endif
@else
@for ($i = 1; $i <= 5; $i++)
<i class="material-icons text-xs">star_border</i>
@endfor
@endif
</span>
<div class="w-full lg:w-1/2">
<p class="text-sm lh-160">
{!! nl2br($review->text) !!}
</p>
</div>
</div>
@endforeach
@endif
</div>

View File

@ -0,0 +1,45 @@
@props(['module', 'installed', 'enable'])
@if ($installed)
@can('delete-modules-item')
<a href="{{ route('apps.app.uninstall', $module->slug) }}" class="bg-red text-white rounded-md text-sm text-center w-1/2 py-2 truncate">
{{ trans('modules.button.uninstall') }}
</a>
@endcan
@can('update-modules-item')
@if ($enable)
<a href="{{ route('apps.app.disable', $module->slug) }}" class="bg-orange rounded-md text-white w-1/2 text-center text-sm py-2 truncate">
{{ trans('modules.button.disable') }}
</a>
@else
<a href="{{ route('apps.app.enable', $module->slug) }}" class="bg-green rounded-md text-white text-sm text-center w-1/2 py-2 truncate">
{{ trans('modules.button.enable') }}
</a>
@endif
@endcan
@else
@can('create-modules-item')
@if ($module->install)
@if (! empty($module->isPurchase) && (! empty($module->purchase_type) && $module->purchase_type == 'monthly'))
<x-tooltip message="{!! trans('modules.can_not_install', ['app' => $module->name]) !!}" placement="right">
<x-button disabled="disabled">
{{ trans('modules.install') }}
</x-button>
</x-tooltip>
@else
<button type="button"
@click="onInstall('{{ $module->action_url }}', '{{ $module->slug }}', '{!! str_replace("'", "\'", $module->name) !!}', '{{ $module->version }}')"
class="bg-green hover:bg-green-700 rounded-md text-white text-sm text-center w-full py-2 truncate"
id="install-module"
>
{{ trans('modules.install') }}
</button>
@endif
@else
<a href="{{ $module->action_url }}" class="bg-green hover:bg-green-700 rounded-md text-white text-sm text-center w-full py-2 truncate" target="_blank">
{{ trans('modules.use_app') }}
</a>
@endif
@endcan
@endif

View File

@ -0,0 +1,5 @@
@props(['module'])
<div class="font-thin text-sm">
{!! $module->changelog !!}
</div>

View File

@ -0,0 +1,7 @@
@props(['module'])
<div class="font-thin text-sm">
<div class="app-documentation flex flex-col gap-4 py-4">
{!! $module->description !!}
</div>
</div>

View File

@ -0,0 +1,7 @@
@props(['module'])
<div class="font-thin text-sm">
<div class="app-documentation flex flex-col gap-4 py-4">
{!! $module->documentation->body !!}
</div>
</div>

View File

@ -0,0 +1,29 @@
@props(['module'])
<div class="flex flex-col gap-20">
@foreach ($module->call_to_actions as $cta)
<div @class([
'flex flex-col',
'lg:flex-row-reverse' => $cta->position == 'left',
'lg:flex-row' => $cta->position != 'left',
'justify-between gap-12'
])
>
<div class="w-full lg:w-1/2 flex flex-col gap-6 justify-center">
<h2 class="font-bold text-3xl">
{{ $cta->title }}
</h2>
<div class="flex flex-col gap-4 divide-y">
<div class="font-thin text-sm leading-6 tracking-widest">
{{ $cta->description }}
</div>
</div>
</div>
<div class="w-full lg:w-1/2">
<img src="{{ $cta->thumb->path_string }}" alt="{{ $cta->thumb->alt_attribute }}" />
</div>
</div>
@endforeach
</div>

View File

@ -0,0 +1,5 @@
@props(['module'])
<div class="font-thin text-sm">
{!! $module->installation !!}
</div>

View File

@ -0,0 +1,59 @@
@props(['module'])
@if ($module->price != '0.0000')
<div class="flex gap-2 items-baseline">
{!! $module->price_prefix !!}
<div x-show="price_type == true">
@if (! empty($module->is_discount))
<del class="text-red">
{!! $module->yearly_per_monthly_price !!}
</del>
<span class="text-5xl font-bold text-purple">
{!! $module->yearly_per_monthly_special_price !!}
</span>
@else
<span class="text-5xl font-bold text-purple">
{!! $module->yearly_per_monthly_price !!}
</span>
@endif
<div class="text-center text-sm mt-3 mb--2">
<span style="height: 18px;display: block;"></span>
</div>
</div>
<div x-show="price_type == false">
@if (! empty($module->is_discount))
<del class="text-red">
{!! $module->monthly_price !!}
</del>
<span class="text-5xl font-bold text-purple">
{!! $module->monthly_special_price !!}
</span>
@else
<span class="text-5xl font-bold text-purple">
{!! $module->monthly_price !!}
</span>
@endif
<div class="text-center text-sm mt-3 mb--2">
<span style="font-size: 12px;">
<span class="text-danger">*</span> {!! trans('modules.information_monthly') !!}
</span>
</div>
</div>
{!! $module->price_suffix !!}
<span class="font-thin">
{{ trans('modules.per_month') }}
</span>
</div>
@else
<span class="text-4xl font-bold text-purple">
{{ trans('modules.free') }}
</span>
@endif

View File

@ -0,0 +1,36 @@
@props(['module'])
@php
$releases = $module->app_releases;
@endphp
<div id="releases" class="clearfix js-releases-content" v-if="releases.status" v-html="releases.html"></div>
<div id="releases" class="clearfix js-releases-content" v-else>
<x-layouts.modules.releases :releases="$releases" />
</div>
@if (! empty($releases->current_page != $releases->last_page))
@stack('pagination_start')
<div class="w-full flex flex-row justify-evenly my-2" v-if="releases.pagination.last_page != releases.pagination.current_page">
<button
type="button"
id="releases-load-more"
:disabled="loadMoreLoading"
@click="onModuleLoadMore('releases')"
class="w-48 bg-green m-auto block whitespace-nowrap px-4 py-2 border border-transparent rounded-md shadow-sm text-base font-medium text-white text-center js-learn-more js-button-modal-submit hover:bg-green-700 disabled:bg-green-300"
>
<i v-if="loadMoreLoading" class="animate-submit delay-[0.28s] absolute w-2 h-2 rounded-full left-0 right-0 -top-3.5 m-auto before:absolute before:w-2 before:h-2 before:rounded-full before:animate-submit before:delay-[0.14s] after:absolute after:w-2 after:h-2 after:rounded-full after:animate-submit before:-left-3.5 after:-right-3.5 after:delay-[0.42s]"></i>
<span :class="[{'opacity-0': loadMoreLoading}]">
{{ trans('modules.see_more') }}
</span>
</button>
</div>
@stack('pagination_end')
@else
<div class="flex">
<small>{{ trans('general.no_records') }}</small>
</div>
@endif

View File

@ -0,0 +1,36 @@
@props(['module'])
@php
$reviews = $module->app_reviews;
@endphp
<div id="review" class="clearfix js-reviews-content" v-if="reviews.status" v-html="reviews.html"></div>
<div id="review" class="clearfix js-reviews-content" v-else>
<x-layouts.modules.reviews :reviews="$reviews" />
</div>
@if (! empty($reviews->current_page != $reviews->last_page))
@stack('pagination_start')
<div class="w-full flex flex-row justify-evenly my-2" v-if="reviews.pagination.last_page != reviews.pagination.current_page">
<button
type="button"
id="review-load-more"
:disabled="loadMoreLoading"
@click="onModuleLoadMore('reviews')"
class="w-48 bg-green m-auto block whitespace-nowrap px-4 py-2 border border-transparent rounded-md shadow-sm text-base font-medium text-white text-center js-learn-more js-button-modal-submit hover:bg-green-700 disabled:bg-green-300"
>
<i v-if="loadMoreLoading" class="animate-submit delay-[0.28s] absolute w-2 h-2 rounded-full left-0 right-0 -top-3.5 m-auto before:absolute before:w-2 before:h-2 before:rounded-full before:animate-submit before:delay-[0.14s] after:absolute after:w-2 after:h-2 after:rounded-full after:animate-submit before:-left-3.5 after:-right-3.5 after:delay-[0.42s]"></i>
<span :class="[{'opacity-0': loadMoreLoading}]">
{{ trans('modules.see_more') }}
</span>
</button>
</div>
@stack('pagination_end')
@else
<div class="flex">
<small>{{ trans('general.no_records') }}</small>
</div>
@endif

View File

@ -0,0 +1,5 @@
@props(['module'])
<div class="relative">
<akaunting-slider :screenshots="{{ json_encode($module->screenshots) }}" :arrow="true" :slider-view="5"></akaunting-slider>
</div>

View File

@ -0,0 +1,23 @@
<x-form>
<div class="lg:absolute lg:ltr:right-0 lg:rtl:left-0 top-4">
<label for="priceToggle" class="flex items-center cursor-pointer" x-on:click="price_type = ! price_type">
<div class="relative">
<input type="checkbox" id="priceToggle" class="sr-only" x-model="price_type">
<div class="bg-purple-300 w-24 h-7 rounded-full">
<span id="apps-toggle-monthly" class="monthly-badge text-xs text-white float-left ml-3 mt-1.5" x-show="price_type == true">
{{ trans('general.monthly') }}
</span>
<span id="apps-toggle-yearly" class="yearly-badge text-xs text-white float-right mr-3 mt-1.5" x-show="price_type == false">
{{ trans('general.yearly') }}
</span>
</div>
<div class="dot absolute left-1 top-1 bg-white w-5 h-5 rounded-full transition"
x-bind:style="price_type == true ? 'transform: translateX(333%)' : ' transform: translateX(0) '"
></div>
</div>
</label>
</div>
</x-form>

View File

@ -0,0 +1,81 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.portal.head>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
</x-layouts.portal.head>
@mobile
<body class="g-sidenav-hidden bg-body overflow-overlay">
@elsemobile
<body class="g-sidenav-show bg-body overflow-overlay">
@endmobile
@stack('body_start')
<x-layouts.portal.menu />
<div class="main-content xl:ltr:ml-64 xl:rtl:mr-64 transition-all ease-in-out" id="panel">
<div id="main-body">
<div class="container">
<x-layouts.portal.header>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
@if (!empty($status))
<x-slot name="status">
{!! $status ?? '' !!}
</x-slot>
@endif
@if (!empty($favorite) || (!empty($favorite) && $favorite->attributes->has('title')))
@if (! $favorite->attributes->has('title'))
<x-slot name="favorite">
{!! $favorite ?? '' !!}
</x-slot>
@else
@php
$favorite = [
'title' => $favorite->attributes->get('title'),
'icon' => $favorite->attributes->get('icon'),
'route' => !empty($favorite->attributes->has('route')) ? $favorite->attributes->get('route') : '',
'url' => !empty($favorite->attributes->has('url')) ? $favorite->attributes->get('url') : '',
];
@endphp
<x-slot name="favorite">
<x-menu.favorite
:title="$favorite['title']"
:icon="$favorite['icon']"
:route="$favorite['route']"
:url="$favorite['url']"
/>
</x-slot>
@endif
@endif
<x-slot name="buttons">
{!! $buttons ?? '' !!}
</x-slot>
<x-slot name="moreButtons">
{!! $moreButtons ?? '' !!}
</x-slot>
</x-layouts.portal.header>
<x-layouts.portal.content>
{!! $content !!}
</x-layouts.portal.content>
<x-layouts.portal.footer />
</div>
</div>
</div>
@stack('body_end')
<x-layouts.portal.scripts />
</body>
</html>

View File

@ -0,0 +1,15 @@
@stack('content_start')
<div id="app">
@stack('content_content_start')
{!! $slot !!}
@stack('content_content_end')
<notifications></notifications>
<form id="form-dynamic-component" method="POST" action="#"></form>
<component v-bind:is="component"></component>
</div>
@stack('content_end')

View File

@ -0,0 +1,19 @@
@props(['invoice'])
@stack('button_pdf_start')
<x-link href="{{ route('portal.invoices.pdf', $invoice->id) }}" class="bg-green text-white px-3 py-1.5 mb-3 sm:mb-0 rounded-lg text-sm font-medium leading-6 hover:bg-green-700">
{{ trans('general.download_pdf') }}
</x-link>
@stack('button_pdf_end')
@stack('button_show_start')
<x-link href="{{ route('portal.invoices.show', $invoice->id) }}" class="px-3 py-1.5 mb-3 sm:mb-0 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium leading-6">
{{ trans('general.show') }}
</x-link>
@stack('button_show_end')
@stack('button_print_start')
<x-link href="{{ route('portal.invoices.print', $invoice->id) }}" target="_blank" class="px-3 py-1.5 mb-3 sm:mb-0 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium leading-6">
{{ trans('general.print') }}
</x-link>
@stack('button_print_end')

View File

@ -0,0 +1,19 @@
@props(['invoice'])
<div class="flex">
<div class="w-full text-center">
<div class="my-10">
<img src="https://assets.akaunting.com/software/portal/finish.gif" alt="Get Started" />
</div>
<div class="my-10">
{{ trans('portal.create_your_invoice') }}
</div>
<div class="my-10">
<a href="https://akaunting.com/lp/accounting-software?utm_source=invoice_payment&utm_medium=software&utm_campaign=plg" class="bg-purple text-white px-3 py-1.5 mb-3 sm:mb-0 rounded-xl text-sm font-medium leading-6 hover:bg-purple-700">
{{ trans('portal.get_started') }}
</a>
</div>
</div>
</div>

View File

@ -0,0 +1,11 @@
@stack('footer_start')
<footer class="footer">
<div class="flex flex-col sm:flex-row items-center justify-between mt-10 lg:mt-20 py-7 text-sm font-light">
<div>
{{ trans('footer.powered') }}:
<a href="{{ trans('footer.link') }}" target="_blank">{{ trans('footer.software') }}</a> |
{{ trans('footer.version') }} {{ version('short') }}
</div>
</div>
</footer>
@stack('footer_end')

View File

@ -0,0 +1,59 @@
@props([
'title',
])
<head>
@stack('head_start')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8; charset=ISO-8859-1"/>
<title>{!! $title !!} - @setting('company.name')</title>
<base href="{{ config('app.url') . '/' }}">
<x-layouts.pwa.head />
<!-- Favicon -->
<link rel="icon" href="{{ asset('public/img/favicon.ico') }}" type="image/png">
<!--Icons-->
<link rel="stylesheet" href="{{ asset('public/css/fonts/material-icons/style.css?v=' . version('short')) }}" type="text/css">
<!-- Font -->
<link rel="stylesheet" href="{{ asset('public/vendor/quicksand/css/quicksand.css?v=' . version('short')) }}" type="text/css">
<!-- Css -->
<link rel="stylesheet" href="{{ asset('public/css/element.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/app.css') }}" type="text/css">
@stack('css')
@stack('stylesheet')
@livewireStyles
<script type="text/javascript"><!--
var url = '{{ url("/" . company_id()) }}';
var app_url = '{{ config("app.url") }}';
var aka_currency = {!! !empty($currency) ? $currency : 'false' !!};
//--></script>
@stack('js')
<script type="text/javascript"><!--
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>;
var flash_notification = {!! (session()->has('flash_notification')) ? json_encode(session()->get('flash_notification')) : 'false' !!};
//--></script>
{{ session()->forget('flash_notification') }}
@stack('scripts')
@stack('head_end')
</head>

View File

@ -0,0 +1,33 @@
@stack('header_start')
<div id="header" class="xl:pt-6">
<div class="flex flex-col sm:flex-row flex-wrap items-start justify-between hide-empty-page">
<div class="w-full sm:w-6/12 items-center mb-3 sm:mb-0">
<div class="flex items-center">
<h1 class="flex items-center text-2xl xl:text-5xl text-black font-light -ml-0.5">
{!! $title !!}
@yield('dashboard_action')
</h1>
{!! $status ?? '' !!}
{!! $favorite ?? '' !!}
</div>
</div>
<div class="w-full sm:w-6/12">
<div class="flex flex-wrap flex-col sm:flex-row sm:items-center justify-end sm:space-x-2 sm:rtl:space-x-reverse">
@stack('header_button_start')
{!! $buttons !!}
@stack('header_button_end')
{!! $moreButtons !!}
</div>
</div>
</div>
</div>
@stack('header_end')

View File

@ -0,0 +1,179 @@
@props(['companies'])
<div class="container flex items-center py-3 mb-4 border-b-2 xl:hidden">
<span class="material-icons text-black js-hamburger-menu">menu</span>
<div class="flex items-center m-auto">
<img src="{{ asset('public/img/akaunting-logo-green.svg') }}" class="w-8 m-auto" alt="Akaunting" />
<span class="ltr:ml-2 rtl:mr-2">{{ Str::limit(setting('company.name'), 22) }}</span>
</div>
</div>
@stack('menu_start')
<div data-real-menu class="w-70 h-screen flex hidden fixed top-0 js-menu z-20 xl:z-10 transition-all ltr:-left-80 rtl:-right-80 xl:ltr:left-0 xl:rtl:right-0">
<div class="w-14 py-7 px-1 bg-lilac-900 z-10 menu-scroll overflow-y-auto overflow-x-hidden">
<div
data-tooltip-target="tooltip-profile"
data-tooltip-placement="right"
class="flex flex-col items-center justify-center mb-5 cursor-pointer menu-button"
data-menu="profile-menu"
>
<span name="account_circle" class="material-icons-outlined w-8 h-8 flex items-center justify-center text-purple text-2xl hidden">
account_circle
</span>
@if (setting('default.use_gravatar', '0') == '1')
<img src="{{ user()->picture }}" alt="{{ user()->name }}" class="w-8 h-8 m-auto rounded-full" alt="{{ user()->name }}" title="{{ user()->name }}">
@elseif (is_object(user()->picture))
<img src="{{ Storage::url(user()->picture->id) }}" class="w-8 h-8 m-auto rounded-full" alt="{{ user()->name }}" title="{{ user()->name }}">
@else
<span name="account_circle" class="material-icons-outlined text-purple w-8 h-8 flex items-center justify-center text-center text-2xl" alt="{{ user()->name }}" title="{{ user()->name }}">
account_circle
</span>
@endif
</div>
<div id="tooltip-profile" class="inline-block absolute z-20 py-1 px-2 text-sm font-medium rounded-lg bg-white text-gray-900 w-auto border border-gray-200 shadow-sm whitespace-nowrap tooltip-content opacity-0 invisible">
{{ trans('auth.profile') }}
<div class="absolute w-2 h-2 before:absolute before:w-2 before:h-2 before:bg-white before:border-gray-200 before:transform before:rotate-45 before:border -left-1 before:border-t-0 before:border-r-0 border-gray-200" data-popper-arrow></div>
</div>
<div class="group flex flex-col items-center justify-center menu-toggle-buttons">
@can('read-notifications')
<x-tooltip id="tooltip-notifications" placement="right" message="{{ trans_choice('general.notifications', 2) }}">
<button type="button"
@class([
'flex items-center menu-button justify-center w-8 h-8 mb-2.5 relative cursor-pointer js-menu-toggles',
'animate-vibrate' => user()->unreadNotifications->count(),
])
data-menu="notifications-menu">
<span name="notifications" class="material-icons-outlined text-purple text-2xl">notifications</span>
@if (user()->unreadNotifications->count())
<span data-notification-count class="w-2 h-2 absolute top-2 right-2 inline-flex items-center justify-center p-2.5 text-xs text-white font-bold leading-none transform translate-x-1/2 -translate-y-1/2 bg-orange rounded-full">
{{ user()->unreadNotifications->count() }}
</span>
@endif
</button>
</x-tooltip>
@endcan
<x-tooltip id="tooltip-search" placement="right" message="{{ trans('general.search') }}">
<button type="button" class="flex items-center menu-button justify-center w-8 h-8 mb-2.5 relative cursor-pointer">
<span name="search" class="material-icons-outlined text-purple text-2xl">search</span>
</button>
</x-tooltip>
<x-tooltip id="tooltip-support" placement="right" message="{{ trans('general.help') }}">
<a href="{{ url(trans('header.support_link')) }}" target="_blank" class="flex items-center justify-center w-8 h-8 mb-2.5 cursor-pointer js-menu-toggles">
<span class="material-icons-outlined text-purple text-2xl">support</span>
</a>
</x-tooltip>
</div>
<livewire:menu.favorites />
</div>
<nav class="menu-list js-main-menu" id="sidenav-main">
<div class="relative mb-5 cursor-pointer">
<button type="button" class="flex items-center" data-dropdown-toggle="dropdown-menu-company">
<div class="w-8 h-8 flex items-center justify-center">
<img src="{{ asset('public/img/akaunting-logo-green.svg') }}" class="w-6 h-6" alt="Akaunting" />
</div>
<div class="flex ltr:ml-2 rtl:mr-2">
<span class="w-28 text-left block text-base truncate">
<span class="border-b border-transparent transition-all hover:border-black">
{{ Str::limit(setting('company.name'), 22) }}
</span>
</span>
@can('read-common-companies')
<div class="absolute top-2 ltr:-right-1 rtl:-left-1">
<svg class="h-5 w-5 text-gray-400" x-description="Heroicon name: solid/selector" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
<path fill-rule="evenodd" d="M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z" clip-rule="evenodd"></path>
</svg>
</div>
@endcan
</div>
</button>
@can('read-common-companies')
<div id="dropdown-menu-company" class="absolute right-0 mt-3 py-2 bg-white rounded-md shadow-xl z-20 hidden" style="left: auto; min-width: 10rem;">
@foreach($companies as $com)
<a href="{{ route('companies.switch', $com->id) }}" id="$com->id" class="h-9 leading-9 flex items-center text-sm px-2" role="menuitem" tabindex="-1">
<div class="w-full h-full flex items-center rounded-md px-2 hover:bg-lilac-100">
<span class="material-icons-outlined text-purple text-xl">business</span>
<span class="ltr:pl-2 rtl:pr-2 text-purple text-xs truncate">{{ Str::limit($com->name, 18) }}</span>
</div>
</a>
@endforeach
@can('update-common-companies')
<a href="{{ route('companies.index') }}" class="h-9 leading-9 flex items-center text-sm px-2 border-t rounded-bl rounded-br group hover:bg-purple">
<div class="w-full h-full flex items-center rounded-md px-2 ">
<span class="material-icons-outlined text-purple text-xl group-hover:text-white">settings</span>
<span class="ltr:pl-2 rtl:pr-2 text-purple text-xs truncate group-hover:text-white">
{{ trans('general.title.manage', ['type' => trans_choice('general.companies', 2)]) }}
</span>
</div>
</a>
@endcan
</div>
@endcan
</div>
<div class="main-menu transform">
{!! menu('portal') !!}
</div>
</nav>
<div class="profile-menu user-menu menu-list fixed h-full ltr:-left-80 rtl:-right-80">
<div class="flex h-12.5">
@if (setting('default.use_gravatar', '0') == '1')
<img src="{{ user()->picture }}" alt="{{ user()->name }}" class="w-8 h-8 rounded-full" alt="{{ user()->name }}" title="{{ user()->name }}">
@elseif (is_object(user()->picture))
<img src="{{ Storage::url(user()->picture->id) }}" class="w-8 h-8 rounded-full" alt="{{ user()->name }}" title="{{ user()->name }}">
@else
<span name="account_circle" class="material-icons-outlined w-8 h-8 flex items-center justify-center text-purple text-2xl" alt="{{ user()->name }}" title="{{ user()->name }}">account_circle</span>
@endif
@stack('navbar_profile_welcome')
<div class="flex flex-col text-black ml-2">
<span class="text-xs">{{ trans('general.welcome') }}</span>
{{ user()->name }}
</div>
</div>
<livewire:menu.profile />
</div>
@can('read-notifications')
<div class="notifications-menu user-menu menu-list fixed h-full ltr:-left-80 rtl:-right-80">
<div class="flex items-center mb-3">
<span name="notifications" class="material-icons-outlined w-8 h-8 flex items-center justify-center text-purple text-2xl">notifications</span>
<div class="text-black ltr:ml-1 rtl:mr-1">
{{ trans_choice('general.your_notifications', 2) }}
</div>
</div>
<livewire:menu.notifications />
</div>
@endcan
<button type="button" class="toggle-button absolute ltr:-right-2 rtl:-left-2 top-8 cursor-pointer transition-opacity ease-in-out z-50">
<span class="material-icons text-lg text-purple transform ltr:rotate-90 rtl:-rotate-90">expand_circle_down</span>
</button>
<span data-menu-close class="material-icons absolute ltr:-right-2 rtl:right-12 top-8 text-lg text-purple cursor-pointer z-10 hidden">cancel</span>
<div class="fixed w-full h-full invisible lg:hidden js-menu-background" style="background-color: rgba(0, 0, 0, 0.5); z-index: -1;"></div>
</div>
<x-loading.menu />
@stack('menu_end')

View File

@ -0,0 +1,227 @@
<!-- Core -->
<script src="{{ asset('public/vendor/js-cookie/js.cookie.js') }}"></script>
<script type="text/javascript">
var company_currency_code = '{{ setting("default.currency") }}';
</script>
@stack('scripts_start')
@apexchartsScripts
@stack('charts')
<!-- <script type="text/javascript" src="{{ asset('public/akaunting-js/hotkeys.js') }}" defer></script> -->
<script type="text/javascript" src="{{ asset('public/akaunting-js/generalAction.js') }}"></script>
<script type="text/javascript" src="{{ asset('public/akaunting-js/popper.js') }}"></script>
<script type="text/javascript">
"use strict";
var Layout = (function() {
const toggleButton = document.querySelector(".toggle-button");
const sideBar = document.querySelector(".js-main-menu");
const navbarMenu = document.querySelector(".js-menu");
const mainContent = document.querySelector(".main-menu");
const menus = document.querySelectorAll(".user-menu");
const menuButtons = document.querySelectorAll(".menu-button");
const detailsEL = mainContent.getElementsByTagName("details");
const sectionContent = document.querySelector(".main-content");
const menuBackground = document.querySelector(".js-menu-background");
const menuClose = document.querySelector("[data-menu-close]");
if (document.querySelector('[data-menu="notifications-menu"]')) {
setTimeout(function() {
document.querySelector('[data-menu="notifications-menu"]').classList.remove("animate-vibrate");
}, 6000);
}
Array.from(detailsEL).forEach((el) => {
el.addEventListener("toggle", function(e) {
if(e.target.querySelector(".material-icons-outlined")) {
e.target.querySelector(".material-icons").classList.toggle("rotate-180");
} else {
e.target.querySelectorAll(".material-icons")[1].classList.toggle("rotate-180");
}
})
}
);
function contentTransitionLeft() {
sectionContent.classList.add("xl:ltr:ml-0", "xl:rtl:mr-0");
sectionContent.classList.remove("xl:ltr:ml-64", "xl:rtl:mr-64");
toggleButton.querySelector("span").classList.add("ltr:-rotate-90", "rtl:rotate-90");
}
function contentTransitionRight() {
sectionContent.classList.remove("xl:ltr:ml-0", "xl:rtl:mr-0");
sectionContent.classList.add("xl:ltr:ml-64", "xl:rtl:mr-64");
toggleButton.querySelector("span").classList.remove("ltr:-rotate-90", "rtl:rotate-90");
}
function slideMenu() {
if (document.body.clientWidth <= 1280) {
mobileMenuHidden();
} else {
if (sideBar.classList.contains("menu-list-hidden")) {
toggleButton.classList.remove("ltr:left-12", "rtl:right-12");
sideBar.classList.remove("menu-list-hidden");
if (document.body.clientWidth > "991") {
contentTransitionRight();
}
} else {
sideBar.classList.add("menu-list-hidden");
toggleButton.classList.add("ltr:left-12", "rtl:right-12");
if (document.body.clientWidth > "991") {
contentTransitionLeft();
}
}
}
}
toggleButton.addEventListener("click", function() {
slideMenu();
});
function toggleMenu(iconButton, event) {
const menuRef = iconButton.getAttribute("data-menu");
const icon = iconButton.children[0].getAttribute("name");
if (iconButton.getAttribute("data-menu") === "profile-menu") {
if (iconButton.children[0].textContent != "cancel") {
iconButton.children[0].classList.remove("hidden");
iconButton.children[1].classList.add("hidden");
} else {
iconButton.children[0].classList.add("hidden");
iconButton.children[1].classList.remove("hidden");
}
}
menuButtons.forEach((button) => {
if (icon) {
if (button.getAttribute("data-menu") !== menuRef && iconButton.children[0].textContent != "cancel") {
button.children[0].textContent = button.children[0].getAttribute("name");
button.children[0].classList.remove("active"); // inactive icon
}
}
});
menus.forEach((menu) => {
if (menu.classList.contains(menuRef) && iconButton.children[0].textContent != "cancel") {
iconButton.children[0].textContent = "cancel";
iconButton.children[0].classList.add("active");
menu.classList.remove("ltr:-left-80", "rtl:-right-80");
menu.classList.add("ltr:left-14", "rtl:right-14");
mainContent.classList.add("hidden");
toggleButton.classList.add("invisible");
menuClose.classList.remove("hidden");
} else if (menu.classList.contains(menuRef) && iconButton.children[0].textContent == "cancel") {
iconButton.children[0].textContent = icon;
iconButton.children[0].classList.remove("active");
menu.classList.add("ltr:-left-80", "rtl:-right-80");
menu.classList.remove("ltr:left-14", "rtl:right-14");
mainContent.classList.remove("hidden");
toggleButton.classList.remove("invisible");
menuClose.classList.add("hidden");
} else {
menu.classList.add("ltr:-left-80", "rtl:-right-80");
menu.classList.remove("ltr:left-14", "rtl:right-14");
}
menuClose.addEventListener("click", function() {
menu.classList.add("ltr:-left-80", "rtl:-right-80");
iconButton.children[0].textContent = icon;
iconButton.children[0].classList.remove("active");
mainContent.classList.remove("hidden");
this.classList.add("hidden");
toggleButton.classList.remove("invisible");
});
});
}
if (document.body.clientWidth >= 1280) {
if (is_profile_menu == 1) {
let profile_menu_html = document.querySelector(".profile-menu");
let profile_icon_html = document.querySelector("[data-menu='profile-menu']");
profile_menu_html.classList.add("ltr:left-14", "rtl:right-14");
profile_menu_html.classList.remove("ltr:-left-80", "rtl:-right-80");
profile_icon_html.children[0].textContent = "cancel";
profile_icon_html.children[0].classList.add("active");
profile_icon_html.children[0].classList.remove("hidden");
profile_icon_html.children[1].classList.add("hidden");
toggleButton.classList.add("invisible");
menuClose.classList.remove("hidden");
}
}
function mobileMenuActive() {
navbarMenu.classList.add("ltr:left-0", "rtl:right-0");
navbarMenu.classList.remove("ltr:-left-80", "rtl:-right-80");
menuBackground.classList.add("visible");
menuBackground.classList.remove("invisible");
}
function mobileMenuHidden() {
navbarMenu.classList.remove("ltr:left-0", "rtl:right-0");
navbarMenu.classList.add("ltr:-left-80", "rtl:-right:80");
mainContent.classList.remove("hidden");
menus.forEach((menu) => {
menu.classList.remove("ltr:left-14", "rtl:right-14");
menu.classList.add("ltr:-left-80", "rtl:-right-80");
});
menuButtons.forEach((iconButton) => {
iconButton.children[0].classList.remove("active");
iconButton.children[0].textContent = iconButton.children[0].getAttribute("name");
});
menuBackground.classList.remove("visible");
menuBackground.classList.add("invisible");
}
document.querySelector(".js-hamburger-menu").addEventListener("click", function() {
mobileMenuActive();
});
menuBackground.addEventListener("click", function() {
mobileMenuHidden();
});
menuButtons.forEach((iconButton) =>
iconButton.addEventListener("click", function() {
toggleMenu(iconButton, event);
})
);
})(500);
</script>
@stack('body_css')
@stack('body_stylesheet')
@stack('body_js')
@stack('body_scripts')
@livewireScripts
<script src="{{ asset('public/vendor/alpinejs/alpine.min.js') }}"></script>
<!-- Livewire -->
<script type="text/javascript">
window.livewire_app_url = {{ company_id() }};
</script>
@stack('scripts_end')

View File

@ -0,0 +1,92 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.preview.head>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
</x-layouts.preview.head>
<body>
@stack('body_start')
<div class="flex flex-col h-screen">
<header class="py-5 bg-purple-lighter text-purple text-center">
<div class="w-full lg:max-w-6xl m-auto flex flex-col lg:flex-row items-center justify-between">
<div class="flex flex-col items-start">
<span class="font-medium uppercase">
{{ trans('general.preview_mode') }}
</span>
<span>
{!! !empty($sticky->attributes->has('description')) ? $sticky->attributes->get('description') : trans('invoices.sticky.description') !!}
</span>
</div>
<a href="{!! !empty($sticky->attributes->has('url')) ? $sticky->attributes->get('url') : route('dashboard') !!}" class="px-3 py-1.5 rounded-xl text-sm font-medium leading-6 bg-purple hover:bg-purple-700 text-white disabled:bg-purple-100">
{{ trans('general.go_back', ['type' => company()->name]) }}
</a>
</div>
</header>
<div class="flex-1 overflow-y-auto p-5">
<div class="w-full lg:max-w-6xl m-auto">
<x-layouts.preview.header>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
@if (!empty($status))
<x-slot name="status">
{!! $status ?? '' !!}
</x-slot>
@endif
@if (!empty($favorite) || (!empty($favorite) && $favorite->attributes->has('title')))
@if (! $favorite->attributes->has('title'))
<x-slot name="favorite">
{!! $favorite ?? '' !!}
</x-slot>
@else
@php
$favorite = [
'title' => $favorite->attributes->get('title'),
'icon' => $favorite->attributes->get('icon'),
'route' => !empty($favorite->attributes->has('route')) ? $favorite->attributes->get('route') : '',
'url' => !empty($favorite->attributes->has('url')) ? $favorite->attributes->get('url') : '',
];
@endphp
<x-slot name="favorite">
<x-menu.favorite
:title="$favorite['title']"
:icon="$favorite['icon']"
:route="$favorite['route']"
:url="$favorite['url']"
/>
</x-slot>
@endif
@endif
<x-slot name="buttons">
{!! $buttons ?? '' !!}
</x-slot>
<x-slot name="moreButtons">
{!! $moreButtons ?? '' !!}
</x-slot>
</x-layouts.preview.header>
<x-layouts.preview.content>
{!! $content !!}
</x-layouts.preview.content>
<x-layouts.preview.footer />
</div>
</div>
</div>
@stack('body_end')
<x-layouts.preview.scripts />
</body>
</html>

View File

@ -0,0 +1,15 @@
@stack('content_start')
<div id="app">
@stack('content_content_start')
{!! $slot !!}
@stack('content_content_end')
<notifications></notifications>
<form id="form-dynamic-component" method="POST" action="#"></form>
<component v-bind:is="component"></component>
</div>
@stack('content_end')

View File

@ -0,0 +1,14 @@
@stack('footer_start')
<footer class="footer">
<div class="flex flex-col sm:flex-row items-center justify-between mt-10 lg:mt-20 py-7 text-sm font-light">
<div>
{{ trans('footer.powered') }}:
<a href="{{ trans('footer.link') }}" target="_blank">{{ trans('footer.software') }}</a>
&nbsp;<span class="material-icons align-middle text-black-300">code</span>&nbsp;
{{ trans('footer.version') }} {{ version('short') }}
</div>
</div>
</footer>
@stack('footer_end')

View File

@ -0,0 +1,60 @@
@props([
'title',
])
<head>
@stack('head_start')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8; charset=ISO-8859-1"/>
<title>{!! $title !!} - @setting('company.name')</title>
<base href="{{ config('app.url') . '/' }}">
<x-layouts.pwa.head />
<!-- Favicon -->
<link rel="icon" href="{{ asset('public/img/favicon.ico') }}" type="image/png">
<!--Icons-->
<link rel="stylesheet" href="{{ asset('public/css/fonts/material-icons/style.css?v=' . version('short')) }}" type="text/css">
<!-- Font -->
<link rel="stylesheet" href="{{ asset('public/vendor/quicksand/css/quicksand.css?v=' . version('short')) }}" type="text/css">
<!-- Css -->
<link rel="stylesheet" href="{{ asset('public/css//third_party/swiper-bundle.min.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/element.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/app.css') }}" type="text/css">
@stack('css')
@stack('stylesheet')
@livewireStyles
<script type="text/javascript"><!--
var url = '{{ url("/" . company_id()) }}';
var app_url = '{{ config("app.url") }}';
var aka_currency = {!! !empty($currency) ? $currency : 'false' !!};
//--></script>
@stack('js')
<script type="text/javascript"><!--
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>;
var flash_notification = {!! (session()->has('flash_notification')) ? json_encode(session()->get('flash_notification')) : 'false' !!};
//--></script>
{{ session()->forget('flash_notification') }}
@stack('scripts')
@stack('head_end')
</head>

View File

@ -0,0 +1,33 @@
@stack('header_start')
<div id="header" class="xl:pt-6">
<div class="flex flex-col sm:flex-row flex-wrap items-start justify-between hide-empty-page">
<div class="w-full sm:w-6/12 items-center mb-3 sm:mb-0">
<div class="flex items-center">
<h1 class="flex items-center text-2xl xl:text-5xl text-black font-light -ml-0.5">
{!! $title !!}
@yield('dashboard_action')
</h1>
{!! $status ?? '' !!}
{!! $favorite ?? '' !!}
</div>
</div>
<div class="w-full sm:w-6/12">
<div class="flex flex-wrap flex-col sm:flex-row sm:items-center justify-end sm:space-x-2 sm:rtl:space-x-reverse">
@stack('header_button_start')
{!! $buttons !!}
@stack('header_button_end')
{!! $moreButtons !!}
</div>
</div>
</div>
</div>
@stack('header_end')

View File

@ -0,0 +1,13 @@
@stack('scripts_start')
@stack('body_css')
@stack('body_stylesheet')
@stack('body_js')
@stack('body_scripts')
@livewireScripts
<script src="{{ asset('public/vendor/alpinejs/alpine.min.js') }}"></script>
@stack('scripts_end')

View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.print.head>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
</x-layouts.print.head>
<body onload="window.print();">
@stack('body_start')
<x-layouts.print.content>
{!! $content !!}
</x-layouts.print.content>
@stack('body_end')
<x-layouts.print.scripts />
</body>
</html>

View File

@ -0,0 +1,3 @@
@stack('content_start')
{!! $slot !!}
@stack('content_end')

View File

@ -0,0 +1,54 @@
@props([
'title',
])
<head>
@stack('head_start')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8; charset=ISO-8859-1"/>
<title>{!! $title !!} - @setting('company.name')</title>
<base href="{{ config('app.url') . '/' }}">
<!-- Favicon -->
<link rel="icon" href="{{ asset('public/img/favicon.ico') }}" type="image/png">
<!-- Css -->
<link rel="stylesheet" href="{{ asset('public/css/print.css') }}" type="text/css">
@if (isset($currency_style) && $currency_style && in_array(app()->getLocale(), ['zh-CN', 'ja-JP', 'zh-TW']))
<style type="text/css">
@font-face {
font-family: 'Firefly Sung';
font-weight: 'normal';
src: url('{{ asset("/public/css/fonts/firefly_sung_normal.ttf") }}') format("truetype");
}
* {
font-family: 'Firefly Sung', sans-serif !important;
}
</style>
@else
<style type="text/css">
* {
font-family: DejaVu Sans, sans-serif !important;
}
</style>
@endif
@stack('css')
@stack('stylesheet')
@livewireStyles
@stack('js')
@stack('scripts')
@stack('head_end')
</head>

View File

@ -0,0 +1,29 @@
<!-- Core -->
<script src="{{ asset('public/vendor/js-cookie/js.cookie.js') }}"></script>
<script type="text/javascript">
var company_currency_code = '{{ setting("default.currency") }}';
</script>
@stack('scripts_start')
@apexchartsScripts
@stack('charts')
@stack('body_css')
@stack('body_stylesheet')
@stack('body_js')
@stack('body_scripts')
@livewireScripts
<!-- Livewire -->
<script type="text/javascript">
window.livewire_app_url = {{ company_id() }};
</script>
@stack('scripts_end')

View File

@ -0,0 +1,38 @@
<!-- Web Application Manifest -->
<link rel="manifest" href="{{ asset('manifest.json') }}">
<!-- Chrome for Android theme color -->
<meta name="theme-color" content="#FFFFFF">
<!-- Add to homescreen for Chrome on Android -->
<meta name="mobile-web-app-capable" content="yes">
<meta name="application-name" content="Akaunting">
<link rel="icon" sizes="512x512" href="{{ asset('public/img/icons/icon-512x512.png') }}">
<!-- Add to homescreen for Safari on iOS -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="#FFFFFF">
<meta name="apple-mobile-web-app-title" content="Akaunting">
<link rel="apple-touch-icon" href="{{ asset('public/img/icons/icon-512x512.png') }}">
<link href="{{ asset('public/img/icons/splash-640x1136.png') }}" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
<link href="{{ asset('public/img/icons/splash-750x1334.png') }}" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
<link href="{{ asset('public/img/icons/splash-828x1792.png') }}" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
<link href="{{ asset('public/img/icons/splash-1242x2208.png') }}" media="(device-width: 621px) and (device-height: 1104px) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image" />
<link href="{{ asset('public/img/icons/splash-1242x2688.png') }}" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image" />
<link href="{{ asset('public/img/icons/splash-1536x2048.png') }}" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
<link href="{{ asset('public/img/icons/splash-1668x2224.png') }}" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
<link href="{{ asset('public/img/icons/splash-1668x2388.png') }}" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
<link href="{{ asset('public/img/icons/splash-2048x2732.png') }}" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
<!-- Tile for Win8 -->
<meta name="msapplication-TileColor" content="#FFFFFF">
<meta name="msapplication-TileImage" content="{{ asset('public/img/icons/icon-512x512.png') }}">
<script type="text/javascript">
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register("{{ asset('serviceworker.js') }}");
}
</script>

View File

@ -0,0 +1,70 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.signed.head>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
</x-layouts.signed.head>
<body>
@stack('body_start')
<div class="container-fluid content-layout mt-4">
<x-layouts.signed.header>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
@if (!empty($status))
<x-slot name="status">
{!! $status ?? '' !!}
</x-slot>
@endif
@if (!empty($favorite) || (!empty($favorite) && $favorite->attributes->has('title')))
@if (! $favorite->attributes->has('title'))
<x-slot name="favorite">
{!! $favorite ?? '' !!}
</x-slot>
@else
@php
$favorite = [
'title' => $favorite->attributes->get('title'),
'icon' => $favorite->attributes->get('icon'),
'route' => !empty($favorite->attributes->has('route')) ? $favorite->attributes->get('route') : '',
'url' => !empty($favorite->attributes->has('url')) ? $favorite->attributes->get('url') : '',
];
@endphp
<x-slot name="favorite">
<x-menu.favorite
:title="$favorite['title']"
:icon="$favorite['icon']"
:route="$favorite['route']"
:url="$favorite['url']"
/>
</x-slot>
@endif
@endif
<x-slot name="buttons">
{!! $buttons ?? '' !!}
</x-slot>
<x-slot name="moreButtons">
{!! $moreButtons ?? '' !!}
</x-slot>
</x-layouts.signed.header>
<x-layouts.signed.content>
{!! $content !!}
</x-layouts.signed.content>
<x-layouts.signed.footer />
</div>
@stack('body_end')
<x-layouts.signed.scripts />
</body>
</html>

View File

@ -0,0 +1,15 @@
@stack('content_start')
<div id="app">
@stack('content_content_start')
{!! $slot !!}
@stack('content_content_end')
<notifications></notifications>
<form id="form-dynamic-component" method="POST" action="#"></form>
<component v-bind:is="component"></component>
</div>
@stack('content_end')

View File

@ -0,0 +1,14 @@
@stack('footer_start')
<footer class="footer">
<div class="flex flex-col sm:flex-row items-center justify-between mt-10 lg:mt-20 py-7 text-sm font-light">
<div>
{{ trans('footer.powered') }}:
<a href="{{ trans('footer.link') }}" target="_blank">{{ trans('footer.software') }}</a>
&nbsp;<span class="material-icons align-middle text-black-300">code</span>&nbsp;
{{ trans('footer.version') }} {{ version('short') }}
</div>
</div>
</footer>
@stack('footer_end')

View File

@ -0,0 +1,59 @@
@props([
'title',
])
<head>
@stack('head_start')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8; charset=ISO-8859-1"/>
<title>{!! $title !!} - @setting('company.name')</title>
<base href="{{ config('app.url') . '/' }}">
<x-layouts.pwa.head />
<!-- Favicon -->
<link rel="icon" href="{{ asset('public/img/favicon.ico') }}" type="image/png">
<!--Icons-->
<link rel="stylesheet" href="{{ asset('public/css/fonts/material-icons/style.css?v=' . version('short')) }}" type="text/css">
<!-- Font -->
<link rel="stylesheet" href="{{ asset('public/vendor/quicksand/css/quicksand.css?v=' . version('short')) }}" type="text/css">
<!-- Css -->
<link rel="stylesheet" href="{{ asset('public/css/element.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/app.css') }}" type="text/css">
@stack('css')
@stack('stylesheet')
@livewireStyles
<script type="text/javascript"><!--
var url = '{{ url("/" . company_id()) }}';
var app_url = '{{ config("app.url") }}';
var aka_currency = {!! !empty($currency) ? $currency : 'false' !!};
//--></script>
@stack('js')
<script type="text/javascript"><!--
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>;
var flash_notification = {!! (session()->has('flash_notification')) ? json_encode(session()->get('flash_notification')) : 'false' !!};
//--></script>
{{ session()->forget('flash_notification') }}
@stack('scripts')
@stack('head_end')
</head>

View File

@ -0,0 +1,33 @@
@stack('header_start')
<div id="header" class="xl:pt-6">
<div class="flex flex-col sm:flex-row flex-wrap items-start justify-between hide-empty-page">
<div class="w-full sm:w-6/12 items-center mb-3 sm:mb-0">
<div class="flex items-center">
<h1 class="flex items-center text-2xl xl:text-5xl text-black font-light -ml-0.5">
{!! $title !!}
@yield('dashboard_action')
</h1>
{!! $status ?? '' !!}
{!! $favorite ?? '' !!}
</div>
</div>
<div class="w-full sm:w-6/12">
<div class="flex flex-wrap flex-col sm:flex-row sm:items-center justify-end sm:space-x-2 sm:rtl:space-x-reverse">
@stack('header_button_start')
{!! $buttons !!}
@stack('header_button_end')
{!! $moreButtons !!}
</div>
</div>
</div>
</div>
@stack('header_end')

View File

@ -0,0 +1,13 @@
@stack('scripts_start')
@stack('body_css')
@stack('body_stylesheet')
@stack('body_js')
@stack('body_scripts')
@livewireScripts
<script src="{{ asset('public/vendor/alpinejs/alpine.min.js') }}"></script>
@stack('scripts_end')

View File

@ -0,0 +1,24 @@
<!DOCTYPE html>
<html dir="{{ language()->direction() }}" lang="{{ app()->getLocale() }}">
<x-layouts.wizard.head>
<x-slot name="title">
{!! !empty($title->attributes->has('title')) ? $title->attributes->get('title') : $title !!}
</x-slot>
</x-layouts.wizard.head>
<body class="h-screen flex justify-center items-center">
@stack('body_start')
<x-layouts.wizard.background />
<div class="container">
<x-layouts.wizard.content>
{!! $content !!}
</x-layouts.wizard.content>
</div>
@stack('body_end')
<x-layouts.wizard.scripts />
</body>
</html>

View File

@ -0,0 +1,2 @@
<div class="w-full h-full absolute left-0 right-0 top-0 bottom-0 bg-cover bg-no-repeat opacity-20"
style="background-image:url({{ asset('public/img/dashboard.png') }});"></div>

View File

@ -0,0 +1,11 @@
@stack('content_start')
<div id="app">
@stack('content_content_start')
@include('flash::message')
{!! $slot !!}
@stack('content_content_end')
</div>
@stack('content_end')

View File

@ -0,0 +1,57 @@
@props([
'title',
])
<head>
@stack('head_start')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8; charset=ISO-8859-1"/>
<title>{!! $title !!} - @setting('company.name')</title>
<base href="{{ config('app.url') . '/' }}">
<!-- Favicon -->
<link rel="icon" href="{{ asset('public/img/favicon.ico') }}" type="image/png">
<!--Icons-->
<link rel="stylesheet" href="{{ asset('public/css/fonts/material-icons/style.css?v=' . version('short')) }}" type="text/css">
<!-- Font -->
<link rel="stylesheet" href="{{ asset('public/vendor/quicksand/css/quicksand.css?v=' . version('short')) }}" type="text/css">
<!-- Css -->
<link rel="stylesheet" href="{{ asset('public/css/element.css?v=' . version('short')) }}" type="text/css">
<link rel="stylesheet" href="{{ asset('public/css/app.css') }}" type="text/css">
@stack('css')
@stack('stylesheet')
@livewireStyles
<script type="text/javascript"><!--
var url = '{{ url("/" . company_id()) }}';
var app_url = '{{ config("app.url") }}';
var aka_currency = {!! !empty($currency) ? $currency : 'false' !!};
//--></script>
@stack('js')
<script type="text/javascript"><!--
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>;
var flash_notification = {!! (session()->has('flash_notification')) ? json_encode(session()->get('flash_notification')) : 'false' !!};
//--></script>
{{ session()->forget('flash_notification') }}
@stack('scripts')
@stack('head_end')
</head>

View File

@ -0,0 +1,26 @@
@stack('scripts_start')
<!-- Core -->
<script src="{{ asset('public/vendor/js-cookie/js.cookie.js') }}"></script>
<script type="text/javascript">
var wizard_translations = {!! json_encode($translations) !!};
var wizard_company = {!! json_encode($company) !!};
var wizard_countries = {!! json_encode(trans('countries')) !!};
var wizard_currencies = {!! json_encode($currencies) !!};
var wizard_currency_codes = {!! json_encode($currency_codes) !!};
var wizard_taxes = {!! json_encode($taxes) !!};
var wizard_modules = {!! json_encode($modules) !!};
</script>
<script src="{{ asset('public/js/wizard/wizard.min.js?v=' . version('short')) }}"></script>
@stack('body_css')
@stack('body_stylesheet')
@stack('body_js')
@stack('body_scripts')
@livewireScripts
@stack('scripts_end')