Compare commits
	
		
			12 Commits
		
	
	
		
			test-andro
			...
			b740a4e483
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						b740a4e483
	
				 | 
					
					
						|||
| 
						
						
							
						
						9ce77897d8
	
				 | 
					
					
						|||
| 
						
						
							
						
						bf4afb03e6
	
				 | 
					
					
						|||
| 
						
						
							
						
						f134e6d4c3
	
				 | 
					
					
						|||
| 
						
						
							
						
						97a3a24378
	
				 | 
					
					
						|||
| 
						
						
							
						
						7f5a524d4b
	
				 | 
					
					
						|||
| 
						
						
							
						
						dbd3a5841b
	
				 | 
					
					
						|||
| 
						
						
							
						
						60cf0b641d
	
				 | 
					
					
						|||
| 
						
						
							
						
						bfadb1c2b2
	
				 | 
					
					
						|||
| 
						
						
							
						
						0548c6cbea
	
				 | 
					
					
						|||
| 
						
						
							
						
						8dda8ec0dd
	
				 | 
					
					
						|||
| 
						
						
							
						
						5725c3e7da
	
				 | 
					
					
						
							
								
								
									
										2
									
								
								.env.dev
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								.env.dev
									
									
									
									
									
								
							@@ -1,2 +1,2 @@
 | 
			
		||||
DATABASE_URL=postgres://app:app@localhost:5432/todo_baggins
 | 
			
		||||
DATABASE_URL=postgres://app:app@db/todo_baggins
 | 
			
		||||
LANGUAGE_CODE=en-US
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								.github/workflows/shellcheck-check.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.github/workflows/shellcheck-check.yaml
									
									
									
									
										vendored
									
									
								
							@@ -24,5 +24,10 @@ jobs:
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
      - name: ShellCheck check
 | 
			
		||||
        # https://www.shellcheck.net/wiki/Recursiveness
 | 
			
		||||
        run: find . -type f -name "*.sh" -print0 | xargs -0 shellcheck
 | 
			
		||||
        run: |
 | 
			
		||||
          if find . -type f -name "*.sh" -print0 | grep -qz .; then
 | 
			
		||||
            find . -type f -name "*.sh" -print0 | xargs -0 shellcheck
 | 
			
		||||
            exit 0
 | 
			
		||||
          else
 | 
			
		||||
            echo "No shell scripts found. Skipping ShellCheck."
 | 
			
		||||
          fi
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -8,3 +8,5 @@
 | 
			
		||||
 | 
			
		||||
.env
 | 
			
		||||
.env.prod
 | 
			
		||||
 | 
			
		||||
docker-compose.yaml
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										203
									
								
								.idea/icon.svg
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								.idea/icon.svg
									
									
									
										generated
									
									
									
										Normal file
									
								
							@@ -0,0 +1,203 @@
 | 
			
		||||
<?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="icon.svg"
 | 
			
		||||
   inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
 | 
			
		||||
   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="#505050"
 | 
			
		||||
     bordercolor="#eeeeee"
 | 
			
		||||
     borderopacity="1"
 | 
			
		||||
     inkscape:showpageshadow="0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pagecheckerboard="0"
 | 
			
		||||
     inkscape:deskcolor="#505050"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:zoom="1.1020922"
 | 
			
		||||
     inkscape:cx="188.27826"
 | 
			
		||||
     inkscape:cy="204.15715"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1011"
 | 
			
		||||
     inkscape:window-x="0"
 | 
			
		||||
     inkscape:window-y="0"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:current-layer="layer1" />
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs1">
 | 
			
		||||
    <inkscape:path-effect
 | 
			
		||||
       effect="fillet_chamfer"
 | 
			
		||||
       id="path-effect2"
 | 
			
		||||
       is_visible="true"
 | 
			
		||||
       lpeversion="1"
 | 
			
		||||
       nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
 | 
			
		||||
       radius="0"
 | 
			
		||||
       unit="px"
 | 
			
		||||
       method="auto"
 | 
			
		||||
       mode="F"
 | 
			
		||||
       chamfer_steps="1"
 | 
			
		||||
       flexible="false"
 | 
			
		||||
       use_knot_distance="true"
 | 
			
		||||
       apply_no_radius="true"
 | 
			
		||||
       apply_with_radius="true"
 | 
			
		||||
       only_selected="false"
 | 
			
		||||
       hide_knots="false" />
 | 
			
		||||
    <inkscape:path-effect
 | 
			
		||||
       effect="fillet_chamfer"
 | 
			
		||||
       id="path-effect1"
 | 
			
		||||
       is_visible="true"
 | 
			
		||||
       lpeversion="1"
 | 
			
		||||
       nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
 | 
			
		||||
       radius="0"
 | 
			
		||||
       unit="px"
 | 
			
		||||
       method="auto"
 | 
			
		||||
       mode="F"
 | 
			
		||||
       chamfer_steps="1"
 | 
			
		||||
       flexible="false"
 | 
			
		||||
       use_knot_distance="true"
 | 
			
		||||
       apply_no_radius="true"
 | 
			
		||||
       apply_with_radius="true"
 | 
			
		||||
       only_selected="false"
 | 
			
		||||
       hide_knots="false" />
 | 
			
		||||
  </defs>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1">
 | 
			
		||||
    <rect
 | 
			
		||||
       style="display:inline;fill:#27272a;fill-opacity:1;stroke:none;stroke-width:32;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
       id="rect1"
 | 
			
		||||
       width="512"
 | 
			
		||||
       height="512"
 | 
			
		||||
       x="0"
 | 
			
		||||
       y="0"
 | 
			
		||||
       sodipodi:insensitive="true"
 | 
			
		||||
       inkscape:label="background"
 | 
			
		||||
       ry="128.00018"
 | 
			
		||||
       sodipodi:type="rect"
 | 
			
		||||
       rx="129.98714" />
 | 
			
		||||
    <g
 | 
			
		||||
       id="g17"
 | 
			
		||||
       inkscape:label="logo"
 | 
			
		||||
       transform="translate(8)">
 | 
			
		||||
      <g
 | 
			
		||||
         id="g8"
 | 
			
		||||
         inkscape:label="ring">
 | 
			
		||||
        <g
 | 
			
		||||
           id="g7"
 | 
			
		||||
           inkscape:label="back">
 | 
			
		||||
          <circle
 | 
			
		||||
             style="fill:#d97706;fill-opacity:1;stroke:#d97706;stroke-width:32;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="path1"
 | 
			
		||||
             cx="224"
 | 
			
		||||
             cy="256"
 | 
			
		||||
             r="128"
 | 
			
		||||
             inkscape:label="ring back" />
 | 
			
		||||
          <rect
 | 
			
		||||
             style="fill:#d97706;fill-opacity:1;stroke:none;stroke-width:21.8936;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="rect2"
 | 
			
		||||
             width="48"
 | 
			
		||||
             height="288"
 | 
			
		||||
             x="224"
 | 
			
		||||
             y="112"
 | 
			
		||||
             inkscape:label="rect2" />
 | 
			
		||||
        </g>
 | 
			
		||||
        <g
 | 
			
		||||
           id="g1"
 | 
			
		||||
           transform="translate(-4.163147,-0.69235229)"
 | 
			
		||||
           inkscape:label="front">
 | 
			
		||||
          <circle
 | 
			
		||||
             style="fill:#27272a;fill-opacity:1;stroke:none;stroke-width:32;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="path1-5-2"
 | 
			
		||||
             cx="276.16315"
 | 
			
		||||
             cy="256.69235"
 | 
			
		||||
             r="128" />
 | 
			
		||||
          <circle
 | 
			
		||||
             style="fill:none;fill-opacity:1;stroke:#fbbf24;stroke-width:32;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="path1-5"
 | 
			
		||||
             cx="276.16315"
 | 
			
		||||
             cy="256.69235"
 | 
			
		||||
             r="128" />
 | 
			
		||||
        </g>
 | 
			
		||||
      </g>
 | 
			
		||||
      <g
 | 
			
		||||
         id="g16"
 | 
			
		||||
         inkscape:label="tick"
 | 
			
		||||
         transform="translate(16.000231,-8.3918418e-5)">
 | 
			
		||||
        <g
 | 
			
		||||
           id="g6"
 | 
			
		||||
           transform="rotate(45,-57.96574,415.4208)"
 | 
			
		||||
           style="fill:#d97706;fill-opacity:1;stroke:none;stroke-opacity:1"
 | 
			
		||||
           inkscape:label="back">
 | 
			
		||||
          <rect
 | 
			
		||||
             style="fill:#d97706;fill-opacity:1;stroke:none;stroke-width:32;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="rect9"
 | 
			
		||||
             width="32.000458"
 | 
			
		||||
             height="32"
 | 
			
		||||
             x="273.94067"
 | 
			
		||||
             y="210.74516"
 | 
			
		||||
             transform="rotate(-45,-57.96574,415.4208)" />
 | 
			
		||||
          <rect
 | 
			
		||||
             style="fill:#d97706;fill-opacity:1;stroke:none;stroke-width:32;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="rect8"
 | 
			
		||||
             width="32.000458"
 | 
			
		||||
             height="32"
 | 
			
		||||
             x="206.05841"
 | 
			
		||||
             y="233.37257"
 | 
			
		||||
             transform="rotate(-45,-57.96574,415.4208)" />
 | 
			
		||||
          <rect
 | 
			
		||||
             style="fill:#d97706;fill-opacity:1;stroke:none;stroke-width:32;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="rect7"
 | 
			
		||||
             height="16"
 | 
			
		||||
             x="228.686"
 | 
			
		||||
             y="285.255"
 | 
			
		||||
             width="32"
 | 
			
		||||
             transform="rotate(-45,-57.96574,415.4208)" />
 | 
			
		||||
          <rect
 | 
			
		||||
             style="fill:#d97706;fill-opacity:1;stroke:none;stroke-width:32;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="rect5"
 | 
			
		||||
             width="64"
 | 
			
		||||
             height="32"
 | 
			
		||||
             x="0"
 | 
			
		||||
             y="100" />
 | 
			
		||||
          <rect
 | 
			
		||||
             style="fill:#d97706;fill-opacity:1;stroke:none;stroke-width:39.1918;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="rect6"
 | 
			
		||||
             width="32"
 | 
			
		||||
             height="96"
 | 
			
		||||
             x="32"
 | 
			
		||||
             y="36" />
 | 
			
		||||
        </g>
 | 
			
		||||
        <g
 | 
			
		||||
           id="g4"
 | 
			
		||||
           transform="rotate(45,-41.965512,454.04877)"
 | 
			
		||||
           style="fill:#fbbf24;fill-opacity:1;stroke:none;stroke-opacity:1"
 | 
			
		||||
           inkscape:label="front">
 | 
			
		||||
          <rect
 | 
			
		||||
             style="fill:#fbbf24;fill-opacity:1;stroke:none;stroke-width:32;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="rect3"
 | 
			
		||||
             width="64"
 | 
			
		||||
             height="32"
 | 
			
		||||
             x="0"
 | 
			
		||||
             y="100" />
 | 
			
		||||
          <rect
 | 
			
		||||
             style="fill:#fbbf24;fill-opacity:1;stroke:none;stroke-width:39.1918;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
             id="rect4"
 | 
			
		||||
             width="32"
 | 
			
		||||
             height="96"
 | 
			
		||||
             x="32"
 | 
			
		||||
             y="36" />
 | 
			
		||||
        </g>
 | 
			
		||||
      </g>
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 6.4 KiB  | 
							
								
								
									
										541
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										541
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										41
									
								
								Cargo.toml
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								Cargo.toml
									
									
									
									
									
								
							@@ -1,43 +1,42 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "todo-baggins"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
authors = ["Matouš Volf <66163112+matous-volf@users.noreply.github.com>"]
 | 
			
		||||
authors = ["Matouš Volf <git@matousvolf.cz>"]
 | 
			
		||||
edition = "2021"
 | 
			
		||||
 | 
			
		||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
chrono = { version = "0.4.38", features = ["serde", "unstable-locales"] }
 | 
			
		||||
dioxus = { version = "0.6.0", features = ["fullstack", "router"] }
 | 
			
		||||
feruca = { version = "0.10.0" }
 | 
			
		||||
serde = { version = "1.0.208" }
 | 
			
		||||
serde_json = { version = "1.0.125" }
 | 
			
		||||
serde_with = { version = "3.9.0", features = ["chrono_0_4"] }
 | 
			
		||||
tracing = "0.1.40"
 | 
			
		||||
chrono = { version = "0.4.39", features = ["serde", "unstable-locales"] }
 | 
			
		||||
dioxus = { version = "0.6.1", features = ["fullstack", "router"] }
 | 
			
		||||
feruca = { version = "0.10.1" }
 | 
			
		||||
serde = { version = "1.0.217" }
 | 
			
		||||
serde_json = { version = "1.0.134" }
 | 
			
		||||
serde_with = { version = "3.12.0", features = ["chrono_0_4"] }
 | 
			
		||||
tracing = "0.1.41"
 | 
			
		||||
unic-langid-impl = { version = "0.9.5", features = ["serde"] }
 | 
			
		||||
validator = { version = "0.19.0", features = ["derive"] }
 | 
			
		||||
 | 
			
		||||
diesel = { version = "2.2.2", features = ["chrono", "postgres", "postgres_backend", "serde_json"], optional = true }
 | 
			
		||||
diesel = { version = "2.2.6", features = ["chrono", "postgres", "postgres_backend", "serde_json"], optional = true }
 | 
			
		||||
diesel_migrations = { version = "2.2.0", features = ["postgres"], optional = true }
 | 
			
		||||
dotenvy = { version = "0.15.7", optional = true }
 | 
			
		||||
time = { version = "0.3.36", optional = true }
 | 
			
		||||
time = { version = "0.3.37", optional = true }
 | 
			
		||||
 | 
			
		||||
async-std = { version = "1.12.0" }
 | 
			
		||||
dioxus-i18n = { version = "0.3.0" }
 | 
			
		||||
dioxus-query = { version = "0.6.0" }
 | 
			
		||||
voca_rs = { version = "1.15.2" }
 | 
			
		||||
 | 
			
		||||
[target.'cfg(target_os = "android")'.dependencies]
 | 
			
		||||
openssl = { version = "0.10", features = ["vendored"] }
 | 
			
		||||
async-std = { version = "1.13.0", optional = true }
 | 
			
		||||
dioxus-i18n = { version = "0.3.0", optional = true }
 | 
			
		||||
dioxus-query = { version = "0.6.0", optional = true }
 | 
			
		||||
voca_rs = { version = "1.15.2", optional = true }
 | 
			
		||||
 | 
			
		||||
[features]
 | 
			
		||||
default = ["mobile"]
 | 
			
		||||
default = ["web"]
 | 
			
		||||
desktop = ["dioxus/desktop"]
 | 
			
		||||
mobile = [
 | 
			
		||||
    "dioxus/mobile",
 | 
			
		||||
]
 | 
			
		||||
mobile = ["dioxus/mobile"]
 | 
			
		||||
web = [
 | 
			
		||||
    "dioxus/web",
 | 
			
		||||
    "dep:async-std",
 | 
			
		||||
    "dep:dioxus-query",
 | 
			
		||||
    "dep:dioxus-i18n",
 | 
			
		||||
    "dep:voca_rs"
 | 
			
		||||
]
 | 
			
		||||
server = [
 | 
			
		||||
    "dioxus/server",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								Dioxus.toml
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								Dioxus.toml
									
									
									
									
									
								
							@@ -25,18 +25,3 @@ reload_html = true
 | 
			
		||||
 | 
			
		||||
# which files or dirs will be watcher monitoring
 | 
			
		||||
watch_path = ["src", "assets"]
 | 
			
		||||
 | 
			
		||||
# include `assets` in web platform
 | 
			
		||||
[web.resource]
 | 
			
		||||
 | 
			
		||||
# CSS style file
 | 
			
		||||
style = []
 | 
			
		||||
 | 
			
		||||
# Javascript code file
 | 
			
		||||
script = ["https://kit.fontawesome.com/3c1b409f8f.js"]
 | 
			
		||||
 | 
			
		||||
[web.resource.dev]
 | 
			
		||||
 | 
			
		||||
# Javascript code file
 | 
			
		||||
# serve: [dev-server] only
 | 
			
		||||
script = []
 | 
			
		||||
 
 | 
			
		||||
@@ -13,11 +13,11 @@ stdout_logfile=/dev/fd/1
 | 
			
		||||
stdout_logfile_maxbytes=0
 | 
			
		||||
redirect_stderr=true
 | 
			
		||||
 | 
			
		||||
# [program:dx]
 | 
			
		||||
# command=dx serve --addr 0.0.0.0 --port 8000
 | 
			
		||||
# directory=/srv/app
 | 
			
		||||
# autostart=true
 | 
			
		||||
# autorestart=true
 | 
			
		||||
# stdout_logfile=/dev/fd/1
 | 
			
		||||
# stdout_logfile_maxbytes=0
 | 
			
		||||
# redirect_stderr=true
 | 
			
		||||
[program:dx]
 | 
			
		||||
command=dx serve --addr 0.0.0.0 --port 8000
 | 
			
		||||
directory=/srv/app
 | 
			
		||||
autostart=true
 | 
			
		||||
autorestart=true
 | 
			
		||||
stdout_logfile=/dev/fd/1
 | 
			
		||||
stdout_logfile_maxbytes=0
 | 
			
		||||
redirect_stderr=true
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,7 @@ pub(crate) fn App() -> Element {
 | 
			
		||||
        document::Link { rel: "stylesheet", href: FONTS_CSS }
 | 
			
		||||
        document::Link { rel: "stylesheet", href: INPUT_NUMBER_ARROWS_CSS }
 | 
			
		||||
        document::Link { rel: "stylesheet", href: INPUT_RANGE_CSS }
 | 
			
		||||
        document::Script { src: "https://kit.fontawesome.com/3c1b409f8f.js" }
 | 
			
		||||
 | 
			
		||||
        div {
 | 
			
		||||
            class: "min-h-screen text-zinc-200 bg-zinc-800 pt-4 pb-36",
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ use diesel::prelude::*;
 | 
			
		||||
use diesel::{ExpressionMethods, OptionalExtension, QueryDsl, RunQueryDsl, SelectableHelper};
 | 
			
		||||
use dioxus::prelude::*;
 | 
			
		||||
#[cfg(feature = "server")]
 | 
			
		||||
use time::util::days_in_year_month;
 | 
			
		||||
use time::Month;
 | 
			
		||||
#[cfg(feature = "server")]
 | 
			
		||||
use validator::Validate;
 | 
			
		||||
 | 
			
		||||
@@ -178,10 +178,11 @@ pub(crate) async fn complete_task(task_id: i32) -> Result<Task, ServerFnError<Er
 | 
			
		||||
                *date = NaiveDate::from_ymd_opt(
 | 
			
		||||
                    date.year(),
 | 
			
		||||
                    date.month(),
 | 
			
		||||
                    reoccurrence.start_date().day().min(days_in_year_month(
 | 
			
		||||
                        date.year(),
 | 
			
		||||
                        (date.month() as u8).try_into().unwrap(),
 | 
			
		||||
                    ) as u32),
 | 
			
		||||
                    reoccurrence.start_date().day().min(
 | 
			
		||||
                        Month::try_from(date.month() as u8)
 | 
			
		||||
                            .unwrap()
 | 
			
		||||
                            .length(date.year()) as u32,
 | 
			
		||||
                    ),
 | 
			
		||||
                )
 | 
			
		||||
                .unwrap()
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user