<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ceres, branch 0.3.x-to-0.4.y</title>
<subtitle>Recipe server for your favorite dishes</subtitle>
<id>https://cgit.xengineering.eu/ceres/atom?h=0.3.x-to-0.4.y</id>
<link rel='self' href='https://cgit.xengineering.eu/ceres/atom?h=0.3.x-to-0.4.y'/>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/'/>
<updated>2024-05-26T10:16:27Z</updated>
<entry>
<title>tools: Create standalone program for 0.4 migration</title>
<updated>2024-05-26T10:16:27Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-26T08:46:05Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=05a525f27971541ee5f86c97d8a45cf48c371621'/>
<id>urn:sha1:05a525f27971541ee5f86c97d8a45cf48c371621</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Update CHANGELOG.md for version 0.4.0</title>
<updated>2024-05-17T21:29:34Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-17T21:29:34Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=08150821fdb8fd1af23d84e661e61983a16a36b5'/>
<id>urn:sha1:08150821fdb8fd1af23d84e661e61983a16a36b5</id>
<content type='text'>
</content>
</entry>
<entry>
<title>model: Add strict Ingredient.Validate()</title>
<updated>2024-05-17T21:20:41Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-15T18:18:39Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=bc149ee58122effc9d4c035da2af3a7ec1f2f862'/>
<id>urn:sha1:bc149ee58122effc9d4c035da2af3a7ec1f2f862</id>
<content type='text'>
</content>
</entry>
<entry>
<title>model: Add strict Step.Validate()</title>
<updated>2024-05-17T21:16:36Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-15T18:18:13Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=f8f5d296f218f79646a54d3aed8d54fa9f8704c1'/>
<id>urn:sha1:f8f5d296f218f79646a54d3aed8d54fa9f8704c1</id>
<content type='text'>
</content>
</entry>
<entry>
<title>model: Fix another unhandled error</title>
<updated>2024-05-17T21:15:56Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-17T21:15:56Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=5194ea4b29ffef0fe5206899243339cf109af41d'/>
<id>urn:sha1:5194ea4b29ffef0fe5206899243339cf109af41d</id>
<content type='text'>
This could also lead to bugs.
</content>
</entry>
<entry>
<title>model: Fix ignored error</title>
<updated>2024-05-17T21:10:17Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-17T21:08:05Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=5d5580285a366e37ac00a4e1a6f2f1bda853ff28'/>
<id>urn:sha1:5d5580285a366e37ac00a4e1a6f2f1bda853ff28</id>
<content type='text'>
An ignored return value here caused a serious bug as soon as validation
for ingredients was tried. The validation could raise an error e.g. on a
negative amount for the ingredient. This error was ignored at the
changed line which resulted into deleted ingredients for the whole
recipe.
</content>
</entry>
<entry>
<title>model: Rework recipe validation</title>
<updated>2024-05-17T15:14:40Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-17T15:12:50Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=5eca3267d37cdc51f775b5452727efebbb7e7e9e'/>
<id>urn:sha1:5eca3267d37cdc51f775b5452727efebbb7e7e9e</id>
<content type='text'>
This reduces code duplication and enforces time stamps.
</content>
</entry>
<entry>
<title>view: Fix time stamp bug</title>
<updated>2024-05-17T15:14:35Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-17T15:06:55Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=0416f520cff9716792ac0f3ade5f71187d07ac2e'/>
<id>urn:sha1:0416f520cff9716792ac0f3ade5f71187d07ac2e</id>
<content type='text'>
The recipe edit page HTML template did not contain the two time stamps
"Created" and "LastChanged" as hidden form values.

Thus the information was not passed from the backend to the frontend. On
a save the recipe without time stamp information was injected into the
backend.

This effectively deleted any time stamp information. This commit fixes
that bug by including all fields of the model.Recipe struct inside the
form of the recipe-edit.html template.
</content>
</entry>
<entry>
<title>view: Use number input for ingredient amount</title>
<updated>2024-05-17T15:14:29Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-17T13:51:45Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=c61e45a5a260d9804ebc4f54814edf1e1b471ac3'/>
<id>urn:sha1:c61e45a5a260d9804ebc4f54814edf1e1b471ac3</id>
<content type='text'>
This accepts only real numbers with a minimum step of 0.001 as input for
the amount field of a recipe ingredient.

The browser has the chance to give the user direct feedback that a
non-numeric string will not work.
</content>
</entry>
<entry>
<title>view: Remove empty ingredient summaries</title>
<updated>2024-05-15T18:42:09Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-15T18:42:09Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=d14aece3295405b4377ea20aabd9c621aace4922'/>
<id>urn:sha1:d14aece3295405b4377ea20aabd9c621aace4922</id>
<content type='text'>
If the recipe has no ingredients at all the "Ingredient summary:" text
used to be displayed. This is not useful and confusing. It is removed
with this commit.
</content>
</entry>
<entry>
<title>model: Make Recipe.Validate() more strict</title>
<updated>2024-05-15T18:09:35Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-15T18:09:35Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=ae771a44c2ffe31dc1bd67a12b65849f7d7d2d11'/>
<id>urn:sha1:ae771a44c2ffe31dc1bd67a12b65849f7d7d2d11</id>
<content type='text'>
Before the next release this method should be as strict as possible to
avoid cases where actually invalid enters databases.
</content>
</entry>
<entry>
<title>view: Require text for steps</title>
<updated>2024-05-15T17:39:17Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-15T17:39:17Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=34880a0194f66e2b1808b45abfb01497d4816aaf'/>
<id>urn:sha1:34880a0194f66e2b1808b45abfb01497d4816aaf</id>
<content type='text'>
It does not make sense to add empty steps.
</content>
</entry>
<entry>
<title>view: Require ingredient type</title>
<updated>2024-05-15T17:37:05Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-15T17:37:05Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=29c8c305c52b97248e505cdfc6b86e96f57d0a53'/>
<id>urn:sha1:29c8c305c52b97248e505cdfc6b86e96f57d0a53</id>
<content type='text'>
It does make sense to add an ingredient only with a type and no amount
or unit like 'salt'. But it does not make sense to add an ingredient
without a type like '5' or '2 l'.
</content>
</entry>
<entry>
<title>view: Update to simple.css v2.3.0</title>
<updated>2024-05-15T17:33:11Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-15T17:33:11Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=45a0a10c070e3dba33be01d4de4d094fd7f7394a'/>
<id>urn:sha1:45a0a10c070e3dba33be01d4de4d094fd7f7394a</id>
<content type='text'>
This is the latest available release. Updated to keep up to date and
adopt fixes.
</content>
</entry>
<entry>
<title>view: Rename to 'Ingredient summary:'</title>
<updated>2024-05-15T17:27:05Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-15T17:27:05Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=b48f4514a44450da1ad5da68ce434c2b87e721d0'/>
<id>urn:sha1:b48f4514a44450da1ad5da68ce434c2b87e721d0</id>
<content type='text'>
This used to be named 'Ingredients: which might be confusing since
ingredients are defined per step and the list at the top of the recipe
is just a summary.
</content>
</entry>
<entry>
<title>When adding a recipe step or an ingredient the browser should focus on</title>
<updated>2024-05-15T17:20:01Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-15T17:20:01Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=d8b40f0a0a2ac2bcb8b9b690166ae7594c067298'/>
<id>urn:sha1:d8b40f0a0a2ac2bcb8b9b690166ae7594c067298</id>
<content type='text'>
the first text input of that new element.

This supports using Ceres without a mouse and only with tab-based
navigation with a keyboard.
</content>
</entry>
<entry>
<title>Update CHANGELOG.md</title>
<updated>2024-05-14T19:25:31Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-14T19:25:31Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=dfee08b810d2c8ec5883dc8e8ec8a143abd2e961'/>
<id>urn:sha1:dfee08b810d2c8ec5883dc8e8ec8a143abd2e961</id>
<content type='text'>
</content>
</entry>
<entry>
<title>view: Complete ingredient editing</title>
<updated>2024-05-14T18:43:41Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-14T18:14:42Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=a87128138bdb301ede64049ec5068e47abb5c839'/>
<id>urn:sha1:a87128138bdb301ede64049ec5068e47abb5c839</id>
<content type='text'>
</content>
</entry>
<entry>
<title>view: Add HTML for editing recipe ingredients</title>
<updated>2024-05-13T19:52:48Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-13T19:51:43Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=b5b72880a0b6e9f188b532c9b2ad360ff1dab2ea'/>
<id>urn:sha1:b5b72880a0b6e9f188b532c9b2ad360ff1dab2ea</id>
<content type='text'>
</content>
</entry>
<entry>
<title>view: Add ingredient overview to recipe read page</title>
<updated>2024-05-12T18:52:25Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-04-07T10:04:11Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=bf328dd38a28cf44cfa81c7f1dcd95936d2d0301'/>
<id>urn:sha1:bf328dd38a28cf44cfa81c7f1dcd95936d2d0301</id>
<content type='text'>
</content>
</entry>
<entry>
<title>view: Show ingredients on read page</title>
<updated>2024-05-12T18:52:25Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-04-07T09:56:20Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=01d97189d245300d65ca31d650dd868d1d1fc0d8'/>
<id>urn:sha1:01d97189d245300d65ca31d650dd868d1d1fc0d8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>model: Add per-step ingredients</title>
<updated>2024-05-12T18:52:25Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-04-04T12:54:21Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=87ae71413e47ef34da57bc1e0b8dddbf84b0c66a'/>
<id>urn:sha1:87ae71413e47ef34da57bc1e0b8dddbf84b0c66a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>view: Use HTML template to add recipe steps</title>
<updated>2024-05-12T18:38:24Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-12T18:38:24Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=fec2fea87615e6ee3a6e73f7f98e021eee1b7098'/>
<id>urn:sha1:fec2fea87615e6ee3a6e73f7f98e021eee1b7098</id>
<content type='text'>
This makes the JS function way simpler and removes a duplication of the
step HTML code.
</content>
</entry>
<entry>
<title>view: Create new html/recipe-step.html</title>
<updated>2024-05-12T18:20:14Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-12T18:20:14Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=64ece1c4455ed6f8e8be5cb8f060f14b6131823f'/>
<id>urn:sha1:64ece1c4455ed6f8e8be5cb8f060f14b6131823f</id>
<content type='text'>
This allows to use it in two places:

- template for loop for backend-generated steps
- a HTML template tag for frontend- / JS-generated steps
</content>
</entry>
<entry>
<title>view: Move all JS code to static/ceres.js</title>
<updated>2024-05-12T18:06:17Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-12T18:06:17Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=f2800e8289e9637bb3227a5f9622edabf6529b0f'/>
<id>urn:sha1:f2800e8289e9637bb3227a5f9622edabf6529b0f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>view: Remove global JS code in recipe-edit.html</title>
<updated>2024-05-12T18:01:02Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-12T18:01:02Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=cfeff398f0ad7e4205dc26b66ca2b46ebca24606'/>
<id>urn:sha1:cfeff398f0ad7e4205dc26b66ca2b46ebca24606</id>
<content type='text'>
This makes it impossible to move the whole JS functionality into the
central ceres.js script. Moving that JS code there makes caching
possible and bundles all JS-related code in one file.

The overall goal is to get rid of as many JS code as possible.
</content>
</entry>
<entry>
<title>Move config path from config to flags struct</title>
<updated>2024-05-11T22:12:55Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-11T22:12:55Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=642fed1cbf5160c89a93deab810bd44fb49d2a4a'/>
<id>urn:sha1:642fed1cbf5160c89a93deab810bd44fb49d2a4a</id>
<content type='text'>
This is metadata about the config and thus does not belong to the config
itself. Moving it to the struct holding flag values is straight forward
since it is defined by flags.
</content>
</entry>
<entry>
<title>Group flag variables in struct</title>
<updated>2024-05-11T22:03:56Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-11T22:03:56Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=938ab103727688b73f2d7b3ef4d9e1b1c85c6628'/>
<id>urn:sha1:938ab103727688b73f2d7b3ef4d9e1b1c85c6628</id>
<content type='text'>
</content>
</entry>
<entry>
<title>view: Add unit test for index handler</title>
<updated>2024-05-11T21:08:42Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-11T21:08:42Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=907bd7e63f4cf3cb01bc678e09fc5b8962afe750'/>
<id>urn:sha1:907bd7e63f4cf3cb01bc678e09fc5b8962afe750</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Inject examples only with new --example flag</title>
<updated>2024-05-09T20:37:03Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2024-05-09T20:33:42Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/ceres/commit/?id=0ac3cc76b4b6c824c4b3f7a357d40b487984abfb'/>
<id>urn:sha1:0ac3cc76b4b6c824c4b3f7a357d40b487984abfb</id>
<content type='text'>
The default use case should be to not inject example recipes.
</content>
</entry>
</feed>
