mirror of
https://github.com/grocy/grocy.git
synced 2025-04-29 09:39:57 +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")
|
||||
- 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)
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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)
|
||||
|
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')
|
||||
|
||||
@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">
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Batteries'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Batteries journal'))
|
||||
|
@ -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">
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['bootstrap-combobox']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Battery tracking'))
|
||||
|
@ -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">
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['bootstrap-select']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@if($mode == 'edit')
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Chores'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Chores journal'))
|
||||
|
@ -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">
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['bootstrap-combobox']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Chore tracking'))
|
||||
|
@ -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
|
||||
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['tempusdominus']); @endphp
|
||||
|
||||
@once
|
||||
@push('componentScripts')
|
||||
<script src="{{ $U('/viewjs/components/calendarcard.js', true) }}?v={{ $version }}"></script>
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['tempusdominus']); @endphp
|
||||
|
||||
@once
|
||||
@push('componentScripts')
|
||||
<script src="{{ $U('/viewjs/components/datetimepicker.js', true) }}?v={{ $version }}"></script>
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['tempusdominus']); @endphp
|
||||
|
||||
@once
|
||||
@push('componentScripts')
|
||||
<script src="{{ $U('/viewjs/components/datetimepicker2.js', true) }}?v={{ $version }}"></script>
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Equipment'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['summernote']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@if($mode == 'edit')
|
||||
|
@ -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>
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Location Content Sheet'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Locations'))
|
||||
|
@ -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">
|
||||
|
@ -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;
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Meal plan sections'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables', 'summernote']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@if($mode == 'edit')
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Product groups'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Products'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('QU conversions resolved'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@if($mode == 'edit')
|
||||
|
@ -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">
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Quantity units'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables', 'summernote']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@if($mode == 'edit')
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Recipes'))
|
||||
|
@ -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(
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Stores'))
|
||||
|
@ -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
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Stock journal'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Stock journal summary'))
|
||||
|
@ -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
|
||||
|
@ -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">
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Task categories'))
|
||||
|
@ -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">
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Userentities'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Userfields'))
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $userentity->caption)
|
||||
|
@ -1,3 +1,5 @@
|
||||
@php require_frontend_packages(['datatables']); @endphp
|
||||
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $__t('Users'))
|
||||
|
Loading…
x
Reference in New Issue
Block a user