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

@ -1,54 +1,43 @@
@extends('layouts.admin')
<x-layouts.admin>
<x-slot name="title">
{{ trans('general.title.new', ['type' => trans_choice('general.categories', 1)]) }}
</x-slot>
@section('title', trans('general.title.new', ['type' => trans_choice('general.categories', 1)]))
<x-slot name="favorite"
title="{{ trans('general.title.new', ['type' => trans_choice('general.categories', 1)]) }}"
icon="folder"
route="categories.create"
></x-slot>
@section('content')
<div class="card">
{!! Form::open([
'route' => 'categories.store',
'id' => 'category',
'@submit.prevent' => 'onSubmit',
'@keydown' => 'form.errors.clear($event.target.name)',
'files' => true,
'role' => 'form',
'class' => 'form-loading-button',
'novalidate' => true
]) !!}
<x-slot name="content">
<x-form.container>
<x-form id="category" route="categories.store">
<x-form.section>
<x-slot name="head">
<x-form.section.head title="{{ trans('general.general') }}" description="{{ trans('categories.form_description.general') }}" />
</x-slot>
<div class="card-body">
<div class="row">
{{ Form::textGroup('name', trans('general.name'), 'font') }}
<x-slot name="body">
<x-form.group.text name="name" label="{{ trans('general.name') }}" />
{{ Form::selectGroup('type', trans_choice('general.types', 1), 'bars', $types, config('general.types')) }}
<x-form.group.color name="color" label="{{ trans('general.color') }}" />
@stack('color_input_start')
<div class="form-group col-md-6 required {{ $errors->has('color') ? 'has-error' : ''}}">
{!! Form::label('color', trans('general.color'), ['class' => 'form-control-label']) !!}
<div class="input-group input-group-merge" id="category-color-picker">
<div class="input-group-prepend">
<span class="input-group-text">
<el-color-picker v-model="color" size="mini" :predefine="predefineColors" @change="onChangeColor"></el-color-picker>
</span>
</div>
{!! Form::text('color', '#55588b', ['v-model' => 'form.color', '@input' => 'onChangeColorInput', 'id' => 'color', 'class' => 'form-control color-hex', 'required' => 'required']) !!}
</div>
{!! $errors->first('color', '<p class="help-block">:message</p>') !!}
</div>
@stack('color_input_end')
<x-form.group.select name="type" label="{{ trans_choice('general.types', 1) }}" :options="$types" :selected="config('general.types')" change="updateParentCategories" />
{{ Form::radioGroup('enabled', trans('general.enabled'), true) }}
</div>
</div>
<x-form.group.select name="parent_id" label="{{ trans('general.parent') . ' ' . trans_choice('general.categories', 1) }}" :options="[]" not-required dynamicOptions="categoriesBasedTypes" sort-options="false" disabled="isParentCategoryDisabled" />
<div class="card-footer">
<div class="row save-buttons">
{{ Form::saveButtons('categories.index') }}
</div>
</div>
{!! Form::close() !!}
</div>
@endsection
<x-form.input.hidden name="categories" :value="json_encode($categories)" />
</x-slot>
</x-form.section>
@push('scripts_start')
<script src="{{ asset('public/js/settings/categories.js?v=' . version('short')) }}"></script>
@endpush
<x-form.section>
<x-slot name="foot">
<x-form.buttons cancel-route="categories.index" />
</x-slot>
</x-form.section>
</x-form>
</x-form.container>
</x-slot>
<x-script folder="settings" file="categories" />
</x-layouts.admin>

View File

@ -1,62 +1,48 @@
@extends('layouts.admin')
<x-layouts.admin>
<x-slot name="title">
{{ trans('general.title.edit', ['type' => trans_choice('general.categories', 1)]) }}
</x-slot>
@section('title', trans('general.title.edit', ['type' => trans_choice('general.categories', 1)]))
<x-slot name="content">
<x-form.container>
<x-form id="category" method="PATCH" :route="['categories.update', $category->id]" :model="$category">
<x-form.section>
<x-slot name="head">
<x-form.section.head title="{{ trans('general.general') }}" description="{{ trans('categories.form_description.general') }}" />
</x-slot>
@section('content')
<div class="card">
{!! Form::model($category, [
'id' => 'category',
'method' => 'PATCH',
'route' => ['categories.update', $category->id],
'@submit.prevent' => 'onSubmit',
'@keydown' => 'form.errors.clear($event.target.name)',
'files' => true,
'role' => 'form',
'class' => 'form-loading-button',
'novalidate' => true
]) !!}
<x-slot name="body">
<x-form.group.text name="name" label="{{ trans('general.name') }}" />
<div class="card-body">
<div class="row">
{{ Form::textGroup('name', trans('general.name'), 'font') }}
<x-form.group.color name="color" label="{{ trans('general.color') }}" />
@if ($type_disabled)
{{ Form::selectGroup('type', trans_choice('general.types', 1), 'bars', $types, $category->type, ['required' => 'required', 'disabled' => 'true']) }}
<input type="hidden" name="type" value="{{ $category->type }}" />
@else
{{ Form::selectGroup('type', trans_choice('general.types', 1), 'bars', $types, $category->type) }}
@endif
@if ($type_disabled)
<x-form.group.select name="type" label="{{ trans_choice('general.types', 1) }}" :options="$types" disabled />
@stack('color_input_start')
<div class="form-group col-md-6 required {{ $errors->has('color') ? 'has-error' : ''}}">
{!! Form::label('color', trans('general.color'), ['class' => 'form-control-label']) !!}
<div class="input-group input-group-merge" id="category-color-picker">
<div class="input-group-prepend">
<span class="input-group-text">
<el-color-picker v-model="color" size="mini" :predefine="predefineColors" @change="onChangeColor"></el-color-picker>
</span>
</div>
{!! Form::text('color', $category->color, ['@input' => 'onChangeColorInput', 'id' => 'color', 'class' => 'form-control color-hex', 'required' => 'required']) !!}
</div>
{!! $errors->first('color', '<p class="help-block">:message</p>') !!}
</div>
@stack('color_input_end')
<input type="hidden" name="type" value="{{ $category->type }}" />
@else
<x-form.group.select name="type" label="{{ trans_choice('general.types', 1) }}" :options="$types" change="updateParentCategories" />
@endif
{{ Form::radioGroup('enabled', trans('general.enabled'), $category->enabled) }}
</div>
</div>
<x-form.group.select name="parent_id" label="{{ trans('general.parent') . ' ' . trans_choice('general.categories', 1) }}" :options="$categories[$category->type]" not-required dynamicOptions="categoriesBasedTypes" sort-options="false" />
@can('update-settings-categories')
<div class="card-footer">
<div class="row save-buttons">
{{ Form::saveButtons('categories.index') }}
</div>
</div>
@endcan
{!! Form::close() !!}
</div>
@endsection
<x-form.input.hidden name="categories" :value="json_encode($categories)" />
<x-form.input.hidden name="parent_category_id" :value="$category->parent_id" />
</x-slot>
</x-form.section>
@push('scripts_start')
<script src="{{ asset('public/js/settings/categories.js?v=' . version('short')) }}"></script>
@endpush
<x-form.group.switch name="enabled" label="{{ trans('general.enabled') }}" />
@can('update-settings-categories')
<x-form.section>
<x-slot name="foot">
<x-form.buttons cancel-route="categories.index" />
</x-slot>
</x-form.section>
@endcan
</x-form>
</x-form.container>
</x-slot>
<x-script folder="settings" file="categories" />
</x-layouts.admin>

View File

@ -1,95 +1,122 @@
@extends('layouts.admin')
<x-layouts.admin>
<x-slot name="title">
{{ trans_choice('general.categories', 2) }}
</x-slot>
@section('title', trans_choice('general.categories', 2))
<x-slot name="favorite"
title="{{ trans_choice('general.categories', 2) }}"
icon="folder"
route="categories.index"
></x-slot>
@section('new_button')
@can('create-settings-categories')
<a href="{{ route('categories.create') }}" class="btn btn-success btn-sm">{{ trans('general.add_new') }}</a>
<a href="{{ route('import.create', ['settings', 'categories']) }}" class="btn btn-white btn-sm">{{ trans('import.import') }}</a>
@endcan
<a href="{{ route('categories.export', request()->input()) }}" class="btn btn-white btn-sm">{{ trans('general.export') }}</a>
@endsection
<x-slot name="buttons">
@can('create-settings-categories')
<x-link href="{{ route('categories.create') }}" kind="primary">
{{ trans('general.title.new', ['type' => trans_choice('general.categories', 1)]) }}
</x-link>
@endcan
</x-slot>
@section('content')
<div class="card">
<div class="card-header border-bottom-0" :class="[{'bg-gradient-primary': bulk_action.show}]">
{!! Form::open([
'method' => 'GET',
'route' => 'categories.index',
'role' => 'form',
'class' => 'mb-0'
]) !!}
<div class="align-items-center" v-if="!bulk_action.show">
<x-search-string model="App\Models\Setting\Category" />
</div>
<x-slot name="moreButtons">
<x-dropdown id="dropdown-more-actions">
<x-slot name="trigger">
<span class="material-icons">more_horiz</span>
</x-slot>
{{ Form::bulkActionRowGroup('general.categories', $bulk_actions, ['group' => 'settings', 'type' => 'categories']) }}
{!! Form::close() !!}
</div>
@can('create-settings-categories')
<x-dropdown.link href="{{ route('import.create', ['settings', 'categories']) }}">
{{ trans('import.import') }}
</x-dropdown.link>
@endcan
<div class="table-responsive">
<table class="table table-flush table-hover">
<thead class="thead-light">
<tr class="row table-head-line">
<th class="col-sm-2 col-md-2 col-lg-1 d-none d-sm-block">{{ Form::bulkActionAllGroup() }}</th>
<th class="col-xs-4 col-sm-3 col-md-2 col-lg-4">@sortablelink('name', trans('general.name'), ['filter' => 'active, visible'], ['class' => 'col-aka', 'rel' => 'nofollow'])</th>
<th class="col-sm-2 col-md-2 col-lg-2 d-none d-sm-block">@sortablelink('type', trans_choice('general.types', 1))</th>
<th class="col-md-2 col-lg-2 d-none d-md-block">{{ trans('general.color') }}</th>
<th class="col-xs-4 col-sm-3 col-md-2 col-lg-2">@sortablelink('enabled', trans('general.enabled'))</th>
<th class="col-xs-4 col-sm-2 col-md-2 col-lg-1 text-center">{{ trans('general.actions') }}</th>
</tr>
</thead>
<x-dropdown.link href="{{ route('categories.export', request()->input()) }}">
{{ trans('general.export') }}
</x-dropdown.link>
</x-dropdown>
</x-slot>
<tbody>
@foreach($categories as $item)
<tr class="row align-items-center border-top-1">
<td class="col-sm-2 col-md-2 col-lg-1 d-none d-sm-block">
{{ Form::bulkActionGroup($item->id, $item->name) }}
</td>
<td class="col-xs-4 col-sm-3 col-md-2 col-lg-4"><a class="col-aka" href="{{ route('categories.edit', $item->id) }}">{{ $item->name }}</a></td>
<td class="col-sm-2 col-md-2 col-lg-2 d-none d-sm-block">{{ $types[$item->type] ?? trans('general.na') }}</td>
<td class="col-md-2 col-lg-2 d-none d-md-block"><i class="fa fa-2x fa-circle" style="color:{{ $item->color }};"></i></td>
<td class="col-xs-4 col-sm-3 col-md-2 col-lg-2">
@if (user()->can('update-settings-categories'))
{{ Form::enabledGroup($item->id, $item->name, $item->enabled) }}
@else
@if ($item->enabled)
<badge rounded type="success" class="mw-60">{{ trans('general.yes') }}</badge>
@else
<badge rounded type="danger" class="mw-60">{{ trans('general.no') }}</badge>
@endif
@endif
</td>
<td class="col-xs-4 col-sm-2 col-md-2 col-lg-1 text-center">
<div class="dropdown">
<a class="btn btn-neutral btn-sm text-light items-align-center py-2" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-ellipsis-h text-muted"></i>
</a>
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
<a class="dropdown-item" href="{{ route('categories.edit', $item->id) }}">{{ trans('general.edit') }}</a>
@if ($item->id != $transfer_id)
@can('delete-settings-categories')
<div class="dropdown-divider"></div>
{!! Form::deleteLink($item, 'categories.destroy') !!}
@endcan
@endif
<x-slot name="content">
<x-index.container>
<x-index.search
search-string="App\Models\Setting\Category"
bulk-action="App\BulkActions\Settings\Categories"
/>
<x-table>
<x-table.thead>
<x-table.tr class="flex items-center px-1">
<x-table.th class="ltr:pr-6 rtl:pl-6 hidden sm:table-cell" override="class">
<x-index.bulkaction.all />
</x-table.th>
<x-table.th class="w-5/12">
<x-sortablelink column="name" title="{{ trans('general.name') }}" />
</x-table.th>
<x-table.th class="w-5/12">
<x-sortablelink column="type" title="{{ trans_choice('general.types', 1) }}" />
</x-table.th>
<x-table.th class="w-2/12">
{{ trans('general.color') }}
</x-table.th>
</x-table.tr>
</x-table.thead>
<x-table.tbody>
@foreach($categories as $category)
<x-table.tr href="{{ route('categories.edit', $category->id) }}" class="relative flex items-center border-b hover:bg-gray-100 px-1 group transition-all">
<x-table.td class="ltr:pr-6 rtl:pl-6 hidden sm:table-cell" override="class">
<x-index.bulkaction.single id="{{ $category->id }}" name="{{ $category->name }}" />
</x-table.td>
<x-table.td class="w-5/12 truncate">
@if ($category->sub_categories->count())
<div class="flex items-center font-bold">
{{ $category->name }}
<x-tooltip id="tooltip-category-{{ $category->id }}" placement="bottom" message="{{ trans('categories.collapse') }}">
<button
type="button"
class="w-4 h-4 flex items-center justify-center mx-2 leading-none align-text-top rounded-lg bg-gray-500 hover:bg-gray-700"
node="child-{{ $category->id }}"
onClick="toggleSub('child-{{ $category->id }}', event)"
>
<span class="material-icons transform transition-all text-lg leading-none align-middle text-white">navigate_next</span>
</button>
</x-tooltip>
</div>
</div>
</td>
</tr>
@else
<span class="font-bold">{{ $category->name }}</span>
@endif
</x-table.td>
<x-table.td class="w-5/12 truncate">
@if (! empty($types[$category->type]))
{{ $types[$category->type] }}
@else
<x-empty-data />
@endif
</x-table.td>
<x-table.td class="w-2/12 relative">
<span class="material-icons" class="text-3xl" style="color:{{ $category->color }};">circle</span>
</x-table.td>
<x-table.td kind="action">
<x-table.actions :model="$category" />
</x-table.td>
</x-table.tr>
@foreach($category->sub_categories as $sub_category)
@include('settings.categories.sub_category', ['parent_category' => $category, 'sub_category' => $sub_category, 'tree_level' => 1])
@endforeach
@endforeach
</tbody>
</table>
</div>
</x-table.tbody>
</x-table>
<div class="card-footer table-action">
<div class="row">
@include('partials.admin.pagination', ['items' => $categories])
</div>
</div>
</div>
@endsection
<x-pagination :items="$categories" />
</x-index.container>
</x-slot>
@push('scripts_start')
<script src="{{ asset('public/js/settings/categories.js?v=' . version('short')) }}"></script>
@endpush
<x-script folder="settings" file="categories" />
</x-layouts.admin>

View File

@ -0,0 +1,58 @@
@if ($sub_category->sub_categories)
<x-table.tr data-collapse="child-{{ $parent_category->id }}" data-animation class="relative flex items-center hover:bg-gray-100 px-1 group border-b transition-all collapse-sub" href="{{ route('categories.edit', $sub_category->id) }}">
<x-table.td class="ltr:pr-6 rtl:pl-6 hidden sm:table-cell" override="class">
<x-index.bulkaction.single id="{{ $sub_category->id }}" name="{{ $sub_category->name }}" />
</x-table.td>
<x-table.td class="w-5/12 ltr:pr-6 rtl:pl-6 py-4 ltr:text-left rtl:text-right whitespace-nowrap text-sm font-medium text-black truncate" style="padding-left: {{ $tree_level * 15 }}px;">
@if ($sub_category->sub_categories->count())
<div class="flex items-center font-bold">
<span class="material-icons transform mr-1 text-lg leading-none">subdirectory_arrow_right</span>
{{ $sub_category->name }}
<x-tooltip id="tooltip-category-{{ $parent_category->id }}" placement="bottom" message="{{ trans('categories.collapse') }}">
<button
type="button"
class="w-4 h-4 flex items-center justify-center mx-2 leading-none align-text-top rounded-lg bg-gray-500 hover:bg-gray-700"
node="child-{{ $sub_category->id }}"
onClick="toggleSub('child-{{ $sub_category->id }}', event)"
>
<span class="material-icons transform transition-all text-lg leading-none align-middle text-white">navigate_next</span>
</button>
</x-tooltip>
</div>
@else
<div class="flex items-center font-bold">
<span class="material-icons transform mr-1 text-lg leading-none">subdirectory_arrow_right</span>
{{ $sub_category->name }}
</div>
@endif
</x-table.td>
<x-table.td class="w-5/12 ltr:pr-6 rtl:pl-6 py-4 ltr:text-left rtl:text-right whitespace-nowrap text-sm font-normal text-black cursor-pointer truncate">
@if (! empty($types[$category->type]))
{{ $types[$category->type] }}
@else
<x-empty-data />
@endif
</x-table.td>
<x-table.td class="ltr:pr-6 rtl:pl-6 py-4 ltr:text-left rtl:text-right whitespace-nowrap text-sm font-normal text-black cursor-pointer w-2/12 relative">
<span class="material-icons" class="text-3xl" style="color:{{ $sub_category->color }};">circle</span>
</x-table.td>
<x-table.td kind="action">
<x-table.actions :model="$sub_category" />
</x-table.td>
</x-table.tr>
@php
$parent_category = $sub_category;
$tree_level++;
@endphp
@foreach($sub_category->sub_categories as $sub_category)
@include('settings.categories.sub_category', ['parent_category' => $parent_category, 'sub_category' => $sub_category, 'tree_level' => $tree_level])
@endforeach
@endif