├── .gitignore ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── .run ├── Build Flyable.run.xml ├── ControlApplication.run.xml ├── DesignApplication.run.xml ├── Flyable (External Frontend).run.xml ├── Start Control (IntelliJ IDEA Community).run.xml ├── Start Design (IntelliJ IDEA Community).run.xml ├── Start Flyable (Frontend only).run.xml ├── Start Flyable (IntelliJ IDEA Community).run.xml ├── Start Work (IntelliJ IDEA Community).run.xml └── WorkApplication.run.xml ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── README.md ├── docker ├── .env └── docker-compose.yml ├── documentation ├── community-configuration.png ├── reload.png ├── ultimate-configurations.png └── vscode-configurations.png ├── flowable-control ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── flowable │ │ └── gsd │ │ └── control │ │ └── ControlApplication.java │ └── resources │ ├── application-postgres.properties │ └── application.properties ├── flowable-design ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── flowable │ │ └── gsd │ │ └── design │ │ ├── DesignApplication.java │ │ ├── ExampleAppService.java │ │ └── configuration │ │ ├── SecurityActuatorConfiguration.java │ │ ├── SecurityConfiguration.java │ │ └── TrainingPropertiesConfiguration.java │ └── resources │ ├── application-postgres.properties │ ├── application.properties │ ├── example-apps │ └── Flight Booking Manager.zip │ └── static │ └── custom │ ├── custom.css │ └── custom.js ├── flowable-work ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── flowable │ │ │ └── gsd │ │ │ └── work │ │ │ ├── WorkApplication.java │ │ │ └── configuration │ │ │ ├── CorsConfig.java │ │ │ ├── SecurityActuatorConfiguration.java │ │ │ ├── SecurityConfiguration.java │ │ │ └── StaticResourceConfiguration.java │ └── resources │ │ ├── application-elastic.properties │ │ ├── application-postgres.properties │ │ ├── application-prod.properties │ │ ├── application.properties │ │ └── com │ │ └── flowable │ │ ├── filters │ │ └── contact │ │ │ └── default-platform-contact-filters.json │ │ ├── tenant-setup │ │ └── custom │ │ │ └── tenant-setup.json │ │ ├── themes │ │ └── custom │ │ │ └── Flyable.json │ │ └── users │ │ └── custom │ │ └── user-definitions.user.json │ └── test │ ├── java │ └── com │ │ └── flowable │ │ └── gsd │ │ └── work │ │ ├── WorkApplicationIT.java │ │ ├── WorkApplicationTest.java │ │ └── config │ │ └── TestConfiguration.java │ └── resources │ └── application.properties ├── flyable-booking-portal ├── .gitignore ├── .mvn │ └── wrapper │ │ └── maven-wrapper.properties ├── README.md ├── documentation │ └── StartFormSequenceDiagram.svg ├── frontend │ ├── .env │ ├── .eslintrc.yml │ ├── .gitignore │ ├── .npmrc │ ├── index.html │ ├── package-lock.json │ ├── package.json │ ├── pnpm-lock.yaml │ ├── public │ │ ├── favicon │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── browserconfig.xml │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon.ico │ │ │ ├── mstile-150x150.png │ │ │ ├── safari-pinned-tab.svg │ │ │ └── site.webmanifest │ │ ├── img │ │ │ ├── avatar │ │ │ │ └── anonymous.png │ │ │ └── flyable-logo.png │ │ ├── manifest.json │ │ └── robots.txt │ ├── src │ │ ├── .prettierrc │ │ ├── api │ │ │ ├── authApi.ts │ │ │ ├── flowableApi.ts │ │ │ └── flyableApi.ts │ │ ├── app.tsx │ │ ├── config │ │ │ ├── axiosConfig.ts │ │ │ └── theme.ts │ │ ├── error │ │ │ ├── ErrorOverlay.tsx │ │ │ └── FlyableApiError.ts │ │ ├── form │ │ │ ├── defaultForm.ts │ │ │ ├── flowableStyles.tsx │ │ │ ├── formSkeleton.tsx │ │ │ ├── outcomes.ts │ │ │ ├── submittableForm.tsx │ │ │ └── workForm.tsx │ │ ├── index.tsx │ │ ├── layout │ │ │ ├── backNavigation.tsx │ │ │ ├── footer.tsx │ │ │ ├── header.tsx │ │ │ ├── headerMenu.tsx │ │ │ └── mainContent.tsx │ │ ├── portal │ │ │ ├── apps │ │ │ │ ├── appDefinitionList.tsx │ │ │ │ └── appView.tsx │ │ │ ├── book-flight │ │ │ │ ├── myFlights.tsx │ │ │ │ └── wizard │ │ │ │ │ ├── bookFlightWizard.tsx │ │ │ │ │ ├── stepContent.tsx │ │ │ │ │ ├── steps │ │ │ │ │ ├── chooseFlightStep.tsx │ │ │ │ │ ├── flightDetailsStep.tsx │ │ │ │ │ ├── passengerInfoStep.tsx │ │ │ │ │ ├── paymentStep.tsx │ │ │ │ │ └── reviewStep.tsx │ │ │ │ │ ├── style │ │ │ │ │ └── step-styles.css │ │ │ │ │ ├── wizardControlButtons.tsx │ │ │ │ │ ├── wizardStepper.tsx │ │ │ │ │ └── wizardSuccessMessage.tsx │ │ │ ├── generic-instances │ │ │ │ └── definitionList.tsx │ │ │ ├── home │ │ │ │ └── home.tsx │ │ │ └── login │ │ │ │ └── loginForm.tsx │ │ ├── routes │ │ │ ├── bookingPortalRoutes.tsx │ │ │ └── privateRoute.tsx │ │ ├── shared │ │ │ └── itemList.tsx │ │ ├── store │ │ │ ├── authStore.ts │ │ │ ├── flightStore.ts │ │ │ └── overlayStore.ts │ │ ├── style │ │ │ ├── app.css │ │ │ ├── flwFormsStyle.css │ │ │ └── index.css │ │ └── util │ │ │ └── modelKeys.ts │ ├── tsconfig.json │ └── vite.config.mts ├── mvnw ├── mvnw.cmd ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── flowable │ │ └── training │ │ └── flyable │ │ ├── FlyableBookingPortalApplication.java │ │ ├── bootstrap │ │ └── FlyableDemoBootstrapper.java │ │ ├── configuration │ │ ├── FlyableConfigurationProperties.java │ │ └── RestClientConfig.java │ │ ├── exception │ │ └── FlowableServiceException.java │ │ ├── rest │ │ └── flowable │ │ │ ├── FlowableApiController.java │ │ │ ├── FlowableDataResponse.java │ │ │ ├── FlowableExceptionHandler.java │ │ │ ├── FlowableThemeController.java │ │ │ └── dto │ │ │ ├── request │ │ │ ├── ActuatorHealth.java │ │ │ └── CreateFlowableInstanceRequest.java │ │ │ └── response │ │ │ ├── ErrorResponse.java │ │ │ ├── FlowableAppDefinitionDto.java │ │ │ ├── FlowableAppPageDto.java │ │ │ ├── FlowableDefinitionDto.java │ │ │ ├── FlowableInstanceDto.java │ │ │ └── FormDefinitionDto.java │ │ ├── security │ │ ├── SecurityConfiguration.java │ │ ├── jwt │ │ │ ├── JwtAuthController.java │ │ │ ├── JwtAuthenticationFilter.java │ │ │ ├── JwtTokenUtil.java │ │ │ ├── request │ │ │ │ └── LoginRequest.java │ │ │ └── response │ │ │ │ ├── FlyableAuthResponse.java │ │ │ │ └── FlyableAuthTokenDeniedResponse.java │ │ └── user │ │ │ ├── FlyableUserDetails.java │ │ │ ├── FlyableUserDto.java │ │ │ ├── UserBootstrapper.java │ │ │ ├── UserInfoResource.java │ │ │ └── UserRepository.java │ │ ├── service │ │ ├── FlowableAdminService.java │ │ ├── FlowableInstanceService.java │ │ ├── FlowableRepositoryService.java │ │ └── FlowableWorkThemeService.java │ │ └── util │ │ ├── FlowableUtil.java │ │ ├── ModelConstants.java │ │ └── ScopeTypes.java │ └── resources │ ├── application.properties │ ├── apps │ └── Flight Booking Manager.zip │ └── static │ ├── assets │ ├── 0cc3e06704117dcfc36752c00a55b57b-BNkQWmgR.woff2 │ ├── 1444a6b9c953dc315b52c1495b8639b2-vE1REFhz.woff2 │ ├── 2217608a0cd2cc473784bed43e95fa45-DC3iHbBu.woff │ ├── 281179d375517d9c131b60e3397b79ff-DTzeWEth.woff │ ├── 38a674fae449557fef97f120c301ff8d-DOzcbrzr.woff2 │ ├── 3bd3a5087aba78c8c69367662be821f8-zybrCNhD.woff │ ├── 3ef98f0900af1725de09ec569afdcb06-DpdrRkFF.woff2 │ ├── 546a8d3d3ae7781174818041e36b176a-B8vfLIVM.woff │ ├── 5d6df38dd70f631c488bdec905f68464-Q_BPs6ba.woff2 │ ├── 62a04d3d3d6d38ba2a92496367934ecc-CyeSa8YS.woff │ ├── 7c87b4e83e3eaced4c767ede1c9fce3d-teVGZC04.woff2 │ ├── a6dfc650c384fc216db7f766530affae-UGOo1vBJ.woff │ ├── acb6629fe45c43ad5d8ba47a1c95c9fd-BTyQisEy.woff2 │ ├── bfb189e4624aecc093a290a367255444-CVQP1sHG.woff2 │ ├── d2e9da29b749112660a986b9510a1515-DjeOFJkz.woff │ ├── e5f115311730acb7c30581477c6ef2d5-CPZdhQyt.woff │ ├── f191d5449ca95b09457705bbf2ebba57-BSA0dzBb.woff │ ├── f66678b41cde86a3ead23a7fe503c8f5-DWcNxDES.woff2 │ ├── index-BV7diovH.css │ └── index-CmmmcohN.js │ ├── favicon │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── mstile-150x150.png │ ├── safari-pinned-tab.svg │ └── site.webmanifest │ ├── img │ ├── avatar │ │ └── anonymous.png │ └── flyable-logo.png │ ├── index.html │ ├── manifest.json │ └── robots.txt ├── generate-changelog.ps1 ├── generate-overview.ps1 ├── mvnw ├── mvnw.cmd ├── pom.xml ├── rebase.ps1 └── settings-flowable.xml /.gitignore: -------------------------------------------------------------------------------- 1 | # Maven / NPM 2 | target/ 3 | dist/ 4 | node_modules/ 5 | *.js.map 6 | 7 | # IntelliJ IDEA 8 | .idea/ 9 | *.iml 10 | 11 | # Visual Studio Code 12 | *.code-workspace 13 | .project 14 | .classpath 15 | .settings/ 16 | 17 | # MacOS 18 | .DS_Store 19 | 20 | # Docker 21 | docker/data/ 22 | 23 | # Flowable 24 | h2-database/ 25 | /h2-db/flyable.mv.db 26 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | # Licensed to the Apache Software Foundation (ASF) under one 2 | # or more contributor license agreements. See the NOTICE file 3 | # distributed with this work for additional information 4 | # regarding copyright ownership. The ASF licenses this file 5 | # to you under the Apache License, Version 2.0 (the 6 | # "License"); you may not use this file except in compliance 7 | # with the License. You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, 12 | # software distributed under the License is distributed on an 13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 14 | # KIND, either express or implied. See the License for the 15 | # specific language governing permissions and limitations 16 | # under the License. 17 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip 18 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar 19 | -------------------------------------------------------------------------------- /.run/Build Flyable.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /.run/ControlApplication.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | -------------------------------------------------------------------------------- /.run/DesignApplication.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | -------------------------------------------------------------------------------- /.run/Flyable (External Frontend).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | -------------------------------------------------------------------------------- /.run/Start Control (IntelliJ IDEA Community).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /.run/Start Design (IntelliJ IDEA Community).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /.run/Start Flyable (Frontend only).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 32 | 33 | 34 |
35 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flyable-booking-portal", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "vite", 7 | "build": "vite build", 8 | "build-and-copy": "vite build && cpx -r dist ../src/main/resources/static", 9 | "test": "vite test", 10 | "dev": "vite" 11 | }, 12 | "dependencies": { 13 | "@emotion/react": "11.14.0", 14 | "@emotion/styled": "11.14.0", 15 | "@flowable/forms": "3.17.0", 16 | "@flowable/work-views": "3.17.0", 17 | "@fortawesome/fontawesome-svg-core": "6.6.0", 18 | "@fortawesome/free-solid-svg-icons": "6.6.0", 19 | "@fortawesome/react-fontawesome": "0.2.2", 20 | "@mui/icons-material": "6.3.1", 21 | "@mui/material": "6.3.1", 22 | "@tanstack/react-query": "5.45.0", 23 | "@testing-library/jest-dom": "5.17.0", 24 | "@testing-library/react": "13.4.0", 25 | "@testing-library/user-event": "13.5.0", 26 | "axios": "1.6.8", 27 | "notistack": "3.0.1", 28 | "react": "18.3.1", 29 | "react-dom": "18.3.1", 30 | "react-error-boundary": "4.0.13", 31 | "react-router-dom": "6.23.1", 32 | "stream-http": "3.2.0", 33 | "typescript": "4.9.5", 34 | "web-vitals": "2.1.4", 35 | "zustand": "5.0.3", 36 | "react-datepicker": "7.6.0", 37 | "i18n-iso-countries": "7.13.0" 38 | }, 39 | "devDependencies": { 40 | "@types/node": "22.10.0", 41 | "@types/jest": "27.5.2", 42 | "@types/react": "18.3.3", 43 | "@types/react-dom": "18.3.0", 44 | "@vitejs/plugin-react": "4.3.4", 45 | "cpx": "^1.5.0", 46 | "vite": "6.0.7", 47 | "vite-tsconfig-paths": "5.1.4", 48 | "prettier": "3.4.2", 49 | "eslint": "9.17.0", 50 | "eslint-plugin-react": "7.37.3", 51 | "eslint-plugin-react-hooks": "5.1.0", 52 | "eslint-plugin-react-refresh": "0.4.16" 53 | }, 54 | "eslintConfig": { 55 | "extends": [ 56 | "eslint:recommended", 57 | "plugin:react/recommended", 58 | "plugin:@typescript-eslint/recommended" 59 | ] 60 | }, 61 | "browserslist": { 62 | "production": [ 63 | ">0.2%", 64 | "not dead", 65 | "not op_mini all" 66 | ], 67 | "development": [ 68 | "last 1 chrome version", 69 | "last 1 firefox version", 70 | "last 1 safari version" 71 | ] 72 | } 73 | } -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flowable/flowable-training-getting-started/82af07f7cf336b7aa9e967f2e9a650df10f1a046/flyable-booking-portal/frontend/public/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flowable/flowable-training-getting-started/82af07f7cf336b7aa9e967f2e9a650df10f1a046/flyable-booking-portal/frontend/public/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flowable/flowable-training-getting-started/82af07f7cf336b7aa9e967f2e9a650df10f1a046/flyable-booking-portal/frontend/public/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #2d89ef 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flowable/flowable-training-getting-started/82af07f7cf336b7aa9e967f2e9a650df10f1a046/flyable-booking-portal/frontend/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flowable/flowable-training-getting-started/82af07f7cf336b7aa9e967f2e9a650df10f1a046/flyable-booking-portal/frontend/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flowable/flowable-training-getting-started/82af07f7cf336b7aa9e967f2e9a650df10f1a046/flyable-booking-portal/frontend/public/favicon/favicon.ico -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flowable/flowable-training-getting-started/82af07f7cf336b7aa9e967f2e9a650df10f1a046/flyable-booking-portal/frontend/public/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/favicon/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/img/avatar/anonymous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flowable/flowable-training-getting-started/82af07f7cf336b7aa9e967f2e9a650df10f1a046/flyable-booking-portal/frontend/public/img/avatar/anonymous.png -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/img/flyable-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flowable/flowable-training-getting-started/82af07f7cf336b7aa9e967f2e9a650df10f1a046/flyable-booking-portal/frontend/public/img/flyable-logo.png -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Flyable Portal", 3 | "name": "Standalone Frontend that uses Flowable Work", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/src/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "singleQuote": true, 4 | "trailingComma": "es5", 5 | "printWidth": 200, 6 | "tabWidth": 2, 7 | "jsxSingleQuote": false, 8 | "bracketSpacing": true, 9 | "arrowParens": "avoid", 10 | "endOfLine": "lf", 11 | "jsxBracketSameLine": true, 12 | "quoteProps": "consistent" 13 | } -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/src/api/authApi.ts: -------------------------------------------------------------------------------- 1 | import { FlyableApiError } from '../error/FlyableApiError'; 2 | import { flyableAxiosInstance as axiosInstance } from '../config/axiosConfig'; 3 | 4 | type AuthRequest = { username: string; password: string }; 5 | type AuthResponse = { jwt: string; user: User }; 6 | export type User = { username: string; firstName: string; lastName: string; avatar: string }; 7 | 8 | export const ANONYMOUS_USER = { username: 'anonymous', firstName: 'Anonymous', lastName: '', avatar: 'img/avatar/anonymous.png' }; 9 | 10 | /** 11 | * Makes API requests, handling errors and returning data. 12 | */ 13 | async function makeApiRequest(method: 'get' | 'post', url: string, data?: any): Promise { 14 | try { 15 | const response = await axiosInstance({ 16 | method, 17 | url, 18 | data, 19 | headers: data ? { 'Content-Type': 'application/json' } : undefined, // Add Content-Type header if data is present 20 | }); 21 | 22 | if (response.status >= 200 && response.status < 300) { 23 | // Check for success status codes 24 | return response.data; 25 | } else { 26 | throw new FlyableApiError(`API request to ${method.toUpperCase()} ${url} failed with status ${response.status}`); // Include status code in error 27 | } 28 | } catch (error: any) { 29 | const errorMessage = error.response?.data?.message || error.message || 'Unknown error'; 30 | throw new FlyableApiError(`API request to ${method.toUpperCase()} ${url} failed: ${errorMessage}`); // Wrap error in custom error class 31 | } 32 | } 33 | 34 | /** 35 | * Logs in a user. 36 | * @param request - The login request (username and password). 37 | */ 38 | export const login = async (request: AuthRequest): Promise => { 39 | try { 40 | return await makeApiRequest('post', '/auth/login', request); // Make the API request 41 | } catch (error) { 42 | throw new FlyableApiError('Login failed'); // Handle login errors 43 | } 44 | }; 45 | -------------------------------------------------------------------------------- /flyable-booking-portal/frontend/src/app.tsx: -------------------------------------------------------------------------------- 1 | import './style/app.css'; 2 | import '@flowable/forms/flwforms.min.css'; 3 | import { Box, ThemeProvider } from '@mui/material'; 4 | import { Header } from './layout/header'; 5 | import { Footer } from './layout/footer'; 6 | import { HashRouter as Router } from 'react-router-dom'; 7 | import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; 8 | import { SnackbarProvider } from 'notistack'; 9 | import theme from './config/theme'; 10 | import { MainContent } from './layout/mainContent'; 11 | import FlowableFormStyles from './form/flowableStyles'; 12 | import React from 'react'; 13 | import ErrorOverlay from './error/ErrorOverlay'; 14 | 15 | /** 16 | * Main component for the Flyable Portal. 17 | */ 18 | const App = () => { 19 | const queryClient = new QueryClient(); 20 | 21 | return ( 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |