mirror of
https://github.com/grocy/grocy.git
synced 2025-04-30 10:05:45 +00:00
Load all frontend packages conditionally
This commit is contained in:
parent
d16d976d0b
commit
f427849e89
@ -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")
|
- 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)
|
- 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)
|
- 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 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
|
- Fixed that button tooltips on some places didn't disappear after clicking the corresponding button
|
||||||
- New translations: (thanks all the translators)
|
- New translations: (thanks all the translators)
|
||||||
|
@ -253,3 +253,12 @@ function string_ends_with($haystack, $needle)
|
|||||||
|
|
||||||
return (substr($haystack, -$length) === $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));
|
||||||
|
}
|
||||||
|
@ -249,7 +249,14 @@ __t = function(text, ...placeholderValues)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sprintf can fail due to invalid placeholders
|
||||||
|
try
|
||||||
|
{
|
||||||
return sprintf(Grocy.Translator.__(text, ...placeholderValues), ...placeholderValues);
|
return sprintf(Grocy.Translator.__(text, ...placeholderValues), ...placeholderValues);
|
||||||
|
} catch (e)
|
||||||
|
{
|
||||||
|
return Grocy.Translator.__(text, ...placeholderValues);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
__n = function(number, singularForm, pluralForm, isQu = false)
|
__n = function(number, singularForm, pluralForm, isQu = false)
|
||||||
{
|
{
|
||||||
@ -272,13 +279,15 @@ __n = function(number, singularForm, pluralForm, isQu = false)
|
|||||||
pluralForm = singularForm;
|
pluralForm = singularForm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
number = Math.abs(number);
|
||||||
|
|
||||||
if (isQu)
|
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
|
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();
|
$(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
|
// Summernote workaround: Make embeds responsive
|
||||||
// By wrapping any embeded video in a container with class "embed-responsive"
|
// By wrapping any embeded video in a container with class "embed-responsive"
|
||||||
$(".note-video-clip").each(function()
|
$(".note-video-clip").each(function()
|
||||||
@ -745,128 +740,6 @@ $(document).on("click", ".show-as-dialog-link", function(e)
|
|||||||
// Init Bootstrap tooltips
|
// Init Bootstrap tooltips
|
||||||
$('[data-toggle="tooltip"]').tooltip()
|
$('[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 defaults
|
||||||
$.serializeJSON.defaultOptions.checkboxUncheckedValue = "0";
|
$.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();
|
$(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)
|
$(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 (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_RECIPES)
|
||||||
{
|
{
|
||||||
if ($(window).width() < 768)
|
if ($(window).width() < 768)
|
||||||
|
369
public/js/grocy_datatables.js
Normal file
369
public/js/grocy_datatables.js
Normal 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();
|
||||||
|
});
|
13
public/js/grocy_summernote.js
Normal file
13
public/js/grocy_summernote.js
Normal 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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
@ -1,12 +1,9 @@
|
|||||||
|
@php require_frontend_packages(['animatecss']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Barcode scanner testing'))
|
@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')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Batteries'))
|
@section('title', $__t('Batteries'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Batteries journal'))
|
@section('title', $__t('Batteries journal'))
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
|
@php require_frontend_packages(['datatables', 'animatecss']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Batteries overview'))
|
@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')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['bootstrap-combobox']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Battery tracking'))
|
@section('title', $__t('Battery tracking'))
|
||||||
|
@ -1,18 +1,9 @@
|
|||||||
|
@php require_frontend_packages(['fullcalendar', 'bwipjs']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Calendar'))
|
@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')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['bootstrap-select']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@if($mode == 'edit')
|
@if($mode == 'edit')
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Chores'))
|
@section('title', $__t('Chores'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Chores journal'))
|
@section('title', $__t('Chores journal'))
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
|
@php require_frontend_packages(['datatables', 'animatecss']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Chores overview'))
|
@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')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['bootstrap-combobox']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Chore tracking'))
|
@section('title', $__t('Chore tracking'))
|
||||||
|
@ -1,17 +1,13 @@
|
|||||||
@if (!GROCY_FEATURE_FLAG_DISABLE_BROWSER_BARCODE_CAMERA_SCANNING)
|
@if (!GROCY_FEATURE_FLAG_DISABLE_BROWSER_BARCODE_CAMERA_SCANNING)
|
||||||
|
|
||||||
|
@php require_frontend_packages(['quagga2']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@push('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/components/barcodescanner.js', true) }}?v={{ $version }}"></script>
|
<script src="{{ $U('/viewjs/components/barcodescanner.js', true) }}?v={{ $version }}"></script>
|
||||||
@endpush
|
@endpush
|
||||||
@endonce
|
@endonce
|
||||||
|
|
||||||
@once
|
|
||||||
@push('pageScripts')
|
|
||||||
<script src="{{ $U('/node_modules/@ericblade/quagga2/dist/quagga.min.js?v=', true) }}{{ $version }}"></script>
|
|
||||||
@endpush
|
|
||||||
@endonce
|
|
||||||
|
|
||||||
@push('pageStyles')
|
@push('pageStyles')
|
||||||
<style>
|
<style>
|
||||||
#barcodescanner-start-button {
|
#barcodescanner-start-button {
|
||||||
@ -25,7 +21,6 @@
|
|||||||
.combobox-container #barcodescanner-start-button {
|
.combobox-container #barcodescanner-start-button {
|
||||||
margin-right: 36px !important;
|
margin-right: 36px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
@endpush
|
@endpush
|
||||||
|
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['tempusdominus']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@push('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/components/calendarcard.js', true) }}?v={{ $version }}"></script>
|
<script src="{{ $U('/viewjs/components/calendarcard.js', true) }}?v={{ $version }}"></script>
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['tempusdominus']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@push('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/components/datetimepicker.js', true) }}?v={{ $version }}"></script>
|
<script src="{{ $U('/viewjs/components/datetimepicker.js', true) }}?v={{ $version }}"></script>
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['tempusdominus']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@push('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/components/datetimepicker2.js', true) }}?v={{ $version }}"></script>
|
<script src="{{ $U('/viewjs/components/datetimepicker2.js', true) }}?v={{ $version }}"></script>
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['bootstrap-combobox']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@push('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/components/locationpicker.js', true) }}?v={{ $version }}"></script>
|
<script src="{{ $U('/viewjs/components/locationpicker.js', true) }}?v={{ $version }}"></script>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
|
@php require_frontend_packages(['chartjs']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@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>
|
<script src="{{ $U('/viewjs/components/productcard.js', true) }}?v={{ $version }}"></script>
|
||||||
@endpush
|
@endpush
|
||||||
@endonce
|
@endonce
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['bootstrap-combobox']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@push('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/components/productpicker.js', true) }}?v={{ $version }}"></script>
|
<script src="{{ $U('/viewjs/components/productpicker.js', true) }}?v={{ $version }}"></script>
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['bootstrap-combobox']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@push('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/components/recipepicker.js', true) }}?v={{ $version }}"></script>
|
<script src="{{ $U('/viewjs/components/recipepicker.js', true) }}?v={{ $version }}"></script>
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['bootstrap-combobox']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@push('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/components/shoppinglocationpicker.js', true) }}?v={{ $version }}"></script>
|
<script src="{{ $U('/viewjs/components/shoppinglocationpicker.js', true) }}?v={{ $version }}"></script>
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['bootstrap-select']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@push('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/components/userfieldsform.js', true) }}?v={{ $version }}"></script>
|
<script src="{{ $U('/viewjs/components/userfieldsform.js', true) }}?v={{ $version }}"></script>
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['bootstrap-combobox']); @endphp
|
||||||
|
|
||||||
@once
|
@once
|
||||||
@push('componentScripts')
|
@push('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/components/userpicker.js', true) }}?v={{ $version }}"></script>
|
<script src="{{ $U('/viewjs/components/userpicker.js', true) }}?v={{ $version }}"></script>
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Equipment'))
|
@section('title', $__t('Equipment'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['summernote']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@if($mode == 'edit')
|
@if($mode == 'edit')
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php global $GROCY_REQUIRED_FRONTEND_PACKAGES; @endphp
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="{{ GROCY_LOCALE }}"
|
<html lang="{{ GROCY_LOCALE }}"
|
||||||
dir="{{ $dir }}">
|
dir="{{ $dir }}">
|
||||||
@ -6,7 +8,6 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport"
|
<meta name="viewport"
|
||||||
content="width=device-width, initial-scale=1">
|
content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
<meta name="robots"
|
<meta name="robots"
|
||||||
content="noindex,nofollow">
|
content="noindex,nofollow">
|
||||||
|
|
||||||
@ -19,12 +20,24 @@
|
|||||||
|
|
||||||
<title>@yield('title') | Grocy</title>
|
<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 }}"
|
<link href="{{ $U('/node_modules/bootstrap/dist/css/bootstrap.min.css?v=', true) }}{{ $version }}"
|
||||||
rel="stylesheet">
|
rel="stylesheet">
|
||||||
<link href="{{ $U('/node_modules/@fortawesome/fontawesome-free/css/all.min.css?v=', true) }}{{ $version }}"
|
<link href="{{ $U('/node_modules/@fortawesome/fontawesome-free/css/all.min.css?v=', true) }}{{ $version }}"
|
||||||
rel="stylesheet">
|
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 }}"
|
<link href="{{ $U('/node_modules/@danielfarrell/bootstrap-combobox/css/bootstrap-combobox.css?v=', true) }}{{ $version }}"
|
||||||
rel="stylesheet">
|
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 }}"
|
<link href="{{ $U('/node_modules/datatables.net-bs4/css/dataTables.bootstrap4.min.css?v=', true) }}{{ $version }}"
|
||||||
rel="stylesheet">
|
rel="stylesheet">
|
||||||
<link href="{{ $U('/node_modules/datatables.net-colreorder-bs4/css/colReorder.bootstrap4.min.css?v=', true) }}{{ $version }}"
|
<link href="{{ $U('/node_modules/datatables.net-colreorder-bs4/css/colReorder.bootstrap4.min.css?v=', true) }}{{ $version }}"
|
||||||
@ -33,16 +46,28 @@
|
|||||||
rel="stylesheet">
|
rel="stylesheet">
|
||||||
<link href="{{ $U('/node_modules/datatables.net-select-bs4/css/select.bootstrap4.min.css?v=', true) }}{{ $version }}"
|
<link href="{{ $U('/node_modules/datatables.net-select-bs4/css/select.bootstrap4.min.css?v=', true) }}{{ $version }}"
|
||||||
rel="stylesheet">
|
rel="stylesheet">
|
||||||
<link href="{{ $U('/node_modules/toastr/build/toastr.min.css?v=', true) }}{{ $version }}"
|
@endif
|
||||||
rel="stylesheet">
|
@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 }}"
|
<link href="{{ $U('/node_modules/tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.min.css?v=', true) }}{{ $version }}"
|
||||||
rel="stylesheet">
|
rel="stylesheet">
|
||||||
|
@endif
|
||||||
|
@if(in_array('summernote', $GROCY_REQUIRED_FRONTEND_PACKAGES))
|
||||||
<link href="{{ $U('/node_modules/summernote/dist/summernote-bs4.css?v=', true) }}{{ $version }}"
|
<link href="{{ $U('/node_modules/summernote/dist/summernote-bs4.css?v=', true) }}{{ $version }}"
|
||||||
rel="stylesheet">
|
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">
|
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">
|
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 }}"
|
<link href="{{ $U('/css/grocy_menu_layout.css?v=', true) }}{{ $version }}"
|
||||||
rel="stylesheet">
|
rel="stylesheet">
|
||||||
<link href="{{ $U('/css/grocy.css?v=', true) }}{{ $version }}"
|
<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/jquery-serializejson/jquery.serializejson.min.js?v=', true) }}{{ $version }}"></script>
|
||||||
<script src="{{ $U('/node_modules/moment/min/moment.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
|
@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>
|
<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/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-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>
|
<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-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/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/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/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>
|
@endif
|
||||||
<script src="{{ $U('/node_modules/gettext-translator/dist/translator.js?v=', true) }}{{ $version }}"></script>
|
@if(in_array('summernote', $GROCY_REQUIRED_FRONTEND_PACKAGES))
|
||||||
<script src="{{ $U('/node_modules/summernote/dist/summernote-bs4.js?v=', true) }}{{ $version }}"></script>
|
<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
|
@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>
|
<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
|
@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>
|
@endif
|
||||||
<script src="{{ $U('/node_modules/nosleep.js/dist/NoSleep.min.js?v=', true) }}{{ $version }}"></script>
|
@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/extensions.js?v=', true) }}{{ $version }}"></script>
|
||||||
<script src="{{ $U('/js/grocy_menu_layout.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_nightmode.js?v=', true) }}{{ $version }}"></script>
|
||||||
<script src="{{ $U('/js/grocy_clock.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('pageScripts')
|
||||||
@stack('componentScripts')
|
@stack('componentScripts')
|
||||||
<script src="{{ $U('/viewjs/' . $viewName . '.js?v=', true) }}{{ $version }}"></script>
|
<script src="{{ $U('/viewjs/' . $viewName . '.js?v=', true) }}{{ $version }}"></script>
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Location Content Sheet'))
|
@section('title', $__t('Location Content Sheet'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Locations'))
|
@section('title', $__t('Locations'))
|
||||||
|
@ -1,16 +1,9 @@
|
|||||||
|
@php require_frontend_packages(['datatables', 'animatecss', 'bwipjs']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('API keys'))
|
@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')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
@ -1,16 +1,10 @@
|
|||||||
|
@php require_frontend_packages(['fullcalendar']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Meal plan'))
|
@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')
|
@push('pageStyles')
|
||||||
<link href="{{ $U('/node_modules/fullcalendar/dist/fullcalendar.min.css?v=', true) }}{{ $version }}"
|
|
||||||
rel="stylesheet">
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.fc-event-container {
|
.fc-event-container {
|
||||||
border-bottom: 1px solid !important;
|
border-bottom: 1px solid !important;
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Meal plan sections'))
|
@section('title', $__t('Meal plan sections'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables', 'summernote']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@if($mode == 'edit')
|
@if($mode == 'edit')
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Product groups'))
|
@section('title', $__t('Product groups'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Products'))
|
@section('title', $__t('Products'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('QU conversions resolved'))
|
@section('title', $__t('QU conversions resolved'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@if($mode == 'edit')
|
@if($mode == 'edit')
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
|
@php require_frontend_packages(['animatecss']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Quantity unit plural form testing'))
|
@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')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Quantity units'))
|
@section('title', $__t('Quantity units'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables', 'summernote']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@if($mode == 'edit')
|
@if($mode == 'edit')
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Recipes'))
|
@section('title', $__t('Recipes'))
|
||||||
|
@ -1,17 +1,13 @@
|
|||||||
|
@php require_frontend_packages(['datatables', 'summernote', 'animatecss', 'bwipjs']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Shopping list'))
|
@section('title', $__t('Shopping list'))
|
||||||
|
|
||||||
@push('pageScripts')
|
@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>
|
<script src="{{ $U('/viewjs/purchase.js?v=', true) }}{{ $version }}"></script>
|
||||||
@endpush
|
@endpush
|
||||||
|
|
||||||
@push('pageStyles')
|
|
||||||
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
|
|
||||||
rel="stylesheet">
|
|
||||||
@endpush
|
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="row d-print-none hide-on-fullscreen-card">
|
<div class="row d-print-none hide-on-fullscreen-card">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
@ -270,12 +266,14 @@
|
|||||||
{{ $listItem->default_shopping_location_name }}
|
{{ $listItem->default_shopping_location_name }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
|
@if($listItem->product_barcodes != null)
|
||||||
@foreach(explode(',', $listItem->product_barcodes) as $barcode)
|
@foreach(explode(',', $listItem->product_barcodes) as $barcode)
|
||||||
@if(!empty($barcode))
|
@if(!empty($barcode))
|
||||||
<img class="barcode img-fluid pr-2"
|
<img class="barcode img-fluid pr-2"
|
||||||
data-barcode="{{ $barcode }}">
|
data-barcode="{{ $barcode }}">
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
|
@endif
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
@include('components.userfields_tbody', array(
|
@include('components.userfields_tbody', array(
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Stores'))
|
@section('title', $__t('Stores'))
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
|
@php require_frontend_packages(['datatables', 'animatecss']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Stock entries'))
|
@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')
|
@push('pageScripts')
|
||||||
<script src="{{ $U('/viewjs/purchase.js?v=', true) }}{{ $version }}"></script>
|
<script src="{{ $U('/viewjs/purchase.js?v=', true) }}{{ $version }}"></script>
|
||||||
@endpush
|
@endpush
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Stock journal'))
|
@section('title', $__t('Stock journal'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Stock journal summary'))
|
@section('title', $__t('Stock journal summary'))
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
|
@php require_frontend_packages(['datatables', 'animatecss']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Stock overview'))
|
@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')
|
@push('pageScripts')
|
||||||
<script src="{{ $U('/viewjs/purchase.js?v=', true) }}{{ $version }}"></script>
|
<script src="{{ $U('/viewjs/purchase.js?v=', true) }}{{ $version }}"></script>
|
||||||
@endpush
|
@endpush
|
||||||
|
@ -1,20 +1,9 @@
|
|||||||
|
@php require_frontend_packages(['datatables', 'daterangepicker', 'chartjs']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Stock report') . ' / ' . $__t('Spendings'))
|
@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')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Task categories'))
|
@section('title', $__t('Task categories'))
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
|
@php require_frontend_packages(['datatables', 'animatecss']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Tasks'))
|
@section('title', $__t('Tasks'))
|
||||||
|
|
||||||
@push('pageStyles')
|
|
||||||
<link href="{{ $U('/node_modules/animate.css/animate.min.css?v=', true) }}{{ $version }}"
|
|
||||||
rel="stylesheet">
|
|
||||||
@endpush
|
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Userentities'))
|
@section('title', $__t('Userentities'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Userfields'))
|
@section('title', $__t('Userfields'))
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $userentity->caption)
|
@section('title', $userentity->caption)
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
@php require_frontend_packages(['datatables']); @endphp
|
||||||
|
|
||||||
@extends('layout.default')
|
@extends('layout.default')
|
||||||
|
|
||||||
@section('title', $__t('Users'))
|
@section('title', $__t('Users'))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user