diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..6cf0df8 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": true, + "tabWidth": 2, + "singleQuote": false, + "printWidth": 120, + "trailingComma": "es5" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index eb5350e..56bf1f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,18 @@ "name": "doxfood-frontend", "version": "0.0.0", "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.5.2", + "@fortawesome/free-solid-svg-icons": "^6.5.2", + "@fortawesome/vue-fontawesome": "^3.0.8", "@vee-validate/yup": "^4.13.0", "daisyui": "^4.12.2", + "datatables.net-responsive": "^3.0.2", + "datatables.net-select": "^2.0.3", "datatables.net-vue3": "^3.0.1", "leaflet": "^1.9.4", "pinia": "^2.1.7", "pocketbase": "^0.21.3", + "prettier-plugin-tailwindcss": "^0.6.2", "vee-validate": "^4.13.0", "vue": "^3.4.21", "vue-router": "^4.3.2", @@ -418,6 +424,48 @@ "node": ">=12" } }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz", + "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", + "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/vue-fontawesome": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.8.tgz", + "integrity": "sha512-yyHHAj4G8pQIDfaIsMvQpwKMboIZtcHTUvPqXjOHyldh1O1vZfH4W03VDPv5RvI9P6DLTzJQlmVgj9wCf7c2Fw==", + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "vue": ">= 3.0.0 < 4" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1176,11 +1224,28 @@ "version": "2.0.8", "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-2.0.8.tgz", "integrity": "sha512-4/2dYx4vl975zQqZbyoVEm0huPe61qffjBRby7K7V+y9E+ORq4R8KavkgrNMmIgO6cl85Pg4AvCbVjvPCIT1Yg==", - "peer": true, "dependencies": { "jquery": ">=1.7" } }, + "node_modules/datatables.net-responsive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/datatables.net-responsive/-/datatables.net-responsive-3.0.2.tgz", + "integrity": "sha512-OVsrTfcYvT8YtnOeCef51veKc+DABVPWOypvID+xFzCgyBDCIgcauTk+H5zItOscXw/CwSIbGN9zD6Sxa7lZPA==", + "dependencies": { + "datatables.net": "^2", + "jquery": ">=1.7" + } + }, + "node_modules/datatables.net-select": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/datatables.net-select/-/datatables.net-select-2.0.3.tgz", + "integrity": "sha512-Fw7/uAlpOTfz8R8JAXDV4qHfP2MA+4vnNSYjuo9NVbkwrA/71t+KGN2JRugCTTzJuiyQ8YN6thzC9lPBqd/7nA==", + "dependencies": { + "datatables.net": "^2", + "jquery": ">=1.7" + } + }, "node_modules/datatables.net-vue3": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/datatables.net-vue3/-/datatables.net-vue3-3.0.1.tgz", @@ -1537,8 +1602,7 @@ "node_modules/jquery": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", - "peer": true + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" }, "node_modules/leaflet": { "version": "1.9.4", @@ -1961,6 +2025,94 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prettier": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.2.tgz", + "integrity": "sha512-eFefm4cg+1c2B57+H274Qm//CTWBdtQN9ansl0YTP/8TC8x3bugCTQSS/e4FC5Ctl9djhTzsbcMrZ7x2/abIow==", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig-melody": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig-melody": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, "node_modules/property-expr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", diff --git a/package.json b/package.json index 8b86076..2b5ee2e 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,18 @@ "preview": "vite preview" }, "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.5.2", + "@fortawesome/free-solid-svg-icons": "^6.5.2", + "@fortawesome/vue-fontawesome": "^3.0.8", "@vee-validate/yup": "^4.13.0", "daisyui": "^4.12.2", + "datatables.net-responsive": "^3.0.2", + "datatables.net-select": "^2.0.3", "datatables.net-vue3": "^3.0.1", "leaflet": "^1.9.4", "pinia": "^2.1.7", "pocketbase": "^0.21.3", + "prettier-plugin-tailwindcss": "^0.6.2", "vee-validate": "^4.13.0", "vue": "^3.4.21", "vue-router": "^4.3.2", diff --git a/src/assets/datatable.css b/src/assets/datatable.css index 123ec85..d1e59c3 100644 --- a/src/assets/datatable.css +++ b/src/assets/datatable.css @@ -31,4 +31,12 @@ } } +} + +.dataTable { + .selected { + @apply bg-gray-300; + @apply hover:bg-gray-300; + } + } \ No newline at end of file diff --git a/src/assets/map.css b/src/assets/map.css new file mode 100644 index 0000000..dd4ada3 --- /dev/null +++ b/src/assets/map.css @@ -0,0 +1,9 @@ +#map { + height: 90vh; +} + +@media (width < 640px) { + #map { + height: 50vh; + } +} \ No newline at end of file diff --git a/src/components/NavigationBar.vue b/src/components/NavigationBar.vue index 04e96ac..c860eaa 100644 --- a/src/components/NavigationBar.vue +++ b/src/components/NavigationBar.vue @@ -4,36 +4,61 @@ import { currentUser, signOut } from "../pocketbase"; diff --git a/src/components/RestaurantsMap.vue b/src/components/RestaurantsMap.vue index 66525cf..4a64ed3 100644 --- a/src/components/RestaurantsMap.vue +++ b/src/components/RestaurantsMap.vue @@ -1,22 +1,40 @@ - diff --git a/src/components/RestaurantsTable.vue b/src/components/RestaurantsTable.vue index 607c972..efa030f 100644 --- a/src/components/RestaurantsTable.vue +++ b/src/components/RestaurantsTable.vue @@ -3,6 +3,7 @@ import "../assets/datatable.css"; import DataTable from "datatables.net-vue3"; import DataTablesCore from "datatables.net"; +import "datatables.net-select"; import { PropType } from "vue"; DataTable.use(DataTablesCore); @@ -14,7 +15,16 @@ const props = defineProps({ const columns = [ { data: "name", title: "Name" }, { data: "tags", title: "Tags" }, + { data: "average_rating", title: "" }, ]; + +function onRowSelected(e, dt, type, indexes) { + if (indexes.length != 0 && props.data !== undefined) { + emit("restaurantSelected", props.data[indexes[0]]); + } +} + +const emit = defineEmits(["restaurantSelected"]); diff --git a/src/components/ReviewsDrawer.vue b/src/components/ReviewsDrawer.vue new file mode 100644 index 0000000..db75a89 --- /dev/null +++ b/src/components/ReviewsDrawer.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/components/ReviewsList.vue b/src/components/ReviewsList.vue new file mode 100644 index 0000000..832b8f2 --- /dev/null +++ b/src/components/ReviewsList.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/main.ts b/src/main.ts index 7b71f4d..62ae40b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,12 @@ import "./style.css"; import { createApp } from "vue"; import { createPinia } from "pinia"; +import { library } from "@fortawesome/fontawesome-svg-core"; +import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; +import { faBars, faUser, faXmark } from "@fortawesome/free-solid-svg-icons"; + +library.add(faBars, faUser, faXmark); + import App from "./App.vue"; import router from "./router"; @@ -11,4 +17,6 @@ const app = createApp(App); app.use(createPinia()); app.use(router); +app.component("font-awesome-icon", FontAwesomeIcon); + app.mount("#app"); diff --git a/src/utils/average.ts b/src/utils/average.ts new file mode 100644 index 0000000..6c686cd --- /dev/null +++ b/src/utils/average.ts @@ -0,0 +1 @@ +export const average = (array) => array.reduce((a, b) => a + b) / array.length; diff --git a/src/views/CreateView.vue b/src/views/CreateView.vue index 8757c58..25c4998 100644 --- a/src/views/CreateView.vue +++ b/src/views/CreateView.vue @@ -33,13 +33,14 @@ onMounted(async () => { const tags = await pb.collection("tags").getFullList(); tagsModel.value = tags.map((record) => record.name); }); + +function onUpdateSelectedTags(selected: string[]) { + tagsModel.value = selected; +}