diff --git a/index.html b/index.html
index c7569eb9..be2eb79c 100644
--- a/index.html
+++ b/index.html
@@ -6,7 +6,7 @@
-
Truck Wash
+ Truck Wash
diff --git a/package-lock.json b/package-lock.json
index af333260..0008f0e9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,18 +17,21 @@
"animate.css": "^4.1.1",
"axios": "^1.7.8",
"bulma": "^1.0.2",
+ "bulma-block-list": "^1.1.0",
"bulma-calendar": "^7.1.1",
"bulma-list": "^3.0.0",
"bulma-pageloader": "^0.3.0",
"bulma-quickview": "^2.0.0",
"bulma-switch": "^2.0.4",
"chart.js": "^4.4.7",
+ "dayspan-vuetify": "^0.4.0",
"flow": "^0.2.3",
"sass": "^1.81.1",
"sweetalert2": "^11.14.5",
"toastify-js": "^1.12.0",
"vite-plugin-singlefile": "^2.1.0",
"vue": "^3.5.12",
+ "vue-cal": "^5.0.1-rc.20",
"vue-chartjs": "^5.3.2",
"vue-popperjs": "^2.3.0",
"vue-router": "^4.5.0",
@@ -36,6 +39,8 @@
},
"devDependencies": {
"@creativebulma/bulma-divider": "^1.1.0",
+ "@event-calendar/core": "^4.1.0",
+ "@types/event-calendar__core": "^3.7.0",
"@vitejs/plugin-vue": "^5.1.4",
"@vitejs/plugin-vue-jsx": "^4.1.2",
"sass-embedded": "^1.81.0",
@@ -1840,6 +1845,15 @@
"node": ">=12"
}
},
+ "node_modules/@event-calendar/core": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@event-calendar/core/-/core-4.1.0.tgz",
+ "integrity": "sha512-orU66fl1p9zLVTFkz9WUWH53H6GxMnyxBx7mYMobQO0mbdJ+tbCJ9W9xL00MyHBQk1sJFdINc6YyIlVdqpFTRw==",
+ "dev": true,
+ "dependencies": {
+ "svelte": "^5.28.2"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
@@ -2453,6 +2467,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@sveltejs/acorn-typescript": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz",
+ "integrity": "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^8.9.0"
+ }
+ },
"node_modules/@sweetalert2/theme-bulma": {
"version": "5.0.18",
"resolved": "https://registry.npmjs.org/@sweetalert2/theme-bulma/-/theme-bulma-5.0.18.tgz",
@@ -2468,6 +2491,49 @@
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
},
+ "node_modules/@types/event-calendar__core": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@types/event-calendar__core/-/event-calendar__core-3.7.0.tgz",
+ "integrity": "sha512-mNyYp2PeQ+pP9msbMcDLuYhZwDZDUgQWl/pniZRaNfckPxo31x3ue10Lv7tFlHAKihgw7a2Ogw2S5PHjGm7dLA==",
+ "dev": true,
+ "dependencies": {
+ "svelte": "^4"
+ }
+ },
+ "node_modules/@types/event-calendar__core/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/@types/event-calendar__core/node_modules/svelte": {
+ "version": "4.2.19",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz",
+ "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.15",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/estree": "^1.0.1",
+ "acorn": "^8.9.0",
+ "aria-query": "^5.3.0",
+ "axobject-query": "^4.0.0",
+ "code-red": "^1.0.3",
+ "css-tree": "^2.3.1",
+ "estree-walker": "^3.0.3",
+ "is-reference": "^3.0.1",
+ "locate-character": "^3.0.0",
+ "magic-string": "^0.30.4",
+ "periscopic": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/@types/web-bluetooth": {
"version": "0.0.20",
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
@@ -2837,11 +2903,32 @@
"url": "https://github.com/sponsors/antfu"
}
},
+ "node_modules/acorn": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/animate.css": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz",
"integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="
},
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -2857,6 +2944,15 @@
"proxy-from-env": "^1.1.0"
}
},
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.4.13",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz",
@@ -2955,6 +3051,14 @@
"resolved": "https://registry.npmjs.org/bulma/-/bulma-1.0.2.tgz",
"integrity": "sha512-D7GnDuF6seb6HkcnRMM9E739QpEY9chDzzeFrHMyEns/EXyDJuQ0XA0KxbBl/B2NTsKSoDomW61jFGFaAxhK5A=="
},
+ "node_modules/bulma-block-list": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/bulma-block-list/-/bulma-block-list-1.1.0.tgz",
+ "integrity": "sha512-GFBRrLs7Wrja+QlGAGDlFu8y+4/9eBaPMN6DdKZ2+se95YjFM6gshRp5FdHwpTCZT9TRpyY+slHTtpOGgEFcKg==",
+ "dependencies": {
+ "bulma": "^1.0.0"
+ }
+ },
"node_modules/bulma-calendar": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/bulma-calendar/-/bulma-calendar-7.1.1.tgz",
@@ -3048,6 +3152,37 @@
"url": "https://paulmillr.com/funding/"
}
},
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/code-red": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz",
+ "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15",
+ "@types/estree": "^1.0.1",
+ "acorn": "^8.10.0",
+ "estree-walker": "^3.0.3",
+ "periscopic": "^3.1.0"
+ }
+ },
+ "node_modules/code-red/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
"node_modules/colorjs.io": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz",
@@ -3111,6 +3246,19 @@
"node": ">= 8"
}
},
+ "node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
@@ -3227,6 +3375,63 @@
"url": "https://opencollective.com/date-fns"
}
},
+ "node_modules/dayspan": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/dayspan/-/dayspan-0.12.5.tgz",
+ "integrity": "sha512-/IkvULBqTRJjUnmKcu3nAGpo04mIszC+ua1ItZadNRxfMKzplmxEljHytOpHdOyl6GF3V7de8oxgep7emeivNA==",
+ "engines": {
+ "node": ">=6.9"
+ },
+ "peerDependencies": {
+ "moment": "^2.24.0"
+ }
+ },
+ "node_modules/dayspan-vuetify": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/dayspan-vuetify/-/dayspan-vuetify-0.4.0.tgz",
+ "integrity": "sha512-YoCFu1hZsvklDQXm8IBRvY00v/B06F/h6yS0k4GALEqrzlqY0EKF4UUdjlr5xMRoKuw7NTA//4V4twOQ8H3D/A==",
+ "dependencies": {
+ "dayspan": "^0.12.2",
+ "material-design-icons-iconfont": "^3.0.3",
+ "vue": "^2.3.3",
+ "vuetify": "^1.3.9"
+ },
+ "engines": {
+ "node": ">= 4.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/dayspan-vuetify/node_modules/@vue/compiler-sfc": {
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
+ "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
+ "dependencies": {
+ "@babel/parser": "^7.23.5",
+ "postcss": "^8.4.14",
+ "source-map": "^0.6.1"
+ },
+ "optionalDependencies": {
+ "prettier": "^1.18.2 || ^2.0.0"
+ }
+ },
+ "node_modules/dayspan-vuetify/node_modules/vue": {
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz",
+ "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
+ "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.",
+ "dependencies": {
+ "@vue/compiler-sfc": "2.7.16",
+ "csstype": "^3.1.0"
+ }
+ },
+ "node_modules/dayspan-vuetify/node_modules/vuetify": {
+ "version": "1.5.23",
+ "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-1.5.23.tgz",
+ "integrity": "sha512-T6ZAli8jWHRsDIjQmB4UG4iXJtwH1M+H5/8Cd76m6XKcic93R6qnKI1IK9OFIVqcrZc1Iw1kDeQWG35iQt0M2Q==",
+ "peerDependencies": {
+ "vue": "^2.5.18"
+ }
+ },
"node_modules/debug": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
@@ -3373,6 +3578,21 @@
"node": ">=6"
}
},
+ "node_modules/esm-env": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
+ "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
+ "dev": true
+ },
+ "node_modules/esrap": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.6.tgz",
+ "integrity": "sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ }
+ },
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
@@ -3688,6 +3908,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-reference": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
+ "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.6"
+ }
+ },
"node_modules/is-stream": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
@@ -3790,6 +4019,12 @@
"integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
"dev": true
},
+ "node_modules/locate-character": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
+ "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
+ "dev": true
+ },
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -3811,6 +4046,17 @@
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
+ "node_modules/material-design-icons-iconfont": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/material-design-icons-iconfont/-/material-design-icons-iconfont-3.0.3.tgz",
+ "integrity": "sha512-wbvGpfJGLDuL0bj9pFd4sjXvGqukKraViSFRVDLk97s/GrKs/rGv9Eo2286jkxfFqkYXczyJrglUZlbyfFVOFw=="
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "dev": true
+ },
"node_modules/micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
@@ -3873,6 +4119,15 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/mrmime": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
@@ -4007,6 +4262,26 @@
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
"dev": true
},
+ "node_modules/periscopic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
+ "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "is-reference": "^3.0.0"
+ }
+ },
+ "node_modules/periscopic/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -4061,6 +4336,21 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "optional": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
"node_modules/pretty-ms": {
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz",
@@ -4655,6 +4945,14 @@
"node": ">=18"
}
},
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -4722,6 +5020,31 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/svelte": {
+ "version": "5.28.2",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.28.2.tgz",
+ "integrity": "sha512-FbWBxgWOpQfhKvoGJv/TFwzqb4EhJbwCD17dB0tEpQiw1XyUEKZJtgm4nA4xq3LLsMo7hu5UY/BOFmroAxKTMg==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.3.0",
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@sveltejs/acorn-typescript": "^1.0.5",
+ "@types/estree": "^1.0.5",
+ "acorn": "^8.12.1",
+ "aria-query": "^5.3.1",
+ "axobject-query": "^4.1.0",
+ "clsx": "^2.1.1",
+ "esm-env": "^1.2.1",
+ "esrap": "^1.4.6",
+ "is-reference": "^3.0.3",
+ "locate-character": "^3.0.0",
+ "magic-string": "^0.30.11",
+ "zimmerframe": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/svg-tags": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
@@ -5058,6 +5381,17 @@
}
}
},
+ "node_modules/vue-cal": {
+ "version": "5.0.1-rc.20",
+ "resolved": "https://registry.npmjs.org/vue-cal/-/vue-cal-5.0.1-rc.20.tgz",
+ "integrity": "sha512-3Nsngu7MiNmDDf8uQf8nRznRW5VYmRbFC8Yq9rP8vGY7mWYgC6/2BHy3eO2S2gvgvV7nbmSR46lkd8zI5AShgg==",
+ "funding": {
+ "url": "https://github.com/sponsors/antoniandre"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
"node_modules/vue-chartjs": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-5.3.2.tgz",
@@ -5133,6 +5467,12 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/zimmerframe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz",
+ "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==",
+ "dev": true
}
}
}
diff --git a/package.json b/package.json
index 00063890..7fa29203 100644
--- a/package.json
+++ b/package.json
@@ -18,18 +18,21 @@
"animate.css": "^4.1.1",
"axios": "^1.7.8",
"bulma": "^1.0.2",
+ "bulma-block-list": "^1.1.0",
"bulma-calendar": "^7.1.1",
"bulma-list": "^3.0.0",
"bulma-pageloader": "^0.3.0",
"bulma-quickview": "^2.0.0",
"bulma-switch": "^2.0.4",
"chart.js": "^4.4.7",
+ "dayspan-vuetify": "^0.4.0",
"flow": "^0.2.3",
"sass": "^1.81.1",
"sweetalert2": "^11.14.5",
"toastify-js": "^1.12.0",
"vite-plugin-singlefile": "^2.1.0",
"vue": "^3.5.12",
+ "vue-cal": "^5.0.1-rc.20",
"vue-chartjs": "^5.3.2",
"vue-popperjs": "^2.3.0",
"vue-router": "^4.5.0",
@@ -37,6 +40,8 @@
},
"devDependencies": {
"@creativebulma/bulma-divider": "^1.1.0",
+ "@event-calendar/core": "^4.1.0",
+ "@types/event-calendar__core": "^3.7.0",
"@vitejs/plugin-vue": "^5.1.4",
"@vitejs/plugin-vue-jsx": "^4.1.2",
"sass-embedded": "^1.81.0",
diff --git a/src/components/displays/department/pos/PosSelectedCustomer.vue b/src/components/displays/department/pos/PosSelectedCustomer.vue
index 9ebbab17..fd2e6411 100644
--- a/src/components/displays/department/pos/PosSelectedCustomer.vue
+++ b/src/components/displays/department/pos/PosSelectedCustomer.vue
@@ -3,6 +3,7 @@ import { customer_name, customer_id, customer_data, customer_attributes, loadCus
import { createAttribute, deleteAttribute } from "@/components/shop/CustomerAttributes.vue";
import {ref, watch} from 'vue';
import 'bulma-switch/dist/css/bulma-switch.min.css';
+import 'bulma-block-list/src/block-list.scss';
import {SessionUser} from "@/components/session/token/SessionUser.vue";
import {popperBox, popper, removePopperIfOpen, showPopperWithContent, showPopper} from "@/components/displays/PopperDefault.vue";
import RequiresPermission from "@/components/displays/permissionbased/RequiresPermission.vue";
diff --git a/src/components/displays/department/timebookings/departmentTimeBookingsTypesTable.vue b/src/components/displays/department/timebookings/departmentTimeBookingsTypesTable.vue
new file mode 100644
index 00000000..9fc2a493
--- /dev/null
+++ b/src/components/displays/department/timebookings/departmentTimeBookingsTypesTable.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+ | {{su_object.columns.id.label}} |
+ {{su_object.columns.name.label}} |
+ {{su_object.columns.description.label}} |
+ {{su_object.columns.duration.label}} |
+ |
+
+
+
+
+ | {{obj.id}} |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+ | {{SessionUser.objects.global.language.showing}} {{ objects.length }} {{su_object.meta.labels.multiple}} |
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/displays/pagination/models/DepartmentPos/TimeBookingsTypesPagination.vue b/src/components/displays/pagination/models/DepartmentPos/TimeBookingsTypesPagination.vue
new file mode 100644
index 00000000..06c56748
--- /dev/null
+++ b/src/components/displays/pagination/models/DepartmentPos/TimeBookingsTypesPagination.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{SessionUser.objects.global.language.reload}}
+
+
+
\ No newline at end of file
diff --git a/src/components/menus/admin/AdminLeftMenu.vue b/src/components/menus/admin/AdminLeftMenu.vue
index aa68fcfa..006b59d8 100644
--- a/src/components/menus/admin/AdminLeftMenu.vue
+++ b/src/components/menus/admin/AdminLeftMenu.vue
@@ -121,6 +121,47 @@ const menu_items = ref([
'list_bookings'
]
},
+ {
+ name: 'Tidsbooking',
+ route: '/admin/' + SessionUser.functions.getDepartmentIdFromUrl() + '/modules/time-bookings',
+ icon: 'fas fa-exchange-alt',
+ children: [
+ {
+ name: 'Bookinger',
+ route: '/admin/' + SessionUser.functions.getDepartmentIdFromUrl() + '/modules/time-bookings',
+ icon: 'fas fa-exchange-alt',
+ children: [],
+ hidden: isDepartmentIdUndefined,
+ permissions: [
+ 'list_time_bookings'
+ ]
+ },
+ {
+ name: 'Åbningstider',
+ route: '/admin/' + SessionUser.functions.getDepartmentIdFromUrl() + '/modules/time-bookings/opening-hours',
+ icon: 'fas fa-exchange-alt',
+ children: [],
+ hidden: isDepartmentIdUndefined,
+ permissions: [
+ 'list_opening_hours'
+ ]
+ },
+ {
+ name: 'Opsætning',
+ route: '/admin/' + SessionUser.functions.getDepartmentIdFromUrl() + '/modules/time-bookings/types',
+ icon: 'fas fa-exchange-alt',
+ children: [],
+ hidden: isDepartmentIdUndefined,
+ permissions: [
+ 'list_time_bookings_setup'
+ ]
+ },
+ ],
+ hidden: isDepartmentIdUndefined,
+ permissions: [
+ 'list_time_bookings'
+ ]
+ },
{
name: 'Dagsopgørelse',
route: '/admin/' + SessionUser.functions.getDepartmentIdFromUrl() + '/modules/daily-report',
diff --git a/src/components/session/token/SessionUser.vue b/src/components/session/token/SessionUser.vue
index 3921a603..07b38370 100644
--- a/src/components/session/token/SessionUser.vue
+++ b/src/components/session/token/SessionUser.vue
@@ -24,6 +24,8 @@ import {Forms} from "@/components/session/token/SessionUser/Objects/Forms.vue";
import {Branding} from "@/components/session/token/SessionUser/Objects/Brandings.vue";
import {Vehicles} from "@/components/session/token/SessionUser/Objects/Vehicles.vue";
import {DepartmentNotificationSms} from "@/components/session/token/SessionUser/Objects/DepartmentNotificationSms.vue";
+import {DepartmentTimeBookingsOpeningHours} from "@/components/session/token/SessionUser/Objects/DepartmentTimeBookingsOpeningHours.vue";
+import {DepartmentTimeBookingsTypes} from "@/components/session/token/SessionUser/Objects/DepartmentTimeBookingsTypes.vue";
import {ObjectsGlobal} from "@/components/session/token/SessionUser/Objects/ObjectsGlobal.vue";
import {useRouter} from "vue-router";
import Swal from "sweetalert2";
@@ -202,6 +204,8 @@ export const SessionUser = {
Branding: Branding,
vehicles: Vehicles,
department_notification_sms: DepartmentNotificationSms,
+ department_time_bookings_opening_hours: DepartmentTimeBookingsOpeningHours,
+ department_time_bookings_types: DepartmentTimeBookingsTypes,
global: ObjectsGlobal,
},
/** The user's token & authentication status */
@@ -378,6 +382,16 @@ export const SessionUser = {
getDateYear(date) {
return new Date(date).getFullYear();
},
+ getDateAtTime(date, hours, minutes, seconds) {
+ const newDate = new Date(date);
+ newDate.setHours(hours);
+ newDate.setMinutes(minutes);
+ newDate.setSeconds(seconds);
+ return newDate;
+ },
+ getWeekdayNameToLocal(date) {
+ return new Date(date).toLocaleString('da-DK', { weekday: 'long' });
+ }
},
/** Redirect to */
redirectTo: {
diff --git a/src/components/session/token/SessionUser/Objects/DepartmentTimeBookingsOpeningHours.vue b/src/components/session/token/SessionUser/Objects/DepartmentTimeBookingsOpeningHours.vue
new file mode 100644
index 00000000..75889e91
--- /dev/null
+++ b/src/components/session/token/SessionUser/Objects/DepartmentTimeBookingsOpeningHours.vue
@@ -0,0 +1,334 @@
+
\ No newline at end of file
diff --git a/src/components/session/token/SessionUser/Objects/DepartmentTimeBookingsTypes.vue b/src/components/session/token/SessionUser/Objects/DepartmentTimeBookingsTypes.vue
new file mode 100644
index 00000000..b3df07eb
--- /dev/null
+++ b/src/components/session/token/SessionUser/Objects/DepartmentTimeBookingsTypes.vue
@@ -0,0 +1,147 @@
+
\ No newline at end of file
diff --git a/src/components/session/token/SessionUser/Objects/ObjectsGlobal.vue b/src/components/session/token/SessionUser/Objects/ObjectsGlobal.vue
index 64f9539b..9a18c093 100644
--- a/src/components/session/token/SessionUser/Objects/ObjectsGlobal.vue
+++ b/src/components/session/token/SessionUser/Objects/ObjectsGlobal.vue
@@ -23,8 +23,12 @@ export const ObjectsGlobal = {
close: "Luk",
note: "Note",
succeeded: "Fuldførte",
+ opening_hours: "Åbningstider",
customers: "Kunder",
selected: "Valgt",
+ weekday: "Ugedag",
+ opening_hour: "Åbningstid",
+ closing_hour: "Lukketid",
found: "Fundet",
waiting: "Afventer",
selected_multiple: "Valgte",
diff --git a/src/components/timebookings/TimeBookingsCalendar.vue b/src/components/timebookings/TimeBookingsCalendar.vue
new file mode 100644
index 00000000..45604081
--- /dev/null
+++ b/src/components/timebookings/TimeBookingsCalendar.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
Time Bookings Calendar
+
This is the Time Bookings Calendar component.
+
Department ID: {{ departmentId }}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/timebookings/displays/Calendar.vue b/src/components/timebookings/displays/Calendar.vue
new file mode 100644
index 00000000..80f9f84d
--- /dev/null
+++ b/src/components/timebookings/displays/Calendar.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/router.js b/src/router.js
index ae82994d..5acce2e9 100644
--- a/src/router.js
+++ b/src/router.js
@@ -90,6 +90,12 @@ import DepartmentNotifications
import Vehicles from "@/views/dashboards/superUserDashboard/Vehicles.vue";
import ConfigurationXLVask from "@/views/dashboards/superUserDashboard/configuration/ConfigurationXLVask.vue";
import UserXLVask from "@/views/dashboards/superUserDashboard/user/UserXLVask.vue";
+import DepartmentTimeBookings
+ from "@/views/dashboards/departmentDashboard/modules/time-bookings/DepartmentTimeBookings.vue";
+import DepartmentTimeBookingsOpeningHours
+ from "@/views/dashboards/departmentDashboard/modules/time-bookings/DepartmentTimeBookingsOpeningHours.vue";
+import DepartmentTimeBookingsTypes
+ from "@/views/dashboards/departmentDashboard/modules/time-bookings/DepartmentTimeBookingsTypes.vue";
// Export the router as router
export const router = createRouter({
@@ -222,6 +228,24 @@ export const router = createRouter({
component: DepartmentDailyReport,
meta: { middleware: adminMiddleware }
},
+ {
+ name: 'timebookings',
+ path: '/admin/:departmentId/modules/time-bookings',
+ component: DepartmentTimeBookings,
+ meta: { middleware: adminMiddleware }
+ },
+ {
+ name: 'timebookingsopeninghours',
+ path: '/admin/:departmentId/modules/time-bookings/opening-hours',
+ component: DepartmentTimeBookingsOpeningHours,
+ meta: { middleware: adminMiddleware }
+ },
+ {
+ name: 'timebookingstypes',
+ path: '/admin/:departmentId/modules/time-bookings/types',
+ component: DepartmentTimeBookingsTypes,
+ meta: { middleware: adminMiddleware }
+ },
{
name: 'superuser',
path: '/superuser',
diff --git a/src/views/dashboards/departmentDashboard/modules/bookings/DepartmentBookings.vue b/src/views/dashboards/departmentDashboard/modules/bookings/DepartmentBookings.vue
index cb8b2d3a..6d98e5b7 100644
--- a/src/views/dashboards/departmentDashboard/modules/bookings/DepartmentBookings.vue
+++ b/src/views/dashboards/departmentDashboard/modules/bookings/DepartmentBookings.vue
@@ -1,8 +1,4 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/dashboards/departmentDashboard/modules/time-bookings/DepartmentTimeBookingsOpeningHours.vue b/src/views/dashboards/departmentDashboard/modules/time-bookings/DepartmentTimeBookingsOpeningHours.vue
new file mode 100644
index 00000000..d894dd1a
--- /dev/null
+++ b/src/views/dashboards/departmentDashboard/modules/time-bookings/DepartmentTimeBookingsOpeningHours.vue
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/dashboards/departmentDashboard/modules/time-bookings/DepartmentTimeBookingsTypes.vue b/src/views/dashboards/departmentDashboard/modules/time-bookings/DepartmentTimeBookingsTypes.vue
new file mode 100644
index 00000000..dc737e79
--- /dev/null
+++ b/src/views/dashboards/departmentDashboard/modules/time-bookings/DepartmentTimeBookingsTypes.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file