parent
cb5616c81f
commit
93abc216e1
@ -0,0 +1,255 @@
|
||||
{
|
||||
"lockfileVersion": 1,
|
||||
"workspaces": {
|
||||
"": {
|
||||
"name": "inventory-app",
|
||||
"devDependencies": {
|
||||
"@types/bun": "latest",
|
||||
"prettier": "^3.4.2",
|
||||
"prettier-plugin-tailwindcss": "^0.6.11",
|
||||
"tailwindcss": "^3.4.17",
|
||||
},
|
||||
},
|
||||
},
|
||||
"packages": {
|
||||
"@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
|
||||
|
||||
"@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
|
||||
|
||||
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
|
||||
|
||||
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
|
||||
|
||||
"@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="],
|
||||
|
||||
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
|
||||
|
||||
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="],
|
||||
|
||||
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
|
||||
|
||||
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
|
||||
|
||||
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
|
||||
|
||||
"@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
|
||||
|
||||
"@types/bun": ["@types/bun@1.2.1", "", { "dependencies": { "bun-types": "1.2.1" } }, "sha512-iiCeMAKMkft8EPQJxSbpVRD0DKqrh91w40zunNajce3nMNNFd/LnAquVisSZC+UpTMjDwtcdyzbWct08IvEqRA=="],
|
||||
|
||||
"@types/node": ["@types/node@22.12.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA=="],
|
||||
|
||||
"@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="],
|
||||
|
||||
"ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
|
||||
|
||||
"ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
|
||||
|
||||
"any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
|
||||
|
||||
"anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
|
||||
|
||||
"arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
|
||||
|
||||
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
|
||||
|
||||
"binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
|
||||
|
||||
"brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
|
||||
|
||||
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
|
||||
|
||||
"bun-types": ["bun-types@1.2.1", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-p7bmXUWmrPWxhcbFVk7oUXM5jAGt94URaoa3qf4mz43MEhNAo/ot1urzBqctgvuq7y9YxkuN51u+/qm4BiIsHw=="],
|
||||
|
||||
"camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="],
|
||||
|
||||
"chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
|
||||
|
||||
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
|
||||
|
||||
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
||||
|
||||
"commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
|
||||
|
||||
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
|
||||
|
||||
"cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
|
||||
|
||||
"didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="],
|
||||
|
||||
"dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
|
||||
|
||||
"eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
|
||||
|
||||
"emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
|
||||
|
||||
"fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
|
||||
|
||||
"fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="],
|
||||
|
||||
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
|
||||
|
||||
"foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="],
|
||||
|
||||
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||
|
||||
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
|
||||
|
||||
"glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="],
|
||||
|
||||
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
|
||||
|
||||
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
|
||||
|
||||
"is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
|
||||
|
||||
"is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
|
||||
|
||||
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
|
||||
|
||||
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
|
||||
|
||||
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
|
||||
|
||||
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
|
||||
|
||||
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||
|
||||
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
|
||||
|
||||
"jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
|
||||
|
||||
"lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
|
||||
|
||||
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
|
||||
|
||||
"lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
|
||||
|
||||
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
|
||||
|
||||
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
|
||||
|
||||
"minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
|
||||
|
||||
"minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
|
||||
|
||||
"mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
|
||||
|
||||
"nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="],
|
||||
|
||||
"normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
|
||||
|
||||
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
|
||||
|
||||
"object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
|
||||
|
||||
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
|
||||
|
||||
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
||||
|
||||
"path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
|
||||
|
||||
"path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
|
||||
|
||||
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||
|
||||
"picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
|
||||
"pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="],
|
||||
|
||||
"pirates": ["pirates@4.0.6", "", {}, "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="],
|
||||
|
||||
"postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="],
|
||||
|
||||
"postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="],
|
||||
|
||||
"postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="],
|
||||
|
||||
"postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="],
|
||||
|
||||
"postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="],
|
||||
|
||||
"postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="],
|
||||
|
||||
"postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
|
||||
|
||||
"prettier": ["prettier@3.4.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ=="],
|
||||
|
||||
"prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.11", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA=="],
|
||||
|
||||
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
|
||||
|
||||
"read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="],
|
||||
|
||||
"readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
|
||||
|
||||
"resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="],
|
||||
|
||||
"reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="],
|
||||
|
||||
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
|
||||
|
||||
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
|
||||
|
||||
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
|
||||
|
||||
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
||||
|
||||
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
||||
|
||||
"string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
|
||||
|
||||
"string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||
|
||||
"strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
|
||||
|
||||
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="],
|
||||
|
||||
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
||||
|
||||
"tailwindcss": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="],
|
||||
|
||||
"thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
|
||||
|
||||
"thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
|
||||
|
||||
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
|
||||
|
||||
"ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
|
||||
|
||||
"undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="],
|
||||
|
||||
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
|
||||
|
||||
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||
|
||||
"wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
|
||||
|
||||
"wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
|
||||
|
||||
"yaml": ["yaml@2.7.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="],
|
||||
|
||||
"chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||
|
||||
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||
|
||||
"string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||
|
||||
"string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
|
||||
"wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||
|
||||
"wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
|
||||
"wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||
|
||||
"wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,191 @@
|
||||
use crate::error::AppError;
|
||||
use crate::session::SessionUser;
|
||||
use askama::Template;
|
||||
use askama_axum::{IntoResponse, Response};
|
||||
use axum::extract::{Path, State};
|
||||
use axum::{debug_handler, Form};
|
||||
use axum_htmx::{HxEvent, HxResponseTrigger};
|
||||
use serde::Deserialize;
|
||||
use sqlx::SqlitePool;
|
||||
use tracing::info;
|
||||
use crate::db::display_unit::DbDisplayUnit;
|
||||
use crate::db;
|
||||
|
||||
#[derive(Template, Debug)]
|
||||
#[template(path = "item/item-create-form.html")]
|
||||
pub struct CreateItemFormTemplate {
|
||||
pub display_units: Vec<DbDisplayUnit>,
|
||||
pub name_value: String,
|
||||
pub name_error: &'static str,
|
||||
pub display_unit_value: String,
|
||||
pub display_unit_error: &'static str,
|
||||
pub reorder_point_value: String,
|
||||
pub reorder_point_error: &'static str,
|
||||
pub pims_id_value: String,
|
||||
pub pims_id_error: &'static str,
|
||||
pub vetcove_id_value: String,
|
||||
pub vetcove_id_error: &'static str,
|
||||
pub allow_fractional_units_value: bool,
|
||||
}
|
||||
|
||||
impl CreateItemFormTemplate {
|
||||
pub fn clear_inputs(&mut self) {
|
||||
self.name_value.clear();
|
||||
self.display_unit_value.clear();
|
||||
self.reorder_point_value.clear();
|
||||
self.pims_id_value.clear();
|
||||
self.vetcove_id_value.clear();
|
||||
self.allow_fractional_units_value = false;
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
pub struct CreateItemFormData {
|
||||
name: String,
|
||||
display_unit: String,
|
||||
reorder_point: f64,
|
||||
allow_fractional_units: Option<String>,
|
||||
pims_id: Option<String>,
|
||||
vetcove_id: Option<String>,
|
||||
}
|
||||
|
||||
pub fn form_checkbox_is_checked(val: &Option<String>) -> bool {
|
||||
val.as_ref().map(|val| val == "on").unwrap_or(false)
|
||||
}
|
||||
|
||||
impl CreateItemFormData {
|
||||
pub fn base_template() -> CreateItemFormTemplate {
|
||||
CreateItemFormTemplate {
|
||||
display_units: vec![],
|
||||
name_value: "".to_owned(),
|
||||
name_error: "",
|
||||
display_unit_value: "".to_owned(),
|
||||
display_unit_error: "",
|
||||
reorder_point_value: "".to_owned(),
|
||||
reorder_point_error: "",
|
||||
pims_id_value: "".to_owned(),
|
||||
pims_id_error: "",
|
||||
vetcove_id_value: "".to_owned(),
|
||||
vetcove_id_error: "",
|
||||
allow_fractional_units_value: false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn validate(&self, display_units: Vec<DbDisplayUnit>) -> Result<CreateItemFormTemplate, CreateItemFormTemplate> {
|
||||
let allow_fractional_units = form_checkbox_is_checked(&self.allow_fractional_units);
|
||||
|
||||
let name_error = if self.name.is_empty() {
|
||||
"Please provide a name"
|
||||
} else {
|
||||
""
|
||||
};
|
||||
|
||||
let display_unit_error = if self.display_unit.is_empty() {
|
||||
"Please provide a display unit"
|
||||
} else if !display_units.iter().any(|x| x.abbreviation.eq(&self.display_unit)){
|
||||
"Invalid display unit"
|
||||
} else {
|
||||
""
|
||||
};
|
||||
|
||||
let reorder_point_error = if self.reorder_point.is_nan()
|
||||
|| self.reorder_point.is_infinite()
|
||||
|| self.reorder_point.is_sign_negative()
|
||||
{
|
||||
"Provide a positive number"
|
||||
} else if !(allow_fractional_units || self.reorder_point.fract() == 0.0) {
|
||||
"Fractional units not allowed"
|
||||
} else {
|
||||
""
|
||||
};
|
||||
|
||||
let pims_id_error = if let Some(pims_id) = &self.pims_id {
|
||||
if pims_id.chars().any(char::is_whitespace) {
|
||||
"Invalid PIMS id"
|
||||
}
|
||||
else {
|
||||
""
|
||||
}
|
||||
}
|
||||
else {
|
||||
""
|
||||
};
|
||||
|
||||
|
||||
let vetcove_id_error = if let Some(vetcove_id) = &self.vetcove_id {
|
||||
if !vetcove_id.chars().all(|c| c.is_ascii_digit()) {
|
||||
"Invalid Vectcove id"
|
||||
}
|
||||
else {
|
||||
""
|
||||
}
|
||||
}
|
||||
else {
|
||||
""
|
||||
};
|
||||
|
||||
let template = CreateItemFormTemplate {
|
||||
display_units,
|
||||
name_value: self.name.clone(),
|
||||
name_error,
|
||||
display_unit_value: self.display_unit.clone(),
|
||||
display_unit_error,
|
||||
reorder_point_value: format!("{:.2}", self.reorder_point),
|
||||
reorder_point_error,
|
||||
pims_id_value: self.pims_id.as_deref().unwrap_or_default().to_string(),
|
||||
pims_id_error,
|
||||
vetcove_id_value: self.vetcove_id.as_deref().unwrap_or_default().to_string(),
|
||||
vetcove_id_error,
|
||||
allow_fractional_units_value: allow_fractional_units,
|
||||
};
|
||||
|
||||
if !(name_error.is_empty()
|
||||
&& display_unit_error.is_empty()
|
||||
&& reorder_point_error.is_empty()
|
||||
&& pims_id_error.is_empty()
|
||||
&& vetcove_id_error.is_empty()) {
|
||||
return Err(template);
|
||||
}
|
||||
|
||||
Ok(template)
|
||||
}
|
||||
}
|
||||
|
||||
#[debug_handler]
|
||||
pub async fn create_item_form_post(
|
||||
State(db): State<SqlitePool>,
|
||||
user: SessionUser,
|
||||
mut form_data: Form<CreateItemFormData>,
|
||||
) -> Result<Response, AppError> {
|
||||
|
||||
let display_units = db::display_unit::get_display_units(&db).await?;
|
||||
|
||||
let validation = form_data.validate(display_units);
|
||||
|
||||
if let Err(resp) = validation {
|
||||
return Ok(resp.into_response());
|
||||
}
|
||||
|
||||
let allow_fractional_units = form_checkbox_is_checked(&form_data.allow_fractional_units);
|
||||
|
||||
let _new_id = db::inventory_item::add_inventory_item(&db, &form_data.name, form_data.reorder_point,
|
||||
allow_fractional_units, &form_data.display_unit,
|
||||
&form_data.pims_id, &form_data.vetcove_id,
|
||||
).await?;
|
||||
|
||||
let mut template = validation.unwrap();
|
||||
template.clear_inputs();
|
||||
|
||||
Ok(template.into_response())
|
||||
}
|
||||
|
||||
#[debug_handler]
|
||||
pub async fn create_item_form_get(
|
||||
State(db): State<SqlitePool>,
|
||||
) -> Result<Response, AppError> {
|
||||
|
||||
let mut base = CreateItemFormData::base_template();
|
||||
base.display_units = db::display_unit::get_display_units(&db).await?;
|
||||
|
||||
Ok(base.into_response())
|
||||
}
|
||||
@ -0,0 +1,41 @@
|
||||
use serde::Serialize;
|
||||
use sqlx::SqlitePool;
|
||||
|
||||
#[derive(Debug, Serialize)]
|
||||
#[derive(sqlx::FromRow)]
|
||||
pub struct DbDisplayUnit {
|
||||
pub id: i64,
|
||||
pub unit: String,
|
||||
pub abbreviation: String,
|
||||
}
|
||||
|
||||
pub async fn get_display_units(db: &SqlitePool) -> anyhow::Result<Vec<DbDisplayUnit>> {
|
||||
let res = sqlx::query_as::<_, DbDisplayUnit>(
|
||||
r#"
|
||||
SELECT
|
||||
id, unit, abbreviation
|
||||
FROM DisplayUnit
|
||||
"#,
|
||||
)
|
||||
.fetch_all(db).await?;
|
||||
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
|
||||
pub async fn inventory_item_get_unit_abbreviation(db: &SqlitePool, id: i64) -> anyhow::Result<String> {
|
||||
let res = sqlx::query!(
|
||||
r#"
|
||||
SELECT
|
||||
unit.abbreviation
|
||||
FROM InventoryItem as item
|
||||
JOIN DisplayUnit as unit
|
||||
ON item.display_unit = unit.id
|
||||
WHERE item.id = ?
|
||||
"#,
|
||||
id
|
||||
)
|
||||
.fetch_one(db).await?;
|
||||
|
||||
Ok(res.abbreviation)
|
||||
}
|
||||
@ -1,50 +1,92 @@
|
||||
{% extends "main.html" %} {% block title %} Items {% endblock %} {% block
|
||||
content %}
|
||||
{% extends "main.html" %}
|
||||
{% block title %} Items {% endblock %}
|
||||
|
||||
<div class="mx-auto mb-4 px-4">
|
||||
<label
|
||||
for="item-filter"
|
||||
class="sr-only mb-2 text-sm font-medium text-gray-900 dark:text-white"
|
||||
>Search</label
|
||||
>
|
||||
<div class="relative mb-4 max-w-56 content-center">
|
||||
<div
|
||||
class="pointer-events-none absolute inset-y-0 start-0 flex items-center ps-3"
|
||||
>
|
||||
<svg
|
||||
class="h-4 w-4 text-gray-500 dark:text-gray-400"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 20 20"
|
||||
>
|
||||
<path
|
||||
stroke="currentColor"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"
|
||||
/>
|
||||
</svg>
|
||||
{% block content %}
|
||||
|
||||
<div class="relative h-auto" x-data="{ show_sidebar: false }" >
|
||||
<div class="absolute w-screen h-full" x-show="show_sidebar">
|
||||
<div class="relative w-full h-full bg-neutral-300 backdrop-blur-md opacity-90 py-4 z-40">
|
||||
</div>
|
||||
<div class="py-2 px-4 absolute rounded-tl-xl inset-y-0 right-0 bg-slate-100 opacity-100 w-11/12 max-w-[40rem] z-50">
|
||||
<div class="flex">
|
||||
<div class="flex-1 inline-flex items-center">
|
||||
<h2 class="text-lg font-semibold uppercase">Add Item</h2>
|
||||
</div>
|
||||
<button
|
||||
class="inline-flex items-center whitespace-nowrap p-2 text-sm font-medium tracking-wide text-neutral-900 transition focus:outline-none focus:ring-4 focus:ring-dark-cyan dark:border-neutral-900 dark:text-slate-100"
|
||||
@click="show_sidebar = ! show_sidebar"
|
||||
>
|
||||
<span class="sr-only">Close Sidebar</span>
|
||||
X
|
||||
</button>
|
||||
</div>
|
||||
<div>
|
||||
<div
|
||||
hx-get="/item/create"
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<input
|
||||
id="item-filter"
|
||||
class="block w-full rounded-lg border border-gray-300 bg-slate-100 p-4 ps-10 text-sm text-neutral-900 focus:border-paynes-gray focus:ring-paynes-gray dark:bg-neutral-900 dark:text-slate-100"
|
||||
type="search"
|
||||
name="q"
|
||||
placeholder="Filter"
|
||||
aria-label="Filter"
|
||||
value='{{ query.search.as_deref().unwrap_or("") }}'
|
||||
hx-get="/items"
|
||||
hx-trigger="search, keyup delay:500ms changed"
|
||||
hx-target="#items"
|
||||
hx-push-url="true"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="items" class="container">
|
||||
{% include "catalog_item_fragment.html" %}
|
||||
<div class="relative h-auto mx-auto max-w-[68.75rem] w-[95vw] px-4 py-4">
|
||||
<div class="flex space-x-4">
|
||||
<div class="relative mb-4 max-w-56 content-center">
|
||||
<label
|
||||
for="item-filter"
|
||||
class="sr-only mb-2 text-sm font-medium text-gray-900 dark:text-white"
|
||||
>
|
||||
Search
|
||||
</label>
|
||||
<div
|
||||
class="pointer-events-none absolute inset-y-0 start-0 flex items-center ps-3"
|
||||
>
|
||||
<svg
|
||||
class="h-4 w-4 text-gray-500 dark:text-gray-400"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 20 20"
|
||||
>
|
||||
<path
|
||||
stroke="currentColor"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<input
|
||||
id="item-filter"
|
||||
class="block w-full rounded-lg border border-gray-300 bg-slate-100 p-4 ps-10 text-sm text-neutral-900 focus:border-paynes-gray focus:ring-paynes-gray dark:bg-neutral-900 dark:text-slate-100"
|
||||
type="search"
|
||||
name="q"
|
||||
placeholder="Filter"
|
||||
aria-label="Filter"
|
||||
value='{{ query.search.as_deref().unwrap_or("") }}'
|
||||
hx-get="/items"
|
||||
hx-trigger="search, keyup delay:500ms changed"
|
||||
hx-target="#items"
|
||||
hx-push-url="true"
|
||||
/>
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<button
|
||||
class="mb-2 me-2 rounded-lg bg-paynes-gray px-5 py-2.5 text-sm font-medium text-slate-100 hover:bg-dark-cyan focus:outline-none focus:ring-4 focus:ring-dark-cyan"
|
||||
@click="show_sidebar = ! show_sidebar"
|
||||
>
|
||||
Add
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="items" class="container">
|
||||
{% include "catalog_item_fragment.html" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@ -1,64 +1,66 @@
|
||||
{% extends "main.html" %} {% block title %} Audit Log {% endblock %} {% block
|
||||
content %}
|
||||
|
||||
<h1 class="mb-4 text-4xl font-extrabold uppercase">Audit Log (Coming soon)</h1>
|
||||
<div class="relative h-auto mx-auto max-w-[68.75rem] w-[95vw] px-4 py-4">
|
||||
<h1 class="mb-4 text-4xl font-extrabold uppercase">Audit Log (Coming soon)</h1>
|
||||
|
||||
<section class="mb-4">
|
||||
<form
|
||||
action="/history"
|
||||
hx-get="/history"
|
||||
hx-trigger="change"
|
||||
hx-target="#items"
|
||||
>
|
||||
<div class="flex between">
|
||||
<div class="px-2">
|
||||
<label for="start-date" class="block">Start Date</label>
|
||||
<input
|
||||
type="date"
|
||||
id="start-date"
|
||||
name="start-date"
|
||||
value="{{ start_date }}"
|
||||
class="block"
|
||||
/>
|
||||
<section class="mb-4">
|
||||
<form
|
||||
action="/history"
|
||||
hx-get="/history"
|
||||
hx-trigger="change"
|
||||
hx-target="#items"
|
||||
>
|
||||
<div class="flex between">
|
||||
<div class="px-2">
|
||||
<label for="start-date" class="block">Start Date</label>
|
||||
<input
|
||||
type="date"
|
||||
id="start-date"
|
||||
name="start-date"
|
||||
value="{{ start_date }}"
|
||||
class="block"
|
||||
/>
|
||||
</div>
|
||||
<div class="px-2">
|
||||
<label for="start-time" class="block">Start Time</label>
|
||||
<input
|
||||
type="time"
|
||||
id="start-time"
|
||||
name="start-time"
|
||||
value="{{ start_time }}"
|
||||
class="block"
|
||||
/>
|
||||
<small class="block text-sm">Timezone {{ time_zone }}</small>
|
||||
</div>
|
||||
<div class="px-2">
|
||||
<label for="end-date" class="block">End Date</label>
|
||||
<input
|
||||
type="date"
|
||||
id="end-date"
|
||||
name="end-date"
|
||||
value="{{ end_date }}"
|
||||
class="block"
|
||||
/>
|
||||
</div>
|
||||
<div class="px-2">
|
||||
<label for="end-time" class="form-label">End Time</label>
|
||||
<input
|
||||
type="time"
|
||||
id="end-time"
|
||||
name="end-time"
|
||||
value="{{ end_time }}"
|
||||
class="block"
|
||||
/>
|
||||
<small class="text-sm block">Timezone {{ time_zone }}</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="px-2">
|
||||
<label for="start-time" class="block">Start Time</label>
|
||||
<input
|
||||
type="time"
|
||||
id="start-time"
|
||||
name="start-time"
|
||||
value="{{ start_time }}"
|
||||
class="block"
|
||||
/>
|
||||
<small class="block text-sm">Timezone {{ time_zone }}</small>
|
||||
</div>
|
||||
<div class="px-2">
|
||||
<label for="end-date" class="block">End Date</label>
|
||||
<input
|
||||
type="date"
|
||||
id="end-date"
|
||||
name="end-date"
|
||||
value="{{ end_date }}"
|
||||
class="block"
|
||||
/>
|
||||
</div>
|
||||
<div class="px-2">
|
||||
<label for="end-time" class="form-label">End Time</label>
|
||||
<input
|
||||
type="time"
|
||||
id="end-time"
|
||||
name="end-time"
|
||||
value="{{ end_time }}"
|
||||
class="block"
|
||||
/>
|
||||
<small class="text-sm block">Timezone {{ time_zone }}</small>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section id="items" class="mb-4">
|
||||
{% include "history_item_fragment.html" %}
|
||||
</section>
|
||||
<section id="items" class="mb-4">
|
||||
{% include "history_item_fragment.html" %}
|
||||
</section>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@ -0,0 +1,135 @@
|
||||
<form
|
||||
hx-post="/item/create"
|
||||
hx-target="this"
|
||||
hx-swap="outerHTML">
|
||||
<div class="mb-5 grid grid-cols-6 gap-4 p-2">
|
||||
<div class="col-span-6">
|
||||
<label for="name" class="mb-2 block text-sm font-medium">Name</label>
|
||||
<input
|
||||
type="text"
|
||||
id="name"
|
||||
name="name"
|
||||
class="block w-11/12 p-2 rounded-lg border border-neutral-900 text-sm text-neutral-900 focus:border-paynes-gray focus:ring-paynes-gray dark:text-slate-100"
|
||||
aria-label="name"
|
||||
value="{{ name_value }}"
|
||||
required
|
||||
{% if !name_error.is_empty() -%}
|
||||
aria-invalid="true"
|
||||
aria-describedby="invalid-name"
|
||||
{% endif -%}
|
||||
/>
|
||||
{% if !name_error.is_empty() -%}
|
||||
<small id="invalid-name" class="block mt-2 text-sm text-cerise">
|
||||
{{ name_error }}
|
||||
</small>
|
||||
{% endif -%}
|
||||
</div>
|
||||
|
||||
<div class="col-span-2">
|
||||
<label for="reorder_point" class="mb-2 block text-sm font-medium">Reorder Point</label>
|
||||
<input
|
||||
type="number"
|
||||
id="reorder_point"
|
||||
name="reorder_point"
|
||||
step="0.01"
|
||||
class="block w-3/4 p-2 rounded-lg border border-neutral-900 text-sm text-neutral-900 focus:border-paynes-gray focus:ring-paynes-gray dark:text-slate-100"
|
||||
aria-label="reorder point"
|
||||
value="{{ reorder_point_value }}"
|
||||
{% if !reorder_point_error.is_empty() -%}
|
||||
aria-invalid="true"
|
||||
aria-describedby="invalid-reorder-point"
|
||||
{% endif -%}
|
||||
/>
|
||||
{% if !reorder_point_error.is_empty() -%}
|
||||
<small id="invalid-reorder-point" class="block mt-2 text-sm text-cerise">
|
||||
{{ pims_id_error }}
|
||||
</small>
|
||||
{% endif -%}
|
||||
</div>
|
||||
|
||||
<div class="col-span-2">
|
||||
<label for="display_unit" class="mb-2 block text-sm font-medium">Unit</label>
|
||||
<select
|
||||
id="display_unit"
|
||||
name="display_unit"
|
||||
class="block rounded-lg border border-neutral-900 p-2 text-sm text-neutral-900 focus:border-paynes-gray focus:ring-paynes-gray dark:text-slate-100"
|
||||
aria-label="name"
|
||||
required
|
||||
{% if !display_unit_error.is_empty() -%}
|
||||
aria-invalid="true"
|
||||
aria-describedby="invalid-display-unit"
|
||||
{% endif -%}
|
||||
>
|
||||
{% for unit in display_units -%}
|
||||
<option value="{{ unit.abbreviation }}" {% if unit.abbreviation == display_unit_value %} selected {% endif %}>{{ unit.unit }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% if !display_unit_error.is_empty() -%}
|
||||
<small id="invalid-display-unit" class="block mt-2 text-sm text-cerise">
|
||||
{{ display_unit_error }}
|
||||
</small>
|
||||
{% endif -%}
|
||||
</div>
|
||||
|
||||
<div class="col-span-2">
|
||||
<label for="allow_fractional_units" class="block mb-2 text-sm font-medium">Fractional</label>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="allow_fractional_units"
|
||||
name="allow_fractional_units"
|
||||
class="block w-4 h-4 text-dark-cyan border-slate-100 rounded-sm focus:ring-space-cadet focus:ring-2"
|
||||
{% if allow_fractional_units_value -%} checked {% endif -%}
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-span-3">
|
||||
<label for="pims_id" class="mb-2 block text-sm font-medium">PIMS Id</label>
|
||||
<input
|
||||
type="text"
|
||||
id="pims_id"
|
||||
name="pims_id"
|
||||
class="block p-2 rounded-lg border border-neutral-900 text-sm text-neutral-900 focus:border-paynes-gray focus:ring-paynes-gray dark:text-slate-100"
|
||||
value="{{ pims_id_value }}"
|
||||
aria-label="pims id"
|
||||
{% if !pims_id_error.is_empty() -%}
|
||||
aria-invalid="true"
|
||||
aria-describedby="invalid-pims-id"
|
||||
{% endif -%}
|
||||
/>
|
||||
{% if !pims_id_error.is_empty() -%}
|
||||
<small id="invalid-pims-id" class="block mt-2 text-sm text-cerise">
|
||||
{{ pims_id_error }}
|
||||
</small>
|
||||
{% endif -%}
|
||||
</div>
|
||||
|
||||
<div class="col-span-3">
|
||||
<label for="vetcove_id" class="mb-2 block text-sm font-medium">Vetcove Id</label>
|
||||
<input
|
||||
type="text"
|
||||
id="vetcove_id"
|
||||
name="vetcove_id"
|
||||
class="block p-2 rounded-lg border border-neutral-900 text-sm text-neutral-900 focus:border-paynes-gray focus:ring-paynes-gray dark:text-slate-100"
|
||||
value="{{ vetcove_id_value }}"
|
||||
aria-label="vetcove id"
|
||||
{% if !vetcove_id_error.is_empty() -%}
|
||||
aria-invalid="true"
|
||||
aria-describedby="invalid-vetcove-id"
|
||||
{% endif -%}
|
||||
/>
|
||||
{% if !vetcove_id_error.is_empty() -%}
|
||||
<small id="invalid-vetcove-id" class="block mt-2 text-sm text-cerise">
|
||||
{{ vetcove_id_error }}
|
||||
</small>
|
||||
{% endif -%}
|
||||
</div>
|
||||
<div class="col-span-4">
|
||||
<button
|
||||
class="mb-2 me-2 rounded-lg bg-english-violet px-5 py-2.5 text-sm font-medium text-slate-100 hover:bg-dark-cyan focus:outline-none focus:ring-4 focus:ring-dark-cyan"
|
||||
>
|
||||
Submit
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@ -1,66 +1,69 @@
|
||||
{% extends "main.html" %} {% block title %} Items {% endblock %} {% block
|
||||
content %}
|
||||
|
||||
<h2 class="mb-4 flex items-center text-4xl font-extrabold">
|
||||
{{item.name}} {% if !item.active %}
|
||||
<span
|
||||
class="me-2 ms-2 rounded border border-cerise bg-orchid-pink px-2.5 py-0.5 text-2xl font-semibold text-cerise"
|
||||
>
|
||||
<div class="relative h-auto mx-auto max-w-[68.75rem] w-[95vw] px-4 py-4">
|
||||
|
||||
<h2 class="mb-4 flex items-center text-4xl font-extrabold">
|
||||
{{item.name}} {% if !item.active %}
|
||||
<span
|
||||
class="me-2 ms-2 rounded border border-cerise bg-orchid-pink px-2.5 py-0.5 text-2xl font-semibold text-cerise"
|
||||
>
|
||||
Inactive
|
||||
</span>
|
||||
{% endif %}
|
||||
</h2>
|
||||
{% endif %}
|
||||
</h2>
|
||||
|
||||
<section
|
||||
hx-get="/item/{{item_id}}/stats"
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML"
|
||||
></section>
|
||||
<section
|
||||
hx-get="/item/{{item_id}}/stats"
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML"
|
||||
></section>
|
||||
|
||||
{% if item.active %}
|
||||
<section
|
||||
class="mx-auto mb-5"
|
||||
x-data="{ negative_form_open: false, positive_form_open: false }"
|
||||
>
|
||||
<div class="flex justify-evenly">
|
||||
<button
|
||||
class="mb-2 me-2 rounded-lg bg-paynes-gray px-5 py-2.5 text-sm font-medium text-slate-100 hover:bg-dark-cyan focus:outline-none focus:ring-4 focus:ring-dark-cyan"
|
||||
@click="negative_form_open = ! negative_form_open"
|
||||
>
|
||||
Minus
|
||||
</button>
|
||||
<button
|
||||
class="mb-2 me-2 rounded-lg bg-paynes-gray px-5 py-2.5 text-sm font-medium text-slate-100 hover:bg-dark-cyan focus:outline-none focus:ring-4 focus:ring-dark-cyan"
|
||||
@click="positive_form_open = ! positive_form_open"
|
||||
>
|
||||
Plus
|
||||
</button>
|
||||
</div>
|
||||
{% if item.active %}
|
||||
<section
|
||||
class="mx-auto mb-5"
|
||||
x-data="{ negative_form_open: false, positive_form_open: false }"
|
||||
>
|
||||
<div class="flex justify-evenly">
|
||||
<button
|
||||
class="mb-2 me-2 rounded-lg bg-paynes-gray px-5 py-2.5 text-sm font-medium text-slate-100 hover:bg-dark-cyan focus:outline-none focus:ring-4 focus:ring-dark-cyan"
|
||||
@click="negative_form_open = ! negative_form_open"
|
||||
>
|
||||
Minus
|
||||
</button>
|
||||
<button
|
||||
class="mb-2 me-2 rounded-lg bg-paynes-gray px-5 py-2.5 text-sm font-medium text-slate-100 hover:bg-dark-cyan focus:outline-none focus:ring-4 focus:ring-dark-cyan"
|
||||
@click="positive_form_open = ! positive_form_open"
|
||||
>
|
||||
Plus
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div x-show="negative_form_open" @click.outside="negative_form_open = false">
|
||||
<div
|
||||
hx-get="/item/{{item_id}}/adjustment/negative"
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML"
|
||||
></div>
|
||||
</div>
|
||||
<div x-show="negative_form_open" @click.outside="negative_form_open = false">
|
||||
<div
|
||||
hx-get="/item/{{item_id}}/adjustment/negative"
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML"
|
||||
></div>
|
||||
</div>
|
||||
|
||||
<div x-show="positive_form_open" @click.outside="positive_form_open = false">
|
||||
<div x-show="positive_form_open" @click.outside="positive_form_open = false">
|
||||
<div
|
||||
hx-get="/item/{{item_id}}/adjustment/positive"
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML"
|
||||
></div>
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
|
||||
<section class="mx-auto">
|
||||
<div
|
||||
hx-get="/item/{{item_id}}/adjustment/positive"
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML"
|
||||
hx-get="/item/{{item_id}}/adjustments"
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML"
|
||||
></div>
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
|
||||
<section class="mx-auto">
|
||||
<div
|
||||
hx-get="/item/{{item_id}}/adjustments"
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML"
|
||||
></div>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
{% extends "main.html" %} {% block content %}
|
||||
|
||||
<h1>Logged out</h1>
|
||||
<p>You have been logged out</p>
|
||||
<p><a href="/auth/login">Log In</a></p>
|
||||
<div class="relative h-auto mx-auto max-w-[68.75rem] w-[95vw] px-4 py-4">
|
||||
<h1 class="text-4xl font-extrabold uppercase">Logged out</h1>
|
||||
<p>You have been logged out</p>
|
||||
<p><a href="/auth/login">Log In</a></p>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{% extends "main.html" %} {% block title %} Overview {% endblock %} {% block
|
||||
content %}
|
||||
|
||||
<h1>Overview (Coming soon)</h1>
|
||||
<h1 class="text-4xl font-extrabold uppercase">Overview (Coming soon)</h1>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@ -1,6 +1,10 @@
|
||||
{% extends "main.html" %} {% block title %} Reports {% endblock %} {% block
|
||||
content %}
|
||||
|
||||
<h1>Reports (Coming soon)</h1>
|
||||
|
||||
<div class="relative h-auto mx-auto max-w-[68.75rem] w-[95vw] px-4 py-4">
|
||||
<h1 class="text-4xl font-extrabold uppercase">Reports (Coming soon)</h1>
|
||||
</div>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@ -1,27 +1,29 @@
|
||||
{% extends "main.html" %} {% block title %} Upload {% endblock %} {% block
|
||||
content %}
|
||||
|
||||
<form
|
||||
action="/upload/catalog"
|
||||
method="post"
|
||||
enctype="multipart/form-data"
|
||||
x-data="{ file: '' }"
|
||||
>
|
||||
<fieldset class="grid">
|
||||
<h3>Catalog Import</h3>
|
||||
<label role="button" class="secondary" x-show="!file">
|
||||
Choose File
|
||||
<input
|
||||
type="file"
|
||||
name="file"
|
||||
x-model="file"
|
||||
style="display: none"
|
||||
required
|
||||
/>
|
||||
</label>
|
||||
<input type="submit" value="Upload" x-show="file" />
|
||||
<input type="reset" value="Cancel" x-show="file" />
|
||||
</fieldset>
|
||||
</form>
|
||||
<div class="relative h-auto mx-auto max-w-[68.75rem] w-[95vw] px-4 py-4">
|
||||
<form
|
||||
action="/upload/catalog"
|
||||
method="post"
|
||||
enctype="multipart/form-data"
|
||||
x-data="{ file: '' }"
|
||||
>
|
||||
<fieldset class="grid">
|
||||
<h3>Catalog Import</h3>
|
||||
<label role="button" class="secondary" x-show="!file">
|
||||
Choose File
|
||||
<input
|
||||
type="file"
|
||||
name="file"
|
||||
x-model="file"
|
||||
style="display: none"
|
||||
required
|
||||
/>
|
||||
</label>
|
||||
<input type="submit" value="Upload" x-show="file" />
|
||||
<input type="reset" value="Cancel" x-show="file" />
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
Loading…
Reference in new issue