mirror of
https://github.com/grocy/grocy.git
synced 2025-08-20 04:12:59 +00:00
Implement custom entities / objects (closes #242)
This commit is contained in:
@@ -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>
|
||||
|
62
views/userentities.blade.php
Normal file
62
views/userentities.blade.php
Normal 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> {{ $__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
|
59
views/userentityform.blade.php
Normal file
59
views/userentityform.blade.php
Normal 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
|
38
views/userobjectform.blade.php
Normal file
38
views/userobjectform.blade.php
Normal 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
|
66
views/userobjects.blade.php
Normal file
66
views/userobjects.blade.php
Normal 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> {{ $__t('Add') }}
|
||||
</a>
|
||||
<a class="btn btn-outline-secondary" href="{{ $U('/userfields?entity=' . 'userentity-' . $userentity->name) }}">
|
||||
<i class="fas fa-sliders-h"></i> {{ $__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
|
Reference in New Issue
Block a user