├── .gitignore ├── .vscode └── settings.json ├── README.md ├── frontend ├── .gitignore ├── .prettierrc.json ├── README.md ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public │ └── favicon.png ├── src │ ├── App.vue │ ├── assets │ │ └── Inter │ │ │ ├── Inter-Black.woff │ │ │ ├── Inter-Black.woff2 │ │ │ ├── Inter-BlackItalic.woff │ │ │ ├── Inter-BlackItalic.woff2 │ │ │ ├── Inter-Bold.woff │ │ │ ├── Inter-Bold.woff2 │ │ │ ├── Inter-BoldItalic.woff │ │ │ ├── Inter-BoldItalic.woff2 │ │ │ ├── Inter-ExtraBold.woff │ │ │ ├── Inter-ExtraBold.woff2 │ │ │ ├── Inter-ExtraBoldItalic.woff │ │ │ ├── Inter-ExtraBoldItalic.woff2 │ │ │ ├── Inter-ExtraLight.woff │ │ │ ├── Inter-ExtraLight.woff2 │ │ │ ├── Inter-ExtraLightItalic.woff │ │ │ ├── Inter-ExtraLightItalic.woff2 │ │ │ ├── Inter-Italic.woff │ │ │ ├── Inter-Italic.woff2 │ │ │ ├── Inter-Light.woff │ │ │ ├── Inter-Light.woff2 │ │ │ ├── Inter-LightItalic.woff │ │ │ ├── Inter-LightItalic.woff2 │ │ │ ├── Inter-Medium.woff │ │ │ ├── Inter-Medium.woff2 │ │ │ ├── Inter-MediumItalic.woff │ │ │ ├── Inter-MediumItalic.woff2 │ │ │ ├── Inter-Regular.woff │ │ │ ├── Inter-Regular.woff2 │ │ │ ├── Inter-SemiBold.woff │ │ │ ├── Inter-SemiBold.woff2 │ │ │ ├── Inter-SemiBoldItalic.woff │ │ │ ├── Inter-SemiBoldItalic.woff2 │ │ │ ├── Inter-Thin.woff │ │ │ ├── Inter-Thin.woff2 │ │ │ ├── Inter-ThinItalic.woff │ │ │ ├── Inter-ThinItalic.woff2 │ │ │ ├── Inter-italic.var.woff2 │ │ │ ├── Inter-roman.var.woff2 │ │ │ ├── Inter.var.woff2 │ │ │ └── inter.css │ ├── components │ │ ├── Drawer.vue │ │ ├── Project.vue │ │ └── ProjectPage.vue │ ├── data │ │ ├── session.js │ │ └── user.js │ ├── form │ │ └── components │ │ │ ├── Autocomplete.vue │ │ │ ├── Checkbox.vue │ │ │ ├── Date.vue │ │ │ ├── DateTime.vue │ │ │ ├── FileUploader.vue │ │ │ ├── Int.vue │ │ │ ├── NumberCard.vue │ │ │ ├── Password.vue │ │ │ ├── Phone.vue │ │ │ ├── Select.vue │ │ │ ├── Table.vue │ │ │ ├── Text.vue │ │ │ ├── TextArea.vue │ │ │ └── Time.vue │ ├── index.css │ ├── main.js │ ├── pages │ │ ├── ForgetPassword.vue │ │ ├── Home.vue │ │ ├── Login.vue │ │ ├── SignUp.vue │ │ └── builder │ │ │ ├── Builder.vue │ │ │ ├── base_builder.js │ │ │ ├── builder.txt │ │ │ └── components │ │ │ ├── BuilderCanvas.vue │ │ │ ├── FieldList.vue │ │ │ ├── FormItem.vue │ │ │ └── FormList.vue │ └── router.js ├── tailwind.config.js ├── vite.config.js └── yarn.lock ├── license.txt ├── package-lock.json ├── package.json ├── pwa_builder ├── __init__.py ├── api.py ├── config │ └── __init__.py ├── hooks.py ├── modules.txt ├── patches.txt ├── public │ ├── .gitkeep │ └── frontend │ │ ├── assets │ │ ├── Builder.16b34fe4.css │ │ ├── Builder.6fcab140.js │ │ ├── FontColor.1e856187.js │ │ ├── ForgetPassword.4ab31139.js │ │ ├── ForgetPassword.ff081949.css │ │ ├── Home.0dc89f50.js │ │ ├── Home.4ebe753f.css │ │ ├── InsertImage.ad5d33f0.js │ │ ├── InsertLink.059637e9.js │ │ ├── InsertVideo.51aadb44.js │ │ ├── Inter-Black.05e55dd7.woff2 │ │ ├── Inter-Black.9c79713b.woff │ │ ├── Inter-Black.bc2198e0.woff2 │ │ ├── Inter-BlackItalic.1cb529a7.woff2 │ │ ├── Inter-BlackItalic.4ff7db4a.woff2 │ │ ├── Inter-BlackItalic.7ecbf9fa.woff │ │ ├── Inter-Bold.1dc41a58.woff2 │ │ ├── Inter-Bold.2b828bef.woff │ │ ├── Inter-Bold.2efd8e3c.woff2 │ │ ├── Inter-BoldItalic.8bc8e0ff.woff │ │ ├── Inter-BoldItalic.dc0d4194.woff2 │ │ ├── Inter-BoldItalic.f528d863.woff2 │ │ ├── Inter-DisplayBlack.b1d4e33d.woff2 │ │ ├── Inter-DisplayBlackItalic.d561e8dd.woff2 │ │ ├── Inter-DisplayBold.d9bf35ac.woff2 │ │ ├── Inter-DisplayBoldItalic.fef00c57.woff2 │ │ ├── Inter-DisplayExtraBold.b7cc680a.woff2 │ │ ├── Inter-DisplayExtraBoldItalic.e5a5984a.woff2 │ │ ├── Inter-DisplayExtraLight.32095132.woff2 │ │ ├── Inter-DisplayExtraLightItalic.8eeb78f4.woff2 │ │ ├── Inter-DisplayItalic.938db435.woff2 │ │ ├── Inter-DisplayLight.e40a858d.woff2 │ │ ├── Inter-DisplayLightItalic.151e9a11.woff2 │ │ ├── Inter-DisplayMedium.12a4a358.woff2 │ │ ├── Inter-DisplayMediumItalic.8968b5ab.woff2 │ │ ├── Inter-DisplaySemiBold.856fcb49.woff2 │ │ ├── Inter-DisplaySemiBoldItalic.5e57e1d2.woff2 │ │ ├── Inter-DisplayThin.b64c173b.woff2 │ │ ├── Inter-DisplayThinItalic.b70f1c61.woff2 │ │ ├── Inter-ExtraBold.585b4ce1.woff │ │ ├── Inter-ExtraBold.74e72c6b.woff2 │ │ ├── Inter-ExtraBold.8a72efb6.woff2 │ │ ├── Inter-ExtraBoldItalic.2abc7ab1.woff2 │ │ ├── Inter-ExtraBoldItalic.38e71f7c.woff2 │ │ ├── Inter-ExtraBoldItalic.b87f7d97.woff │ │ ├── Inter-ExtraLight.1c06ef44.woff │ │ ├── Inter-ExtraLight.25a4db7c.woff2 │ │ ├── Inter-ExtraLight.4c337585.woff2 │ │ ├── Inter-ExtraLightItalic.0e5667b1.woff │ │ ├── Inter-ExtraLightItalic.7b39e865.woff2 │ │ ├── Inter-ExtraLightItalic.f0df46d0.woff2 │ │ ├── Inter-Italic.950174d1.woff2 │ │ ├── Inter-Italic.b0b21adf.woff │ │ ├── Inter-Italic.dd31ea31.woff2 │ │ ├── Inter-Italic.var.d9f448e3.woff2 │ │ ├── Inter-Light.211445a8.woff2 │ │ ├── Inter-Light.319f53ba.woff │ │ ├── Inter-Light.87ed65f8.woff2 │ │ ├── Inter-LightItalic.289a60bc.woff │ │ ├── Inter-LightItalic.5b94e337.woff2 │ │ ├── Inter-LightItalic.9ea2db78.woff2 │ │ ├── Inter-Medium.24fb6e39.woff2 │ │ ├── Inter-Medium.a4e1e7e6.woff2 │ │ ├── Inter-Medium.f500bbb9.woff │ │ ├── Inter-MediumItalic.a2db9bea.woff2 │ │ ├── Inter-MediumItalic.d06751dd.woff │ │ ├── Inter-MediumItalic.d4a7f5d9.woff2 │ │ ├── Inter-Regular.b825f1bc.woff │ │ ├── Inter-Regular.c342b1b7.woff2 │ │ ├── Inter-Regular.edd1deaf.woff2 │ │ ├── Inter-SemiBold.3041a990.woff │ │ ├── Inter-SemiBold.51419407.woff2 │ │ ├── Inter-SemiBold.af44b8a2.woff2 │ │ ├── Inter-SemiBoldItalic.5ce565c8.woff │ │ ├── Inter-SemiBoldItalic.a4f92da5.woff2 │ │ ├── Inter-SemiBoldItalic.daa7095c.woff2 │ │ ├── Inter-Thin.2198e9fb.woff │ │ ├── Inter-Thin.914c3fab.woff2 │ │ ├── Inter-Thin.918c5cbe.woff2 │ │ ├── Inter-ThinItalic.382fab25.woff2 │ │ ├── Inter-ThinItalic.a3279f0a.woff2 │ │ ├── Inter-ThinItalic.f53f21de.woff │ │ ├── Inter.var.d30c3bd0.woff2 │ │ ├── Login.3e325efb.js │ │ ├── SignUp.434b9afc.js │ │ ├── SignUp.c9440c69.css │ │ ├── index.5a2791cb.js │ │ ├── index.e52efea3.css │ │ ├── vendor.1875b906.css │ │ └── vendor.2baeb68e.js │ │ ├── favicon.png │ │ └── index.html ├── pwa_builder │ ├── __init__.py │ └── doctype │ │ ├── __init__.py │ │ ├── pwa_doctype │ │ ├── __init__.py │ │ ├── pwa_doctype.js │ │ ├── pwa_doctype.json │ │ ├── pwa_doctype.py │ │ └── test_pwa_doctype.py │ │ ├── pwa_github_integration │ │ ├── __init__.py │ │ ├── pwa_github_integration.js │ │ ├── pwa_github_integration.json │ │ ├── pwa_github_integration.py │ │ └── test_pwa_github_integration.py │ │ └── pwa_project │ │ ├── __init__.py │ │ ├── pwa_project.js │ │ ├── pwa_project.json │ │ ├── pwa_project.py │ │ └── test_pwa_project.py ├── rename_template_app.py ├── templates │ ├── __init__.py │ └── pages │ │ └── __init__.py └── www │ └── frontend.html ├── pyproject.toml └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | *.egg-info 4 | *.swp 5 | tags 6 | node_modules 7 | __pycache__ -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "workbench.colorCustomizations": { 3 | "editor.lineHighlightBackground": "#1073cf2d", 4 | "editor.lineHighlightBorder": "#9fced11f", 5 | "activityBar.background": "#0E350C", 6 | "titleBar.activeBackground": "#134A11", 7 | "titleBar.activeForeground": "#F3FCF3" 8 | } 9 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PWA Builder 2 | 3 | **PWA Builder** is a tool designed to help users create Progressive Web Applications (PWAs) connected to their Frappe sites. With this builder, users can connect their Frappe sites, and build app-like screens by dragging and dropping fields of their site's doctypes. 4 | 5 | We are improving on the addition of all the possible field types and routing abilities across screens. 6 | 7 | This is a hobby project by the developers at Aerele Technologies. Feel free to reach out to us via issues. 8 | 9 | ## Steps 10 | 11 | - Start by creating a project in the PWA Builder. 12 | - Connect your Frappe site to the builder and give access to your Doctypes. 13 | - Select a Doctype and easily drag and drop fields from its metadata to create app screens. 14 | - Export your project and download a `Frappe App`. 15 | - Install this `Frappe App` to your actual site. 16 | - Access your new pwa on `https:///` 17 | 18 | ![PWA Builder Screen](https://insider.frappe.cloud/files/pwa_builder.png) 19 | 20 | #### License 21 | 22 | MIT 23 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local -------------------------------------------------------------------------------- /frontend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # Frappe UI Starter 2 | 3 | This template should help get you started developing custom frontend for Frappe 4 | apps with Vue 3 and the Frappe UI package. 5 | 6 | ![Auth](https://user-images.githubusercontent.com/34810212/236846289-ac31c292-81ea-4456-be65-95773a4049be.png) 7 | 8 | ![Home](https://user-images.githubusercontent.com/34810212/236846299-fd534e2b-1c06-4f01-a4f2-91a27547cd55.png) 9 | 10 | This boilerplate sets up Vue 3, Vue Router, TailwindCSS, and Frappe UI out of 11 | the box. It also has basic authentication frontend. 12 | 13 | ## Docs 14 | 15 | [Frappe UI Website](https://frappeui.com) 16 | 17 | ## Usage 18 | 19 | This template is meant to be cloned inside an existing Frappe App. Assuming your 20 | apps name is `todo`. Clone this template in the root folder of your app using `degit`. 21 | 22 | ``` 23 | cd apps/todo 24 | npx degit NagariaHussain/doppio_frappeui_starter frontend 25 | cd frontend 26 | yarn 27 | yarn dev 28 | ``` 29 | 30 | In a development environment, you need to put the below key-value pair in your `site_config.json` file: 31 | 32 | ``` 33 | "ignore_csrf": 1 34 | ``` 35 | 36 | This will prevent `CSRFToken` errors while using the vite dev server. In production environment, the `csrf_token` is attached to the `window` object in `index.html` for you. 37 | 38 | The Vite dev server will start on the port `8080`. This can be changed from `vite.config.js`. 39 | The development server is configured to proxy your frappe app (usually running on port `8000`). If you have a site named `todo.test`, open `http://todo.test:8080` in your browser. If you see a button named "Click to send 'ping' request", congratulations! 40 | 41 | If you notice the browser URL is `/frontend`, this is the base URL where your frontend app will run in production. 42 | To change this, open `src/router.js` and change the base URL passed to `createWebHistory`. 43 | 44 | ## Resources 45 | 46 | - [Vue 3](https://v3.vuejs.org/guide/introduction.html) 47 | - [Vue Router](https://next.router.vuejs.org/guide/) 48 | - [Frappe UI](https://github.com/frappe/frappe-ui) 49 | - [TailwindCSS](https://tailwindcss.com/docs/utility-first) 50 | - [Vite](https://vitejs.dev/guide/) 51 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Frappe UI App 8 | 9 | 10 |
11 |
12 |
13 | 14 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frappe-ui-frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build --base=/assets/pwa_builder/frontend/ && yarn copy-html-entry", 8 | "preview": "vite preview", 9 | "copy-html-entry": "cp ../pwa_builder/public/frontend/index.html ../pwa_builder/www/frontend.html" 10 | }, 11 | "dependencies": { 12 | "feather-icons": "^4.28.0", 13 | "frappe-ui": "^0.1.54", 14 | "vue": "^3.2.25", 15 | "vue-router": "^4.0.12", 16 | "vuedraggable": "^4.1.0" 17 | }, 18 | "devDependencies": { 19 | "@vitejs/plugin-vue": "^2.0.0", 20 | "autoprefixer": "^10.4.2", 21 | "postcss": "^8.4.5", 22 | "tailwindcss": "^3.0.15", 23 | "vite": "^2.7.2" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /frontend/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/public/favicon.png -------------------------------------------------------------------------------- /frontend/src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Black.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Black.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-BlackItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-BlackItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-BlackItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Bold.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Bold.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-BoldItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-BoldItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-ExtraBold.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-ExtraBold.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-ExtraBoldItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-ExtraLight.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-ExtraLight.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraLightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-ExtraLightItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Italic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Italic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Light.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Light.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-LightItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-LightItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Medium.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Medium.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-MediumItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-MediumItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-MediumItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Regular.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Regular.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-SemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-SemiBold.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-SemiBold.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-SemiBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-SemiBoldItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Thin.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-Thin.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-ThinItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-ThinItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-italic.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-italic.var.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-roman.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter-roman.var.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aerele/pwa-builder/c079233bda6038783db845bec479e9612c45f70e/frontend/src/assets/Inter/Inter.var.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/inter.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Inter'; 3 | font-style: normal; 4 | font-weight: 100; 5 | font-display: swap; 6 | src: url('Inter-Thin.woff2?v=3.12') format('woff2'), 7 | url('Inter-Thin.woff?v=3.12') format('woff'); 8 | } 9 | @font-face { 10 | font-family: 'Inter'; 11 | font-style: italic; 12 | font-weight: 100; 13 | font-display: swap; 14 | src: url('Inter-ThinItalic.woff2?v=3.12') format('woff2'), 15 | url('Inter-ThinItalic.woff?v=3.12') format('woff'); 16 | } 17 | 18 | @font-face { 19 | font-family: 'Inter'; 20 | font-style: normal; 21 | font-weight: 200; 22 | font-display: swap; 23 | src: url('Inter-ExtraLight.woff2?v=3.12') format('woff2'), 24 | url('Inter-ExtraLight.woff?v=3.12') format('woff'); 25 | } 26 | @font-face { 27 | font-family: 'Inter'; 28 | font-style: italic; 29 | font-weight: 200; 30 | font-display: swap; 31 | src: url('Inter-ExtraLightItalic.woff2?v=3.12') format('woff2'), 32 | url('Inter-ExtraLightItalic.woff?v=3.12') format('woff'); 33 | } 34 | 35 | @font-face { 36 | font-family: 'Inter'; 37 | font-style: normal; 38 | font-weight: 300; 39 | font-display: swap; 40 | src: url('Inter-Light.woff2?v=3.12') format('woff2'), 41 | url('Inter-Light.woff?v=3.12') format('woff'); 42 | } 43 | @font-face { 44 | font-family: 'Inter'; 45 | font-style: italic; 46 | font-weight: 300; 47 | font-display: swap; 48 | src: url('Inter-LightItalic.woff2?v=3.12') format('woff2'), 49 | url('Inter-LightItalic.woff?v=3.12') format('woff'); 50 | } 51 | 52 | @font-face { 53 | font-family: 'Inter'; 54 | font-style: normal; 55 | font-weight: 400; 56 | font-display: swap; 57 | src: url('Inter-Regular.woff2?v=3.12') format('woff2'), 58 | url('Inter-Regular.woff?v=3.12') format('woff'); 59 | } 60 | @font-face { 61 | font-family: 'Inter'; 62 | font-style: italic; 63 | font-weight: 400; 64 | font-display: swap; 65 | src: url('Inter-Italic.woff2?v=3.12') format('woff2'), 66 | url('Inter-Italic.woff?v=3.12') format('woff'); 67 | } 68 | 69 | @font-face { 70 | font-family: 'Inter'; 71 | font-style: normal; 72 | font-weight: 500; 73 | font-display: swap; 74 | src: url('Inter-Medium.woff2?v=3.12') format('woff2'), 75 | url('Inter-Medium.woff?v=3.12') format('woff'); 76 | } 77 | @font-face { 78 | font-family: 'Inter'; 79 | font-style: italic; 80 | font-weight: 500; 81 | font-display: swap; 82 | src: url('Inter-MediumItalic.woff2?v=3.12') format('woff2'), 83 | url('Inter-MediumItalic.woff?v=3.12') format('woff'); 84 | } 85 | 86 | @font-face { 87 | font-family: 'Inter'; 88 | font-style: normal; 89 | font-weight: 600; 90 | font-display: swap; 91 | src: url('Inter-SemiBold.woff2?v=3.12') format('woff2'), 92 | url('Inter-SemiBold.woff?v=3.12') format('woff'); 93 | } 94 | @font-face { 95 | font-family: 'Inter'; 96 | font-style: italic; 97 | font-weight: 600; 98 | font-display: swap; 99 | src: url('Inter-SemiBoldItalic.woff2?v=3.12') format('woff2'), 100 | url('Inter-SemiBoldItalic.woff?v=3.12') format('woff'); 101 | } 102 | 103 | @font-face { 104 | font-family: 'Inter'; 105 | font-style: normal; 106 | font-weight: 700; 107 | font-display: swap; 108 | src: url('Inter-Bold.woff2?v=3.12') format('woff2'), 109 | url('Inter-Bold.woff?v=3.12') format('woff'); 110 | } 111 | @font-face { 112 | font-family: 'Inter'; 113 | font-style: italic; 114 | font-weight: 700; 115 | font-display: swap; 116 | src: url('Inter-BoldItalic.woff2?v=3.12') format('woff2'), 117 | url('Inter-BoldItalic.woff?v=3.12') format('woff'); 118 | } 119 | 120 | @font-face { 121 | font-family: 'Inter'; 122 | font-style: normal; 123 | font-weight: 800; 124 | font-display: swap; 125 | src: url('Inter-ExtraBold.woff2?v=3.12') format('woff2'), 126 | url('Inter-ExtraBold.woff?v=3.12') format('woff'); 127 | } 128 | @font-face { 129 | font-family: 'Inter'; 130 | font-style: italic; 131 | font-weight: 800; 132 | font-display: swap; 133 | src: url('Inter-ExtraBoldItalic.woff2?v=3.12') format('woff2'), 134 | url('Inter-ExtraBoldItalic.woff?v=3.12') format('woff'); 135 | } 136 | 137 | @font-face { 138 | font-family: 'Inter'; 139 | font-style: normal; 140 | font-weight: 900; 141 | font-display: swap; 142 | src: url('Inter-Black.woff2?v=3.12') format('woff2'), 143 | url('Inter-Black.woff?v=3.12') format('woff'); 144 | } 145 | @font-face { 146 | font-family: 'Inter'; 147 | font-style: italic; 148 | font-weight: 900; 149 | font-display: swap; 150 | src: url('Inter-BlackItalic.woff2?v=3.12') format('woff2'), 151 | url('Inter-BlackItalic.woff?v=3.12') format('woff'); 152 | } 153 | -------------------------------------------------------------------------------- /frontend/src/components/Drawer.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | -------------------------------------------------------------------------------- /frontend/src/components/Project.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /frontend/src/components/ProjectPage.vue: -------------------------------------------------------------------------------- 1 | 132 | 197 | -------------------------------------------------------------------------------- /frontend/src/data/session.js: -------------------------------------------------------------------------------- 1 | import router from '@/router' 2 | import { computed, reactive } from 'vue' 3 | import { createResource } from 'frappe-ui' 4 | 5 | import { userResource } from './user' 6 | 7 | export function sessionUser() { 8 | const cookies = new URLSearchParams(document.cookie.split('; ').join('&')) 9 | let _sessionUser = cookies.get('user_id') 10 | if (_sessionUser === 'Guest') { 11 | _sessionUser = null 12 | } 13 | return _sessionUser 14 | } 15 | 16 | export const session = reactive({ 17 | login: createResource({ 18 | url: 'login', 19 | makeParams({ email, password }) { 20 | return { 21 | usr: email, 22 | pwd: password, 23 | } 24 | }, 25 | onSuccess(data) { 26 | userResource.reload() 27 | session.user = sessionUser() 28 | session.login.reset() 29 | router.replace(data.default_route || '/') 30 | }, 31 | }), 32 | logout: createResource({ 33 | url: 'logout', 34 | onSuccess() { 35 | userResource.reset() 36 | session.user = sessionUser() 37 | router.replace({ name: 'Login' }) 38 | }, 39 | }), 40 | user: sessionUser(), 41 | isLoggedIn: computed(() => !!session.user), 42 | }) 43 | -------------------------------------------------------------------------------- /frontend/src/data/user.js: -------------------------------------------------------------------------------- 1 | import router from '@/router' 2 | import { createResource } from 'frappe-ui' 3 | 4 | export const userResource = createResource({ 5 | url: 'frappe.auth.get_logged_user', 6 | cache: 'User', 7 | onError(error) { 8 | if (error && error.exc_type === 'AuthenticationError') { 9 | router.push({ name: 'LoginPage' }) 10 | } 11 | }, 12 | }) 13 | -------------------------------------------------------------------------------- /frontend/src/form/components/Autocomplete.vue: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /frontend/src/form/components/Checkbox.vue: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /frontend/src/form/components/Date.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /frontend/src/form/components/DateTime.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /frontend/src/form/components/FileUploader.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/form/components/Int.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /frontend/src/form/components/NumberCard.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /frontend/src/form/components/Password.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /frontend/src/form/components/Phone.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /frontend/src/form/components/Select.vue: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /frontend/src/form/components/Table.vue: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /frontend/src/form/components/Text.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /frontend/src/form/components/TextArea.vue: -------------------------------------------------------------------------------- 1 |