Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • akmrx/chorechef
1 result
Show changes
Commits on Source (3)
......@@ -16,6 +16,7 @@ their chores and meals in a dashboard view.
- date-fns
- Air Datepicker
- fontawesome
## Installation
......@@ -28,6 +29,8 @@ cd chorechef
### Running the application
Note: The setup script is assuming that you have python (Python 3) and npm installed.
```bash
./startapp.sh
```
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="512"
height="512"
viewBox="0 0 512 512"
version="1.1"
id="svg1"
sodipodi:docname="arrow-left.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="0.70710678"
inkscape:cx="135.7645"
inkscape:cy="0.70710678"
inkscape:window-width="1368"
inkscape:window-height="843"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<circle
id="path1"
style="fill:#000000;stroke:#000000"
cx="2625.9294"
cy="205.98904"
r="2.8478267" />
<circle
id="path4"
style="fill:#000000;stroke:#000000"
cx="2289.0151"
cy="-92.03437"
r="2.8478267" />
<path
id="path6"
style="fill:#000000"
d="m 481.17559,42.546875 c 0.10678,0.0025 0.2139,0.0079 0.32031,0.01758 0.23486,0.02139 0.4312,0.06746 0.66211,0.113281 0.25881,0.05896 0.5108,0.136444 0.75977,0.22461 0.008,0.004 0.0157,0.0077 0.0234,0.01172 0.21093,0.141159 0.41991,0.285522 0.62695,0.431641 0.76867,2.738626 1.25985,4.700927 1.58594,6.8125 0.007,0.297067 0.0157,0.593558 0.0273,0.890625 0.015,0.505097 0.038,1.010969 0.0645,1.515625 0.0349,0.540312 0.0502,1.08155 0.0977,1.621094 0.0278,0.413725 0.0598,0.827484 0.0996,1.240234 0.0134,0.410002 0.0253,0.82025 0.0312,1.230469 0.008,0.327728 0.0366,0.654838 0.041,0.982422 0.0245,0.175436 0.0171,0.285218 0.10937,0.302734 3e-4,0.02083 0.002,0.04167 0.002,0.0625 0.031,0.292497 0.0505,0.585039 0.0645,0.878906 0.0133,0.306546 0.0234,0.613357 0.0391,0.919922 0.005,0.155752 0.0219,0.310772 0.041,0.464844 -0.0117,1.076553 -0.0407,2.154099 0.0625,3.22461 0.43494,4.510045 1.586,8.931409 2.02149,13.441406 0.5331,5.520915 0.56309,11.079704 0.88085,16.617187 0.40418,7.043215 0.85693,14.083205 1.28516,21.124995 0.32731,8.60911 1.04569,17.21298 0.98242,25.82813 -0.0533,7.25913 -2.65105,46.802 -3.11133,53.65625 -4.49447,66.92986 0.61264,-9.60712 -4.56835,58.63476 -0.78366,10.322 -1.3783,20.65765 -2.06836,30.98633 -0.92891,10.12176 -1.86735,20.24263 -2.78711,30.36523 -0.88138,9.70005 -1.64031,19.41066 -2.61719,29.10157 -1.99373,19.77839 -3.65741,32.32055 -6.30469,51.75976 -0.95708,7.028 -1.78085,14.07702 -2.96484,21.07031 -0.93437,5.51892 -2.25727,10.96501 -3.38672,16.44727 -1.89626,9.99363 -3.12564,14.04167 -3.375,23.92188 -0.2379,9.4262 1.3315,18.79448 1.94726,28.16796 0.15865,2.41501 0.14015,4.83864 0.21094,7.25782 -0.11813,1.96906 0.052,3.97768 -0.35351,5.9082 -0.56513,2.69048 -2.6512,6.65825 -6.20508,6.5 -2.71964,-0.12111 -5.21096,-1.71024 -7.57032,-3.06836 -4.38133,-2.52205 -13.01734,-10.6612 -16.17773,-13.48047 -3.07815,-3.27348 -6.02962,-6.67062 -9.23438,-9.82031 -3.71423,-3.65045 -7.63623,-7.08324 -11.50781,-10.56641 -7.5234,-6.76863 -18.67988,-16.69057 -26.79492,-22.62695 -7.01174,-5.12928 -27.86904,-18.2894 -34.95703,-22.81836 -16.9684,-10.26397 -20.49321,-12.59268 -37.83789,-22.28906 -6.33578,-3.54196 -12.7966,-6.85706 -19.125,-10.41211 -9.24181,-5.19166 -22.64578,-13.6634 -32.51172,-18.01172 -6.49513,-2.86267 -13.29546,-4.97357 -19.94336,-7.46094 -10.80441,-5.09688 -25.72186,-12.36939 -36.86523,-16.67773 -7.18641,-2.77847 -14.55987,-5.04538 -21.83985,-7.56836 -7.32703,-2.81296 -14.68748,-5.53931 -21.98047,-8.43945 -15.80201,-6.284 -22.89994,-9.50162 -38.125,-16.11914 -8.36708,-4.63523 -17.77715,-7.17347 -26.191397,-11.72071 -1.49931,-0.81026 -2.51814,-2.3366 -3.99024,-3.19531 -2.0323,-1.18549 -4.30141,-1.90661 -6.43945,-2.88867 -5.0955,-2.3405 -4.75793,-2.25478 -9.88867,-4.95703 -0.67137,-1.11627 -1.83321,-2.05761 -2.01367,-3.34766 -0.71709,-5.12629 3.53902,-9.04049 6.66015,-12.30078 3.9962,-4.17438 7.1673,-7.17015 11.41406,-11.30274 11.562597,-9.41896 23.888167,-17.8272 37.119137,-24.72851 3.61782,-1.88706 7.3382,-3.57292 10.99805,-5.37695 3.95046,-1.9473 7.88928,-3.91804 11.83399,-5.87696 13.85228,-6.87939 27.59737,-13.97398 41.51562,-20.7207 5.92737,-2.87324 23.13726,-10.8227 28.9707,-14.12109 5.10466,-2.88634 9.93223,-6.23707 14.89844,-9.35547 23.61785,-16.82416 48.47588,-31.8934 73.86914,-45.875 11.6464,-6.41258 23.45552,-12.52827 35.17578,-18.80469 21.55947,-10.48441 41.57921,-23.690781 61.82222,-36.437501 15.63016,-9.842083 16.08347,-10.015342 31.7168,-19.447265 9.48522,-4.607574 17.71173,-11.544141 27.16797,-16.210938 2.63469,-1.300255 5.4269,-2.237362 8.20898,-3.199218 0.006,-0.0149 0.0119,-0.03404 0.0176,-0.04883 0.0409,-0.01192 0.0818,-0.02442 0.12305,-0.03516 0.29068,-0.07691 0.57807,-0.162751 0.86914,-0.238281 0.39072,-0.09743 0.78412,-0.189842 1.16992,-0.306641 0.44929,-0.115 0.90183,-0.224939 1.32031,-0.43164 0.3797,-0.191982 0.74414,-0.412686 1.09571,-0.652344 0.31464,-0.214747 0.61698,-0.446502 0.9375,-0.652344 0.0549,-0.0268 0.11255,-0.04546 0.16797,-0.07031 0.23882,-0.02127 0.47737,-0.04059 0.71679,-0.05469 0.31952,-0.0069 0.64058,-0.02518 0.96094,-0.01758 z m -14.54492,35.964844 c -3.65087,2.918638 -7.52891,5.990737 -9.33789,7.433593 -15.00823,10.760744 -15.54272,11.600186 -31.60352,21.226568 -20.64752,12.37543 -42.41225,22.91211 -62.16406,36.77539 -36.04918,22.69648 -71.56888,46.70177 -110.56836,64.16406 -5.70349,2.69221 -11.44483,5.30707 -17.11133,8.07617 -15.42875,7.53961 -13.75597,7.46335 -29.45899,14.45117 -9.99878,4.44948 -20.2682,8.41917 -30.53906,12.18945 -4.58751,1.68404 -9.21492,3.25966 -13.82226,4.88868 -4.04834,1.46474 -8.14081,2.80995 -12.14454,4.39258 -17.00003,6.7199 -32.82668,16.00976 -48.39648,25.49023 -3.925606,1.91783 -10.259516,4.99777 -14.466796,7.09766 1.27244,-0.007 2.5461,-0.0396 3.81446,0.0508 15.232166,1.08501 30.287756,3.64053 45.054676,7.54297 18.62714,5.44973 22.73846,6.21799 41.29688,13.51757 27.55514,10.83829 15.75534,7.10574 42.14844,19.49024 6.51651,3.05779 30.96703,13.34 37.58789,16.14453 6.12184,3.35421 12.09407,6.99653 18.36523,10.0625 11.80393,5.77088 24.38991,9.83895 36.21875,15.55859 6.76193,3.26965 13.33874,6.91309 19.89258,10.58203 18.83162,10.54228 20.86113,12.34426 38.88867,24.21094 5.99972,4.48937 12.17979,8.74455 17.99805,13.4668 5.47414,4.44295 10.65317,9.24316 15.85156,14.00586 9.80299,8.98128 17.24612,16.11523 25.64453,26.37304 3.39484,4.14647 6.4258,8.57735 9.54688,12.9336 2.06422,2.8812 4.04278,5.82375 6.04296,8.75 -2.35507,-15.57309 -2.06338,-31.4689 -4.52148,-47.04688 -0.60038,-5.66986 -1.40211,-11.32216 -1.80078,-17.00976 -0.502,-7.16169 -0.64633,-14.3447 -0.89844,-21.51953 -0.6393,-18.19439 -1.12921,-34.23186 -0.73242,-52.52344 0.49623,-22.87524 1.78976,-37.32595 3.39258,-60.25195 3.33773,-26.81815 4.18534,-33.63693 7.47461,-60.03711 1.15241,-9.24939 2.42343,-18.48484 3.45898,-27.74805 0.97994,-8.7658 1.79055,-17.54969 2.58789,-26.33398 0.78636,-8.66343 1.10375,-17.37369 2.16407,-26.00782 1.0344,-8.4231 2.74333,-16.74828 4.11523,-25.12304 1.2217,-6.87597 2.48914,-13.74484 3.66407,-20.62891 0.83179,-4.873651 1.45979,-9.783689 2.35742,-14.644531 z" />
<path
style="fill:#000000"
d="m 466.21349,77.679688 c 5.20187,3.266294 0.40472,10.30491 0.70984,15.16384 -4.52616,26.307312 -8.98424,52.510992 -10.6439,79.182892 -6.02047,61.00092 -16.90491,121.71299 -16.05032,183.16499 -0.0707,32.01085 1.76424,63.72639 5.3803,95.45782 0.19064,8.28992 2.17452,16.74153 1.73493,24.89765 -4.12225,5.13687 -8.40113,-2.5937 -10.62304,-5.66993 -36.78337,-50.60618 -91.53232,-85.20998 -148.31897,-109.71176 -19.99215,-8.48238 -38.77654,-19.53839 -59.02156,-27.48768 -26.17033,-12.1058 -51.9659,-25.37614 -79.81442,-33.34183 -19.62906,-6.10616 -39.76062,-10.17528 -60.292315,-12.0349 -6.61742,-3.02435 0.93093,-8.03122 4.87305,-9.05859 23.304125,-13.34361 46.595565,-27.23772 72.460835,-35.1084 34.61369,-11.66592 66.83499,-29.11373 99.85947,-44.71582 51.92433,-26.01609 98.58566,-61.51214 149.74567,-89.10991 16.79933,-9.13242 32.03337,-20.744986 47.79144,-31.442826 0.70223,-0.391313 1.45377,-0.230392 2.20899,-0.185546 z"
id="path9" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="512"
height="512"
viewBox="0 0 512 512"
version="1.1"
id="svg1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
sodipodi:docname="arrow_back.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="0.5"
inkscape:cx="67"
inkscape:cy="69"
inkscape:window-width="1368"
inkscape:window-height="843"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<circle
id="path1"
style="fill:#000000;stroke:#000000"
cx="2625.9294"
cy="205.98904"
r="2.8478267" />
<circle
id="path4"
style="fill:#000000;stroke:#000000"
cx="2289.0151"
cy="-92.03437"
r="2.8478267" />
<path
id="path6"
style="fill:#000000"
d="m 74.177734,42.546875 c -0.106785,0.0025 -0.213905,0.0079 -0.320312,0.01758 -0.234863,0.02139 -0.431203,0.06746 -0.66211,0.113281 -0.25881,0.05896 -0.510795,0.136444 -0.759765,0.22461 -0.0077,0.004 -0.0157,0.0077 -0.02344,0.01172 -0.210936,0.141159 -0.419918,0.285522 -0.626953,0.431641 -0.768669,2.738626 -1.259854,4.700927 -1.585937,6.8125 -0.0075,0.297067 -0.01573,0.593558 -0.02734,0.890625 -0.01497,0.505097 -0.03801,1.010969 -0.06445,1.515625 -0.03493,0.540312 -0.05017,1.08155 -0.09766,1.621094 -0.02782,0.413725 -0.05983,0.827484 -0.09961,1.240234 -0.01339,0.410002 -0.02528,0.82025 -0.03125,1.230469 -0.0078,0.327728 -0.0366,0.654838 -0.04102,0.982422 -0.02454,0.175436 -0.01713,0.285218 -0.109375,0.302734 -3.03e-4,0.02083 -0.0017,0.04167 -0.002,0.0625 -0.03101,0.292497 -0.05045,0.585039 -0.06445,0.878906 -0.01329,0.306546 -0.0234,0.613357 -0.03906,0.919922 -0.0053,0.155752 -0.02191,0.310772 -0.04102,0.464844 0.01166,1.076553 0.04074,2.154099 -0.0625,3.22461 -0.434942,4.510045 -1.585998,8.931409 -2.021484,13.441406 -0.533106,5.520915 -0.563097,11.079704 -0.880859,16.617187 -0.404173,7.043219 -0.856929,14.083209 -1.285157,21.124999 -0.327304,8.60911 -1.045684,17.21298 -0.982422,25.82813 0.0533,7.25913 2.651053,46.802 3.111329,53.65625 4.494475,66.92986 -0.612639,-9.60712 4.568359,58.63476 0.783656,10.322 1.378293,20.65765 2.068359,30.98633 0.928909,10.12176 1.867347,20.24263 2.78711,30.36523 0.881372,9.70005 1.640309,19.41066 2.617187,29.10157 1.993732,19.77839 3.657405,32.32055 6.304688,51.75976 0.957085,7.028 1.780851,14.07702 2.964843,21.07031 0.934369,5.51892 2.257273,10.96501 3.386719,16.44727 1.89626,9.99363 3.12564,14.04167 3.375,23.92188 0.237903,9.4262 -1.331502,18.79448 -1.947265,28.16796 -0.158647,2.41501 -0.140142,4.83864 -0.210938,7.25782 0.118132,1.96906 -0.05198,3.97768 0.353516,5.9082 0.565123,2.69048 2.651197,6.65825 6.205078,6.5 2.719636,-0.12111 5.210956,-1.71024 7.570316,-3.06836 4.38133,-2.52205 13.01734,-10.6612 16.17773,-13.48047 3.07815,-3.27348 6.02962,-6.67062 9.23438,-9.82031 3.71423,-3.65045 7.63623,-7.08324 11.50781,-10.56641 7.5234,-6.76863 18.67988,-16.69057 26.79492,-22.62695 7.01174,-5.12928 27.86904,-18.2894 34.95703,-22.81836 16.9684,-10.26397 20.49321,-12.59268 37.83789,-22.28906 6.33578,-3.54196 12.7966,-6.85706 19.125,-10.41211 9.24181,-5.19166 22.64578,-13.6634 32.51172,-18.01172 6.49513,-2.86267 13.29546,-4.97357 19.94336,-7.46094 10.80441,-5.09688 25.72186,-12.36939 36.86523,-16.67773 7.18641,-2.77847 14.55987,-5.04538 21.83985,-7.56836 7.32703,-2.81296 14.68748,-5.53931 21.98047,-8.43945 15.80201,-6.284 22.89994,-9.50162 38.125,-16.11914 8.36708,-4.63523 17.77715,-7.17347 26.1914,-11.72071 1.49931,-0.81026 2.51814,-2.3366 3.99024,-3.19531 2.0323,-1.18549 4.30141,-1.90661 6.43945,-2.88867 5.0955,-2.3405 4.75793,-2.25478 9.88867,-4.95703 0.67137,-1.11627 1.83321,-2.05761 2.01367,-3.34766 0.71709,-5.12629 -3.53902,-9.04049 -6.66015,-12.30078 -3.9962,-4.17438 -7.1673,-7.17015 -11.41406,-11.30274 -11.5626,-9.41896 -23.88817,-17.8272 -37.11914,-24.72851 -3.61782,-1.88706 -7.3382,-3.57292 -10.99805,-5.37695 -3.95046,-1.9473 -7.88928,-3.91804 -11.83399,-5.87696 -13.85228,-6.87939 -27.59737,-13.97398 -41.51562,-20.7207 -5.92737,-2.87324 -23.13726,-10.8227 -28.9707,-14.12109 -5.10466,-2.88634 -9.93223,-6.23707 -14.89844,-9.35547 -23.61785,-16.82416 -48.47588,-31.8934 -73.86914,-45.875 -11.6464,-6.41258 -23.45552,-12.52827 -35.17578,-18.80469 C 188.91314,109.8652 168.8934,96.658829 148.65039,83.912109 133.02023,74.070026 132.56692,73.896767 116.93359,64.464844 107.44837,59.85727 99.221862,52.920703 89.765625,48.253906 c -2.634688,-1.300255 -5.426904,-2.237362 -8.208984,-3.199218 -0.0057,-0.0149 -0.01194,-0.03404 -0.01758,-0.04883 -0.04089,-0.01192 -0.08179,-0.02442 -0.123046,-0.03516 -0.290686,-0.07691 -0.57807,-0.162751 -0.869141,-0.238281 -0.390724,-0.09743 -0.784121,-0.189842 -1.169922,-0.306641 -0.449287,-0.115 -0.90183,-0.224939 -1.320312,-0.43164 -0.379696,-0.191982 -0.744138,-0.412686 -1.095703,-0.652344 -0.314646,-0.214747 -0.616986,-0.446502 -0.9375,-0.652344 -0.05485,-0.0268 -0.11255,-0.04546 -0.167969,-0.07031 -0.238822,-0.02127 -0.477371,-0.04059 -0.716797,-0.05469 -0.319518,-0.0069 -0.640582,-0.02518 -0.960938,-0.01758 z m 14.544922,35.964844 c 3.650864,2.918638 7.528904,5.990737 9.337891,7.433593 15.008223,10.760744 15.542713,11.600186 31.603513,21.226568 20.64752,12.37543 42.41225,22.91211 62.16406,36.77539 36.04918,22.69648 71.56888,46.70177 110.56836,64.16406 5.70349,2.69221 11.44483,5.30707 17.11133,8.07617 15.42875,7.53961 13.75597,7.46335 29.45899,14.45117 9.99878,4.44948 20.2682,8.41917 30.53906,12.18945 4.58751,1.68404 9.21492,3.25966 13.82226,4.88868 4.04834,1.46474 8.14081,2.80995 12.14454,4.39258 17.00003,6.7199 32.82668,16.00976 48.39648,25.49023 3.92561,1.91783 10.25952,4.99777 14.4668,7.09766 -1.27244,-0.007 -2.5461,-0.0396 -3.81446,0.0508 -15.23217,1.08501 -30.28776,3.64053 -45.05468,7.54297 -18.62714,5.44973 -22.73846,6.21799 -41.29688,13.51757 -27.55514,10.83829 -15.75534,7.10574 -42.14844,19.49024 -6.51651,3.05779 -30.96703,13.34 -37.58789,16.14453 -6.12184,3.35421 -12.09407,6.99653 -18.36523,10.0625 -11.80393,5.77088 -24.38991,9.83895 -36.21875,15.55859 -6.76193,3.26965 -13.33874,6.91309 -19.89258,10.58203 -18.83162,10.54228 -20.86113,12.34426 -38.88867,24.21094 -5.99972,4.48937 -12.17979,8.74455 -17.99805,13.4668 -5.47414,4.44295 -10.65317,9.24316 -15.85156,14.00586 -9.80299,8.98128 -17.24612,16.11523 -25.64453,26.37304 -3.39484,4.14647 -6.4258,8.57735 -9.54688,12.9336 -2.06422,2.8812 -4.04278,5.82375 -6.04296,8.75 2.35507,-15.57309 2.06338,-31.4689 4.52148,-47.04688 0.60038,-5.66986 1.40211,-11.32216 1.80078,-17.00976 0.502,-7.16169 0.64633,-14.3447 0.89844,-21.51953 0.6393,-18.19439 1.12921,-34.23186 0.73242,-52.52344 -0.49623,-22.87524 -1.78976,-37.32595 -3.39258,-60.25195 -3.33773,-26.81815 -4.18534,-33.63693 -7.47461,-60.03711 -1.15241,-9.24939 -2.42343,-18.48484 -3.45898,-27.74805 -0.97994,-8.7658 -1.79055,-17.54969 -2.58789,-26.33398 -0.78636,-8.66343 -1.103748,-17.37369 -2.164065,-26.00782 -1.034404,-8.4231 -2.743333,-16.74828 -4.115234,-25.12304 -1.2217,-6.87597 -2.489141,-13.74484 -3.664063,-20.62891 -0.831796,-4.873651 -1.459794,-9.783689 -2.357422,-14.644531 z" />
<path
style="fill:#000000"
d="m 89.091797,77.679688 c -5.20187,3.266294 -0.404727,10.30491 -0.709843,15.16384 4.526161,26.307312 8.984239,52.510992 10.643902,79.182892 6.020464,61.00092 16.904904,121.71299 16.050314,183.16499 0.0707,32.01085 -1.76424,63.72639 -5.3803,95.45782 -0.19064,8.28992 -2.17452,16.74153 -1.73493,24.89765 4.12225,5.13687 8.40113,-2.5937 10.62304,-5.66993 36.78337,-50.60618 91.53232,-85.20998 148.31897,-109.71176 19.99215,-8.48238 38.77654,-19.53839 59.02156,-27.48768 26.17033,-12.1058 51.9659,-25.37614 79.81442,-33.34183 19.62906,-6.10616 39.76062,-10.17528 60.29232,-12.0349 6.61742,-3.02435 -0.93093,-8.03122 -4.87305,-9.05859 -23.30413,-13.34361 -46.59557,-27.23772 -72.46084,-35.1084 -34.61369,-11.66592 -66.83499,-29.11373 -99.85947,-44.71582 -51.92433,-26.01609 -98.58566,-61.51214 -149.74567,-89.10991 -16.79933,-9.13242 -32.03337,-20.744986 -47.791439,-31.442826 -0.702227,-0.391313 -1.45377,-0.230392 -2.208984,-0.185546 z"
id="path9" />
</g>
</svg>
This diff is collapsed.
<script setup lang="ts">
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import {
faCirclePlus,
faCheck,
faTrash,
faPenToSquare,
faCaretUp,
faCaretDown,
faTimes,
faFloppyDisk,
} from "@fortawesome/free-solid-svg-icons";
import { format, add } from "date-fns";
import AirDatepicker from "air-datepicker";
import "air-datepicker/air-datepicker.css";
import localeDe from "air-datepicker/locale/de";
</script>
<template>
<h2 class="font-bold p-1">Aufgaben</h2>
<div id="chores" class="flex flex-col shrink gap-1 p-1">
<div
v-for="chore in chores"
class="chore items-center"
:class="{
'text-red-600':
chore.chore_date < compareFormatDate(new Date().toISOString()),
}"
>
<div
class="w-full border border-black rounded p-1 flex flex-row gap-4 items-center"
v-if="
!onDashboard ||
(chore.chore_date <= compareFormatDate(currDate.toISOString()) &&
!chore.chore_done)
"
>
<div
v-if="onDashboard"
class="chore-checkbox border border-black w-4 h-4 rounded bg-gray-50 hover:cursor-pointer flex justify-center items-center"
@click="toggleChore(chore)"
>
<FontAwesomeIcon :icon="faCheck" v-if="chore.chore_done" />
</div>
<div
class="chore-name w-1/4"
v-if="editChore.chore_id != chore.chore_id"
>
{{ chore.chore_name }} | {{ editChore.chore_id }} |
{{ chore.chore_id }}
</div>
<input
v-else
v-focus
v-model="editChore.chore_name"
type="text"
class="chore-name-input pl-2 pr-2 w-1/4 flex flex-row gap-1 border border-black rounded bg-gray-50"
/>
<div
class="chore-date w-[6.25rem]"
v-if="editChore.chore_id != chore.chore_id"
>
{{ formatDate(chore.chore_date) }}
</div>
<input
id="edit-date-picker"
type="text"
class="chore-date-input px-1 w-[6.25rem] bg-gray-50 border border-black rounded hover:cursor-pointer"
readonly
v-else
/>
<div
v-if="editChore.chore_id != chore.chore_id"
class="chore-frequency"
>
alle {{ chore.chore_frequency }} {{ chore.chore_frequency_unit }}
</div>
<div v-else class="flex flex-row gap-1">
<label for="chore-frequency" class="flex flex-row shrink gap-1">
alle
<input
v-model="editChore.chore_frequency"
type="number"
class="chore-frequency-input w-12 px-1 bg-gray-50 border border-black rounded hover:cursor-text"
/>
<select
v-model="editChore.chore_frequency_unit"
class="chore-frequency-input flex flex-row gap-1 bg-gray-50 border border-black rounded hover:cursor-pointer"
>
<option value="Tage" class="hover:cursor-pointer">Tage</option>
<option value="Wochen" class="hover:cursor-pointer">
Wochen
</option>
<option value="Monate" class="hover:cursor-pointer">
Monate
</option>
</select>
</label>
</div>
<div class="px-4">
{{ users.find((u) => u.user_id == chore.chore_user)?.username }}
</div>
<div class="grow"></div>
<FontAwesomeIcon
v-if="editChore.chore_id == chore.chore_id"
:icon="faTimes"
class="hover:cursor-pointer pr-2 hover:text-green-600"
@click="cancelEditing"
/>
<FontAwesomeIcon
v-if="editChore.chore_id == chore.chore_id"
:icon="faFloppyDisk"
class="hover:cursor-pointer pr-2 hover:text-green-600"
@click="endEditing"
/>
<FontAwesomeIcon
v-if="!onDashboard && editChore.chore_id != chore.chore_id"
:icon="faPenToSquare"
class="hover:cursor-pointer pr-2"
@click="startEditing(chore)"
/>
<FontAwesomeIcon
v-if="!onDashboard"
:icon="faTrash"
class="hover:cursor-pointer pr-2 hover:text-red-600"
@click="deleteChore(chore)"
/>
</div>
</div>
</div>
<div
v-if="!onDashboard"
id="add-chore"
class="flex flex-row gap-4 p-1 justify-center"
>
<FontAwesomeIcon
v-if="!adding"
@click="startAdding"
:icon="faCirclePlus"
class="hover:cursor-pointer text-2xl"
/>
<div class="flex flex-row items-center gap-2 px-2 w-full" v-else>
<input
v-focus
v-model="newChore.chore_name"
type="text"
class="chore-name-input pl-2 pr-2 w-1/3 flex flex-row gap-1 bg-gray-50 border border-black rounded"
placeholder="Neue Aufgabe"
/>
<label for="date-picker" class="flex flex-row shrink gap-1">
erste Ausführung am
<input
id="date-picker"
type="text"
class="chore-date-input px-1 w-[6.25rem] bg-gray-50 border border-black rounded hover:cursor-pointer"
readonly
/>
</label>
<label for="chore-frequency" class="flex flex-row shrink gap-1">
alle
<input
v-model="newChore.chore_frequency"
type="number"
class="chore-frequency-input w-12 px-1 bg-gray-50 border border-black rounded hover:cursor-text"
/>
</label>
<select
v-model="newChore.chore_frequency_unit"
class="chore-frequency-input flex flex-row gap-1 bg-gray-50 border border-black rounded hover:cursor-pointer"
>
<option value="Tage" class="hover:cursor-pointer">Tage</option>
<option value="Wochen" class="hover:cursor-pointer">Wochen</option>
<option value="Monate" class="hover:cursor-pointer">Monate</option>
</select>
<select
v-model="newChore.chore_user"
class="chore-user-input flex flex-row gap-1 bg-gray-50 border border-black rounded hover:cursor-pointer"
>
<option
v-for="user in users"
:value="user.user_id"
class="hover:cursor-pointer"
>
{{ user.username }}
</option>
</select>
<div class="flex-grow"></div>
<FontAwesomeIcon
:icon="faTimes"
@click="adding = false"
class="hover:cursor-pointer px-2 hover:text-red-600"
/>
<FontAwesomeIcon
:icon="faCheck"
@click="endAdding"
class="hover:cursor-pointer px-2 hover:text-green-600"
/>
</div>
</div>
<div v-if="onDashboard" class="done-chores">
<h3 class="font-bold p-1 hover:cursor-pointer" @click="toggleDoneChores">
Erledigte Aufgaben
<FontAwesomeIcon :icon="faCaretDown" v-if="!showDone" />
<FontAwesomeIcon :icon="faCaretUp" v-if="showDone" />
</h3>
<div v-if="showDone" class="flex flex-col gap-1 p-1">
<div
v-for="chore in chores.filter((c) => c.chore_done)"
class="flex flex-row shrink gap-4 border border-black rounded p-1 italic line-through text-gray-500 items-center"
>
<div
v-if="onDashboard"
class="chore-checkbox border border-black w-4 h-4 rounded bg-gray-50 hover:cursor-pointer flex justify-center items-center"
@click="toggleChore(chore)"
>
<FontAwesomeIcon :icon="faCheck" v-if="chore.chore_done" />
</div>
<div class="chore-name w-1/4">{{ chore.chore_name }}</div>
<div class="chore-date">{{ formatDate(chore.chore_date) }}</div>
<div class="chore-frequency">
alle {{ chore.chore_frequency }} {{ chore.chore_frequency_unit }}
</div>
<div class="grow"></div>
</div>
</div>
</div>
</template>
<script lang="ts">
interface Chore {
chore_id: number;
chore_name: string;
chore_date: string;
chore_frequency: string;
chore_frequency_unit: string;
chore_done: boolean;
chore_user: number;
}
interface User {
user_id: number;
username: string;
}
export default {
name: "Chores",
data() {
return {
chores: [] as Chore[],
users: [] as User[],
adding: false,
newChore: {} as Chore,
editChore: {} as Chore,
rollBackChore: {} as Chore,
showDone: false,
unitConversion: {
Tage: "days",
Wochen: "weeks",
Monate: "months",
},
};
},
props: {
currDate: Date,
onDashboard: Boolean,
},
methods: {
toggleDoneChores() {
this.showDone = !this.showDone;
},
async fetchChores() {
const response = await fetch("http://localhost:8000/chores/");
const chores = await response.json();
if (this.onDashboard) {
this.chores = chores.sort((a, b) =>
a.chore_date.localeCompare(b.chore_date),
);
} else {
this.chores = chores;
}
},
startEditing(chore: Chore) {
this.editChore = chore;
this.rollBackChore = { ...chore };
this.$nextTick(() => {
new AirDatepicker("#edit-date-picker", {
selectedDates: [new Date(chore.chore_date)],
locale: localeDe,
onSelect: (rec) => {
this.editChore.chore_date = format(rec.date, "yyyy-MM-dd");
},
});
});
},
cancelEditing() {
this.editChore = this.rollBackChore;
this.rollBackChore = {} as Chore;
this.endEditing();
// reflect the changes in the UI
this.fetchChores();
},
endEditing() {
fetch(`http://localhost:8000/chores/${this.editChore.chore_id}/`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(this.editChore),
});
this.editChore = {} as Chore;
this.rollBackChore = {} as Chore;
},
startAdding() {
this.adding = true;
this.newChore.chore_date = format(new Date(), "yyyy-MM-dd");
this.newChore.chore_frequency = 1;
this.newChore.chore_frequency_unit = "Wochen";
this.newChore.chore_done = false;
// pause until the element is rendered
this.$nextTick(() => {
new AirDatepicker("#date-picker", {
selectedDates: [new Date()],
locale: localeDe,
onSelect: (rec) => {
this.newChore.chore_date = format(rec.date, "yyyy-MM-dd");
},
});
});
},
endAdding() {
console.log(this.newChore);
fetch("http://localhost:8000/chores/", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
chore_name: this.newChore.chore_name,
chore_date: this.newChore.chore_date,
chore_frequency: this.newChore.chore_frequency,
chore_frequency_unit: this.newChore.chore_frequency_unit,
chore_done: false,
chore_user: this.newChore.chore_user,
}),
});
this.chores.push(this.newChore);
this.newChore = {} as Chore;
this.adding = false;
},
deleteChore(chore: Chore) {
fetch(`http://localhost:8000/chores/${chore.chore_id}/`, {
method: "DELETE",
});
this.chores = this.chores.filter((c) => c.chore_id !== chore.chore_id);
},
toggleChore(chore: Chore) {
chore.chore_done = !chore.chore_done;
this.updateDonePastChores(chore);
fetch(`http://localhost:8000/chores/${chore.chore_id}/`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(chore),
});
},
formatDate(date: string) {
return format(new Date(date), "d.M.yy");
},
compareFormatDate(date: string) {
return format(new Date(date), "yyyy-MM-dd");
},
moveChoreBack(chore: Chore) {
let unit = this.unitConversion[chore.chore_frequency_unit];
let updatedChore = {
chore_id: chore.chore_id,
chore_name: chore.chore_name,
chore_date: this.compareFormatDate(
add(new Date(chore.chore_date), {
[unit]: -chore.chore_frequency,
}).toISOString(),
"yyyy-MM-dd",
),
chore_frequency: chore.chore_frequency,
chore_frequency_unit: chore.chore_frequency_unit,
chore_done: false,
} as Chore;
this.chores.push(updatedChore);
fetch(`http://localhost:8000/chores/${chore.chore_id}/`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(updatedChore),
});
},
updateDonePastChores(chore) {
console.log("updateDonePastChores");
if (
chore.chore_date < this.compareFormatDate(new Date().toISOString()) &&
chore.chore_done
) {
let unit = this.unitConversion[chore.chore_frequency_unit];
let updatedChore = {
chore_id: chore.chore_id,
chore_name: chore.chore_name,
chore_date: this.compareFormatDate(
add(new Date(chore.chore_date), {
[unit]: chore.chore_frequency,
}).toISOString(),
),
chore_frequency: chore.chore_frequency,
chore_frequency_unit: chore.chore_frequency_unit,
chore_done: false,
chore_user: chore.chore_user,
} as Chore;
console.log(this.chores);
console.log(updatedChore);
this.chores.push(updatedChore);
console.log(this.chores);
fetch(`http://localhost:8000/chores/${chore.chore_id}/`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(updatedChore),
});
}
},
fetchUsers() {
fetch("http://localhost:8000/users/").then((response) => {
response.json().then((users) => {
this.users = users.sort((a, b) => a.user_id - b.user_id);
console.log(this.users);
});
});
},
},
async mounted() {
await this.fetchChores();
this.fetchUsers();
},
watch: {
currDate() {
this.fetchChores();
},
},
};
</script>
<script setup lang="ts"></script>
<template>
<h1 class="text-4xl p-2 font-bold">ChoreChef</h1>
</template>
<script setup lang="ts"></script>
<template>
<h2 class="font-bold p-1">Essensplan</h2>
<div id="meals" class="flex flex-row grow gap-1 p-1">
<div class="meal flex flex-col gap-1 w-1/4 border border-black rounded p-1">
<div
class="meal-name h-2/6 text-xl font-bold border border-black rounded flex justify-center items-center"
>
Kassler
</div>
<div
class="meal-notices text-sm break-normal h-4/6 border border-black rounded p-0.5"
>
Lexker Schmecker po palekker
</div>
</div>
<div class="meal flex flex-col gap-1 w-1/4 border border-black rounded p-1">
<div
class="meal-name h-2/6 text-xl font-bold border border-black rounded flex justify-center items-center"
>
Kassler
</div>
<div
class="meal-notices text-sm break-normal h-4/6 border border-black rounded p-0.5"
>
Lexker Schmecker po palekker
</div>
</div>
<div class="meal flex flex-col gap-1 w-1/4 border border-black rounded p-1">
<div
class="meal-name h-2/6 text-xl font-bold border border-black rounded flex justify-center items-center"
>
Kassler
</div>
<div
class="meal-notices text-sm break-normal h-4/6 border border-black rounded p-0.5"
>
Lexker Schmecker po palekker
</div>
</div>
<div class="meal flex flex-col gap-1 w-1/4 border border-black rounded p-1">
<div
class="meal-name h-2/6 text-xl font-bold border border-black rounded flex justify-center items-center"
>
Kassler
</div>
<div
class="meal-notices text-sm break-normal h-4/6 border border-black rounded p-0.5"
>
Lexker Schmecker po palekker
</div>
</div>
</div>
</template>
<script setup lang="ts"></script>
<template>
<h2 class="font-bold p-1">Aufgaben</h2>
<div id="tasks" class="flex flex-col grow gap-1 p-1">
<div
class="task flex flex-row gap-4 border border-black rounded p-1 items-center"
>
<div
class="task-checkbox border border-black w-4 h-4 rounded bg-gray-50"
></div>
<div class="task-name flex-grow">Wohnzimmer saugen</div>
</div>
<div
class="task flex flex-row gap-4 border border-black rounded p-1 items-center"
>
<div
class="task-checkbox border border-black w-4 h-4 rounded bg-gray-50"
></div>
<div class="task-name flex-grow">Wohnzimmer saugen</div>
</div>
<div
class="task flex flex-row gap-4 border border-black rounded p-1 items-center"
>
<div
class="task-checkbox border border-black w-4 h-4 rounded bg-gray-50"
></div>
<div class="task-name flex-grow">Wohnzimmer saugen</div>
</div>
<div
class="task flex flex-row gap-4 border border-black rounded p-1 items-center"
>
<div
class="task-checkbox border border-black w-4 h-4 rounded bg-gray-50"
></div>
<div class="task-name flex-grow">Wohnzimmer saugen</div>
</div>
<div
class="task flex flex-row gap-4 border border-black rounded p-1 items-center"
>
<div
class="task-checkbox border border-black w-4 h-4 rounded bg-gray-50"
></div>
<div class="task-name flex-grow">Wohnzimmer saugen</div>
</div>
</div>
</template>
<script setup lang="ts">
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import {
faPenToSquare,
faTimes,
faSave,
} from "@fortawesome/free-solid-svg-icons";
import { ref } from "vue";
import moment from "moment";
import de from "moment/locale/de";
moment.locale("de", de);
</script>
<template>
<div id="meals" class="flex flex-row grow gap-1 p-1">
<div
class="meal flex flex-col gap-1 w-1/4 border border-black rounded p-1"
v-for="n in 7"
>
<div class="flex flex-row">
<div class="meal-date text-xl font-bold flex justify-center">
{{
today()
.add(n - 1, "days")
.format("DD.MM.")
}}
</div>
<div
class="flex justify-end w-full p-1 gap-2 flex-row"
v-if="editingMeal && editingMeal.meal_date === dateOnPos(n)"
>
<FontAwesomeIcon
:icon="faSave"
@click="saveMeal"
class="hover:cursor-pointer"
/>
<FontAwesomeIcon
:icon="faTimes"
@click="cancelEditing"
class="hover:cursor-pointer"
/>
</div>
<div v-else class="edit-button flex justify-end w-full p-1">
<FontAwesomeIcon
:icon="faPenToSquare"
@click="startEditing(n)"
class="hover:cursor-pointer"
/>
</div>
</div>
<input
v-if="editingMeal && editingMeal.meal_date === dateOnPos(n)"
v-model="editingMeal.meal_name"
class="meal-name-input p-2 h-2/6 w-full flex flex-row gap-1 bg-gray-50 border border-black rounded"
/>
<div
v-else
class="meal-name h-2/6 text-xl font-bold border border-black rounded flex flex-col justify-center items-center"
>
{{
meals.find(
(meal) =>
meal.meal_date ===
today()
.add(n - 1, "days")
.format("YYYY-MM-DD"),
)?.meal_name
}}
</div>
<textarea
v-model="editingMeal.meal_description"
v-if="editingMeal && editingMeal.meal_date === dateOnPos(n)"
class="meal-description-input p-2 h-4/6 flex flex-row gap-1 bg-gray-50 border border-black rounded"
></textarea>
<div
v-else
class="meal-notice text-sm break-normal h-4/6 border border-black rounded p-0.5"
>
{{
meals.find(
(meal) =>
meal.meal_date ===
today()
.add(n - 1, "days")
.format("YYYY-MM-DD"),
)?.meal_description
}}
</div>
</div>
</div>
</template>
<script lang="ts">
import moment from "moment";
interface Meal {
meal_name: string;
meal_description: string;
meal_date: string;
meal_image: string | null;
}
export default {
data() {
return {
meals: [] as Meal[],
editingMeal: null as Meal | null,
rollBackMeal: null as Meal | null,
};
},
methods: {
today() {
return moment();
},
mealOnPos(n: int) {
const date = this.today()
.add(n - 1, "days")
.format("YYYY-MM-DD");
return (
this.meals.find((meal) => meal.meal_date === date) || {
meal_name: "",
meal_description: "",
meal_date: date,
meal_image: null,
}
);
},
dateOnPos(n: int) {
return this.today()
.add(n - 1, "days")
.format("YYYY-MM-DD");
},
async fetchMeals() {
const response = await fetch("http://localhost:8000/meals");
const data = await response.json();
return data as Meal[];
},
startEditing(n: int) {
this.editingMeal = this.mealOnPos(n);
this.rollBackMeal = { ...this.editingMeal };
},
async saveMeal() {
const index = this.meals.findIndex(
(meal) => meal.meal_date === this.editingMeal!.meal_date,
);
if (index !== -1) {
this.meals.splice(index, 1, this.editingMeal!);
}
//Update the meal or create a new one in database
console.log(JSON.stringify(this.editingMeal));
if (index === -1) {
let resp = await fetch("http://localhost:8000/meals/", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(this.editingMeal),
});
console.log(resp);
console.log(resp.json());
} else {
fetch(`http://localhost:8000/meals/${this.editingMeal!.meal_date}/`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(this.editingMeal),
});
}
this.meals = await this.fetchMeals();
this.editingMeal = null;
this.rollBackMeal = null;
},
cancelEditing() {
console.log(this.rollBackMeal);
const index = this.meals.findIndex(
(meal) => meal.meal_date === this.editingMeal!.meal_date,
);
if (index !== -1) {
this.meals.splice(index, 1, this.rollBackMeal!);
}
this.editingMeal = null;
this.rollBackMeal = null;
},
},
async mounted() {
const meals = await this.fetchMeals();
this.meals = meals;
},
};
</script>