mirror of
https://github.com/grocy/grocy.git
synced 2025-10-31 18:49:38 +00:00
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e693460894 | ||
|
|
47a6260d27 | ||
|
|
bfd29def8d | ||
|
|
cd0ca4a67c | ||
|
|
659d60b235 | ||
|
|
8efcb79ed7 | ||
|
|
5ba55823c9 | ||
|
|
6de4b120b3 | ||
|
|
8fec262184 | ||
|
|
bd483ec8b0 | ||
|
|
4d215edbd0 | ||
|
|
a3d4fd834f | ||
|
|
2d0c0bf34f | ||
|
|
0f03420808 | ||
|
|
ba319dc6f1 | ||
|
|
c10890205c | ||
|
|
643f6272e4 | ||
|
|
cad5e9ef79 | ||
|
|
01fdfe1a0c |
1
changelog/10_1.4.0_2017-06-04.md
Normal file
1
changelog/10_1.4.0_2017-06-04.md
Normal file
@@ -0,0 +1 @@
|
||||
- Added a login screen and switched to cookie/session based authentication instead of HTTP-basic-auth
|
||||
2
changelog/11_1.5.0_2017-07-25.md
Normal file
2
changelog/11_1.5.0_2017-07-25.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- New feature: Habit tracking
|
||||
- Fixed an issue which prevented that the databse is correctly created on unix systems
|
||||
2
changelog/12_1.6.0_2017-11-06.md
Normal file
2
changelog/12_1.6.0_2017-11-06.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- New feature: Rechargeable battery management
|
||||
- Improved productivity of input forms
|
||||
1
changelog/13_1.6.1_2017-11-09.md
Normal file
1
changelog/13_1.6.1_2017-11-09.md
Normal file
@@ -0,0 +1 @@
|
||||
- Improved sidebar responsiveness
|
||||
2
changelog/14_1.7.0_2018-04-15.md
Normal file
2
changelog/14_1.7.0_2018-04-15.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- Allow to add anything to the shopping list, not only products
|
||||
- Major project refactoring
|
||||
1
changelog/15_1.8.0_2018-04-16.md
Normal file
1
changelog/15_1.8.0_2018-04-16.md
Normal file
@@ -0,0 +1 @@
|
||||
- grocy is now fully localizable and ships by default with English and German translations
|
||||
2
changelog/16_1.8.1_2018-04-18.md
Normal file
2
changelog/16_1.8.1_2018-04-18.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- New configuration option "BASE_URL" to define base installation URL (should make subdirectory installations possible, see #3)
|
||||
- Added some missing translations
|
||||
1
changelog/17_1.8.2_2018-04-18.md
Normal file
1
changelog/17_1.8.2_2018-04-18.md
Normal file
@@ -0,0 +1 @@
|
||||
- Fixed login form didn't respect the configured BASE_URL
|
||||
1
changelog/18_1.9.0_2018-04-21.md
Normal file
1
changelog/18_1.9.0_2018-04-21.md
Normal file
@@ -0,0 +1 @@
|
||||
- Documented the REST API and data model, see the integrated instance of Swagger UI at [/api](https://demo-en.grocy.info/api)
|
||||
1
changelog/19_1.9.1_2018-04-22.md
Normal file
1
changelog/19_1.9.1_2018-04-22.md
Normal file
@@ -0,0 +1 @@
|
||||
- Added validation of all API requests and improved Swagger/OpenAPI description
|
||||
1
changelog/1_0.1.0_2017-04-15.md
Normal file
1
changelog/1_0.1.0_2017-04-15.md
Normal file
@@ -0,0 +1 @@
|
||||
- Basic features, mainly about a interface to record grocery purchases and consumptions
|
||||
1
changelog/20_1.9.2_2018-04-22.md
Normal file
1
changelog/20_1.9.2_2018-04-22.md
Normal file
@@ -0,0 +1 @@
|
||||
- Added a plugin system for looking up products against external services by barcode, see #6 for reference
|
||||
4
changelog/21_1.10.0_2018-05-12.md
Normal file
4
changelog/21_1.10.0_2018-05-12.md
Normal file
@@ -0,0 +1,4 @@
|
||||
- It's now possible to consume products directly from stock overview with one click
|
||||
- Added due/overdue info on bateries- and habits overview (like on stock overview)
|
||||
- Reworked general page layout and improved responsiveness (see #9 and thanks @d-Rickyy-b)
|
||||
- Translations fixes
|
||||
1
changelog/22_1.11.0_2018-06-15.md
Normal file
1
changelog/22_1.11.0_2018-06-15.md
Normal file
@@ -0,0 +1 @@
|
||||
- Added an option to not use URL rewriting (for webservers which, however, don't support URL rewriting)
|
||||
2
changelog/23_1.12.0_2018-07-08.md
Normal file
2
changelog/23_1.12.0_2018-07-08.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- On the stockoverview it's now possible to filter the products by location
|
||||
- All dropdowns are now sorted alphabetically
|
||||
1
changelog/24_1.12.1_2018-07-08.md
Normal file
1
changelog/24_1.12.1_2018-07-08.md
Normal file
@@ -0,0 +1 @@
|
||||
- Bug fix for location filtering on stock overview page did not work in all browsers
|
||||
3
changelog/25_1.13.0_2018-07-12.md
Normal file
3
changelog/25_1.13.0_2018-07-12.md
Normal file
@@ -0,0 +1,3 @@
|
||||
- Upgraded Bootstrap and some other dependencies (grocy now looks even better!)
|
||||
- Added Italian translation (thanks @davidoskky)
|
||||
- => Demo for this language available at: https://demo-it.grocy.info
|
||||
5
changelog/26_1.13.1_2018-07-12.md
Normal file
5
changelog/26_1.13.1_2018-07-12.md
Normal file
@@ -0,0 +1,5 @@
|
||||
This was released shortly after the last release to fix a small regression bug, original changes from Version 1.13.0:
|
||||
|
||||
- Upgraded Bootstrap and some other dependencies (grocy now looks even better!)
|
||||
- Added Italian translation (thanks @davidoskky)
|
||||
- => Demo for this language available at: https://demo-it.grocy.info
|
||||
13
changelog/27_1.14.0_2018-07-15.md
Normal file
13
changelog/27_1.14.0_2018-07-15.md
Normal file
@@ -0,0 +1,13 @@
|
||||
- New feature: **Recipes**
|
||||
- Organize a list of products, amounts and a description into recipes and see at a glance if everything needed is in stock or put the missing things with one click on the shopping list
|
||||
- Try it live on the demo page: => https://demo-en.grocy.info/recipes
|
||||
- Added norwegian translation (thanks @BlizzWave)
|
||||
- Demo available at: => https://demo-no.grocy.info
|
||||
- A lot of small UI improvements
|
||||
- Columns in tables can now be reordered
|
||||
- Show a calendar on the shopping list page (useful, at least for me)
|
||||
- Table column ordering and sorting is now remembered
|
||||
- Sidebar collapse state is now remembered
|
||||
- Fixed datetimepicker border
|
||||
- Keep the parent sidebar menu item expanded if the active page is a sub menu item
|
||||
- Custom JS/CSS file names have changed [see README](https://github.com/berrnd/grocy#adding-your-own-css-or-js-without-to-have-to-modify-the-application-itself)
|
||||
9
changelog/28_1.15.0_2018-07-22.md
Normal file
9
changelog/28_1.15.0_2018-07-22.md
Normal file
@@ -0,0 +1,9 @@
|
||||
- New related project: **grocy-desktop**
|
||||
- => https://github.com/berrnd/grocy-desktop
|
||||
- Run grocy without a webserver just like a normal (windows) desktop application
|
||||
- New "embedded mode" for grocy to help running in "desktop application mode" [see README](https://github.com/berrnd/grocy#embedded-mode)
|
||||
- New datepicker shorthands and improvements
|
||||
- `YYYYMMe` or `YYYYMM+` gets expanded to the end of the given month in the given year in proper notation
|
||||
- Changed: `MMDD` will be expanded to the given day next year if > today
|
||||
- [see README](https://github.com/berrnd/grocy#input-shorthands-for-date-fields)
|
||||
- Some other small bug fixes
|
||||
8
changelog/29_1.16.0_2018-07-25.md
Normal file
8
changelog/29_1.16.0_2018-07-25.md
Normal file
@@ -0,0 +1,8 @@
|
||||
- Replaced the single user (so far defined in `/data/config.php`) with a multi-user management
|
||||
- The currently defined user will automatically be migrated, please remove `HTTP_USER` and `HTTP_PASSWORD` from your config file afterwards
|
||||
- For this it was necessary to delete all sessions and API keys during the migration
|
||||
- Added an update script (`/update.sh`) to make updates (on Linux machines) easier
|
||||
- See also ["How to update" in README](https://github.com/berrnd/grocy#how-to-update)
|
||||
- Added the possibility to track who did a habit
|
||||
- Added a rudimentary habit analysis possibility
|
||||
- Different small UI, code and translation improvements
|
||||
1
changelog/2_0.2.0_2017-04-16.md
Normal file
1
changelog/2_0.2.0_2017-04-16.md
Normal file
@@ -0,0 +1 @@
|
||||
- General improvements, the work goes on...
|
||||
4
changelog/30_1.17.0_2018-08-04.md
Normal file
4
changelog/30_1.17.0_2018-08-04.md
Normal file
@@ -0,0 +1,4 @@
|
||||
- Basic product price tracking (can be entered on purchase, a little price history chart is shown in the product card - right side on purchase/consume/etc. pages)
|
||||
- Proper pluralization of everything (for quantity units you can enter the plural form in master data)
|
||||
- On all overview pages the statistics shown in the header are now updated when doing changes directly on the page (e. g. consuming a product)
|
||||
- Lots of small fixes and improvements (form validation, translations - thanks for keeping the norwegian translation always updated @BlizzWave, other small bugs)
|
||||
5
changelog/31_1.18.0_2018-08-11.md
Normal file
5
changelog/31_1.18.0_2018-08-11.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- The complete row is now refreshed on changes on all overview pages
|
||||
- Added a checkbox to set the "never expires date" in best before date inputs (alternative to shortcut "x")
|
||||
- Recipes can now have arbitrary quantity units and stock is only checked for one unit then (imagine you have sugar in "Packs" in stock but your recipe "Pancakes" needs 200 grams)
|
||||
- Added a "consume this recipe button" to remove all ingredients of a recipe from stock with one click
|
||||
- Other small UI changes/improvements
|
||||
1
changelog/32_1.18.1_2018-09-08.md
Normal file
1
changelog/32_1.18.1_2018-09-08.md
Normal file
@@ -0,0 +1 @@
|
||||
- Some smaller UI bug fixes and enhancements (thanks again for all the testing @BlizzWave)
|
||||
6
changelog/33_1.19.0_2018-09-24.md
Normal file
6
changelog/33_1.19.0_2018-09-24.md
Normal file
@@ -0,0 +1,6 @@
|
||||
- New feature: Tasks / To-do list
|
||||
- Renamed habits to chores as this is more what it is about
|
||||
- Products can now be organized in product groups, this group is also used to group the items on the shopping list (you can use this to optimize your way in the supermarket for example)
|
||||
- Added an option to stay logged in permanently (checkbox on the login page)
|
||||
- When the database was changed externally, the current page is automatically reloaded when there was no input for at least 50 seconds
|
||||
- Fixed some minor UI bugs
|
||||
2
changelog/34_1.19.1_2018-09-27.md
Normal file
2
changelog/34_1.19.1_2018-09-27.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- The colored info bars on top of all (overview)pages can now be clicked to filter the table accordingly
|
||||
- Fixed some minor mostly UI related bugs
|
||||
2
changelog/35_1.19.2_2018-09-29.md
Normal file
2
changelog/35_1.19.2_2018-09-29.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- Important bug fix: All forms were submitted twice when using ENTER instead of the OK/Save button
|
||||
- Norwegian translation updates (thanks @BlizzWave )
|
||||
3
changelog/36_1.20.0_2018-09-30.md
Normal file
3
changelog/36_1.20.0_2018-09-30.md
Normal file
@@ -0,0 +1,3 @@
|
||||
- New optional "Night Mode" (thanks a lot @BlizzWave, can also be activated automatically by a time range - see the new dropdown menu next to the user menu)
|
||||
- Docker support (thanks @talmai)
|
||||
- Fixed some minor UI bugs
|
||||
6
changelog/37_1.21.0_2018-10-06.md
Normal file
6
changelog/37_1.21.0_2018-10-06.md
Normal file
@@ -0,0 +1,6 @@
|
||||
- New feature: Equipment
|
||||
- Manage all your household equipment/devices in one place and have the information/instruction manual at hand when needed
|
||||
- New feature: Products can now have pictures
|
||||
- Add them in the product edit page
|
||||
- Will be shown in the productcard (purchase/consume/etc. pages) and when you click the product name on the stock overview page (a little image icon next to the product name indicates if the product has an image)
|
||||
- Recipes and the new equipment edit page now have a little editor with text formatting capabilities
|
||||
14
changelog/38_1.22.0_2018-10-27.md
Normal file
14
changelog/38_1.22.0_2018-10-27.md
Normal file
@@ -0,0 +1,14 @@
|
||||
- Added a journal for stock bookings, chore executions and battery charge cycles
|
||||
- => Button in each line on the overview pages or the "Journal" button next to the headline on every overview page
|
||||
- Added the possibility to undo any stock booking, chore execution and battery charge cycle
|
||||
- => Button in the success popup while booking a purchase/consume/etc. or on the new journal pages (see above)
|
||||
- Presets for new products are now configurable
|
||||
- => "Presets for new products" button next to the headline on the products list page
|
||||
- Recipes can now be nested (include a recipe into another one)
|
||||
- Recipe ingredients can now be grouped together which will result in headlines per group in the rendered recipe
|
||||
- => Group can be set on the recipe position edit page, demo recipe is "Pizza")
|
||||
- On the stock overview page, the product card is now shown when clicking the product name
|
||||
- Added option to filter by product group on stock overview page
|
||||
- When auto reloading on external changes is enabled, the page is not reloaded when there is a fullscreen card active (recipe/equipment instruction manual)
|
||||
- On the product-/chore-/batterycard there is now a link to the edit page of the corresponding item
|
||||
- Some other minor bug fixes
|
||||
18
changelog/39_1.23.0_2018-11-24.md
Normal file
18
changelog/39_1.23.0_2018-11-24.md
Normal file
@@ -0,0 +1,18 @@
|
||||
- New feature: "Shopping list to stock workflow"
|
||||
- Add a single shopping list item or all at once to stock directly from the shopping list
|
||||
- There are new "stock settings" under settings menu in the top right corner
|
||||
- You can enable there, that all products which have "Default best before days" set, are added without confirmation in this workflow
|
||||
- => This means, you can add the whole shopping list to stock with one click, if you want
|
||||
- Improved stock handling
|
||||
- On consume, a specific stock item can now be picked
|
||||
- A stock item can now be marked as "opened" (on the consume page or directly from stock overview, visible in the product card and on the stock overview page)
|
||||
- New feature: Calendar
|
||||
- Shows all upcoming product expirations, due chores, due tasks and due battery charge cycles
|
||||
- New translation: French (thanks all the translators)
|
||||
- As for all languages, a demo is available at: https://demo-fr.grocy.info
|
||||
- Small other improvements
|
||||
- Allow fraction numbers for recipe ingredients when not checked against stock and add an option to not check stock for a recipe position
|
||||
- The current time can now be shown in the header (see the settings menu next to the user icon)
|
||||
- Changed: Docker related things are now in a separate repository: https://github.com/grocy/grocy-docker
|
||||
- Changed: Translations are now managed with Transifex: https://www.transifex.com/grocy/grocy
|
||||
|
||||
1
changelog/3_0.3.0_2017-04-17.md
Normal file
1
changelog/3_0.3.0_2017-04-17.md
Normal file
@@ -0,0 +1 @@
|
||||
- Form validation and barcode input handling improvements
|
||||
2
changelog/40_1.23.1_2018-11-27.md
Normal file
2
changelog/40_1.23.1_2018-11-27.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- Added a skip button when adding all shopping list items in "Shopping list to stock workflow"
|
||||
- Fixed some minor UI related bugs
|
||||
1
changelog/41_1.24.0_2018-12-30.md
Normal file
1
changelog/41_1.24.0_2018-12-30.md
Normal file
@@ -0,0 +1 @@
|
||||
- All `config.php` settings can now also be set via environment variables (for [grocy-docker](https://github.com/grocy/grocy-docker))
|
||||
5
changelog/42_1.24.1_2019-01-10.md
Normal file
5
changelog/42_1.24.1_2019-01-10.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- Fixed a SQL error during database migration when using SQLite >= 3.25.2
|
||||
- Improved data tables loading time
|
||||
- Location edit form did not work (master data)
|
||||
- Quantity unit "purchase to stock factor" was not respected when putting a recipe on the shopping list or when comparing the already on the shopping list amount
|
||||
- Better API response for POST routes when there is no or invalid JSON request body content
|
||||
23
changelog/43_2.0.0_2019-03-06.md
Normal file
23
changelog/43_2.0.0_2019-03-06.md
Normal file
@@ -0,0 +1,23 @@
|
||||
- Breaking change: The API has been completely reworked, please review [the documentation](https://demo-en.grocy.info/api) before updating when you are using the API
|
||||
- New feature: Tare weight handling
|
||||
- An option per product
|
||||
- Imagine this: You have flour in jars, the jar weighs 500 grams, currently there are 1000 grams in stock, the new weight including the jar is 1100 grams - grocy can now calculate the used amount on consume/purchase/inventory automatically, you only have to enter the weighed amount including the jar (demo product to showcase this "Flour")
|
||||
- Recipe improvements
|
||||
- Recipes are now scalable - define per recipe for how much servings it is, change the desired servings on the fly when the recipe is displayed, ingredient amounts are scaled accordingly
|
||||
- The cost of a recipe is now displayed based on the last purchase price per ingredient (recipe scaling also applies)
|
||||
- When putting all missing recipe ingredients on the shopping list, it is now possible to ignore certain ingredients (in the popup when clicking the "Put missing items on shopping list" button)
|
||||
- A new option per recipe to not check against the amount already on the shopping list when putting all missing ingredients on it (by default, only the amount not already on the shopping list is added, when this is enabled, always the whole missing amount will be put on the shopping list)
|
||||
- On consume, there can now be tracked for which recipe it was, this is also tracked automatically when using the "Consume all ingredients needed by this recipe" button (for future statistical purposes)
|
||||
- Recipes can now have pictures
|
||||
- New "gallery view" for recipes (demo available at https://demo-en.grocy.info/recipes?tab=gallery)
|
||||
- Stock improvements
|
||||
- It is now optionally possible to have partial units in stock (option per product)
|
||||
- On purchase, a different location can now be assigned (imagine you have two freezers, by default you store your pizza there, but sometimes there)
|
||||
- New translations: (thanks all the translators)
|
||||
- Spanish (demo available at https://demo-es.grocy.info)
|
||||
- Turkish (demo available at https://demo-tr.grocy.info)
|
||||
- Other improvements
|
||||
- The calendar can now be shared/integrated in iCal format (button in the header on the calendar page)
|
||||
- Added feature flags to hide/disable certain parts of grocy when you don't use them (for example hide "Chores" and all related UI elements, when you don't use it, see `config-dist.php`)
|
||||
- Added a "Apple Touch Icon" and a "Web App Manifest" which should improve grocy on mobile devices and also enables "Add to Home screen" on major mobile browsers
|
||||
- A lot of other minor small and bigger UI improvements
|
||||
10
changelog/44_2.1.0_2019-03-09.md
Normal file
10
changelog/44_2.1.0_2019-03-09.md
Normal file
@@ -0,0 +1,10 @@
|
||||
- Some small UI fixes & improvements
|
||||
- Recipe ingredient notes were not displayed
|
||||
- Edit/delete buttons on the equipment page had no icons
|
||||
- Improved the overview pages "action buttons column" (e. g. hide more rarely used actions behind a context/dropdown menu)
|
||||
- The "purchase to stock conversion factor" is now displayed on the purchase page when QU units are different (above the amount field)
|
||||
- Some JS files were not loaded correctly on case sensitive file systems
|
||||
- The changelog is now included as markdown files (in `/changelog` directory, one file per release with a filename in format `<ReleaseNumber>_<Version>_<ReleaseDateIso>.md`) and shown in the about dialog
|
||||
- Please review your `CURRENCY` setting in `data/config.php`, see also `config-dist.php` - this should be the ISO 4217 code of the currency to properly work with the JS `toLocaleString` function
|
||||
- New translation: (thanks all the translators)
|
||||
- Russian (demo available at https://demo-ru.grocy.info)
|
||||
1
changelog/4_0.4.0_2017-04-18.md
Normal file
1
changelog/4_0.4.0_2017-04-18.md
Normal file
@@ -0,0 +1 @@
|
||||
- Add possibility to have multiple barcodes per product
|
||||
1
changelog/5_1.0.0_2017-04-20.md
Normal file
1
changelog/5_1.0.0_2017-04-20.md
Normal file
@@ -0,0 +1 @@
|
||||
- Ready to ERP your fridge!
|
||||
1
changelog/6_1.0.1_2017-04-20.md
Normal file
1
changelog/6_1.0.1_2017-04-20.md
Normal file
@@ -0,0 +1 @@
|
||||
- Added flow to directly add products and barcodes from purchase and inventory view
|
||||
2
changelog/7_1.1.0_2017-04-21.md
Normal file
2
changelog/7_1.1.0_2017-04-21.md
Normal file
@@ -0,0 +1,2 @@
|
||||
* New feature: Shopping list (which is also automatically filled based on defined min. stock amount)
|
||||
* Small UI changes for better productivity
|
||||
1
changelog/8_1.2.0_2017-04-21.md
Normal file
1
changelog/8_1.2.0_2017-04-21.md
Normal file
@@ -0,0 +1 @@
|
||||
- Added a flow to add a new product with prefilled barcode
|
||||
1
changelog/9_1.3.0_2017-04-22.md
Normal file
1
changelog/9_1.3.0_2017-04-22.md
Normal file
@@ -0,0 +1 @@
|
||||
- Added a favicon and more productivity improvements
|
||||
@@ -5,7 +5,8 @@
|
||||
"morris/lessql": "^0.3.4",
|
||||
"rubellum/slim-blade-view": "^0.1.1",
|
||||
"tuupola/cors-middleware": "^0.7.0",
|
||||
"eluceo/ical": "^0.15.0"
|
||||
"eluceo/ical": "^0.15.0",
|
||||
"erusev/parsedown": "^1.7.1"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
||||
48
composer.lock
generated
48
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "0b203f875499dfeaa61890cdec018a2d",
|
||||
"content-hash": "d11fedeb82f88d3996984cca43395a08",
|
||||
"packages": [
|
||||
{
|
||||
"name": "container-interop/container-interop",
|
||||
@@ -155,6 +155,52 @@
|
||||
],
|
||||
"time": "2019-01-13T22:00:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "erusev/parsedown",
|
||||
"version": "1.7.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/erusev/parsedown.git",
|
||||
"reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/erusev/parsedown/zipball/92e9c27ba0e74b8b028b111d1b6f956a15c01fc1",
|
||||
"reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-mbstring": "*",
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4.8.35"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Parsedown": ""
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Emanuil Rusev",
|
||||
"email": "hello@erusev.com",
|
||||
"homepage": "http://erusev.com"
|
||||
}
|
||||
],
|
||||
"description": "Parser for Markdown.",
|
||||
"homepage": "http://parsedown.org",
|
||||
"keywords": [
|
||||
"markdown",
|
||||
"parser"
|
||||
],
|
||||
"time": "2018-03-08T01:11:30+00:00"
|
||||
},
|
||||
{
|
||||
"name": "http-interop/http-factory",
|
||||
"version": "0.3.0",
|
||||
|
||||
@@ -23,8 +23,9 @@ Setting('CULTURE', 'en');
|
||||
|
||||
# To keep it simple: grocy does not handle any currency conversions,
|
||||
# this here is used to format all money values,
|
||||
# so can be anything (e. g. "USD" OR "$", doesn't matter...)
|
||||
Setting('CURRENCY', '$');
|
||||
# so doesn't matter really matter, but should be the
|
||||
# ISO 4217 code of the currency ("USD", "EUR", "GBP", etc.)
|
||||
Setting('CURRENCY', 'USD');
|
||||
|
||||
# The base url of your installation,
|
||||
# should be just "/" when running directly under the root of a (sub)domain
|
||||
|
||||
@@ -34,7 +34,8 @@ class SystemController extends BaseController
|
||||
public function About(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||
{
|
||||
return $this->AppContainer->view->render($response, 'about', [
|
||||
'system_info' => $this->ApplicationService->GetSystemInfo()
|
||||
'system_info' => $this->ApplicationService->GetSystemInfo(),
|
||||
'changelog' => $this->ApplicationService->GetChangelog()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,5 +85,6 @@ return array(
|
||||
'Topping' => 'Topping',
|
||||
'French' => 'Fransk',
|
||||
'Turkish' => 'Turkish',
|
||||
'Spanish' => 'Spanish'
|
||||
'Spanish' => 'Spanish',
|
||||
'Russian' => 'Russian'
|
||||
);
|
||||
|
||||
@@ -85,5 +85,6 @@ return array(
|
||||
'Topping' => 'Belag',
|
||||
'French' => 'Französisch',
|
||||
'Turkish' => 'Türkisch',
|
||||
'Spanish' => 'Spanisch'
|
||||
'Spanish' => 'Spanisch',
|
||||
'Russian' => 'Russisch'
|
||||
);
|
||||
|
||||
@@ -345,5 +345,14 @@ return array(
|
||||
'You have to select a location' => 'Ein Standort muss ausgewählt werden',
|
||||
'List' => 'Liste',
|
||||
'Gallery' => 'Galerie',
|
||||
'The current picture will be deleted when you save the recipe' => 'Das aktuelle Bild wird beim Speichern des Rezepts gelöscht '
|
||||
'The current picture will be deleted when you save the recipe' => 'Das aktuelle Bild wird beim Speichern des Rezepts gelöscht ',
|
||||
'Show product details' => 'Produktdetails anzeigen',
|
||||
'Stock journal for this product' => 'Bestandsjournal für dieses Produkt',
|
||||
'Show chore details' => 'Hausarbeitdetails anzeigen',
|
||||
'Journal for this chore' => 'Journal für dieses Hausarbeit',
|
||||
'Show battery details' => 'Batteriedetails anzeigen',
|
||||
'Journal for this battery' => 'Journal für diese Batterie',
|
||||
'System info' => 'Systeminformationen',
|
||||
'Changelog' => 'Änderungsprotokoll',
|
||||
'will be multiplied a factor of #1 to get #2' => 'wird mit dem Faktor #1 multipliziert um #2 zu erhalten'
|
||||
);
|
||||
|
||||
@@ -85,5 +85,6 @@ return array(
|
||||
'Topping' => 'Topping',
|
||||
'French' => 'French',
|
||||
'Turkish' => 'Turkish',
|
||||
'Spanish' => 'Spanish'
|
||||
'Spanish' => 'Spanish',
|
||||
'Russian' => 'Russian'
|
||||
);
|
||||
|
||||
@@ -345,5 +345,14 @@ return array(
|
||||
'You have to select a location' => 'You have to select a location',
|
||||
'List' => 'List',
|
||||
'Gallery' => 'Gallery',
|
||||
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe'
|
||||
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe',
|
||||
'Show product details' => 'Show product details',
|
||||
'Stock journal for this product' => 'Stock journal for this product',
|
||||
'Show chore details' => 'Show chore details',
|
||||
'Journal for this chore' => 'Journal for this chore',
|
||||
'Show battery details' => 'Show battery details',
|
||||
'Journal for this battery' => 'Journal for this battery',
|
||||
'System info' => 'System info',
|
||||
'Changelog' => 'Changelog',
|
||||
'will be multiplied a factor of #1 to get #2' => 'will be multiplied a factor of #1 to get #2'
|
||||
);
|
||||
|
||||
@@ -85,5 +85,6 @@ return array(
|
||||
'Topping' => 'Parte superior',
|
||||
'French' => 'Francés',
|
||||
'Turkish' => 'Turkish',
|
||||
'Spanish' => 'Spanish'
|
||||
'Spanish' => 'Spanish',
|
||||
'Russian' => 'Russian'
|
||||
);
|
||||
|
||||
@@ -345,5 +345,14 @@ return array(
|
||||
'You have to select a location' => 'You have to select a location',
|
||||
'List' => 'List',
|
||||
'Gallery' => 'Gallery',
|
||||
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe'
|
||||
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe',
|
||||
'Show product details' => 'Show product details',
|
||||
'Stock journal for this product' => 'Stock journal for this product',
|
||||
'Show chore details' => 'Show chore details',
|
||||
'Journal for this chore' => 'Journal for this chore',
|
||||
'Show battery details' => 'Show battery details',
|
||||
'Journal for this battery' => 'Journal for this battery',
|
||||
'System info' => 'System info',
|
||||
'Changelog' => 'Changelog',
|
||||
'will be multiplied a factor of #1 to get #2' => 'will be multiplied a factor of #1 to get #2'
|
||||
);
|
||||
|
||||
@@ -85,5 +85,6 @@ return array(
|
||||
'Topping' => 'Garniture',
|
||||
'French' => 'Français',
|
||||
'Turkish' => 'Turkish',
|
||||
'Spanish' => 'Spanish'
|
||||
'Spanish' => 'Spanish',
|
||||
'Russian' => 'Russian'
|
||||
);
|
||||
|
||||
@@ -345,5 +345,14 @@ return array(
|
||||
'You have to select a location' => 'You have to select a location',
|
||||
'List' => 'List',
|
||||
'Gallery' => 'Gallery',
|
||||
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe'
|
||||
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe',
|
||||
'Show product details' => 'Show product details',
|
||||
'Stock journal for this product' => 'Stock journal for this product',
|
||||
'Show chore details' => 'Show chore details',
|
||||
'Journal for this chore' => 'Journal for this chore',
|
||||
'Show battery details' => 'Show battery details',
|
||||
'Journal for this battery' => 'Journal for this battery',
|
||||
'System info' => 'System info',
|
||||
'Changelog' => 'Changelog',
|
||||
'will be multiplied a factor of #1 to get #2' => 'will be multiplied a factor of #1 to get #2'
|
||||
);
|
||||
|
||||
@@ -85,5 +85,6 @@ return array(
|
||||
'Topping' => 'Guarnizione',
|
||||
'French' => 'Francese',
|
||||
'Turkish' => 'Turkish',
|
||||
'Spanish' => 'Spanish'
|
||||
'Spanish' => 'Spanish',
|
||||
'Russian' => 'Russian'
|
||||
);
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
|
||||
return array(
|
||||
'manually' => 'Handmatig',
|
||||
'dynamic-regular' => 'Dynamic regular'
|
||||
'dynamic-regular' => 'Dynamisch regelmatig'
|
||||
);
|
||||
|
||||
@@ -85,5 +85,6 @@ return array(
|
||||
'Topping' => 'Topping',
|
||||
'French' => 'Fransk',
|
||||
'Turkish' => 'Turkish',
|
||||
'Spanish' => 'Spanish'
|
||||
'Spanish' => 'Spanish',
|
||||
'Russian' => 'Russian'
|
||||
);
|
||||
|
||||
@@ -345,5 +345,14 @@ return array(
|
||||
'You have to select a location' => 'You have to select a location',
|
||||
'List' => 'List',
|
||||
'Gallery' => 'Gallery',
|
||||
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe'
|
||||
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe',
|
||||
'Show product details' => 'Show product details',
|
||||
'Stock journal for this product' => 'Stock journal for this product',
|
||||
'Show chore details' => 'Show chore details',
|
||||
'Journal for this chore' => 'Journal for this chore',
|
||||
'Show battery details' => 'Show battery details',
|
||||
'Journal for this battery' => 'Journal for this battery',
|
||||
'System info' => 'System info',
|
||||
'Changelog' => 'Changelog',
|
||||
'will be multiplied a factor of #1 to get #2' => 'will be multiplied a factor of #1 to get #2'
|
||||
);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'timeago_locale' => 'en',
|
||||
'timeago_nan' => 'NaN years ago',
|
||||
'moment_locale' => 'x',
|
||||
'datatables_localization' => '{"sEmptyTable":"No data available in table","sInfo":"Showing _START_ to _END_ of _TOTAL_ entries","sInfoEmpty":"Showing 0 to 0 of 0 entries","sInfoFiltered":"(filtered from _MAX_ total entries)","sInfoPostFix":"","sInfoThousands":",","sLengthMenu":"Show _MENU_ entries","sLoadingRecords":"Loading...","sProcessing":"Processing...","sSearch":"Search:","sZeroRecords":"No matching records found","oPaginate":{"sFirst":"First","sLast":"Last","sNext":"Next","sPrevious":"Previous"},"oAria":{"sSortAscending":": activate to sort column ascending","sSortDescending":": activate to sort column descending"}}',
|
||||
'summernote_locale' => 'x',
|
||||
'fullcalendar_locale' => 'x'
|
||||
'timeago_locale' => 'ru',
|
||||
'timeago_nan' => 'NaN год',
|
||||
'moment_locale' => 'ru',
|
||||
'datatables_localization' => '{}',
|
||||
'summernote_locale' => 'ru-RU',
|
||||
'fullcalendar_locale' => 'ru'
|
||||
);
|
||||
|
||||
@@ -4,7 +4,7 @@ return array(
|
||||
'Stock overview' => 'Обзор склада',
|
||||
'#1 products expiring within the next #2 days' => 'У #1 продуктов заканчивается срок годности через #2 дня (дней)',
|
||||
'#1 products are already expired' => 'У #1 продуктов закончился срок годности',
|
||||
'#1 products are below defined min. stock amount' => '#1 продуктов имеются в количестве меньше минимально заданного',
|
||||
'#1 products are below defined min. stock amount' => '#1 продуктов имеются меньше мин. заданного кол-ва',
|
||||
'Product' => 'Продукт',
|
||||
'Amount' => 'Количество',
|
||||
'Next best before date' => 'Следующий срок годности',
|
||||
@@ -51,7 +51,7 @@ return array(
|
||||
'Add' => 'Добавить',
|
||||
'Name' => 'Имя',
|
||||
'Location' => 'Место хранения',
|
||||
'Min. stock amount' => 'Мин. количество в запасе',
|
||||
'Min. stock amount' => 'Мин. кол-во в запасе',
|
||||
'QU purchase' => 'Ед.изм. покупки',
|
||||
'QU stock' => 'Ед.изм. запаса',
|
||||
'QU factor' => 'Пересчёт ед.изм.',
|
||||
@@ -79,7 +79,7 @@ return array(
|
||||
'Manage master data' => 'Управление основными данными',
|
||||
'This will apply to added products' => 'Будет применено к добавленным продуктам',
|
||||
'never' => 'никогда',
|
||||
'Add products that are below defined min. stock amount' => 'Add products that are below defined min. stock amount',
|
||||
'Add products that are below defined min. stock amount' => 'Добавить продукты, которых меньше мин. заданного кол-ва',
|
||||
'For purchases this amount of days will be added to today for the best before date suggestion' => 'For purchases this amount of days will be added to today for the best before date suggestion',
|
||||
'This means 1 #1 purchased will be converted into #2 #3 in stock' => 'Означает, что 1 купленный #1 будет пересчитан в #2 #3 в запасе',
|
||||
'Login' => 'Вход',
|
||||
@@ -194,7 +194,7 @@ return array(
|
||||
'The price cannot be lower than #1' => 'Цена не может быть ниже #1',
|
||||
'#1 product expires within the next #2 days' => 'У #1 продукта закончится срок годности через #2 дня(дней)',
|
||||
'#1 product is already expired' => 'У #1 продукта уже закончился срок годности',
|
||||
'#1 product is below defined min. stock amount' => '#1 продукт имеется в количестве меньше минимально заданного',
|
||||
'#1 product is below defined min. stock amount' => '#1 продукт имеется меньше мин. заданного кол-ва',
|
||||
'Unit' => 'Ед.изм.',
|
||||
'Units' => 'Ед.изм.',
|
||||
'#1 chore is due to be done within the next #2 days' => 'Срок исполнения #1 работы по дому наступает в ближайшие #2 дня (дней) ',
|
||||
@@ -239,11 +239,11 @@ return array(
|
||||
'Create product group' => 'Создать группу продуктов',
|
||||
'Edit product group' => 'Изменить группу продуктов',
|
||||
'Product group' => 'Группа продуктов',
|
||||
'Are you sure to delete product group "#1"?' => 'Are you sure to delete product group "#1"?',
|
||||
'Are you sure to delete product group "#1"?' => 'Вы уверены, что нужно удалить группу "#1"?',
|
||||
'Stay logged in permanently' => 'Оставаться в сети всегда',
|
||||
'When not set, you will get logged out at latest after 30 days' => 'Если не отмечено, то вы выйдете автоматически через 30 дней',
|
||||
'Filter by status' => 'Отфильтровать по статусу',
|
||||
'Below min. stock amount' => 'Below min. stock amount',
|
||||
'Below min. stock amount' => 'Меньше мин. заданного кол-ва',
|
||||
'Expiring soon' => 'Скоро заканчивается срок',
|
||||
'Already expired' => 'Срок годности вышел',
|
||||
'Due soon' => 'Срок выполнения подходит',
|
||||
@@ -293,7 +293,7 @@ return array(
|
||||
'Undone on' => 'Отменено',
|
||||
'Batteries journal' => 'Журнал батарей',
|
||||
'Filter by battery' => 'Отфильтровать по батарее',
|
||||
'Undo charge cycle' => 'Undo charge cycle',
|
||||
'Undo charge cycle' => 'Отменить цикл заряда',
|
||||
'Undo chore execution' => 'Отменить выполнение работы по дому',
|
||||
'Chore execution successfully undone' => 'Успешно отменено выполнение работы по дому',
|
||||
'Undo' => 'Отменить',
|
||||
@@ -301,49 +301,59 @@ return array(
|
||||
'Charge cycle successfully undone' => 'Charge cycle successfully undone',
|
||||
'This cannot be negative and must be an integral number' => 'This cannot be negative and must be an integral number',
|
||||
'Disable stock fulfillment checking for this ingredient' => 'Disable stock fulfillment checking for this ingredient',
|
||||
'Add all list items to stock' => 'Add all list items to stock',
|
||||
'Add #3 #1 of #2 to stock' => 'Add #3 #1 of #2 to stock',
|
||||
'Adding shopping list item #1 of #2' => 'Adding shopping list item #1 of #2',
|
||||
'Use a specific stock item' => 'Use a specific stock item',
|
||||
'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"' => 'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"',
|
||||
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||
'Add all list items to stock' => 'Добавить всё в списке в запас',
|
||||
'Add #3 #1 of #2 to stock' => 'Добавить #3 #1 #2 в запас',
|
||||
'Adding shopping list item #1 of #2' => 'Добавляется элемент списка покупок #1 из #2',
|
||||
'Use a specific stock item' => 'Использовать конкретный элемент из запаса',
|
||||
'The first item in this list would be picked by the default rule which is "First expiring first, then first in first out"' => 'Первый элемент этого списка будет выбран по правилу "Сначала с меньшим сроком годности, затем по дате поступления"',
|
||||
'Mark #3 #1 of #2 as open' => 'Пометить #3 #1 #2 как открытую',
|
||||
'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)' => 'When a product was marked as opened, the best before date will be replaced by today + this amount of days (a value of 0 disables this)',
|
||||
'Default best before days after opened' => 'Default best before days after opened',
|
||||
'Marked #1 #2 of #3 as opened' => 'Marked #1 #2 of #3 as opened',
|
||||
'Mark as opened' => 'Mark as opened',
|
||||
'Expires on #1; Bought on #2' => 'Expires on #1; Bought on #2',
|
||||
'Not opened' => 'Not opened',
|
||||
'Opened' => 'Opened',
|
||||
'Mark #3 #1 of #2 as open' => 'Mark #3 #1 of #2 as open',
|
||||
'#1 opened' => '#1 opened',
|
||||
'Product expires' => 'Product expires',
|
||||
'Task due' => 'Task due',
|
||||
'Marked #1 #2 of #3 as opened' => '#1 #2 #3 помечена открытой',
|
||||
'Mark as opened' => 'Пометить как открытые',
|
||||
'Expires on #1; Bought on #2' => 'Срок годности: #1; Приобретено: #2',
|
||||
'Not opened' => 'Не открыто',
|
||||
'Opened' => 'Открыто',
|
||||
'Mark #3 #1 of #2 as open' => 'Пометить #3 #1 #2 как открытую',
|
||||
'#1 opened' => '#1 открыто',
|
||||
'Product expires' => 'У продукта заканчивается срок годности',
|
||||
'Task due' => 'Срок выполнения задачи',
|
||||
'Chore due' => 'Срок выполнения работы по дому',
|
||||
'Battery charge cycle due' => 'Battery charge cycle due',
|
||||
'Show clock in header' => 'Show clock in header',
|
||||
'Stock settings' => 'Stock settings',
|
||||
'Show clock in header' => 'Показывать часы в заголовке',
|
||||
'Stock settings' => 'Настройки запаса',
|
||||
'Shopping list to stock workflow' => 'Shopping list to stock workflow',
|
||||
'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set' => 'Automatically do the booking using the last price and the amount of the shopping list item, if the product has "Default best before days" set',
|
||||
'Skip' => 'Skip',
|
||||
'Servings' => 'Servings',
|
||||
'Costs' => 'Costs',
|
||||
'Based on the prices of the last purchase per product' => 'Based on the prices of the last purchase per product',
|
||||
'Skip' => 'Пропустить',
|
||||
'Servings' => 'Порции',
|
||||
'Costs' => 'Цены',
|
||||
'Based on the prices of the last purchase per product' => 'На основании цен на недавние покупки продуктов',
|
||||
'The ingredients listed here result in this amount of servings' => 'The ingredients listed here result in this amount of servings',
|
||||
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||
'Picture' => 'Picture',
|
||||
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||
'You have to select a recipe' => 'You have to select a recipe',
|
||||
'Picture' => 'Изображение',
|
||||
'Uncheck ingredients to not put them on the shopping list' => 'Снимите выделение с элементов, чтобы не добавлять их в список покупок',
|
||||
'This is for statistical purposes only' => 'Нужно только для статистический целей',
|
||||
'You have to select a recipe' => 'Вам нужно выбрать рецепт',
|
||||
'Key type' => 'Key type',
|
||||
'Share/Integrate calendar (iCal)' => 'Share/Integrate calendar (iCal)',
|
||||
'Use the following (public) URL to share or integrate the calendar in iCal format' => 'Use the following (public) URL to share or integrate the calendar in iCal format',
|
||||
'Allow partial units in stock' => 'Allow partial units in stock',
|
||||
'Enable tare weight handling' => 'Enable tare weight handling',
|
||||
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below',
|
||||
'Tare weight' => 'Tare weight',
|
||||
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated',
|
||||
'You have to select a location' => 'You have to select a location',
|
||||
'List' => 'List',
|
||||
'Gallery' => 'Gallery'
|
||||
'Allow partial units in stock' => 'Разрешить дробные количества в запасе',
|
||||
'Enable tare weight handling' => 'Включить расчёт с учётом тары',
|
||||
'This is useful e.g. for flour in jars - on purchase/consume/inventory you always weigh the whole jar, the amount to be posted is then automatically calculated based on what is in stock and the tare weight defined below' => 'Это удобно, например, для хранения муки в контейнере - при покупке/потреблении/инветаризации взвесьте весь контейнер, а настоящее количество будет автоматически рассчитано на основе объёма в запасе и веса тары ниже',
|
||||
'Tare weight' => 'Вес тары',
|
||||
'Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated' => 'Включён расчёт с учётом тары - пожалуйста, взвесьте весь контейнер, изменения в количестве будут автоматически рассчитаны',
|
||||
'You have to select a location' => 'Вам нужно выбрать место хранения',
|
||||
'List' => 'Список',
|
||||
'Gallery' => 'Галерея',
|
||||
'The current picture will be deleted when you save the recipe' => 'Текущее изображение будет удалено при сохранении рецепта',
|
||||
'Show product details' => 'Show product details',
|
||||
'Stock journal for this product' => 'Stock journal for this product',
|
||||
'Show chore details' => 'Show chore details',
|
||||
'Journal for this chore' => 'Journal for this chore',
|
||||
'Show battery details' => 'Show battery details',
|
||||
'Journal for this battery' => 'Journal for this battery',
|
||||
'System info' => 'System info',
|
||||
'Changelog' => 'Changelog',
|
||||
'will be multiplied a factor of #1 to get #2' => 'will be multiplied a factor of #1 to get #2'
|
||||
);
|
||||
|
||||
@@ -85,5 +85,6 @@ return array(
|
||||
'Topping' => 'Süsleme',
|
||||
'French' => 'Fransızca',
|
||||
'Turkish' => 'Türkçe',
|
||||
'Spanish' => 'İspanyolca'
|
||||
'Spanish' => 'İspanyolca',
|
||||
'Russian' => 'Russian'
|
||||
);
|
||||
|
||||
@@ -345,5 +345,14 @@ return array(
|
||||
'You have to select a location' => 'You have to select a location',
|
||||
'List' => 'List',
|
||||
'Gallery' => 'Gallery',
|
||||
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe'
|
||||
'The current picture will be deleted when you save the recipe' => 'The current picture will be deleted when you save the recipe',
|
||||
'Show product details' => 'Show product details',
|
||||
'Stock journal for this product' => 'Stock journal for this product',
|
||||
'Show chore details' => 'Show chore details',
|
||||
'Journal for this chore' => 'Journal for this chore',
|
||||
'Show battery details' => 'Show battery details',
|
||||
'Journal for this battery' => 'Journal for this battery',
|
||||
'System info' => 'System info',
|
||||
'Changelog' => 'Changelog',
|
||||
'will be multiplied a factor of #1 to get #2' => 'will be multiplied a factor of #1 to get #2'
|
||||
);
|
||||
|
||||
79
migrations/0060.sql
Normal file
79
migrations/0060.sql
Normal file
@@ -0,0 +1,79 @@
|
||||
DROP VIEW recipes_pos_resolved;
|
||||
CREATE VIEW recipes_pos_resolved
|
||||
AS
|
||||
|
||||
-- Multiplication by 1.0 to force conversion to float (REAL)
|
||||
|
||||
SELECT
|
||||
r.id AS recipe_id,
|
||||
rp.id AS recipe_pos_id,
|
||||
rp.product_id AS product_id,
|
||||
rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 AS recipe_amount,
|
||||
IFNULL(sc.amount, 0) AS stock_amount,
|
||||
CASE WHEN IFNULL(sc.amount, 0) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END THEN 1 ELSE 0 END AS need_fulfilled,
|
||||
CASE WHEN IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END < 0 THEN ABS(IFNULL(sc.amount, 0) - (CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END)) ELSE 0 END AS missing_amount,
|
||||
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||
CASE WHEN IFNULL(sc.amount, 0) + (CASE WHEN r.not_check_shoppinglist = 1 THEN 0 ELSE IFNULL(sl.amount, 0) END * p.qu_factor_purchase_to_stock) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END THEN 1 ELSE 0 END AS need_fulfilled_with_shopping_list,
|
||||
rp.qu_id,
|
||||
(CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END / p.qu_factor_purchase_to_stock) * pcp.last_price AS costs,
|
||||
CASE WHEN rnr.recipe_id = rnr.includes_recipe_id THEN 0 ELSE 1 END AS is_nested_recipe_pos,
|
||||
rp.ingredient_group,
|
||||
rp.id, -- Just a dummy id column
|
||||
rnr.includes_recipe_id as child_recipe_id,
|
||||
rp.note
|
||||
FROM recipes r
|
||||
JOIN recipes_nestings_resolved rnr
|
||||
ON r.id = rnr.recipe_id
|
||||
JOIN recipes_pos rp
|
||||
ON rnr.includes_recipe_id = rp.recipe_id
|
||||
JOIN products p
|
||||
ON rp.product_id = p.id
|
||||
LEFT JOIN (
|
||||
SELECT product_id, SUM(amount) AS amount
|
||||
FROM shopping_list
|
||||
GROUP BY product_id) sl
|
||||
ON rp.product_id = sl.product_id
|
||||
LEFT JOIN stock_current sc
|
||||
ON rp.product_id = sc.product_id
|
||||
LEFT JOIN products_current_price pcp
|
||||
ON rp.product_id = pcp.product_id
|
||||
WHERE rp.not_check_stock_fulfillment = 0
|
||||
|
||||
UNION
|
||||
|
||||
-- Just add all recipe positions which should not be checked against stock with fulfilled need
|
||||
|
||||
SELECT
|
||||
r.id AS recipe_id,
|
||||
rp.id AS recipe_pos_id,
|
||||
rp.product_id AS product_id,
|
||||
rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 AS recipe_amount,
|
||||
IFNULL(sc.amount, 0) AS stock_amount,
|
||||
1 AS need_fulfilled,
|
||||
0 AS missing_amount,
|
||||
IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
|
||||
1 AS need_fulfilled_with_shopping_list,
|
||||
rp.qu_id,
|
||||
(CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE rp.amount * (r.desired_servings*1.0 / r.base_servings*1.0) * rnr.includes_servings*1.0 END / p.qu_factor_purchase_to_stock) * pcp.last_price AS costs,
|
||||
CASE WHEN rnr.recipe_id = rnr.includes_recipe_id THEN 0 ELSE 1 END AS is_nested_recipe_pos,
|
||||
rp.ingredient_group,
|
||||
rp.id, -- Just a dummy id column
|
||||
rnr.includes_recipe_id as child_recipe_id,
|
||||
rp.note
|
||||
FROM recipes r
|
||||
JOIN recipes_nestings_resolved rnr
|
||||
ON r.id = rnr.recipe_id
|
||||
JOIN recipes_pos rp
|
||||
ON rnr.includes_recipe_id = rp.recipe_id
|
||||
JOIN products p
|
||||
ON rp.product_id = p.id
|
||||
LEFT JOIN (
|
||||
SELECT product_id, SUM(amount) AS amount
|
||||
FROM shopping_list
|
||||
GROUP BY product_id) sl
|
||||
ON rp.product_id = sl.product_id
|
||||
LEFT JOIN stock_current sc
|
||||
ON rp.product_id = sc.product_id
|
||||
LEFT JOIN products_current_price pcp
|
||||
ON rp.product_id = pcp.product_id
|
||||
WHERE rp.not_check_stock_fulfillment = 1;
|
||||
@@ -26,7 +26,6 @@
|
||||
"startbootstrap-sb-admin": "^4.0.0",
|
||||
"summernote": "^0.8.11",
|
||||
"swagger-ui-dist": "^3.21.0",
|
||||
"tagmanager": "https://github.com/max-favilli/tagmanager.git#3.0.2",
|
||||
"tempusdominus-bootstrap-4": "https://github.com/berrnd/tempusdominus-bootstrap-4.git#master",
|
||||
"timeago": "^1.6.5",
|
||||
"toastr": "^2.1.4"
|
||||
|
||||
@@ -497,7 +497,8 @@ $("#about-dialog-link").on("click", function()
|
||||
{
|
||||
bootbox.alert({
|
||||
message: '<iframe height="400px" class="embed-responsive" src="' + U("/about?embedded") + '"></iframe>',
|
||||
closeButton: false
|
||||
closeButton: false,
|
||||
size: "large"
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
10
public/viewjs/about.js
Normal file
10
public/viewjs/about.js
Normal file
@@ -0,0 +1,10 @@
|
||||
$('[data-toggle="collapse-next"]').on("click", function(e)
|
||||
{
|
||||
e.preventDefault();
|
||||
$(this).parent().next().collapse("toggle");
|
||||
});
|
||||
|
||||
if ((typeof GetUriParam("tab") !== "undefined" && GetUriParam("tab") === "changelog"))
|
||||
{
|
||||
$(".nav-tabs a[href='#changelog']").tab("show");
|
||||
}
|
||||
@@ -126,6 +126,12 @@ $(document).on('click', '.track-charge-cycle-button', function(e)
|
||||
);
|
||||
});
|
||||
|
||||
$(document).on("click", ".battery-name-cell", function(e)
|
||||
{
|
||||
Grocy.Components.BatteryCard.Refresh($(e.currentTarget).attr("data-battery-id"));
|
||||
$("#batteriesoverview-batterycard-modal").modal("show");
|
||||
});
|
||||
|
||||
function RefreshStatistics()
|
||||
{
|
||||
var nextXDays = $("#info-due-batteries").data("next-x-days");
|
||||
|
||||
@@ -126,6 +126,12 @@ $(document).on('click', '.track-chore-button', function(e)
|
||||
);
|
||||
});
|
||||
|
||||
$(document).on("click", ".chore-name-cell", function(e)
|
||||
{
|
||||
Grocy.Components.ChoreCard.Refresh($(e.currentTarget).attr("data-chore-id"));
|
||||
$("#choresoverview-chorecard-modal").modal("show");
|
||||
});
|
||||
|
||||
function RefreshStatistics()
|
||||
{
|
||||
var nextXDays = $("#info-due-chores").data("next-x-days");
|
||||
|
||||
@@ -212,15 +212,16 @@ Grocy.Components.DateTimePicker.GetInputElement().on('input', function(e)
|
||||
|
||||
$('.datetimepicker').on('update.datetimepicker', function(e)
|
||||
{
|
||||
console.log("update");
|
||||
Grocy.Components.DateTimePicker.GetInputElement().trigger('input');
|
||||
Grocy.Components.DateTimePicker.GetInputElement().trigger('change');
|
||||
Grocy.Components.DateTimePicker.GetInputElement().trigger('keypress');
|
||||
});
|
||||
|
||||
$('.datetimepicker').on('hide.datetimepicker', function(e)
|
||||
{
|
||||
Grocy.Components.DateTimePicker.GetInputElement().trigger('input');
|
||||
Grocy.Components.DateTimePicker.GetInputElement().trigger('change');
|
||||
Grocy.Components.DateTimePicker.GetInputElement().trigger('keypress');
|
||||
});
|
||||
|
||||
$("#datetimepicker-shortcut").on("click", function()
|
||||
|
||||
@@ -150,7 +150,7 @@ $('#product_id_text_input').on('blur', function(e)
|
||||
buttons: {
|
||||
cancel: {
|
||||
label: L('Cancel'),
|
||||
className: 'btn-default responsive-button',
|
||||
className: 'btn-secondary responsive-button',
|
||||
callback: function()
|
||||
{
|
||||
Grocy.Components.ProductPicker.SetValue('');
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
$("#amount").attr("step", "1");
|
||||
$("#amount").parent().find(".invalid-feedback").text(L('The amount cannot be lower than #1', '1'));
|
||||
$('#amount').val(1);
|
||||
$('#amount_qu_unit').text("");
|
||||
$("#tare-weight-handling-info").addClass("d-none");
|
||||
Grocy.Components.ProductPicker.Clear();
|
||||
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_RECIPES)
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
$("#new_amount").attr("step", "1");
|
||||
$("#new_amount").parent().find(".invalid-feedback").text(L('The amount cannot be lower than #1', '0'));
|
||||
$('#new_amount').val('');
|
||||
$('#new_amount_qu_unit').text("");
|
||||
Grocy.Components.DateTimePicker.Clear();
|
||||
Grocy.Components.ProductPicker.SetValue('');
|
||||
Grocy.Components.ProductPicker.GetInputElement().focus();
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
$("#amount").parent().find(".invalid-feedback").text(L('The amount cannot be lower than #1', '1'));
|
||||
$('#amount').val(0);
|
||||
$('#price').val('');
|
||||
$('#amount_qu_unit').text("");
|
||||
$("#tare-weight-handling-info").addClass("d-none");
|
||||
Grocy.Components.LocationPicker.Clear();
|
||||
Grocy.Components.DateTimePicker.Clear();
|
||||
@@ -104,10 +105,18 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e)
|
||||
Grocy.Api.Get('stock/products/' + productId,
|
||||
function (productDetails)
|
||||
{
|
||||
$('#amount_qu_unit').text(productDetails.quantity_unit_purchase.name);
|
||||
$('#price').val(productDetails.last_price);
|
||||
Grocy.Components.LocationPicker.SetId(productDetails.location.id);
|
||||
|
||||
if (productDetails.product.qu_id_purchase === productDetails.product.qu_id_stock)
|
||||
{
|
||||
$('#amount_qu_unit').text(productDetails.quantity_unit_purchase.name);
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#amount_qu_unit').text(productDetails.quantity_unit_purchase.name + " (" + L("will be multiplied a factor of #1 to get #2", parseInt(productDetails.product.qu_factor_purchase_to_stock).toString(), Pluralize(2, productDetails.quantity_unit_stock.name, productDetails.quantity_unit_stock.name_plural)) + ")");
|
||||
}
|
||||
|
||||
if (productDetails.product.allow_partial_units_in_stock == 1)
|
||||
{
|
||||
$("#amount").attr("min", "0.01");
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 160 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 133 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 164 KiB |
@@ -27,4 +27,42 @@ class ApplicationService extends BaseService
|
||||
'sqlite_version' => $sqliteVersion
|
||||
);
|
||||
}
|
||||
|
||||
public function GetChangelog()
|
||||
{
|
||||
$changelogItems = array();
|
||||
foreach(glob(__DIR__ . '/../changelog/*.md') as $file)
|
||||
{
|
||||
$fileName = basename($file);
|
||||
$fileNameParts = explode('_', $fileName);
|
||||
|
||||
$fileContent = file_get_contents($file);
|
||||
$version = $fileNameParts[1];
|
||||
$releaseDate = explode('.', $fileNameParts[2])[0];
|
||||
$releaseNumber = intval($fileNameParts[0]);
|
||||
|
||||
$changelogItems[] = array(
|
||||
'version' => $version,
|
||||
'release_date' => $releaseDate,
|
||||
'body' => $fileContent,
|
||||
'release_number' => $releaseNumber
|
||||
);
|
||||
}
|
||||
|
||||
// Sort changelog items to have the changelog descending by newest version
|
||||
usort($changelogItems, function($a, $b)
|
||||
{
|
||||
if ($a['release_number'] == $b['release_number'])
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ($a['release_number'] < $b['release_number']) ? 1 : -1;
|
||||
});
|
||||
|
||||
return array(
|
||||
'changelog_items' => $changelogItems,
|
||||
'newest_release_number' => $changelogItems[0]['release_number']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"Version": "2.0.0",
|
||||
"ReleaseDate": "2019-03-06"
|
||||
"Version": "2.1.0",
|
||||
"ReleaseDate": "2019-03-09"
|
||||
}
|
||||
|
||||
@@ -1,31 +1,64 @@
|
||||
@extends('layout.default')
|
||||
|
||||
@section('title', $L('About grocy'))
|
||||
@section('viewJsName', 'about')
|
||||
|
||||
@section('content')
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6 col-xl-4 text-center">
|
||||
<div class="col-xs-12 col-md-6 text-center">
|
||||
<h1>@yield('title')</h1>
|
||||
|
||||
<p class="font-italic">
|
||||
grocy is a project by
|
||||
<a href="https://berrnd.de" class="discrete-link" target="_blank">Bernd Bestel</a><br>
|
||||
Created with passion since 2017
|
||||
</p>
|
||||
<ul class="nav nav-tabs justify-content-center mt-3">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" id="system-info-tab" data-toggle="tab" href="#system-info">{{ $L('System info') }}</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="changelog-tab" data-toggle="tab" href="#changelog">{{ $L('Changelog') }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
Version <code>{{ $version }}</code><br>
|
||||
{{ $L('Released on') }} <code>{{ $releaseDate }}</code> <time class="timeago timeago-contextual" datetime="{{ $releaseDate }}"></time>
|
||||
</p>
|
||||
<div class="tab-content mt-3">
|
||||
|
||||
<div class="tab-pane show active" id="system-info">
|
||||
<p>
|
||||
Version <code>{{ $version }}</code><br>
|
||||
{{ $L('Released on') }} <code>{{ $releaseDate }}</code> <time class="timeago timeago-contextual" datetime="{{ $releaseDate }}"></time>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
PHP Version <code>{{ $system_info['php_version'] }}</code><br>
|
||||
SQLite Version <code>{{ $system_info['sqlite_version'] }}</code>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="tab-pane show" id="changelog">
|
||||
@php $Parsedown = new Parsedown(); @endphp
|
||||
@foreach($changelog['changelog_items'] as $changelogItem)
|
||||
<div class="card my-2">
|
||||
<div class="card-header">
|
||||
<a class="discrete-link" data-toggle="collapse-next" href="#">
|
||||
Version <span class="font-weight-bold">{{ $changelogItem['version'] }}</span><br>
|
||||
{{ $L('Released on') }} <span class="font-weight-bold">{{ $changelogItem['release_date'] }}</span>
|
||||
<time class="timeago timeago-contextual" datetime="{{ $changelogItem['release_date'] }}"></time>
|
||||
</a>
|
||||
</div>
|
||||
<div class="collapse @if($changelogItem['release_number'] >= $changelog['newest_release_number'] - 4) show @endif">
|
||||
<div class="card-body text-left">
|
||||
{!! $Parsedown->text($changelogItem['body']) !!}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<p>
|
||||
PHP Version <code>{{ $system_info['php_version'] }}</code><br>
|
||||
SQLite Version <code>{{ $system_info['sqlite_version'] }}</code>
|
||||
</p>
|
||||
|
||||
<p class="small text-muted">
|
||||
grocy is a project by
|
||||
<a href="https://berrnd.de" class="text-dark" target="_blank">Bernd Bestel</a><br>
|
||||
Created with passion since 2017<br>
|
||||
Life runs on code<br>
|
||||
<a href="https://github.com/grocy/grocy" class="discrete-link" target="_blank">
|
||||
<a href="https://github.com/grocy/grocy" class="text-dark" target="_blank">
|
||||
<i class="fab fa-github"></i>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<table id="batteries-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Name') }}</th>
|
||||
<th>{{ $L('Description') }}</th>
|
||||
<th>{{ $L('Used in') }}</th>
|
||||
@@ -38,7 +38,7 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($batteries as $battery)
|
||||
<tr>
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-info btn-sm" href="{{ $U('/battery/') }}{{ $battery->id }}">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<table id="batteries-journal-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Battery') }}</th>
|
||||
<th>{{ $L('Tracked time') }}</th>
|
||||
</tr>
|
||||
@@ -40,7 +40,7 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($chargeCycles as $chargeCycleEntry)
|
||||
<tr class="@if($chargeCycleEntry->undone == 1) text-muted @endif">
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-secondary btn-sm undo-battery-execution-button @if($chargeCycleEntry->undone == 1) disabled @endif" href="#" data-charge-cycle-id="{{ $chargeCycleEntry->id }}" data-toggle="tooltip" data-placement="left" title="{{ $L('Undo charge cycle') }}">
|
||||
<i class="fas fa-undo"></i>
|
||||
</a>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<table id="batteries-overview-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Battery') }}</th>
|
||||
<th>{{ $L('Last charged') }}</th>
|
||||
<th>{{ $L('Next planned charge cycle') }}</th>
|
||||
@@ -51,17 +51,30 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($current as $curentBatteryEntry)
|
||||
<tr id="battery-{{ $curentBatteryEntry->battery_id }}-row" class="@if(FindObjectInArrayByPropertyValue($batteries, 'id', $curentBatteryEntry->battery_id)->charge_interval_days > 0 && $curentBatteryEntry->next_estimated_charge_time < date('Y-m-d H:i:s')) table-danger @elseif(FindObjectInArrayByPropertyValue($batteries, 'id', $curentBatteryEntry->battery_id)->charge_interval_days > 0 && $curentBatteryEntry->next_estimated_charge_time < date('Y-m-d H:i:s', strtotime("+$nextXDays days"))) table-warning @endif">
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-success btn-sm track-charge-cycle-button" href="#" data-toggle="tooltip" data-placement="left" title="{{ $L('Track charge cycle of battery #1', FindObjectInArrayByPropertyValue($batteries, 'id', $curentBatteryEntry->battery_id)->name) }}"
|
||||
data-battery-id="{{ $curentBatteryEntry->battery_id }}"
|
||||
data-battery-name="{{ FindObjectInArrayByPropertyValue($batteries, 'id', $curentBatteryEntry->battery_id)->name }}">
|
||||
<i class="fas fa-fire"></i>
|
||||
</a>
|
||||
<a class="btn btn-info btn-sm" href="{{ $U('/batteriesjournal?battery=') }}{{ $curentBatteryEntry->battery_id }}">
|
||||
<i class="fas fa-file-alt"></i>
|
||||
</a>
|
||||
<div class="dropdown d-inline-block">
|
||||
<button class="btn btn-sm btn-light text-secondary" type="button" data-toggle="dropdown">
|
||||
<i class="fas fa-ellipsis-v"></i>
|
||||
</button>
|
||||
<div class="dropdown-menu">
|
||||
<a class="dropdown-item battery-name-cell" data-chore-id="{{ $curentBatteryEntry->battery_id }}" type="button" href="#">
|
||||
<i class="fas fa-info"></i> {{ $L('Show battery details') }}
|
||||
</a>
|
||||
<a class="dropdown-item" type="button" href="{{ $U('/batteriesjournal?battery=') }}{{ $curentBatteryEntry->battery_id }}">
|
||||
<i class="fas fa-file-alt"></i> {{ $L('Journal for this battery') }}
|
||||
</a>
|
||||
<a class="dropdown-item" type="button" href="{{ $U('/battery/') }}{{ $curentBatteryEntry->battery_id }}">
|
||||
<i class="fas fa-edit"></i> {{ $L('Edit battery') }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<td class="battery-name-cell cursor-link" data-battery-id="{{ $curentBatteryEntry->battery_id }}">
|
||||
{{ FindObjectInArrayByPropertyValue($batteries, 'id', $curentBatteryEntry->battery_id)->name }}
|
||||
</td>
|
||||
<td>
|
||||
@@ -85,4 +98,17 @@
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="batteriesoverview-batterycard-modal" tabindex="-1">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content text-center">
|
||||
<div class="modal-body">
|
||||
@include('components.batterycard')
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ $L('Close') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@stop
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
@push('pageScripts')
|
||||
<script src="{{ $U('/node_modules/fullcalendar/dist/fullcalendar.min.js?v=', true) }}{{ $version }}"></script>
|
||||
@if(!empty($L('fullcalendar_locale')))<script src="{{ $U('/node_modules', true) }}/fullcalendar/dist/locale/{{ $L('fullcalendar_locale') }}.js?v={{ $version }}"></script>@endif
|
||||
@if(!empty($L('fullcalendar_locale') && $L('fullcalendar_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/fullcalendar/dist/locale/{{ $L('fullcalendar_locale') }}.js?v={{ $version }}"></script>@endif
|
||||
@endpush
|
||||
|
||||
@push('pageStyles')
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<table id="chores-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Name') }}</th>
|
||||
<th>{{ $L('Period type') }}</th>
|
||||
<th>{{ $L('Period days') }}</th>
|
||||
@@ -38,7 +38,7 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($chores as $chore)
|
||||
<tr>
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-info btn-sm" href="{{ $U('/chore/') }}{{ $chore->id }}">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<table id="chores-journal-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Chore') }}</th>
|
||||
<th>{{ $L('Tracked time') }}</th>
|
||||
<th>{{ $L('Done by') }}</th>
|
||||
@@ -41,7 +41,7 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($choresLog as $choreLogEntry)
|
||||
<tr class="@if($choreLogEntry->undone == 1) text-muted @endif">
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-secondary btn-sm undo-chore-execution-button @if($choreLogEntry->undone == 1) disabled @endif" href="#" data-execution-id="{{ $choreLogEntry->id }}" data-toggle="tooltip" data-placement="left" title="{{ $L('Undo chore execution') }}">
|
||||
<i class="fas fa-undo"></i>
|
||||
</a>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<table id="chores-overview-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Chore') }}</th>
|
||||
<th>{{ $L('Next estimated tracking') }}</th>
|
||||
<th>{{ $L('Last tracked') }}</th>
|
||||
@@ -51,17 +51,30 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($currentChores as $curentChoreEntry)
|
||||
<tr id="chore-{{ $curentChoreEntry->chore_id }}-row" class="@if(FindObjectInArrayByPropertyValue($chores, 'id', $curentChoreEntry->chore_id)->period_type === \Grocy\Services\ChoresService::CHORE_TYPE_DYNAMIC_REGULAR && $curentChoreEntry->next_estimated_execution_time < date('Y-m-d H:i:s')) table-danger @elseif(FindObjectInArrayByPropertyValue($chores, 'id', $curentChoreEntry->chore_id)->period_type === \Grocy\Services\ChoresService::CHORE_TYPE_DYNAMIC_REGULAR && $curentChoreEntry->next_estimated_execution_time < date('Y-m-d H:i:s', strtotime("+$nextXDays days"))) table-warning @endif">
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-success btn-sm track-chore-button" href="#" data-toggle="tooltip" data-placement="left" title="{{ $L('Track execution of chore #1', FindObjectInArrayByPropertyValue($chores, 'id', $curentChoreEntry->chore_id)->name) }}"
|
||||
data-chore-id="{{ $curentChoreEntry->chore_id }}"
|
||||
data-chore-name="{{ FindObjectInArrayByPropertyValue($chores, 'id', $curentChoreEntry->chore_id)->name }}">
|
||||
<i class="fas fa-play"></i>
|
||||
</a>
|
||||
<a class="btn btn-info btn-sm" href="{{ $U('/choresjournal?chore=') }}{{ $curentChoreEntry->chore_id }}">
|
||||
<i class="fas fa-file-alt"></i>
|
||||
</a>
|
||||
<div class="dropdown d-inline-block">
|
||||
<button class="btn btn-sm btn-light text-secondary" type="button" data-toggle="dropdown">
|
||||
<i class="fas fa-ellipsis-v"></i>
|
||||
</button>
|
||||
<div class="dropdown-menu">
|
||||
<a class="dropdown-item chore-name-cell" data-chore-id="{{ $curentChoreEntry->chore_id }}" type="button" href="#">
|
||||
<i class="fas fa-info"></i> {{ $L('Show chore details') }}
|
||||
</a>
|
||||
<a class="dropdown-item" type="button" href="{{ $U('/choresjournal?chore=') }}{{ $curentChoreEntry->chore_id }}">
|
||||
<i class="fas fa-file-alt"></i> {{ $L('Journal for this chore') }}
|
||||
</a>
|
||||
<a class="dropdown-item" type="button" href="{{ $U('/chore/') }}{{ $curentChoreEntry->chore_id }}">
|
||||
<i class="fas fa-edit"></i> {{ $L('Edit chore') }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<td class="chore-name-cell cursor-link" data-chore-id="{{ $curentChoreEntry->chore_id }}">
|
||||
{{ FindObjectInArrayByPropertyValue($chores, 'id', $curentChoreEntry->chore_id)->name }}
|
||||
</td>
|
||||
<td>
|
||||
@@ -85,4 +98,17 @@
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="choresoverview-chorecard-modal" tabindex="-1">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content text-center">
|
||||
<div class="modal-body">
|
||||
@include('components.chorecard')
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ $L('Close') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@stop
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<strong>{{ $L('Last price') }}:</strong> <span id="productcard-product-last-price"></span>
|
||||
|
||||
<h5 class="mt-3">{{ $L('Product picture') }}</h5>
|
||||
<img id="productcard-product-picture" src="" class="img-fluid img-thumbnail d-none">
|
||||
<p class="w-75 mx-auto"><img id="productcard-product-picture" src="" class="img-fluid img-thumbnail d-none"></p>
|
||||
<span id="productcard-no-product-picture" class="font-italic d-none">{{ $L('No picture available') }}</span>
|
||||
|
||||
<h5 class="mt-3">{{ $L('Price history') }}</h5>
|
||||
|
||||
@@ -50,10 +50,10 @@
|
||||
<div id="selectedEquipmentInstructionManualCard" class="card">
|
||||
<div class="card-header">
|
||||
<i class="fas fa-toolbox"></i> <span class="selected-equipment-name"></span>
|
||||
<a class="btn btn-info btn-sm btn-outline-info py-0 equipment-edit-button" href="#">
|
||||
<a class="btn btn-sm btn-outline-info py-0 equipment-edit-button" href="#">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<a class="btn btn-danger btn-sm btn-outline-danger py-0 equipment-delete-button" href="#" data-equipment-id="{{ $equipmentItem->id }}" data-equipment-name="{{ $equipmentItem->name }}">
|
||||
<a class="btn btn-sm btn-outline-danger py-0 equipment-delete-button" href="#" data-equipment-id="{{ $equipmentItem->id }}" data-equipment-name="{{ $equipmentItem->name }}">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
<a id="selectedEquipmentInstructionManualToggleFullscreenButton" class="btn btn-sm btn-outline-secondary py-0 float-right" href="#" data-toggle="tooltip" title="{{ $L('Expand to fullscreen') }}">
|
||||
@@ -70,10 +70,10 @@
|
||||
<div id="selectedEquipmentDescriptionCard" class="card">
|
||||
<div class="card-header">
|
||||
<i class="fas fa-toolbox"></i> <span class="selected-equipment-name"></span>
|
||||
<a class="btn btn-info btn-sm btn-outline-info py-0 equipment-edit-button" href="#">
|
||||
<a class="btn btn-sm btn-outline-info py-0 equipment-edit-button" href="#">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<a class="btn btn-danger btn-sm btn-outline-danger py-0 equipment-delete-button" href="#" data-equipment-id="{{ $equipmentItem->id }}" data-equipment-name="{{ $equipmentItem->name }}">
|
||||
<a class="btn btn-sm btn-outline-danger py-0 equipment-delete-button" href="#" data-equipment-id="{{ $equipmentItem->id }}" data-equipment-name="{{ $equipmentItem->name }}">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
<a id="selectedEquipmentDescriptionToggleFullscreenButton" class="btn btn-sm btn-outline-secondary py-0 float-right" href="#" data-toggle="tooltip" title="{{ $L('Expand to fullscreen') }}">
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
@push('pageScripts')
|
||||
<script src="{{ $U('/node_modules/summernote/dist/summernote-bs4.js?v=', true) }}{{ $version }}"></script>
|
||||
@if(!empty($L('summernote_locale')))<script src="{{ $U('/node_modules', true) }}/summernote/dist/lang/summernote-{{ $L('summernote_locale') }}.js?v={{ $version }}"></script>@endif
|
||||
@if(!empty($L('summernote_locale') && $L('summernote_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/summernote/dist/lang/summernote-{{ $L('summernote_locale') }}.js?v={{ $version }}"></script>@endif
|
||||
@endpush
|
||||
|
||||
@push('pageStyles')
|
||||
|
||||
@@ -32,8 +32,7 @@
|
||||
<link href="{{ $U('/node_modules/datatables.net-responsive-bs4/css/responsive.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 }}" 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">
|
||||
<link href="{{ $U('/node_modules/tagmanager/tagmanager.css?v=', true) }}{{ $version }}" rel="stylesheet">
|
||||
<link href="{{ $U('/node_modules/toastr/build/toastr.min.css?v=', true) }}{{ $version }}" rel="stylesheet">
|
||||
<link href="{{ $U('/node_modules/tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.min.css?v=', true) }}{{ $version }}" rel="stylesheet">
|
||||
<link href="{{ $U('/components_unmanaged/noto-sans-v6-latin/noto-sans-v6-latin.css?v=', true) }}{{ $version }}" rel="stylesheet">
|
||||
<link href="{{ $U('/css/grocy.css?v=', true) }}{{ $version }}" rel="stylesheet">
|
||||
@@ -339,7 +338,7 @@
|
||||
<script src="{{ $U('/node_modules/bootbox/dist/bootbox.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>
|
||||
@if(!empty($L('moment_locale')))<script src="{{ $U('/node_modules', true) }}/moment/locale/{{ $L('moment_locale') }}.js?v={{ $version }}"></script>@endif
|
||||
@if(!empty($L('moment_locale') && $L('moment_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/moment/locale/{{ $L('moment_locale') }}.js?v={{ $version }}"></script>@endif
|
||||
<script src="{{ $U('/node_modules/@danielfarrell/bootstrap-combobox/js/bootstrap-combobox.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>
|
||||
@@ -352,7 +351,6 @@
|
||||
<script src="{{ $U('/node_modules/timeago/jquery.timeago.js?v=', true) }}{{ $version }}"></script>
|
||||
<script src="{{ $U('/node_modules', true) }}/timeago/locales/jquery.timeago.{{ $L('timeago_locale') }}.js?v={{ $version }}"></script>
|
||||
<script src="{{ $U('/node_modules/toastr/build/toastr.min.js?v=', true) }}{{ $version }}"></script>
|
||||
<script src="{{ $U('/node_modules/tagmanager/tagmanager.js?v=', true) }}{{ $version }}"></script>
|
||||
<script src="{{ $U('/node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.js?v=', true) }}{{ $version }}"></script>
|
||||
|
||||
<script src="{{ $U('/js/extensions.js?v=', true) }}{{ $version }}"></script>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<table id="locations-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Name') }}</th>
|
||||
<th>{{ $L('Description') }}</th>
|
||||
</tr>
|
||||
@@ -36,7 +36,7 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($locations as $location)
|
||||
<tr>
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-info btn-sm" href="{{ $U('/location/') }}{{ $location->id }}">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<table id="apikeys-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('API key') }}</th>
|
||||
<th>{{ $L('User') }}</th>
|
||||
<th>{{ $L('Expires') }}</th>
|
||||
@@ -44,7 +44,7 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($apiKeys as $apiKey)
|
||||
<tr id="apiKeyRow_{{ $apiKey->id }}">
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-danger btn-sm apikey-delete-button" href="#" data-apikey-id="{{ $apiKey->id }}" data-apikey-apikey="{{ $apiKey->api_key }}">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
|
||||
@@ -8,6 +8,14 @@
|
||||
|
||||
@section('viewJsName', 'productform')
|
||||
|
||||
@push('pageScripts')
|
||||
<script src="{{ $U('/node_modules/TagManager/tagmanager.js?v=', true) }}{{ $version }}"></script>
|
||||
@endpush
|
||||
|
||||
@push('pageStyles')
|
||||
<link href="{{ $U('/node_modules/TagManager/tagmanager.css?v=', true) }}{{ $version }}" rel="stylesheet">
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
<div class="row">
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<table id="productgroups-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Name') }}</th>
|
||||
<th>{{ $L('Description') }}</th>
|
||||
</tr>
|
||||
@@ -36,7 +36,7 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($productGroups as $productGroup)
|
||||
<tr>
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-info btn-sm" href="{{ $U('/productgroup/') }}{{ $productGroup->id }}">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<table id="products-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Name') }}</th>
|
||||
<th>{{ $L('Location') }}</th>
|
||||
<th>{{ $L('Min. stock amount') }}</th>
|
||||
@@ -44,7 +44,7 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($products as $product)
|
||||
<tr>
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-info btn-sm" href="{{ $U('/product/') }}{{ $product->id }}">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<table id="quantityunits-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Name') }}</th>
|
||||
<th>{{ $L('Description') }}</th>
|
||||
</tr>
|
||||
@@ -36,7 +36,7 @@
|
||||
<tbody class="d-none">
|
||||
@foreach($quantityunits as $quantityunit)
|
||||
<tr>
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-info btn-sm" href="{{ $U('/quantityunit/') }}{{ $quantityunit->id }}">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
@push('pageScripts')
|
||||
<script src="{{ $U('/node_modules/summernote/dist/summernote-bs4.js?v=', true) }}{{ $version }}"></script>
|
||||
@if(!empty($L('summernote_locale')))<script src="{{ $U('/node_modules', true) }}/summernote/dist/lang/summernote-{{ $L('summernote_locale') }}.js?v={{ $version }}"></script>@endif
|
||||
@if(!empty($L('summernote_locale') && $L('summernote_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/summernote/dist/lang/summernote-{{ $L('summernote_locale') }}.js?v={{ $version }}"></script>@endif
|
||||
<script src="{{ $U('/node_modules/datatables.net-rowgroup/js/dataTables.rowGroup.min.js?v=', true) }}{{ $version }}"></script>
|
||||
<script src="{{ $U('/node_modules/datatables.net-rowgroup-bs4/js/rowGroup.bootstrap4.min.js?v=', true) }}{{ $version }}"></script>
|
||||
@endpush
|
||||
@@ -100,7 +100,7 @@
|
||||
<table id="recipes-pos-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Product') }}</th>
|
||||
<th>{{ $L('Amount') }}</th>
|
||||
<th class="fit-content">{{ $L('Note') }}</th>
|
||||
@@ -111,7 +111,7 @@
|
||||
@if($mode == "edit")
|
||||
@foreach($recipePositions as $recipePosition)
|
||||
<tr>
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-sm btn-info recipe-pos-edit-button" href="#" data-recipe-pos-id="{{ $recipePosition->id }}">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
@@ -152,7 +152,7 @@
|
||||
<table id="recipes-includes-table" class="table table-sm table-striped dt-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th class="border-right"></th>
|
||||
<th>{{ $L('Recipe') }}</th>
|
||||
<th>{{ $L('Servings') }}</th>
|
||||
</tr>
|
||||
@@ -161,7 +161,7 @@
|
||||
@if($mode == "edit")
|
||||
@foreach($recipeNestings as $recipeNesting)
|
||||
<tr>
|
||||
<td class="fit-content">
|
||||
<td class="fit-content border-right">
|
||||
<a class="btn btn-sm btn-info recipe-include-edit-button" href="#" data-recipe-include-id="{{ $recipeNesting->id }}" data-recipe-included-recipe-id="{{ $recipeNesting->includes_recipe_id }}" data-recipe-included-recipe-servings="{{ $recipeNesting->servings }}">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
@@ -223,7 +223,7 @@
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $L('Cancel') }}</button>
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ $L('Cancel') }}</button>
|
||||
<button id="save-recipe-include-button" data-dismiss="modal" class="btn btn-success">{{ $L('Save') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user