Implement custom entities / objects (closes #242)

This commit is contained in:
Bernd Bestel
2019-09-18 16:18:15 +02:00
parent 918f84f568
commit 096fb7a116
20 changed files with 666 additions and 18 deletions

View File

@@ -186,6 +186,17 @@
</a>
</li>
@endif
@php $firstUserentity = true; @endphp
@foreach($userentitiesForSidebar as $userentity)
<li class="nav-item @if($firstUserentity) mt-4 @endif" data-toggle="tooltip" data-placement="right" title="{{ $userentity->caption }}" data-nav-for-page="userentity-{{ $userentity->name }}">
<a class="nav-link discrete-link" href="{{ $U('/userobjects/' . $userentity->name) }}">
<i class="{{ $userentity->icon_css_class }}"></i>
<span class="nav-link-text">{{ $userentity->caption }}</span>
</a>
</li>
@php if ($firstUserentity) { $firstUserentity = false; } @endphp
@endforeach
<li class="nav-item mt-4" data-toggle="tooltip" data-placement="right" title="{{ $__t('Manage master data') }}">
<a class="nav-link nav-link-collapse collapsed discrete-link" data-toggle="collapse" href="#top-nav-manager-master-data">
@@ -249,6 +260,12 @@
<span class="nav-link-text">{{ $__t('Userfields') }}</span>
</a>
</li>
<li data-nav-for-page="userentities" data-sub-menu-of="#top-nav-manager-master-data">
<a class="nav-link discrete-link" href="{{ $U('/userentities') }}">
<i class="fas fa-bookmark "></i>
<span class="nav-link-text">{{ $__t('Userentities') }}</span>
</a>
</li>
</ul>
</li>
</ul>

View File

@@ -0,0 +1,62 @@
@extends('layout.default')
@section('title', $__t('Userentities'))
@section('activeNav', 'userentities')
@section('viewJsName', 'userentities')
@section('content')
<div class="row">
<div class="col">
<h1>
@yield('title')
<a id="new-userentity-button" class="btn btn-outline-dark" href="{{ $U('/userentity/new') }}">
<i class="fas fa-plus"></i>&nbsp;{{ $__t('Add') }}
</a>
</h1>
</div>
</div>
<div class="row mt-3">
<div class="col-xs-12 col-md-6 col-xl-3">
<label for="search">{{ $__t('Search') }}</label> <i class="fas fa-search"></i>
<input type="text" class="form-control" id="search">
</div>
</div>
<div class="row">
<div class="col">
<table id="userentities-table" class="table table-sm table-striped dt-responsive">
<thead>
<tr>
<th class="border-right"></th>
<th>{{ $__t('Name') }}</th>
<th>{{ $__t('Caption') }}</th>
</tr>
</thead>
<tbody class="d-none">
@foreach($userentities as $userentity)
<tr>
<td class="fit-content border-right">
<a class="btn btn-info btn-sm" href="{{ $U('/userentity/') }}{{ $userentity->id }}">
<i class="fas fa-edit"></i>
</a>
<a class="btn btn-danger btn-sm userentity-delete-button" href="#" data-userentity-id="{{ $userentity->id }}" data-userentity-name="{{ $userentity->name }}">
<i class="fas fa-trash"></i>
</a>
<a class="btn btn-secondary btn-sm" href="{{ $U('/userfields?entity=userentity-') }}{{ $userentity->name }}">
<i class="fas fa-th-list"></i> {{ $__t('Configure userfields') }}
</a>
</td>
<td>
{{ $userentity->name }}
</td>
<td>
{{ $userentity->caption }}
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@stop

View File

@@ -0,0 +1,59 @@
@extends('layout.default')
@if($mode == 'edit')
@section('title', $__t('Edit userentity'))
@else
@section('title', $__t('Create userentity'))
@endif
@section('viewJsName', 'userentityform')
@section('content')
<div class="row">
<div class="col-lg-6 col-xs-12">
<h1>@yield('title')</h1>
<script>Grocy.EditMode = '{{ $mode }}';</script>
@if($mode == 'edit')
<script>Grocy.EditObjectId = {{ $userentity->id }};</script>
@endif
<form id="userentity-form" novalidate>
<div class="form-group">
<label for="name">{{ $__t('Name') }}</label>
<input @if($mode == 'edit') disabled @endif type="text" class="form-control" required pattern="^[a-zA-Z0-9]*$" id="name" name="name" value="@if($mode == 'edit'){{ $userentity->name }}@endif">
<div class="invalid-feedback">{{ $__t('This is required and can only contain letters and numbers') }}</div>
</div>
<div class="form-group">
<label for="name">{{ $__t('Caption') }}</label>
<input type="text" class="form-control" required id="caption" name="caption" value="@if($mode == 'edit'){{ $userentity->caption }}@endif">
<div class="invalid-feedback">{{ $__t('A caption is required') }}</div>
</div>
<div class="form-group">
<label for="description">{{ $__t('Description') }}</label>
<textarea class="form-control" rows="2" id="description" name="description">@if($mode == 'edit'){{ $userentity->description }}@endif</textarea>
</div>
<div class="form-group">
<div class="form-check">
<input type="hidden" name="show_in_sidebar_menu" value="0">
<input @if($mode == 'edit' && $userentity->show_in_sidebar_menu == 1) checked @endif class="form-check-input" type="checkbox" id="show_in_sidebar_menu" name="show_in_sidebar_menu" value="1">
<label class="form-check-label" for="show_in_sidebar_menu">{{ $__t('Show in sidebar menu') }}</label>
</div>
</div>
<div class="form-group">
<label for="name">{{ $__t('Icon CSS class') }}</label>
<input type="text" class="form-control" id="icon_css_class" name="icon_css_class" value="@if($mode == 'edit'){{ $userentity->icon_css_class }}@endif" placeholder='{{ $__t('For example') }} "fas fa-smile"'>
</div>
<button id="save-userentity-button" class="btn btn-success">{{ $__t('Save') }}</button>
</form>
</div>
</div>
@stop

View File

@@ -0,0 +1,38 @@
@extends('layout.default')
@if($mode == 'edit')
@section('title', $__t('Edit %s', $userentity->caption))
@else
@section('title', $__t('Create %s', $userentity->caption))
@endif
@section('viewJsName', 'userobjectform')
@section('content')
<div class="row">
<div class="col-lg-6 col-xs-12">
<h1>@yield('title')</h1>
<script>
Grocy.EditMode = '{{ $mode }}';
Grocy.EditObjectParentId = {{ $userentity->id }};
Grocy.EditObjectParentName = "{{ $userentity->name }}";
</script>
@if($mode == 'edit')
<script>Grocy.EditObjectId = {{ $userobject->id }};</script>
@endif
<form id="userobject-form" novalidate>
@include('components.userfieldsform', array(
'userfields' => $userfields,
'entity' => 'userentity-' . $userentity->name
))
<button id="save-userobject-button" class="btn btn-success">{{ $__t('Save') }}</button>
</form>
</div>
</div>
@stop

View File

@@ -0,0 +1,66 @@
@extends('layout.default')
@section('title', $userentity->caption)
@section('activeNav', 'userentity-' . $userentity->name)
@section('viewJsName', 'userobjects')
@section('content')
<div class="row">
<div class="col">
<h1>
@yield('title')
<a class="btn btn-outline-dark" href="{{ $U('/userobject/' . $userentity->name . '/new') }}">
<i class="fas fa-plus"></i>&nbsp;{{ $__t('Add') }}
</a>
<a class="btn btn-outline-secondary" href="{{ $U('/userfields?entity=' . 'userentity-' . $userentity->name) }}">
<i class="fas fa-sliders-h"></i>&nbsp;{{ $__t('Configure userfields') }}
</a>
</h1>
<h5 class="text-muted">{{ $userentity->description }}</h5>
</div>
</div>
<div class="row mt-3">
<div class="col-xs-12 col-md-6 col-xl-3">
<label for="search">{{ $__t('Search') }}</label> <i class="fas fa-search"></i>
<input type="text" class="form-control" id="search">
</div>
</div>
<div class="row">
<div class="col">
<table id="userobjects-table" class="table table-sm table-striped dt-responsive">
<thead>
<tr>
<th class="border-right"></th>
@include('components.userfields_thead', array(
'userfields' => $userfields
))
</tr>
</thead>
<tbody class="d-none">
@foreach($userobjects as $userobject)
<tr>
<td class="fit-content border-right">
<a class="btn btn-info btn-sm" href="{{ $U('/userobject/' . $userentity->name . '/') }}{{ $userobject->id }}">
<i class="fas fa-edit"></i>
</a>
<a class="btn btn-danger btn-sm userobject-delete-button" href="#" data-userobject-id="{{ $userobject->id }}">
<i class="fas fa-trash"></i>
</a>
</td>
@include('components.userfields_tbody', array(
'userfields' => $userfields,
'userfieldValues' => FindAllObjectsInArrayByPropertyValue($userfieldValues, 'object_id', $userobject->id)
))
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@stop