Load all frontend packages conditionally

This commit is contained in:
Bernd Bestel 2023-05-21 10:56:38 +02:00
parent d16d976d0b
commit f427849e89
No known key found for this signature in database
GPG Key ID: 71BD34C0D4891300
57 changed files with 580 additions and 487 deletions

View File

@ -95,6 +95,7 @@
- Like already possible for products/chores/batteries, locations, stores, quantity units, product groups and task categories can now be disabled to keep them for existing references without deleting them, but to hide them everywhere for selections and so on (new option "Active")
- Added a new `config.php` setting `ENERGY_UNIT` to customize the label to display energy values (was fixed `kcal` before and defaults to that, so no changed behavior when not configured)
- New logo and "Grocy" is now officially spelled with a capital initial letter (before everything was lowercase)
- Various frontend performance enhancements
- Fixed that users were unable to delete their own API keys (when not having the `All permissions` permission)
- Fixed that button tooltips on some places didn't disappear after clicking the corresponding button
- New translations: (thanks all the translators)

View File

@ -253,3 +253,12 @@ function string_ends_with($haystack, $needle)
return (substr($haystack, -$length) === $needle);
}
global $GROCY_REQUIRED_FRONTEND_PACKAGES;
$GROCY_REQUIRED_FRONTEND_PACKAGES = [];
function require_frontend_packages(array $packages)
{
global $GROCY_REQUIRED_FRONTEND_PACKAGES;
$GROCY_REQUIRED_FRONTEND_PACKAGES = array_unique(array_merge($GROCY_REQUIRED_FRONTEND_PACKAGES, $packages));
}

View File

@ -249,7 +249,14 @@ __t = function(text, ...placeholderValues)
}
}
return sprintf(Grocy.Translator.__(text, ...placeholderValues), ...placeholderValues);
// sprintf can fail due to invalid placeholders
try
{
return sprintf(Grocy.Translator.__(text, ...placeholderValues), ...placeholderValues);
} catch (e)
{
return Grocy.Translator.__(text, ...placeholderValues);
}
}
__n = function(number, singularForm, pluralForm, isQu = false)
{
@ -272,13 +279,15 @@ __n = function(number, singularForm, pluralForm, isQu = false)
pluralForm = singularForm;
}
number = Math.abs(number);
if (isQu)
{
return Grocy.TranslatorQu.n__(singularForm, pluralForm, Math.abs(number), Math.abs(number))
return sprintf(Grocy.TranslatorQu.n__(singularForm, pluralForm, number, number), number.toString());
}
else
{
return Grocy.Translator.n__(singularForm, pluralForm, Math.abs(number), Math.abs(number))
return sprintf(Grocy.Translator.n__(singularForm, pluralForm, number, number), number.toString());
}
}
@ -665,20 +674,6 @@ $(document).on("click", ".easy-link-copy-textbox", function()
$(this).select();
});
$("textarea.wysiwyg-editor").summernote({
minHeight: "300px",
lang: __t("summernote_locale"),
callbacks: {
onImageLinkInsert: function(url)
{
// Summernote workaround: Make images responsive
// By adding the "img-fluid" class to the img tag
$img = $('<img>').attr({ src: url, class: "img-fluid" })
$(this).summernote("insertNode", $img[0]);
}
}
});
// Summernote workaround: Make embeds responsive
// By wrapping any embeded video in a container with class "embed-responsive"
$(".note-video-clip").each(function()
@ -745,128 +740,6 @@ $(document).on("click", ".show-as-dialog-link", function(e)
// Init Bootstrap tooltips
$('[data-toggle="tooltip"]').tooltip()
// Default DataTables initialisation settings
var collapsedGroups = {};
$.extend(true, $.fn.dataTable.defaults, {
'paginate': false,
'deferRender': true,
'language': IsJsonString(__t('datatables_localization')) ? JSON.parse(__t('datatables_localization')) : {},
'scrollY': false,
'scrollX': true,
'colReorder': true,
'stateSave': true,
'stateSaveParams': function(settings, data)
{
data.search.search = "";
data.columns.forEach(column =>
{
column.search.search = "";
});
},
'stateSaveCallback': function(settings, data)
{
var settingKey = 'datatables_state_' + settings.sTableId;
if ($.isEmptyObject(data))
{
//state.clear was called and unfortunately the table is not refresh, so we are reloading the page
Grocy.FrontendHelpers.DeleteUserSetting(settingKey, true);
} else
{
var stateData = JSON.stringify(data);
Grocy.FrontendHelpers.SaveUserSetting(settingKey, stateData);
}
},
'stateLoadCallback': function(settings, data)
{
var settingKey = 'datatables_state_' + settings.sTableId;
if (Grocy.UserSettings[settingKey] == undefined)
{
return null;
}
else
{
return JSON.parse(Grocy.UserSettings[settingKey]);
}
},
'preDrawCallback': function(settings)
{
// Currently it is not possible to save the state of rowGroup via saveState events
var api = new $.fn.dataTable.Api(settings);
if (typeof api.rowGroup === "function")
{
var settingKey = 'datatables_rowGroup_' + settings.sTableId;
if (Grocy.UserSettings[settingKey] !== undefined)
{
var rowGroup = JSON.parse(Grocy.UserSettings[settingKey]);
// Check if there way changed. the draw event is called often therefore we have to check if it's really necessary
if (rowGroup.enable !== api.rowGroup().enabled()
|| ("dataSrc" in rowGroup && rowGroup.dataSrc !== api.rowGroup().dataSrc()))
{
api.rowGroup().enable(rowGroup.enable);
if ("dataSrc" in rowGroup)
{
api.rowGroup().dataSrc(rowGroup.dataSrc);
// Apply fixed order for group column
api.order.fixed({
pre: [rowGroup.dataSrc, 'asc']
});
}
else
{
// Remove fixed order
api.order.fixed({});
}
}
}
}
},
'columnDefs': [
{ type: 'chinese-string', targets: '_all' }
],
'rowGroup': {
enable: false,
startRender: function(rows, group)
{
var collapsed = !!collapsedGroups[group];
var toggleClass = collapsed ? "fa-caret-right" : "fa-caret-down";
rows.nodes().each(function(row)
{
row.style.display = collapsed ? "none" : "";
});
return $("<tr/>")
.append('<td colspan="' + rows.columns()[0].length + '">' + group + ' <span class="fa fa-fw d-print-none ' + toggleClass + '"/></td>')
.attr("data-name", group)
.toggleClass("collapsed", collapsed);
}
}
});
$(document).on("click", "tr.dtrg-group", function()
{
var name = $(this).data('name');
collapsedGroups[name] = !collapsedGroups[name];
$("table").DataTable().draw();
});
$.fn.dataTable.ext.type.order["custom-sort-pre"] = function(data)
{
// Workaround for https://github.com/DataTables/ColReorder/issues/85
//
// Custom sorting can normally be provided by a "data-order" attribute on the <td> element,
// however this causes issues when reordering such a column...
//
// This here is for a custom column type "custom-sort",
// the custom order value needs to be provided in the first child (<span>) of the <td>
return (Number.parseFloat($(data).get(0).innerText));
};
// serializeJSON defaults
$.serializeJSON.defaultOptions.checkboxUncheckedValue = "0";
@ -912,38 +785,7 @@ $('.dropdown-item').has('.form-check input[type=checkbox]').on('click', function
{
$(e.target).find('input[type=checkbox]').click();
}
})
$('.table').on('column-sizing.dt', function(e, settings)
{
var dtScrollWidth = $('.dataTables_scroll').width();
var tableWidth = $('.table').width() + 100; // Some extra padding, otherwise the scrollbar maybe only appears after a column is already completely out of the viewport
if (dtScrollWidth < tableWidth)
{
$('.dataTables_scrollBody').addClass("no-force-overflow-visible");
$('.dataTables_scrollBody').removeClass("force-overflow-visible");
}
else
{
$('.dataTables_scrollBody').removeClass("no-force-overflow-visible");
$('.dataTables_scrollBody').addClass("force-overflow-visible");
}
});
$(document).on("show.bs.dropdown", "td .dropdown", function(e)
{
if ($('.dataTables_scrollBody').hasClass("no-force-overflow-visible"))
{
$('.dataTables_scrollBody').addClass("force-overflow-visible");
}
});
$(document).on("hide.bs.dropdown", "td .dropdown", function(e)
{
if ($('.dataTables_scrollBody').hasClass("no-force-overflow-visible"))
{
$('.dataTables_scrollBody').removeClass("force-overflow-visible");
}
})
$(window).on("message", function(e)
{
@ -955,223 +797,6 @@ $(window).on("message", function(e)
}
});
$(".change-table-columns-visibility-button").on("click", function(e)
{
e.preventDefault();
var dataTableSelector = $(e.currentTarget).attr("data-table-selector");
var dataTable = $(dataTableSelector).DataTable();
var columnCheckBoxesHtml = "";
var rowGroupRadioBoxesHtml = "";
var rowGroupDefined = typeof dataTable.rowGroup === "function";
if (rowGroupDefined)
{
var rowGroupChecked = (dataTable.rowGroup().enabled()) ? "" : "checked";
rowGroupRadioBoxesHtml = ' \
<div class="custom-control custom-radio custom-control-inline"> \
<input ' + rowGroupChecked + ' class="custom-control-input change-table-columns-rowgroup-toggle" \
type="radio" \
name="column-rowgroup" \
id="column-rowgroup-none" \
data-table-selector="' + dataTableSelector + '" \
data-column-index="-1" \
> \
<label class="custom-control-label font-italic" \
for="column-rowgroup-none">' + __t("None") + ' \
</label > \
</div>';
}
dataTable.columns().every(function()
{
var index = this.index();
var indexForGrouping = index;
var headerCell = $(this.header());
var title = headerCell.text();
var visible = this.visible();
if (!title || title.trim().length == 0 || title.startsWith("Hidden") || headerCell.hasClass("d-none"))
{
return;
}
var shadowColumnIndex = headerCell.attr("data-shadow-rowgroup-column");
if (shadowColumnIndex)
{
indexForGrouping = shadowColumnIndex;
}
var checked = "checked";
if (!visible)
{
checked = "";
}
columnCheckBoxesHtml += ' \
<div class="custom-control custom-checkbox"> \
<input ' + checked + ' class="form-check-input custom-control-input change-table-columns-visibility-toggle" \
type="checkbox" \
id="column-' + index.toString() + '" \
data-table-selector="' + dataTableSelector + '" \
data-column-index="' + index.toString() + '" \
value="1"> \
<label class="form-check-label custom-control-label" \
for="column-' + index.toString() + '">' + title + ' \
</label> \
</div>';
if (rowGroupDefined && headerCell.hasClass("allow-grouping"))
{
var rowGroupChecked = "";
if (dataTable.rowGroup().enabled() && dataTable.rowGroup().dataSrc() == index)
{
rowGroupChecked = "checked";
}
rowGroupRadioBoxesHtml += ' \
<div class="custom-control custom-radio"> \
<input ' + rowGroupChecked + ' class="custom-control-input change-table-columns-rowgroup-toggle" \
type="radio" \
name="column-rowgroup" \
id="column-rowgroup-' + indexForGrouping.toString() + '" \
data-table-selector="' + dataTableSelector + '" \
data-column-index="' + indexForGrouping.toString() + '" \
> \
<label class="custom-control-label" \
for="column-rowgroup-' + indexForGrouping.toString() + '">' + title + ' \
</label > \
</div>';
}
});
var message = '\
<div class="text-center"> \
<h5>' + __t('Table options') + '</h5> \
<hr> \
<h5 class="mb-0">' + __t('Hide/view columns') + '</h5> \
<div class="text-left form-group"> \
' + columnCheckBoxesHtml + ' \
</div> \
</div>';
if (rowGroupDefined)
{
message += ' \
<div class="text-center mt-1"> \
<h5 class="pt-3 mb-0">' + __t('Group by') + '</h5> \
<div class="text-left form-group"> \
' + rowGroupRadioBoxesHtml + ' \
</div> \
</div>';
}
bootbox.dialog({
message: message,
size: 'small',
backdrop: true,
closeButton: false,
buttons: {
reset: {
label: __t('Reset'),
className: 'btn-outline-danger float-left responsive-button',
callback: function()
{
bootbox.confirm({
message: __t("Are you sure to reset the table options?"),
buttons: {
cancel: {
label: 'No',
className: 'btn-danger'
},
confirm: {
label: 'Yes',
className: 'btn-success'
}
},
callback: function(result)
{
if (result)
{
var dataTable = $(dataTableSelector).DataTable();
var tableId = dataTable.settings()[0].sTableId;
// Delete rowgroup settings
Grocy.FrontendHelpers.DeleteUserSetting('datatables_rowGroup_' + tableId);
// Delete state settings
dataTable.state.clear();
}
bootbox.hideAll();
}
});
}
},
ok: {
label: __t('OK'),
className: 'btn-primary responsive-button',
callback: function()
{
bootbox.hideAll();
}
}
}
});
});
$(document).on("click", ".change-table-columns-visibility-toggle", function()
{
var dataTableSelector = $(this).attr("data-table-selector");
var columnIndex = $(this).attr("data-column-index");
var dataTable = $(dataTableSelector).DataTable();
dataTable.columns(columnIndex).visible(this.checked);
LoadImagesLazy();
});
$(document).on("click", ".change-table-columns-rowgroup-toggle", function()
{
var dataTableSelector = $(this).attr("data-table-selector");
var columnIndex = $(this).attr("data-column-index");
var dataTable = $(dataTableSelector).DataTable();
var rowGroup;
if (columnIndex == -1)
{
rowGroup = {
enable: false
};
dataTable.rowGroup().enable(false);
// Remove fixed order
dataTable.order.fixed({});
}
else
{
rowGroup = {
enable: true,
dataSrc: columnIndex
}
dataTable.rowGroup().enable(true);
dataTable.rowGroup().dataSrc(columnIndex);
// Apply fixed order for group column
dataTable.order.fixed({
pre: [columnIndex, 'asc']
});
}
var settingKey = 'datatables_rowGroup_' + dataTable.settings()[0].sTableId;
Grocy.FrontendHelpers.SaveUserSetting(settingKey, JSON.stringify(rowGroup));
dataTable.draw();
});
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_RECIPES)
{
if ($(window).width() < 768)

View File

@ -0,0 +1,369 @@
// Default DataTables initialisation settings
var collapsedGroups = {};
$.extend(true, $.fn.dataTable.defaults, {
'paginate': false,
'deferRender': true,
'language': IsJsonString(__t('datatables_localization')) ? JSON.parse(__t('datatables_localization')) : {},
'scrollY': false,
'scrollX': true,
'colReorder': true,
'stateSave': true,
'stateSaveParams': function(settings, data)
{
data.search.search = "";
data.columns.forEach(column =>
{
column.search.search = "";
});
},
'stateSaveCallback': function(settings, data)
{
var settingKey = 'datatables_state_' + settings.sTableId;
if ($.isEmptyObject(data))
{
//state.clear was called and unfortunately the table is not refresh, so we are reloading the page
Grocy.FrontendHelpers.DeleteUserSetting(settingKey, true);
} else
{
var stateData = JSON.stringify(data);
Grocy.FrontendHelpers.SaveUserSetting(settingKey, stateData);
}
},
'stateLoadCallback': function(settings, data)
{
var settingKey = 'datatables_state_' + settings.sTableId;
if (Grocy.UserSettings[settingKey] == undefined)
{
return null;
}
else
{
return JSON.parse(Grocy.UserSettings[settingKey]);
}
},
'preDrawCallback': function(settings)
{
// Currently it is not possible to save the state of rowGroup via saveState events
var api = new $.fn.dataTable.Api(settings);
if (typeof api.rowGroup === "function")
{
var settingKey = 'datatables_rowGroup_' + settings.sTableId;
if (Grocy.UserSettings[settingKey] !== undefined)
{
var rowGroup = JSON.parse(Grocy.UserSettings[settingKey]);
// Check if there way changed. the draw event is called often therefore we have to check if it's really necessary
if (rowGroup.enable !== api.rowGroup().enabled()
|| ("dataSrc" in rowGroup && rowGroup.dataSrc !== api.rowGroup().dataSrc()))
{
api.rowGroup().enable(rowGroup.enable);
if ("dataSrc" in rowGroup)
{
api.rowGroup().dataSrc(rowGroup.dataSrc);
// Apply fixed order for group column
api.order.fixed({
pre: [rowGroup.dataSrc, 'asc']
});
}
else
{
// Remove fixed order
api.order.fixed({});
}
}
}
}
},
'columnDefs': [
{ type: 'chinese-string', targets: '_all' }
],
'rowGroup': {
enable: false,
startRender: function(rows, group)
{
var collapsed = !!collapsedGroups[group];
var toggleClass = collapsed ? "fa-caret-right" : "fa-caret-down";
rows.nodes().each(function(row)
{
row.style.display = collapsed ? "none" : "";
});
return $("<tr/>")
.append('<td colspan="' + rows.columns()[0].length + '">' + group + ' <span class="fa fa-fw d-print-none ' + toggleClass + '"/></td>')
.attr("data-name", group)
.toggleClass("collapsed", collapsed);
}
}
});
$(document).on("click", "tr.dtrg-group", function()
{
var name = $(this).data('name');
collapsedGroups[name] = !collapsedGroups[name];
$("table").DataTable().draw();
});
$.fn.dataTable.ext.type.order["custom-sort-pre"] = function(data)
{
// Workaround for https://github.com/DataTables/ColReorder/issues/85
//
// Custom sorting can normally be provided by a "data-order" attribute on the <td> element,
// however this causes issues when reordering such a column...
//
// This here is for a custom column type "custom-sort",
// the custom order value needs to be provided in the first child (<span>) of the <td>
return (Number.parseFloat($(data).get(0).innerText));
};
$('.table').on('column-sizing.dt', function(e, settings)
{
var dtScrollWidth = $('.dataTables_scroll').width();
var tableWidth = $('.table').width() + 100; // Some extra padding, otherwise the scrollbar maybe only appears after a column is already completely out of the viewport
if (dtScrollWidth < tableWidth)
{
$('.dataTables_scrollBody').addClass("no-force-overflow-visible");
$('.dataTables_scrollBody').removeClass("force-overflow-visible");
}
else
{
$('.dataTables_scrollBody').removeClass("no-force-overflow-visible");
$('.dataTables_scrollBody').addClass("force-overflow-visible");
}
});
$(document).on("show.bs.dropdown", "td .dropdown", function(e)
{
if ($('.dataTables_scrollBody').hasClass("no-force-overflow-visible"))
{
$('.dataTables_scrollBody').addClass("force-overflow-visible");
}
});
$(document).on("hide.bs.dropdown", "td .dropdown", function(e)
{
if ($('.dataTables_scrollBody').hasClass("no-force-overflow-visible"))
{
$('.dataTables_scrollBody').removeClass("force-overflow-visible");
}
});
$(".change-table-columns-visibility-button").on("click", function(e)
{
e.preventDefault();
var dataTableSelector = $(e.currentTarget).attr("data-table-selector");
var dataTable = $(dataTableSelector).DataTable();
var columnCheckBoxesHtml = "";
var rowGroupRadioBoxesHtml = "";
var rowGroupDefined = typeof dataTable.rowGroup === "function";
if (rowGroupDefined)
{
var rowGroupChecked = (dataTable.rowGroup().enabled()) ? "" : "checked";
rowGroupRadioBoxesHtml = ' \
<div class="custom-control custom-radio custom-control-inline"> \
<input ' + rowGroupChecked + ' class="custom-control-input change-table-columns-rowgroup-toggle" \
type="radio" \
name="column-rowgroup" \
id="column-rowgroup-none" \
data-table-selector="' + dataTableSelector + '" \
data-column-index="-1" \
> \
<label class="custom-control-label font-italic" \
for="column-rowgroup-none">' + __t("None") + ' \
</label > \
</div>';
}
dataTable.columns().every(function()
{
var index = this.index();
var indexForGrouping = index;
var headerCell = $(this.header());
var title = headerCell.text();
var visible = this.visible();
if (!title || title.trim().length == 0 || title.startsWith("Hidden") || headerCell.hasClass("d-none"))
{
return;
}
var shadowColumnIndex = headerCell.attr("data-shadow-rowgroup-column");
if (shadowColumnIndex)
{
indexForGrouping = shadowColumnIndex;
}
var checked = "checked";
if (!visible)
{
checked = "";
}
columnCheckBoxesHtml += ' \
<div class="custom-control custom-checkbox"> \
<input ' + checked + ' class="form-check-input custom-control-input change-table-columns-visibility-toggle" \
type="checkbox" \
id="column-' + index.toString() + '" \
data-table-selector="' + dataTableSelector + '" \
data-column-index="' + index.toString() + '" \
value="1"> \
<label class="form-check-label custom-control-label" \
for="column-' + index.toString() + '">' + title + ' \
</label> \
</div>';
if (rowGroupDefined && headerCell.hasClass("allow-grouping"))
{
var rowGroupChecked = "";
if (dataTable.rowGroup().enabled() && dataTable.rowGroup().dataSrc() == index)
{
rowGroupChecked = "checked";
}
rowGroupRadioBoxesHtml += ' \
<div class="custom-control custom-radio"> \
<input ' + rowGroupChecked + ' class="custom-control-input change-table-columns-rowgroup-toggle" \
type="radio" \
name="column-rowgroup" \
id="column-rowgroup-' + indexForGrouping.toString() + '" \
data-table-selector="' + dataTableSelector + '" \
data-column-index="' + indexForGrouping.toString() + '" \
> \
<label class="custom-control-label" \
for="column-rowgroup-' + indexForGrouping.toString() + '">' + title + ' \
</label > \
</div>';
}
});
var message = '\
<div class="text-center"> \
<h5>' + __t('Table options') + '</h5> \
<hr> \
<h5 class="mb-0">' + __t('Hide/view columns') + '</h5> \
<div class="text-left form-group"> \
' + columnCheckBoxesHtml + ' \
</div> \
</div>';
if (rowGroupDefined)
{
message += ' \
<div class="text-center mt-1"> \
<h5 class="pt-3 mb-0">' + __t('Group by') + '</h5> \
<div class="text-left form-group"> \
' + rowGroupRadioBoxesHtml + ' \
</div> \
</div>';
}
bootbox.dialog({
message: message,
size: 'small',
backdrop: true,
closeButton: false,
buttons: {
reset: {
label: __t('Reset'),
className: 'btn-outline-danger float-left responsive-button',
callback: function()
{
bootbox.confirm({
message: __t("Are you sure to reset the table options?"),
buttons: {
cancel: {
label: 'No',
className: 'btn-danger'
},
confirm: {
label: 'Yes',
className: 'btn-success'
}
},
callback: function(result)
{
if (result)
{
var dataTable = $(dataTableSelector).DataTable();
var tableId = dataTable.settings()[0].sTableId;
// Delete rowgroup settings
Grocy.FrontendHelpers.DeleteUserSetting('datatables_rowGroup_' + tableId);
// Delete state settings
dataTable.state.clear();
}
bootbox.hideAll();
}
});
}
},
ok: {
label: __t('OK'),
className: 'btn-primary responsive-button',
callback: function()
{
bootbox.hideAll();
}
}
}
});
});
$(document).on("click", ".change-table-columns-visibility-toggle", function()
{
var dataTableSelector = $(this).attr("data-table-selector");
var columnIndex = $(this).attr("data-column-index");
var dataTable = $(dataTableSelector).DataTable();
dataTable.columns(columnIndex).visible(this.checked);
LoadImagesLazy();
});
$(document).on("click", ".change-table-columns-rowgroup-toggle", function()
{
var dataTableSelector = $(this).attr("data-table-selector");
var columnIndex = $(this).attr("data-column-index");
var dataTable = $(dataTableSelector).DataTable();
var rowGroup;
if (columnIndex == -1)
{
rowGroup = {
enable: false
};
dataTable.rowGroup().enable(false);
// Remove fixed order
dataTable.order.fixed({});
}
else
{
rowGroup = {
enable: true,
dataSrc: columnIndex
}
dataTable.rowGroup().enable(true);
dataTable.rowGroup().dataSrc(columnIndex);
// Apply fixed order for group column
dataTable.order.fixed({
pre: [columnIndex, 'asc']
});
}
var settingKey = 'datatables_rowGroup_' + dataTable.settings()[0].sTableId;
Grocy.FrontendHelpers.SaveUserSetting(settingKey, JSON.stringify(rowGroup));
dataTable.draw();
});

View File

@ -0,0 +1,13 @@
$("textarea.wysiwyg-editor").summernote({
minHeight: "300px",
lang: __t("summernote_locale"),
callbacks: {
onImageLinkInsert: function(url)
{
// Summernote workaround: Make images responsive
// By adding the "img-fluid" class to the img tag
$img = $('<img>').attr({ src: url, class: "img-fluid" })
$(this).summernote("insertNode", $img[0]);
}
}
});

View File

@ -1,12 +1,9 @@
@php require_frontend_packages(['animatecss']); @endphp
@extends('layout.default')
@section('title', $__t('Barcode scanner testing'))
@push('pageScripts')
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@section('content')
<div class="row">
<div class="col">

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Batteries'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Batteries journal'))

View File

@ -1,12 +1,9 @@
@php require_frontend_packages(['datatables', 'animatecss']); @endphp
@extends('layout.default')
@section('title', $__t('Batteries overview'))
@push('pageStyles')
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@section('content')
<div class="row">
<div class="col">

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['bootstrap-combobox']); @endphp
@extends('layout.default')
@section('title', $__t('Battery tracking'))

View File

@ -1,18 +1,9 @@
@php require_frontend_packages(['fullcalendar', 'bwipjs']); @endphp
@extends('layout.default')
@section('title', $__t('Calendar'))
@push('pageScripts')
<script src="{{ $U('/node_modules/fullcalendar/dist/fullcalendar.min.js?v=', true) }}{{ $version }}"></script>
@if(!empty($__t('fullcalendar_locale') && $__t('fullcalendar_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/fullcalendar/dist/locale/{{ $__t('fullcalendar_locale') }}.js?v={{ $version }}"></script>@endif
<script src="{{ $U('/node_modules/bwip-js/dist/bwip-js-min.js?v=', true) }}{{ $version }}"></script>
@endpush
@push('pageStyles')
<link href="{{ $U('/node_modules/fullcalendar/dist/fullcalendar.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@section('content')
<div class="row">
<div class="col">

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['bootstrap-select']); @endphp
@extends('layout.default')
@if($mode == 'edit')

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Chores'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Chores journal'))

View File

@ -1,12 +1,9 @@
@php require_frontend_packages(['datatables', 'animatecss']); @endphp
@extends('layout.default')
@section('title', $__t('Chores overview'))
@push('pageStyles')
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@section('content')
<div class="row">
<div class="col">

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['bootstrap-combobox']); @endphp
@extends('layout.default')
@section('title', $__t('Chore tracking'))

View File

@ -1,17 +1,13 @@
@if (!GROCY_FEATURE_FLAG_DISABLE_BROWSER_BARCODE_CAMERA_SCANNING)
@php require_frontend_packages(['quagga2']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/viewjs/components/barcodescanner.js', true) }}?v={{ $version }}"></script>
@endpush
@endonce
@once
@push('pageScripts')
<script src="{{ $U('/node_modules/@ericblade/quagga2/dist/quagga.min.js?v=', true) }}{{ $version }}"></script>
@endpush
@endonce
@push('pageStyles')
<style>
#barcodescanner-start-button {
@ -25,7 +21,6 @@
.combobox-container #barcodescanner-start-button {
margin-right: 36px !important;
}
</style>
@endpush

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['tempusdominus']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/viewjs/components/calendarcard.js', true) }}?v={{ $version }}"></script>

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['tempusdominus']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/viewjs/components/datetimepicker.js', true) }}?v={{ $version }}"></script>

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['tempusdominus']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/viewjs/components/datetimepicker2.js', true) }}?v={{ $version }}"></script>

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['bootstrap-combobox']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/viewjs/components/locationpicker.js', true) }}?v={{ $version }}"></script>

View File

@ -1,6 +1,7 @@
@php require_frontend_packages(['chartjs']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/node_modules/chart.js/dist/Chart.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/viewjs/components/productcard.js', true) }}?v={{ $version }}"></script>
@endpush
@endonce

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['bootstrap-combobox']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/viewjs/components/productpicker.js', true) }}?v={{ $version }}"></script>

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['bootstrap-combobox']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/viewjs/components/recipepicker.js', true) }}?v={{ $version }}"></script>

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['bootstrap-combobox']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/viewjs/components/shoppinglocationpicker.js', true) }}?v={{ $version }}"></script>

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['bootstrap-select']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/viewjs/components/userfieldsform.js', true) }}?v={{ $version }}"></script>

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['bootstrap-combobox']); @endphp
@once
@push('componentScripts')
<script src="{{ $U('/viewjs/components/userpicker.js', true) }}?v={{ $version }}"></script>

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Equipment'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['summernote']); @endphp
@extends('layout.default')
@if($mode == 'edit')

View File

@ -1,3 +1,5 @@
@php global $GROCY_REQUIRED_FRONTEND_PACKAGES; @endphp
<!DOCTYPE html>
<html lang="{{ GROCY_LOCALE }}"
dir="{{ $dir }}">
@ -6,7 +8,6 @@
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width, initial-scale=1">
<meta name="robots"
content="noindex,nofollow">
@ -19,12 +20,24 @@
<title>@yield('title') | Grocy</title>
<link href="{{ $U('/node_modules/@fontsource/open-sans/latin.css?v=', true) }}{{ $version }}"
rel="stylesheet">
<link href="{{ $U('/node_modules/bootstrap/dist/css/bootstrap.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
<link href="{{ $U('/node_modules/@fortawesome/fontawesome-free/css/all.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
<link href="{{ $U('/node_modules/toastr/build/toastr.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@if(in_array('bootstrap-combobox', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<link href="{{ $U('/node_modules/@danielfarrell/bootstrap-combobox/css/bootstrap-combobox.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endif
@if(in_array('bootstrap-select', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<link href="{{ $U('/node_modules/bootstrap-select/dist/css/bootstrap-select.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endif
@if(in_array('datatables', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<link href="{{ $U('/node_modules/datatables.net-bs4/css/dataTables.bootstrap4.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
<link href="{{ $U('/node_modules/datatables.net-colreorder-bs4/css/colReorder.bootstrap4.min.css?v=', true) }}{{ $version }}"
@ -33,16 +46,28 @@
rel="stylesheet">
<link href="{{ $U('/node_modules/datatables.net-select-bs4/css/select.bootstrap4.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
<link href="{{ $U('/node_modules/toastr/build/toastr.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endif
@if(in_array('tempusdominus', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<link href="{{ $U('/node_modules/tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endif
@if(in_array('summernote', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<link href="{{ $U('/node_modules/summernote/dist/summernote-bs4.css?v=', true) }}{{ $version }}"
rel="stylesheet">
<link href="{{ $U('/node_modules/bootstrap-select/dist/css/bootstrap-select.min.css?v=', true) }}{{ $version }}"
@endif
@if(in_array('animatecss', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
<link href="{{ $U('/node_modules/@fontsource/open-sans/latin.css?v=', true) }}{{ $version }}"
@endif
@if(in_array('fullcalendar', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<link href="{{ $U('/node_modules/fullcalendar/dist/fullcalendar.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endif
@if(in_array('daterangepicker', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<link href="{{ $U('/node_modules/daterangepicker/daterangepicker.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endif
<link href="{{ $U('/css/grocy_menu_layout.css?v=', true) }}{{ $version }}"
rel="stylesheet">
<link href="{{ $U('/css/grocy.css?v=', true) }}{{ $version }}"
@ -670,7 +695,16 @@
<script src="{{ $U('/node_modules/jquery-serializejson/jquery.serializejson.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/moment/min/moment.min.js?v=', true) }}{{ $version }}"></script>
@if(!empty($__t('moment_locale') && $__t('moment_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/moment/locale/{{ $__t('moment_locale') }}.js?v={{ $version }}"></script>@endif
<script src="{{ $U('/node_modules/toastr/build/toastr.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/sprintf-js/dist/sprintf.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/gettext-translator/dist/translator.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/jquery-lazy/jquery.lazy.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/nosleep.js/dist/NoSleep.min.js?v=', true) }}{{ $version }}"></script>
@if(in_array('bootstrap-combobox', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/node_modules/@danielfarrell/bootstrap-combobox/js/bootstrap-combobox.js?v=', true) }}{{ $version }}"></script>
@endif
@if(in_array('datatables', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/node_modules/datatables.net/js/jquery.dataTables.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/datatables.net-bs4/js/dataTables.bootstrap4.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/datatables.net-colreorder/js/dataTables.colReorder.min.js?v=', true) }}{{ $version }}"></script>
@ -681,16 +715,37 @@
<script src="{{ $U('/node_modules/datatables.net-rowgroup-bs4/js/rowGroup.bootstrap4.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/datatables.net-select/js/dataTables.select.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/datatables.net-select-bs4/js/select.bootstrap4.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/toastr/build/toastr.min.js?v=', true) }}{{ $version }}"></script>
@endif
@if(in_array('tempusdominus', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/sprintf-js/dist/sprintf.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/gettext-translator/dist/translator.js?v=', true) }}{{ $version }}"></script>
@endif
@if(in_array('summernote', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/node_modules/summernote/dist/summernote-bs4.js?v=', true) }}{{ $version }}"></script>
@if(!empty($__t('summernote_locale') && $__t('summernote_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/summernote/dist/lang/summernote-{{ $__t('summernote_locale') }}.js?v={{ $version }}"></script>@endif
@endif
@if(in_array('bootstrap-select', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/node_modules/bootstrap-select/dist/js/bootstrap-select.min.js?v=', true) }}{{ $version }}"></script>
@if(!empty($__t('bootstrap-select_locale') && $__t('bootstrap-select_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/bootstrap-select/dist/js/i18n/defaults-{{ $__t('bootstrap-select_locale') }}.js?v={{ $version }}"></script>@endif
<script src="{{ $U('/node_modules/jquery-lazy/jquery.lazy.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/nosleep.js/dist/NoSleep.min.js?v=', true) }}{{ $version }}"></script>
@endif
@if(in_array('fullcalendar', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/node_modules/fullcalendar/dist/fullcalendar.min.js?v=', true) }}{{ $version }}"></script>
@if(!empty($__t('fullcalendar_locale') && $__t('fullcalendar_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/fullcalendar/dist/locale/{{ $__t('fullcalendar_locale') }}.js?v={{ $version }}"></script>@endif
@endif
@if(in_array('daterangepicker', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/node_modules/daterangepicker/daterangepicker.js?v=', true) }}{{ $version }}"></script>
@endif
@if(in_array('quagga2', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/node_modules/@ericblade/quagga2/dist/quagga.min.js?v=', true) }}{{ $version }}"></script>
@endif
@if(in_array('bwipjs', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/node_modules/bwip-js/dist/bwip-js-min.js?v=', true) }}{{ $version }}"></script>
@endif
@if(in_array('chartjs', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/node_modules/chart.js/dist/Chart.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/chartjs-plugin-colorschemes/dist/chartjs-plugin-colorschemes.min.js?v=', true) }}{{ $version}}"></script>
<script src="{{ $U('/node_modules/chartjs-plugin-doughnutlabel/dist/chartjs-plugin-doughnutlabel.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/chartjs-plugin-piechart-outlabels/dist/chartjs-plugin-piechart-outlabels.min.js?v=', true) }}{{ $version}}"></script>
@endif
<script src="{{ $U('/js/extensions.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/js/grocy_menu_layout.js?v=', true) }}{{ $version }}"></script>
@ -700,6 +755,13 @@
<script src="{{ $U('/js/grocy_nightmode.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/js/grocy_clock.js?v=', true) }}{{ $version }}"></script>
@if(in_array('datatables', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/js/grocy_datatables.js?v=', true) }}{{ $version }}"></script>
@endif
@if(in_array('summernote', $GROCY_REQUIRED_FRONTEND_PACKAGES))
<script src="{{ $U('/js/grocy_summernote.js?v=', true) }}{{ $version }}"></script>
@endif
@stack('pageScripts')
@stack('componentScripts')
<script src="{{ $U('/viewjs/' . $viewName . '.js?v=', true) }}{{ $version }}"></script>

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Location Content Sheet'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Locations'))

View File

@ -1,16 +1,9 @@
@php require_frontend_packages(['datatables', 'animatecss', 'bwipjs']); @endphp
@extends('layout.default')
@section('title', $__t('API keys'))
@push('pageScripts')
<script src="{{ $U('/node_modules/bwip-js/dist/bwip-js-min.js?v=', true) }}{{ $version }}"></script>
@endpush
@push('pageStyles')
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@section('content')
<div class="row">
<div class="col">

View File

@ -1,16 +1,10 @@
@php require_frontend_packages(['fullcalendar']); @endphp
@extends('layout.default')
@section('title', $__t('Meal plan'))
@push('pageScripts')
<script src="{{ $U('/node_modules/fullcalendar/dist/fullcalendar.min.js?v=', true) }}{{ $version }}"></script>
@if(!empty($__t('fullcalendar_locale') && $__t('fullcalendar_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/fullcalendar/dist/locale/{{ $__t('fullcalendar_locale') }}.js?v={{ $version }}"></script>@endif
@endpush
@push('pageStyles')
<link href="{{ $U('/node_modules/fullcalendar/dist/fullcalendar.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
<style>
.fc-event-container {
border-bottom: 1px solid !important;

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Meal plan sections'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables', 'summernote']); @endphp
@extends('layout.default')
@if($mode == 'edit')

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Product groups'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Products'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('QU conversions resolved'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@if($mode == 'edit')

View File

@ -1,12 +1,9 @@
@php require_frontend_packages(['animatecss']); @endphp
@extends('layout.default')
@section('title', $__t('Quantity unit plural form testing'))
@push('pageStyles')
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@section('content')
<div class="row">
<div class="col">

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Quantity units'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables', 'summernote']); @endphp
@extends('layout.default')
@if($mode == 'edit')

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Recipes'))

View File

@ -1,17 +1,13 @@
@php require_frontend_packages(['datatables', 'summernote', 'animatecss', 'bwipjs']); @endphp
@extends('layout.default')
@section('title', $__t('Shopping list'))
@push('pageScripts')
<script src="{{ $U('/node_modules/bwip-js/dist/bwip-js-min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/viewjs/purchase.js?v=', true) }}{{ $version }}"></script>
@endpush
@push('pageStyles')
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@section('content')
<div class="row d-print-none hide-on-fullscreen-card">
<div class="col">
@ -270,12 +266,14 @@
{{ $listItem->default_shopping_location_name }}
</td>
<td>
@if($listItem->product_barcodes != null)
@foreach(explode(',', $listItem->product_barcodes) as $barcode)
@if(!empty($barcode))
<img class="barcode img-fluid pr-2"
data-barcode="{{ $barcode }}">
@endif
@endforeach
@endif
</td>
@include('components.userfields_tbody', array(

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Stores'))

View File

@ -1,12 +1,9 @@
@php require_frontend_packages(['datatables', 'animatecss']); @endphp
@extends('layout.default')
@section('title', $__t('Stock entries'))
@push('pageStyles')
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@push('pageScripts')
<script src="{{ $U('/viewjs/purchase.js?v=', true) }}{{ $version }}"></script>
@endpush

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Stock journal'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Stock journal summary'))

View File

@ -1,12 +1,9 @@
@php require_frontend_packages(['datatables', 'animatecss']); @endphp
@extends('layout.default')
@section('title', $__t('Stock overview'))
@push('pageStyles')
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@push('pageScripts')
<script src="{{ $U('/viewjs/purchase.js?v=', true) }}{{ $version }}"></script>
@endpush

View File

@ -1,20 +1,9 @@
@php require_frontend_packages(['datatables', 'daterangepicker', 'chartjs']); @endphp
@extends('layout.default')
@section('title', $__t('Stock report') . ' / ' . $__t('Spendings'))
@push('pageScripts')
<script src="{{ $U('/node_modules/chart.js/dist/Chart.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/chartjs-plugin-colorschemes/dist/chartjs-plugin-colorschemes.min.js?v=', true) }}{{ $version}}"></script>
<script src="{{ $U('/node_modules/chartjs-plugin-doughnutlabel/dist/chartjs-plugin-doughnutlabel.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/chartjs-plugin-piechart-outlabels/dist/chartjs-plugin-piechart-outlabels.min.js?v=', true) }}{{ $version}}"></script>
<script src="{{ $U('/node_modules/daterangepicker/daterangepicker.js?v=', true) }}{{ $version }}"></script>
@endpush
@push('pageStyles')
<link href="{{ $U('/node_modules/daterangepicker/daterangepicker.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@section('content')
<div class="row">
<div class="col">

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Task categories'))

View File

@ -1,12 +1,9 @@
@php require_frontend_packages(['datatables', 'animatecss']); @endphp
@extends('layout.default')
@section('title', $__t('Tasks'))
@push('pageStyles')
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
rel="stylesheet">
@endpush
@section('content')
<div class="row">
<div class="col">

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Userentities'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Userfields'))

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $userentity->caption)

View File

@ -1,3 +1,5 @@
@php require_frontend_packages(['datatables']); @endphp
@extends('layout.default')
@section('title', $__t('Users'))