Compare commits

...
Author SHA1 Message Date
Jeppe Bundgaard 4860e9bdef Add WeatherAPI config page 2026-03-12 09:06:55 +01:00
Jeppe Bundgaard 655bb622f5 Update OpenAPI schema:
- Make workspaceId and channelId parameters optional with fallback logic across multiple endpoints.
- Replace object schemas with $ref references for bird voice calls, numbers, and related responses.
- Introduce WeatherAPI endpoints (current, forecast, search) and department weather timeline functionality.
- Add WeatherAPI configuration endpoints and corresponding schema updates.
2026-03-11 14:32:06 +01:00
Jeppe Bundgaard 6695268b85 Refactor warnings in DatePeriodSelector.vue to replace custom HTML with b-message components; update CollectedOrderInvoices.vue tabs to use b-tabs and b-tab-item for better structure and styling. 2026-03-11 13:22:53 +01:00
Jeppe Bundgaard 5fa55e3a05 Update conditional rendering in InvoicingBillingPeriodStatistics.vue to include current view check for 'all'. 2026-03-11 12:57:27 +01:00
Jeppe Bundgaard f91089ebe0 Refactor InvoicingBillingPeriodStatistics.vue: add department totals calculation, enhance subscription and pricing views, improve font and color styling, and update conditional rendering logic. 2026-03-11 12:52:18 +01:00
Jeppe Bundgaard 1923b69f4a Enhance table styles in InvoicingBillingPeriodStatistics.vue: add striped, hoverable, bordered, and narrow classes for improved readability and presentation. 2026-03-11 08:50:23 +01:00
Jeppe Bundgaard 27a6207655 Adjust colspan in InvoicingBillingPeriodStatistics.vue for improved table alignment during loading state 2026-03-11 08:46:17 +01:00
Jeppe Bundgaard 79c63813b8 Enhance WhiteBox and WhiteBoxCard components: add border support and update layout with improved styles and hover effects. Adjust text and language labels in invoicing views. 2026-03-10 10:53:06 +01:00
Jeppe Bundgaard f3ecf7261a Add fixed pricing and subscription distribution views with API integrations and conditional rendering adjustments 2026-03-10 10:21:41 +01:00
Jeppe Bundgaard 1820532840 Add passkey login option 2026-03-09 10:59:10 +01:00
Jeppe Bundgaard 70038d5a4f Set dynamic document title using route metadata and i18n, and add convenience slot binding in PaginationDisplayGeneralSearchReload.vue. 2026-03-09 10:40:44 +01:00
Jeppe Bundgaard 8c3bd310a1 Specify iconPack attribute for consistent icon styling in LoadButtonWhileAwait.vue. 2026-03-09 10:26:08 +01:00
Jeppe Bundgaard 2f23b6ea75 Add Playwright test migration plan 2026-03-09 10:20:39 +01:00
Jeppe Bundgaard 721e942a12 Enhance link security in Orders.vue with noopener,noreferrer and add conditional slot rendering to ViewportResponsiveWrapper.vue. 2026-03-05 12:28:57 +01:00
Jeppe Bundgaard 15d1cd8558 Refactor LongPressListener to use computed props for safer reactivity and simplify MobileHeader path check logic with optional chaining adjustments. 2026-03-04 14:55:43 +01:00
Jeppe Bundgaard 88a2361ccc Increase mobile POS transaction history limit from 50 to 100 2026-03-04 11:08:42 +01:00
Jeppe Bundgaard bbedfbdf30 Refactor mobile POS steps: clear localStorage in tests, enhance vehicle type checks, improve safety seal handling logic, and adjust default wait timeout 2026-03-03 15:07:05 +01:00
Jeppe Bundgaard 9473a514da Refactor DepartmentGate and DepartmentRelay schemas: replace object types with explicit $ref definitions and add detailed configuration schemas 2026-03-03 12:27:25 +01:00
Jeppe B 93ad14d9e8 Merge pull request #45 from copenhagentruckwash/codex/implement-department-gates-and-relays
Add Department Gates and Department Relays (objects, UI, routes, i18n)
2026-03-03 12:25:04 +01:00
Jeppe B 22b3240a10 Add department gates and relays management objects and UI 2026-03-03 12:12:39 +01:00
Jeppe Bundgaard 3691abd9a2 Add DepartmentGate and DepartmentRelay endpoints and schemas to OpenAPI spec 2026-03-03 12:03:36 +01:00
Jeppe B cf1dc61299 Merge pull request #44
Fix fetching previous answers in MyWashStart
2026-03-03 11:50:40 +01:00
Jeppe B 1d27b70c72 Fix previous self-serve answers fetch filters 2026-03-03 11:47:53 +01:00
Jeppe B eaebdc39c0 Merge pull request #43
Refactor MyWashStart into reusable components
2026-03-03 10:42:09 +01:00
Jeppe B 321f3d8486 Refactor MyWashStart into reusable display components 2026-03-03 10:36:24 +01:00
Jeppe Bundgaard dc84eaeac4 Hide version info from MobileNavigation footer 2026-03-03 10:28:50 +01:00
Jeppe B a03a98f633 Merge pull request #42
Mobile POS: robust customer ID parsing, long-press scroll handling, wash-certificate flow and cleanup
2026-03-03 10:06:19 +01:00
Jeppe B 1889b4ceb7 Fix wash certificate syncing in mobile POS flow 2026-03-03 10:02:55 +01:00
Jeppe Bundgaard de408403b2 Update superuser navigation menu: remove XLVASK module, add BIRD module 2026-03-03 10:01:40 +01:00
Jeppe Bundgaard 2f9326874b Refactor booking and product logic in Step 2: replace applyPendingBookingFromSelection with initializeStepTwo, unify booking selection methods, and add fallback handling for wash products. 2026-03-02 17:05:29 +01:00
Jeppe Bundgaard 601ab3db04 Merge remote-tracking branch 'origin/master' 2026-03-02 17:02:57 +01:00
Jeppe Bundgaard 430bc35fe9 Add conditional rendering for vehicle type selection in MyWashStart component 2026-03-02 16:41:34 +01:00
Jeppe Bundgaard f0fe848250 Improve task buttons collection and dynamic image handling in MyWashStart 2026-03-02 16:28:19 +01:00
Jeppe Bundgaard 927d66755f Refactor MyWashStart dynamic image handling with lane checks and error handling improvements 2026-03-02 16:09:02 +01:00
Jeppe Bundgaard aa38bc0c43 Fix task completion check in MyWashStart to skip completed tasks when gathering unique buttons 2026-03-02 15:58:14 +01:00
Jeppe Bundgaard 675481672c Add dynamic machine UI with step-based tasks and image rendering to MyWashStart component 2026-03-02 15:54:06 +01:00
Jeppe Bundgaard 55eac9e1f3 Add buttons editing modal and functionality to SelfServeTasksTable component 2026-03-02 15:19:43 +01:00
Jeppe Bundgaard 18ab5cb449 Remove redundant 'permissions' field from logout navigation item 2026-03-02 14:47:12 +01:00
Jeppe Bundgaard f8faf6ec5c Add dynamic image placeholders to MyWashStart self-wash component 2026-03-02 13:44:10 +01:00
Jeppe Bundgaard 187b0c5984 Refactor self-serve warning to use notification with icon and updated styling 2026-03-02 13:39:20 +01:00
Jeppe Bundgaard 18ae74012c Add conditional rendering for self-serve steps based on department selection 2026-03-02 13:27:48 +01:00
Jeppe Bundgaard 8e7be044cc Add self-serve support for departments and localized warning for staffed hours 2026-03-02 13:25:40 +01:00
Jeppe Bundgaard ac940ecf91 Add self-serve availability check and warning message for staffed hours 2026-03-02 13:21:50 +01:00
Jeppe Bundgaard 95e9283236 Fix self-serve toggle error handling by reverting to current status on failure 2026-03-02 13:14:34 +01:00
gold-dev d45cf9598e Feat: Change about us section 2026-02-27 11:45:30 +02:00
Jeppe B d37465a0c0 Merge pull request #41 from copenhagentruckwash/codex/add-translations-to-order-attachments-page
Fix missing translations on POS order attachments
2026-02-27 05:52:02 +01:00
Jeppe B 2bfc8f7d3f Fix missing translations on POS order attachments 2026-02-27 05:51:50 +01:00
Jeppe B 9ab4a979c9 Merge pull request #40 from copenhagentruckwash/codex/fix-translations-errors
Fix missing and incorrect translations across locales
2026-02-27 05:47:32 +01:00
Jeppe B 1bb287f7b4 Fix missing locale keys and add translated auth/security strings 2026-02-27 05:47:21 +01:00
Jeppe Bundgaard 892c786a85 Add responsive language selector with desktop buttons and mobile dropdown 2026-02-27 05:39:08 +01:00
Jeppe Bundgaard c071ba0ebe Add test connection functionality and new input fields for Bird API configuration 2026-02-27 03:12:37 +01:00
Jeppe B ffc1ec2320 Merge pull request #37 from copenhagentruckwash/codex/fix-bugs-in-user-booking-flow
Fix guest mobile booking flow blocking at service step
2026-02-27 02:24:30 +01:00
Jeppe B 69f4f6fd61 Merge pull request #39 from copenhagentruckwash/codex/fix-bugs-in-operator-order-flow
Fix POS operator order creation flow and order lookup
2026-02-27 02:23:52 +01:00
Jeppe B ad7ed052de Fix POS operator order creation step handling 2026-02-27 02:23:37 +01:00
Jeppe B b64093a07b Merge pull request #38 from copenhagentruckwash/codex/implement-bird-module
Add Bird superuser module and configuration screen
2026-02-27 02:17:56 +01:00
Jeppe B fbfa7ad213 Add Bird superuser module and configuration page 2026-02-27 02:17:08 +01:00
Jeppe B 1dae51a240 Fix guest mobile booking step progression 2026-02-27 02:16:48 +01:00
Jeppe Bundgaard 6c2b2b7d96 Enhance OpenAPI documentation for configuration endpoints with detailed success messages and add Bird configuration endpoints 2026-02-27 01:58:03 +01:00
Jeppe Bundgaard 78587485df Add API endpoints for test outbound calls and number management 2026-02-27 01:29:18 +01:00
Jeppe Bundgaard 21861bf48b Add goal period calculations and update progress display for improved clarity 2026-02-27 00:53:40 +01:00
Jeppe Bundgaard 35b4f22f2e Refactor tooltip styles for goal progress to improve clarity and consistency 2026-02-27 00:49:07 +01:00
Jeppe Bundgaard b257ebbabd Enhance tooltip for department goal progress by improving styling and positioning 2026-02-27 00:47:42 +01:00
Jeppe Bundgaard e50a288be8 Enhance DepartmentGoal schema by adding date range fields and improving progress descriptions 2026-02-27 00:46:14 +01:00
Jeppe Bundgaard 6989e38e14 Refactor departmental progress target calculations to use consistent timeframe references and improve clarity in goal tracking 2026-02-27 00:44:58 +01:00
Jeppe Bundgaard adb2b90e2a Add department target unit selection and adjust target calculations for weekly inputs 2026-02-27 00:37:40 +01:00
Jeppe Bundgaard 5af10afcfa Enhance departmental goal tracking by adding yearly and to-date progress calculations 2026-02-27 00:31:24 +01:00
Jeppe Bundgaard 3ac7980d41 Round progress and target values in DepartmentGoals component for improved display accuracy 2026-02-27 00:07:24 +01:00
Jeppe Bundgaard b5c0875a6f Add image compression for LPR processing and update parsing logic 2026-02-27 00:00:48 +01:00
Jeppe Bundgaard b8deec06ae Update button IDs and API URL
- Added IDs to buttons in `NewBookingStep5.vue` for better UI automation.
- Removed IDs from buttons in `MyBookingsBook.vue`.
- Updated API URL from `truckwash.dk` to `truckwash.io`.
- Disabled service worker `devOptions` in `vite.config.js`.
2026-02-25 17:25:15 +01:00
Jeppe Bundgaard 745d0787ab Add timeframe selection and improve goal progress calculations in DepartmentGoals.vue
- Introduced timeframe selection tabs for viewing goals by different periods.
- Updated `getGoalProgress` and department progress calculations to incorporate selected timeframe.
- Enhanced goal progress display to reflect accurate departmental and overall progress based on current timeframe.
2026-02-25 15:41:01 +01:00
Jeppe Bundgaard 732707cc7e Refine goal progress calculation in DepartmentGoals.vue
- Updated `getGoalProgress` to use `all?.count` and `all?.target` properties for enhanced accuracy.
- Improved department progress display with detailed progress attributes.
2026-02-25 15:05:47 +01:00
Jeppe Bundgaard bb57a3f357 Update Goal Progress Logic in DepartmentGoals module
- Refined the `getGoalProgress` function to use new `all?.count` and `all?.target` properties for accurate progress calculation.
- Enhanced department progress display by accessing nested progress details, ensuring correct values are shown per department.
- Updated OpenAPI spec to include detailed progress structures, introducing new schemas like `GoalProgressDetails` and `DepartmentGoalProgress` for comprehensive goal tracking.
2026-02-25 14:53:05 +01:00
Jeppe Bundgaard 09fdc26438 Enhance GoalFormModal with i18n support and department daily targets
- Integrated `vue-i18n` for internationalization features in `GoalFormModal.vue`.
- Added support for custom daily targets for departments, with fallback option for even distribution.
- Updated department, product, and customer search inputs to use `t` function for localization.
- Refactored modal creation logic in `showGoalFormModal.js` to use `createApp` and manage app lifecycle with `i18n`.
2026-02-25 14:21:13 +01:00
Jeppe Bundgaard ee04e213f1 Add Connectivity Issue Page and Improve Table Semantics
- Introduced `ConnectivityIssue.vue` for handling and displaying connectivity problems.
- Added new route for the connectivity issue error page.
- Enhanced accessibility by wrapping table headers in `OrderBookingsTable.vue` with `<thead>` and `<tbody>` tags.
- Included connectivity-related internationalization keys across various locale files.
- Updated components to integrate `ConnectivityIssue` as a fallback display for connection errors.
2026-02-25 12:59:10 +01:00
Jeppe Bundgaard 61a3736ad1 Refactor goal calculation logic and update theme imports
- Simplified `getDailyGoalDepartmentTarget` by introducing custom daily target overrides and improving department target calculation.
- Removed redundant `@use` of SweetAlert themes to fix import issues.
- Corrected import extension for SweetAlert Bulma theme from `.scss` to `.css`.
- Cleaned up unused imports in `TimeBookingsElementSelectVehicles.vue`.
2026-02-25 10:03:32 +01:00
Jeppe Bundgaard d870eb9257 Update package versions to ensure compatibility
- Locked versions for `axios`, `sweetalert2`, and `vite` to specific releases.
- Updated multiple Babel helper and plugin packages to newer versions for enhanced functionality.
- Upgraded various esbuild packages and enforced Node.js version >=18 requirement.
- Added missing MIT licenses for dependencies in `package-lock.json` for clarity.
2026-02-24 15:17:09 +01:00
Jeppe Bundgaard 4e5104ab34 Revise testing guidelines: Switch from WebdriverIO to Playwright
- Updated test creation and maintenance rules to include Playwright as the primary framework.
- Simplified testing instructions with enhanced test file running and asserting methods.
- Enhanced guidelines with examples of Playwright features such as locators, page interactions, and assertions.
- Added information on mobile emulation and test structure best practices.
- Removed outdated testing framework information and examples.
2026-02-24 10:45:38 +01:00
Jeppe Bundgaard 7ed053f029 Merge remote-tracking branch 'origin/master' 2026-02-24 10:44:51 +01:00
Jeppe Bundgaard bc0002ca4e Integrate reCAPTCHA in passkey authentication
- Added `recaptchaToken` to `getAuthenticationChallenge` and `verifyAuthentication` for enhanced security.
- Simplified endpoint selection logic by removing user type distinction in `PasskeyAuthService.js`.
- Updated `LoginForm.vue` to fetch reCAPTCHA token if enabled during passkey authentication.
- Adjusted `PasskeyManagement.vue` to better align naming conventions with UI elements.
2026-02-24 10:44:41 +01:00
Jeppe B a91d103de5 Add Qodana configuration upload workflow 2026-02-24 10:41:19 +01:00
Jeppe B 34ed0b9312 Add Qodana configuration upload workflow 2026-02-24 10:39:55 +01:00
Jeppe Bundgaard 41c2a2575e Improve authentication and API integration
- Refined hostname handling in `PasskeyAuthService.js` for correct `rpId` assignment based on domain matching.
- Expanded OpenAPI spec with multiple production server URLs and added `g_recaptcha_response` in various API endpoints for enhanced security.
- Updated `LoginForm.vue` to ensure `customer_number` is accurately parsed as an integer for API compliance.
2026-02-24 01:26:49 +01:00
Jeppe Bundgaard 75cde6a355 Enhance Passkey Authentication Logic and Error Handling
- Added `customerNumber` parameter to `getAuthenticationChallenge` and `authenticateWithPasskey` functions.
- Introduced challenge token usage in `verifyAuthentication` to align with OpenAPI spec.
- Improved error handling in `LoginForm.vue` with detailed error checks and logging.
- Ensured support for session tokens in `SubuserLoginForm.vue`.
2026-02-24 00:34:07 +01:00
Jeppe Bundgaard 4e7def8559 Add passkey authentication endpoints and fix passkey data handling in UI
- Introduced `/auth/passkey/challenge` and `/auth/passkey/verify` endpoints for passkey authentication.
- Adjusted `PasskeyManagement.vue` to correctly parse nested passkey data.
2026-02-23 23:02:40 +01:00
Jeppe Bundgaard 0f309f6ed4 Center TwoFactorVerify component on the page with auto margins. 2026-02-23 22:30:41 +01:00
Jeppe Bundgaard b2a6ede616 Add Two-Factor Authentication (2FA) to login and profile management
- Integrated 2FA check and handling in user and employee login workflows with `TwoFactorVerify` component.
- Added 2FA setup, enable, and disable functionalities in `UserProfile` and related management views.
- Enhanced internationalization files with 2FA-related translations for multiple locales.
- Created `TwoFactorAuthService.js` to handle API calls for 2FA setup and verification processes.
2026-02-23 22:22:36 +01:00
Jeppe Bundgaard be60ce8fdf Integrate passkey authentication and management
- Added passkey support for secure, passwordless authentication using WebAuthn.
- Implemented passkey management in user profiles, enabling users to add, rename, and delete passkeys.
- Updated authentication forms to support passkey login, including feature detection and login flow.
- Enhanced internationalization files with passkey-related translations for multiple locales.
- Introduced new components and services for handling passkey operations and WebAuthn interactions.
2026-02-23 21:59:01 +01:00
Jeppe Bundgaard af7b02bc79 Add ID attributes to improve component interactability
- Added `id="book-wash-button"` for better identification of the book button.
- Included dynamic ID `department-option-${dept.id}` for departments to enhance interaction specificity.
2026-02-23 20:01:41 +01:00
Jeppe Bundgaard 7614ef482d Add force enable/disable machine actions to ActionSettingsWheelButton
- Implemented new actions for force enabling and disabling machines in `ActionSettingsWheelButton.vue`.
- Display success message on login in `LoginForm.vue` and handle reload with delay.
- Adjusted form input handling and error/success message display across auth-related components and forms.
- Included form ID attributes and improved message visibility for user feedback.
2026-02-23 19:44:29 +01:00
Jeppe Bundgaard 159445467a Merge remote-tracking branch 'origin/master' 2026-02-19 16:46:15 +01:00
Jeppe Bundgaard 2ede884959 Add force enable/disable machine functionality for department lanes
- Introduced endpoints to handle force enable/disable machine actions (`/modules/self-serve/lane/force/machine/enable`, `/disable`).
- Updated OpenAPI spec to document the new endpoints.
- Extended `DepartmentLane.vue` and `departmentLanesTable.vue` with buttons for force enable/disable, including loading states and toast notifications.
- Added corresponding i18n translations for force control actions.
- Created E2E tests to verify translation keys, non-empty values, and source file functionality in `department-lane-force-machine.spec.js`.
2026-02-19 11:39:36 +01:00
Jeppe Bundgaard fe5140f74a Add dynamic image and button handling for department lanes and self-serve tasks
- Updated i18n files to include "Dynamic Image ID" translations.
- Extended `SelfServeTasks` and `DepartmentLanes` with columns for dynamic image and button configurations.
- Integrated new OpenAPI endpoint to generate dynamic images for department lanes.
- Enhanced tables, forms, and dashboards to display and manage new attributes.
2026-02-18 16:53:13 +01:00
Jeppe Bundgaard d2f2354efd Extend OpenAPI spec and refine self-serve wash logic
- Updated OpenAPI schemas to include dynamic button IDs and vehicle type overrides for tasks.
- Refined `isMachineAvailable` type definition in `MyWashStart.vue` to improve type safety.
- Simplified lane selection watcher logic in `MyWashStart.vue` by removing redundant step condition.
2026-02-18 16:36:46 +01:00
gold-dev 266cb4cced Feat: Slide 7 2026-02-18 17:29:36 +02:00
Jeppe Bundgaard ba45ba21a3 Update lane selection and allowed services handling in self-serve wash flow
- Adjusted visibility conditions in `MyWashStart.vue` to include the `VEHICLE` step for lane selection.
- Refined `allowedServices` parsing in `useSelfServeLogic.js` to handle nested API response structures correctly.
2026-02-18 15:47:50 +01:00
Jeppe Bundgaard 8a8f44bab9 Update self-serve wash flow to dynamically manage allowed services per lane
- Refactored `handleConfirmNext` in `MyWashStart.vue` to fetch and update allowed services before lane selection.
- Modified `isMachineAvailable` logic to use server-defined allowed services.
- Added watcher for `radioLaneOption` to fetch services dynamically on lane selection.
- Incorporated `isLoadingSelfServeData` check in `shouldDisableNext` to ensure data readiness.
- Introduced new tests for service logic (`updateLaneAllowedServices`, `isServiceAllowed`, `isMachineAvailable`) and added E2E coverage for guided self-serve wash flow.
2026-02-18 15:20:37 +01:00
Jeppe Bundgaard ea1a605505 Enable machine relay during wash start for machine washes
- Added `enableMachineRelay` function in `useSelfServeLogic.js` for activating machine relays.
- Integrated machine relay logic in `MyWashStart.vue` with error handling to avoid wash start failure.
2026-02-18 14:33:08 +01:00
Jeppe Bundgaard c1e4d9b8c4 Add multi-select tests for services in SelfServeTasks and enhance form generation
- Introduced a new test suite for verifying multi-select functionality in `services` column of `SelfServeTasks`.
- Added tests for `type`, `options`, `parse`, and `set.services` functions.
- Enhanced `ObjectsGlobal` form generation to include multi-select checkboxes and pre-checked values for better usability.
2026-02-18 14:16:37 +01:00
Jeppe Bundgaard a29b978bc5 Add guidelines for creating and maintaining tests in .aiassistant/rules/Creating and maintaining tests.md
- Introduced detailed instructions for test development using WebdriverIO, covering structure, naming conventions, and best practices.
- Added examples for browser interactions, assertions, and handling internationalization (i18n) in tests.
- Documented prerequisites for mobile testing and best practices for maintaining test cases.

Enhance SelfServeTasks capabilities by introducing `services` management

- Added `services` property to `SelfServeTasks` for task-specific service handling.
- Implemented logic to determine and update allowed services dynamically based on active tasks.
- Extended machine availability check (`isMachineAvailable`) to consider services allowed per task.

Expand backend support for lane services

- Added new endpoints to manage lane services (`/modules/self-serve/lane/services/allowed` and `/modules/self-serve/lane/relay/machine/enable`).
- Extended OpenAPI specifications to include service configuration for tasks and validation of lane services.

Modify SelfServe UI components for displaying allowed services

- Updated multiple screens to show allowed services based on active tasks.
- Added tags for visualizing allowed task services in `SelfServeTryModal` and `SelfServeTasksTable`.

Add `i18n-settings-wheel.spec.js` for translation key verification

- Added new test suite to ensure i18n translation parity between English and Danish locale files for `settings_wheel`.
- Implemented checks to validate key presence and exact match across both languages.
2026-02-18 14:12:12 +01:00
Jeppe Bundgaard 21b222674a Remove unnecessary console.log from LoginEmployeeForm.vue 2026-02-18 13:16:47 +01:00
Jeppe Bundgaard 601d4ad2a0 Merge remote-tracking branch 'origin/master' 2026-02-18 13:15:53 +01:00
Jeppe Bundgaard ab1e6b8c44 Add "Sign out" button to subuser security settings in UserProfile.vue
- Introduced a new section for subuser security in the user profile.
- Added a "Sign out" button with a confirmation dialog for improved security and functionality.
2026-02-18 13:12:26 +01:00
Jeppe Bundgaard 887c0df238 Auto-select single grant for subusers and improve phone input handling
- Added logic in `SubuserGrantSelector.vue` to auto-select the grant if the subuser only has one available.
- Replaced country code sanitization watcher in `SubuserLoginForm.vue` with a focusout handler for improved performance and simplicity.
- Updated styles and input attributes in login form for better usability and layout consistency.
2026-02-18 13:10:57 +01:00
Jeppe Bundgaard a8862cfa22 Expand Swedish translations and improve phone login usability in SubuserLoginForm
- Added new Swedish translations for `auth` section in `sv.json` and aligned with `en.json` for consistency.
- Enhanced phone login fields with sanitized country code input handling in `SubuserLoginForm.vue`.
- Improved layout for country code and phone number inputs for better user experience.
2026-02-18 12:55:36 +01:00
Jeppe Bundgaard 3129d9398f Update Danish translations and refactor i18n usage in subuser login form
- Expanded and improved Danish translations in `da.json` for `auth` and `common` sections.
- Refactored `SubuserLoginForm.vue` to utilize `useI18n` for dynamic text rendering.
- Enhanced i18n key usage for labels and placeholders in the form.
2026-02-18 12:50:05 +01:00
Jeppe Bundgaard 9b55b7bc37 Enhance LoadButtonWhileAwait with reactive loading state
- Used `computed` to synchronize `isLoading` fallback to local state when prop not provided.
- Improved prop handling and reactive property alignment for better state management.
2026-02-18 12:15:16 +01:00
Jeppe Bundgaard a2b809a468 Restructure wash steps and refactor dependent logic
- Reordered wash steps to place "Questions" before "Select wash lane."
- Updated navigation and validation logic to adhere to the new flow.
- Refactored lane selection logic for better visibility and functionality.
- Fixed reactive property usage in daily report counts for improved accuracy.
2026-02-18 12:10:32 +01:00
gold-dev 46e0d0e747 Feat: Some fixes from slide 20260217_truckwash_dk_and_truckwash_io_edits_6th_edition_V2 2026-02-18 12:56:45 +02:00
Jeppe Bundgaard ee670b9f5e Add Buefy loading component and refine Danish translations
- Introduced `b-loading` component from Buefy for improved loading state visualization in `UserDashboard.vue`.
- Added computed property `isPermissionsLoading` to manage permission loading states dynamically.
- Updated Danish translations in `da.json` for improved clarity and consistency (`customer_creation`, `customer_login`).
2026-02-18 11:27:57 +01:00
Jeppe Bundgaard 472883f1ad Improve Swedish translations in sv.json
- Refined language for customer and operator modules, making text clearer and terminology more consistent.
- Updated translations for dashboards, reports, and POS components to improve user understanding.
- Improved alignment with key structures in `en.json` for better internationalization consistency.
2026-02-18 11:00:01 +01:00
Jeppe Bundgaard a26d33b714 Update default vehicle data and refactor i18n usage in MassDataInserterModal
- Adjusted default values in `VehicleDataStructure.vue` (`customer_id` and `type`).
- Refactored i18n integration in `MassDataInserterModal.vue` to use `i18n.global.t` for improved consistency.
2026-02-18 10:59:49 +01:00
Jeppe Bundgaard a978675899 Filter restricted products and add-ons based on customer attributes in POS components
- Introduced logic to filter out restricted products and add-ons using new utility methods (`isProductRestricted`, `isAddonRestricted`, `canBuyAdditionalServices`) based on customer attributes.
- Updated relevant POS components to replace unfiltered lists with computed properties for restricted items.
- Enhanced maintainability by centralizing restriction checks in `POSDepartmentProcess.vue`.
2026-02-17 17:21:19 +01:00
Jeppe Bundgaard 382d9e6f6b Add and organize comprehensive Swedish translations (sv.json)
- Added extensive Swedish translations for dashboards, reports, bookings, POS components, settings, and common actions.
- Reorganized and expanded i18n keys for greater maintainability and consistency across multilingual support.
- Aligned sv.json with existing `en.json` and `da.json` structures to ensure seamless integration.
2026-02-17 17:21:09 +01:00
Jeppe Bundgaard ecaa183ac3 Add Swedish and German language options to LanguageSwitcher and LanguageSelector components 2026-02-17 16:39:22 +01:00
Jeppe Bundgaard 52e3d8fea0 Add Swedish (sv.json) and German (de.json) locale files for extended multilingual support
- Introduced comprehensive translation keys for dashboards, reports, bookings, POS components, settings, and common actions.
- Improved multilingual consistency and maintainability by aligning with existing i18n integration in `en.json` and `da.json`.
2026-02-17 16:37:55 +01:00
Jeppe B 49ed546716 Merge pull request #36
Add i18n support with vue-i18n for Danish/English localization
2026-02-17 16:25:16 +01:00
Jeppe Bundgaard 7fc889dd75 Refactor LoadButtonWhileAwait to use Buefy components and enhance loading/disabled state handling 2026-02-17 16:22:43 +01:00
Jeppe Bundgaard 8aa6fcf17f Refactor DepartmentPos pagination component to use TableLabeledPagination and enhance i18n integration 2026-02-17 15:57:22 +01:00
Jeppe Bundgaard 9f5fba3400 Extend i18n integration for department SMS notifications and labels
- Replaced hardcoded text with dynamic translations using `$t` and `i18n.global.t`.
- Updated `en.json` and `da.json` with new translation keys for SMS notifications, country codes, and related labels.
- Improved multilingual consistency and maintainability across components.
2026-02-17 15:50:28 +01:00
Jeppe Bundgaard ca26751b9f Add i18n keys for department reports (revenue, washes, avg revenue per wash) in en.json 2026-02-17 15:41:17 +01:00
Jeppe Bundgaard 66298d7d45 Make DatePeriodSelector shortcuts reactive to language changes
- Replaced static shortcut arrays with computed properties for dynamic reactivity to language changes.
- Improved i18n maintainability by using `SessionUser.objects.global.language
2026-02-17 15:39:50 +01:00
Jeppe Bundgaard 76e5b03bc2 Extend i18n integration in DepartmentDailyReport components
- Added new translation keys (`quantity_sold`) in `en.json` and `da.json` for improved multilingual support.
- Replaced hardcoded labels in `DepartmentDailyReportCount.vue` with computed properties using dynamic translations from `useI18n`.
- Improved maintainability and consistency by centralizing reusable strings.
2026-02-17 15:35:52 +01:00
Jeppe Bundgaard 731ba09696 Extend i18n integration in DepartmentDailyReport components
- Replaced hardcoded strings with dynamic translations using `useI18n` and `$t`.
- Localized titles, subtitles, placeholders, labels, and error messages across daily report components for multilingual consistency.
- Added new scalable translation keys to enhance maintainability.
2026-02-17 15:26:26 +01:00
Jeppe Bundgaard fe3f4b10f0 Extend i18n integration across dashboards, reports, and components
- Updated `en.json` and `da.json` with comprehensive translation keys for department dashboards, booking reports, tables, and POS components.
- Replaced hardcoded strings with dynamic translations using `$t` in multiple components for multilingual consistency.
- Improved maintainability by organizing and centralizing reusable translation keys.
2026-02-17 15:25:32 +01:00
Jeppe Bundgaard 2266e3908f Extend i18n integration for time bookings and POS components
- Added new translation keys in `en.json` and `da.json` for time bookings (placeholders, labels, and actions) and POS component buttons.
- Improved localization for registration numbers, license plate inputs, and booking flows.
2026-02-17 15:13:21 +01:00
Jeppe Bundgaard b0a2c0216f Expand i18n integration across component actions and admin settings
- Replaced hardcoded texts in `ActionSettingsWheelButton.vue` and related components with dynamic translations using `useI18n` for improved multilingual consistency.
- Updated `en.json` with new translation keys for buttons, modals, and action labels.
- Consolidated unused translation keys and improved maintainability by centralizing reusable strings.
2026-02-17 14:57:13 +01:00
Jeppe Bundgaard 16d63a2710 Expand i18n integration across dashboards and components
- Replaced hardcoded text with dynamic translations using `useI18n` or `$t` across multiple dashboards and components.
- Localized labels, placeholders, titles, subtitles, error messages, table headers, buttons, and actions.
- Extended and centralized translation keys for improved multilingual support and maintainability.
2026-02-17 14:16:41 +01:00
Jeppe Bundgaard fe3318e6ac Extend i18n integration across components
- Replaced hardcoded text with dynamic translations using `useI18n` or global `i18n` in multiple components and dashboards.
- Localized buttons, placeholders, labels, table headers, error messages, and object metadata, enhancing multilingual support.
- Improved maintainability by introducing and centralizing new translation keys.
2026-02-17 13:39:43 +01:00
Jeppe Bundgaard d6be146d91 Refactor i18n integration in superuser navigation menu items
- Replaced `useI18n` with global `i18n` instance for consistency.
- Adjusted translation function to `i18n.global.t` for improved maintainability.
2026-02-17 13:18:05 +01:00
Jeppe Bundgaard 27f6de8b42 Localize titles, subtitles, and error messages across dashboards and tables
- Replaced hardcoded titles, subtitles, and error messages with dynamic translations using `$t` across dashboard and table components.
- Enhanced i18n support by introducing new translation keys for improved multilingual consistency.
2026-02-17 13:16:55 +01:00
Jeppe Bundgaard 6c2ca85dee Localize tables and improve i18n integration
- Replaced hardcoded labels and placeholders with dynamic translations using `i18n` across multiple table components (`PosLastScannedLicensePlates.vue`, `InvoiceCollectionsTable.vue`, `ordersSyncTable.vue`, etc.).
- Added comprehensive translation keys for table headers, actions, and states to improve multilingual support.
- Enhanced maintainability by centralizing reusable translation keys.
2026-02-17 13:06:39 +01:00
Jeppe Bundgaard fd8b86987f Localize objects and enhance i18n integration
- Replaced hardcoded labels in `Bookings.vue`, `Orders.vue`, and `Vehicles.vue` with dynamic translations using `i18n`.
- Added comprehensive translation keys for `objects` in `en.json` and `da.json`.
- Improved multilingual support for objects metadata, columns, and labels.
2026-02-17 12:56:40 +01:00
Jeppe Bundgaard 665dc61d98 Localize global objects and extend i18n support
- Replaced hardcoded text in `ObjectsGlobal.vue` with dynamic translations using `i18n`.
- Centralized global translation keys in `en.json` and `da.json` under the `global` namespace.
- Improved multilingual support and maintainability for global object labels and actions.
2026-02-17 12:52:12 +01:00
Jeppe Bundgaard 33c64659c7 Localize admin and user navigation menus
- Replaced hardcoded navigation labels in `NavigationMenuItemsUser.vue`, `NavigationMenuItemsAdmin.vue`, and `NavigationMenuItemsGlobal.vue` with dynamic translations using `i18n`.
- Added new translation keys for navigation items in `en.json` and `da.json`, improving multilingual support.
2026-02-17 12:47:29 +01:00
Jeppe Bundgaard bb8ae993eb Localize user dashboard and enhance translation support
- Replaced hardcoded dashboard text in `UserDashboard.vue` with dynamic translations using `$t`.
- Added new translation keys in `en.json` and `da.json` for user dashboard actions, descriptions, and messages.
- Improved multilingual support for subuser actions, empty state messages, and contact information.
2026-02-17 12:44:45 +01:00
Jeppe Bundgaard 3f71fb85f4 Add language selector and localize user navigation menus
- Introduced a new `LanguageSelector` component for switching between languages with persisted user preference.
- Localized navigation items in `UserLeftMenu.vue` using translation keys in `en.json` and `da.json`.
- Updated `DesktopNavigationBuefy.vue` and `UserLeftMenu.vue` to include the `LanguageSelector` component.
2026-02-17 12:43:06 +01:00
Jeppe Bundgaard 7d3630fa62 Localize QR login and headers
- Replaced hardcoded text in `LoginQR.vue`, `DesktopHeader.vue`, `TabletHeader.vue`, and `GuestBookExteriorWash.vue` with dynamic translations using `$t`.
- Added new translation keys to `en.json` and `da.json` for improved multilingual support across login, QR scanning, and navigation headers.
- Updated `config.js` to adjust the `API_URL` for local development.
2026-02-17 12:38:56 +01:00
Jeppe Bundgaard 32a2725de2 Localize login form components
- Replaced hardcoded labels and button text in `LoginForm.vue` with dynamic translations using `$t`.
- Improved maintainability and multilingual support by introducing keys for customer number, password, login, login with QR code, and forgot password links.
2026-02-17 12:34:51 +01:00
Jeppe Bundgaard f15c07e43e Localize user dashboard and password reset pages
- Replaced hardcoded text with translations using `$t` across user dashboard components (`MyInvoices.vue`, `MyVehicles.vue`, `Home.vue`, `MyWash.vue`, `MyOrders.vue`, `MyBookings.vue`) and password reset pages (`PasswordResetPage.vue`, `PasswordResetConfirmationPage.vue`).
- Added new translation keys to `en.json` and `da.json`, enhancing multilingual support for titles, subtitles, and labels.
2026-02-17 12:31:04 +01:00
Jeppe Bundgaard c4deaa8e86 Localize customer creation and about us pages
- Updated `CustomerCreationPage.vue` and `AboutUsPage.vue` to use translations from `en.json` and `da.json`.
- Added relevant keys for customer creation, about us sections, and form labels in both languages.
- Improved maintainability and consistency by replacing hardcoded text with dynamic translations using `$t`.
2026-02-17 12:28:00 +01:00
Jeppe Bundgaard 84e8491ccc Update API_URL for development to use local endpoint 2026-02-17 12:19:14 +01:00
Jeppe Bundgaard c438fe6b27 Add signature images to public assets
- Added `jm-signature.png` and `my-signature.png` to `public/img`.
2026-02-17 12:19:04 +01:00
Jeppe Bundgaard 6188c7734a Add success message for password reset and handle token validation improvements
- Introduced a success message when password reset is completed, guiding users to log in.
- Refined token validation logic to handle expired or invalid tokens more accurately.
- Updated `PasswordResetConfirmationPage.vue` to display appropriate feedback based on reset status.
2026-02-17 12:18:56 +01:00
copilot-swe-agent[bot]andjepp9350 1ed8a30826 Improve error messages based on code review feedback
Co-authored-by: jepp9350 <17977216+jepp9350@users.noreply.github.com>
2026-02-17 11:04:51 +00:00
copilot-swe-agent[bot]andjepp9350 5dc35d0a1b Add i18n translations to UserProfile.vue for email management dialogs
Co-authored-by: jepp9350 <17977216+jepp9350@users.noreply.github.com>
2026-02-17 11:01:58 +00:00
copilot-swe-agent[bot]andjepp9350 63a10dd5c4 Add i18n setup with vue-i18n, locale files, and LanguageSwitcher component
Co-authored-by: jepp9350 <17977216+jepp9350@users.noreply.github.com>
2026-02-17 10:57:31 +00:00
copilot-swe-agent[bot] 19be7ef797 Initial plan 2026-02-17 10:50:22 +00:00
Jeppe Bundgaard ecf65b47a1 Remove duplicate "Operatørlogin" navigation item from LayoutV2.vue 2026-02-16 00:09:49 +01:00
Jeppe Bundgaard 3e1f8ed6d6 Merge remote-tracking branch 'origin/master' 2026-02-16 00:09:34 +01:00
Jeppe Bundgaard 5ccfb5f050 Add "Operatørlogin" navigation item to LayoutV2.vue
- Added a new link for operator login to the navigation menu.
2026-02-16 00:09:18 +01:00
gold-dev 8ae010b55c Feat: Add operator login for mobile 2026-02-13 16:41:55 +02:00
Jeppe Bundgaard 702b599490 Add empty state for subusers without shortcut permissions
- Render a message in `UserDashboard` when subusers lack access to dashboard shortcuts, including instructions to contact the administrator.
- Introduced `hasAnyShortcutPermission` computed property to check subuser permissions.
2026-02-12 18:15:34 +01:00
Jeppe Bundgaard c24eeca6b4 Add no-permissions message to SubuserGrantSelector for subusers without grants
- Display a warning message when no grants are available, with compact and expanded layouts.
- Updated styles to support new no-permissions notification design.
2026-02-12 18:14:34 +01:00
Jeppe Bundgaard 2156d55650 Update subuser terminology to "chauffør" and refine navigation item visibility logic
- Replaced "subuser" with "chauffør" in `UserProfile.vue` for improved role specificity.
- Enhanced navigation item visibility in `DesktopNavigationBuefy.vue` by adding permission-based checks and refining hidden item filtering logic.
2026-02-12 18:10:54 +01:00
Jeppe Bundgaard ba63aab53b Enhance subuser profile management with editable name and email fields
- Added support for subusers to update their name and email via modals in `UserProfile.vue`.
- Updated `SubuserGrantSelector` styles with improved layout and accessibility for compact mode.
- Refined `SessionUser` logic to conditionally render visible profile attributes and actions based on subuser status.
- Adjusted navigation permissions to remove redundant `user_invoices` permission check.
2026-02-12 18:07:02 +01:00
Jeppe Bundgaard caff98690c Enhance SubuserGrantSelector with compact dropdown mode and integrate into user profile
- Added dropdown-based compact layout for `SubuserGrantSelector` to improve subuser grant selection UX.
- Integrated `SubuserGrantSelector` into `UserProfile.vue` for subuser-specific grant management.
- Updated styles to support compact mode, including dynamic icon and text transformation based on environment.
2026-02-12 18:01:32 +01:00
Jeppe Bundgaard 22f9a486c6 Add compact prop to SubuserGrantSelector and integrate into headers
- Introduced a `compact` prop in `SubuserGrantSelector.vue` for adjustable layout styles.
- Updated `MobileHeader.vue` and `DesktopHeader.vue` to utilize `compact` mode for streamlined grant selection UI in navigation bars.
- Refined styles for `compact` mode, including reduced spacing and smaller select elements.
2026-02-12 17:59:06 +01:00
Jeppe Bundgaard 85477916d5 Integrate SubuserGrantSelector into header components and enhance navigation permissions
- Removed permissions display from `SubuserGrantSelector.vue` template.
- Added `SubuserGrantSelector` to both `MobileHeader.vue` and `DesktopHeader.vue` for subuser-specific navigation.
- Updated user menu items to include permissions for enhanced access control.
2026-02-12 17:57:12 +01:00
Jeppe Bundgaard b173b14e86 Enhance subuser grant handling and permissions
- Update `SubuserGrantSelector` to disable the default option and display customer names if available.
- Refine `UserDashboard` to conditionally render cards based on `SessionUser` permissions.
- Add `X-Customer-Number` header in authenticated requests for subuser-specific actions.
2026-02-12 17:52:59 +01:00
Jeppe Bundgaard 66c9936d32 Expand subuser grant handling and enforce selection before dashboard access
- Enhanced `SessionUser` permissions logic to validate selected grant for subusers.
- Updated `UserDashboard` to require subusers to select a grant before accessing dashboard content.
- Integrated `SubuserGrantSelector` component for dynamic grant management.
2026-02-12 17:40:30 +01:00
Jeppe Bundgaard 316cca9ca3 Expand subuser permissions and adjust navigation logic
- Updated navigation permissions to include specific grants for subusers, ensuring appropriate access to user-related pages.
- Enhanced `SessionUser.getName` to display subuser's name when applicable.
- Refined navigation logic to ensure subusers can access user menus on relevant pages.
2026-02-12 17:33:42 +01:00
Jeppe Bundgaard 393a46ae34 Add subuser role with hierarchy adjustments and redirection logic
- Introduced "subuser" role with level 2 hierarchy and access control.
- Added reactive subuser redirection logic based on status changes.
- Adjusted hierarchy levels for "superuser" (4) and "admin" (3).
2026-02-12 17:27:14 +01:00
Jeppe Bundgaard b41d839258 Introduce Subuser Grant Selector and Chauffør Login Integration
- Added `SubuserGrantSelector.vue` for subuser grant management with dynamic customer selection and associated permissions display.
- Implemented `SubuserLogin.vue` and supporting `SubuserLoginForm.vue` to enable chauffeur login functionality.
- Enhanced `SessionUser` to include grant selection logic, with methods for managing selected customer numbers, persisting selections, and header handling for authenticated requests.
- Integrated new `subuserlogin` route into `router.js`.
- Updated `authenticatedRequest.vue` to include `X-Customer-Number` header for subuser-specific requests.
2026-02-12 17:17:22 +01:00
Jeppe Bundgaard 1f27f3b069 Add subuser session management and authentication support
- Introduced subuser-specific session data handling, including `getSubuserSessionData`.
- Added `authenticateSubuser` to enable password-based authentication for subusers.
- Updated `SessionUser` to support subuser sessions with fields like `isSubuser` and `subuser` details.
- Adjusted logic for clearing and initializing sessions to differentiate subuser and classic user contexts.
- Enhanced OpenAPI spec to include subuser-specific endpoints and permissions, updating customer-targeting behavior.
2026-02-12 17:00:51 +01:00
Jeppe Bundgaard ec292bce73 Update labels and placeholders to replace "Underbruger" with "Chauffør" across Subuser Grants components. 2026-02-12 16:45:11 +01:00
Jeppe Bundgaard 48896d2b83 Update navigation to replace subuser category with direct link to 'Chauffører' grants page. 2026-02-12 16:07:14 +01:00
Jeppe Bundgaard 6829955f2b Refactor permission group display in SubuserGrantPermissionNodes.vue to wrap titles and descriptions within a styled content divider. 2026-02-12 15:56:00 +01:00
Jeppe Bundgaard ec93989002 Refactor SubuserGrantsTable.vue to use dynamic labels for column headers and parse functions, remove unused columns, and update SubuserGrants.vue labels. 2026-02-12 15:48:36 +01:00
Jeppe Bundgaard 08a6f4fefd Reintroduce editable columns in SubuserGrantsTable.vue with EditableTableColumn and implement showEditObjectFieldForm in SubuserGrants.vue 2026-02-12 14:32:06 +01:00
Jeppe Bundgaard ccf4e139f6 Remove editable column for subuser grants in SubuserGrantsTable.vue and replace with static status tag rendering. 2026-02-12 14:25:55 +01:00
Jeppe Bundgaard cb1e007fda Merge remote-tracking branch 'origin/master' 2026-02-12 14:16:57 +01:00
Jeppe Bundgaard 7c8f79f13b Implement interactive modal for editing subuser grant permissions using SubuserGrantPermissionNodes.vue and integrate SweetAlert2 with Vue app creation. 2026-02-12 14:11:15 +01:00
Jeppe Bundgaard d2e0467605 Mark permissions prop in SubuserGrantPermissionNodes.vue as required 2026-02-12 13:20:55 +01:00
Jeppe Bundgaard 8805247dbc Add support for editing subuser grant permissions, integrate permission nodes selector component, and update relevant UI and backend logic 2026-02-12 13:16:52 +01:00
Jeppe Bundgaard b79ce07cda Add editable column for subuser grants and implement permission nodes selector component 2026-02-12 12:34:26 +01:00
gold-dev 44f78e817e Feat: Layout index for header mobile menu 2026-02-12 10:43:08 +02:00
Jeppe Bundgaard 1666c3de45 Expand openapi.yaml with listSubusers and getSubuser endpoints for subuser management, including query parameters, response structure, and error handling definitions. 2026-02-11 18:00:51 +01:00
Jeppe Bundgaard da0bae5bf2 Add created/updated timestamps to SubuserGrantsTable; define new SubuserGrants object structure 2026-02-11 17:58:27 +01:00
Jeppe Bundgaard b7bc4ec907 Add subuser and grant management navigation, expand openapi.yaml with subuser-related definitions, and update permissions in SubuserGrants.vue. 2026-02-11 17:53:54 +01:00
Jeppe Bundgaard c9fee21d24 Add subuser and grant management views with pagination components and routing integration 2026-02-11 17:38:36 +01:00
Jeppe Bundgaard 40a6a4f664 Add subuser, grant, and passkey management endpoints to openapi.yaml.
Expanded the API specification with endpoints for subuser management, including setup, authentication, and permission grants, as well as account security passkey handling.
2026-02-11 17:28:10 +01:00
Jeppe Bundgaard 710c05bf52 Update phone number on AboutUsPage.vue for contact section. 2026-02-11 15:38:58 +01:00
Jeppe Bundgaard 0b7f79d59c Replace team member images and update corresponding references in AboutUsPage.vue. Add new assets mads-scaled.png and jeppe-scaled.png. 2026-02-11 15:36:29 +01:00
Jeppe Bundgaard 5606f2d5f7 Merge remote-tracking branch 'origin/master' 2026-02-03 15:08:57 +01:00
Jeppe Bundgaard 9172a95221 Refine error handling in CollectedOrderInvoicesCompareDataStructure.vue to extract and process differences from error responses. 2026-02-03 14:28:35 +01:00
gold-dev 4af3f2a997 Feat: Slides 4, 8 2026-02-03 15:15:19 +02:00
Jeppe Bundgaard 314462345d Add difference calculation and display to MassDataInsertTable.vue and refine response handling in CollectedOrderInvoicesCompareDataStructure.vue 2026-02-03 13:57:06 +01:00
Jeppe Bundgaard a08ef03bb8 Add onClose prop to MassDataInserterModal.vue for custom modal close handling and minor adjustment to CollectedOrderInvoicesCompareDataStructure.vue structure definition 2026-02-03 13:51:41 +01:00
Jeppe Bundgaard 59d1272e98 Add total_net_amount field to CollectedOrderInvoices structure and implement import/export functionality in MassDataInserterModal.vue with JSON support 2026-02-03 13:35:18 +01:00
Jeppe Bundgaard 71c549df87 Add "Remove Passing Items" functionality to MassDataInserterModal.vue with UI button, data filtering, and progress updates 2026-02-03 13:27:35 +01:00
Jeppe Bundgaard b779d9b479 Add re-run functionality to MassDataInserterModal.vue with progress reset, validation for re-run conditions, and UI button integration 2026-02-03 13:26:21 +01:00
Jeppe Bundgaard 55e85215ce Add multi-page invoice fetching to mass comparison flow in CollectedOrderInvoicesListPagination.vue with user confirmation for large datasets and improved error handling. 2026-02-03 13:16:40 +01:00
Jeppe Bundgaard 931b473efe Add CollectedOrderInvoicesCompareDataStructure.vue and refactor mass comparison flow for collected invoices with E-conomic. Expand pagination options and improve error/message handling. 2026-02-03 12:53:14 +01:00
Jeppe Bundgaard ec1114b1cd Add comparison endpoint and mass comparison feature for collected invoices with E-conomic in openapi.yaml and CollectedOrderInvoicesListPagination.vue. 2026-02-03 12:34:19 +01:00
Jeppe Bundgaard 344acf4a13 Add CollectedOrderInvoicesListPagination and CollectedOrderInvoicesDefaultTable components for handling and displaying collected order invoices with advanced filtering and pagination options 2026-02-03 12:24:13 +01:00
Jeppe Bundgaard 95470794f5 Add QR routes and components for guest actions including new customer registration, driver setup, and booking creation 2026-02-02 11:17:53 +01:00
Jeppe Bundgaard ae7c1dac5b Merge remote-tracking branch 'origin/master' 2026-02-02 10:31:13 +01:00
Jeppe Bundgaard e15e94545c Increase transaction history pagination limit to 1000 in PosDepartmentStep1MobileTransactionHistory.vue. 2026-02-02 10:30:34 +01:00
gold-dev a7d4373abc Feat: Slides 2, 3, 5, 6 2026-02-02 10:49:05 +02:00
Jeppe Bundgaard 14be8db1a6 Add departmental progress tracking in DepartmentGoals.vue with enhanced UI elements and new methods to calculate daily targets and business days. 2026-01-29 17:56:44 +01:00
Jeppe Bundgaard 194c5a8703 Merge remote-tracking branch 'origin/master' 2026-01-28 20:07:17 +01:00
Jeppe Bundgaard 083c53e75f Update goal progress display in DepartmentGoals.vue to show value/target format and adjust progress bar calculations 2026-01-28 20:07:05 +01:00
gold-dev bffde4efc7 Feat: Styleguide 2026-01-28 12:04:45 +02:00
Jeppe Bundgaard f8c0925fef Add test progress alert functionality to department goals, including UI integration and API call 2026-01-27 09:19:34 +01:00
Jeppe Bundgaard be37edaa15 Add endpoint to send test progress alerts for department goals in OpenAPI documentation 2026-01-27 09:12:58 +01:00
Jeppe Bundgaard 28357df51d Add time picker for progress_alert_time_of_day in GoalFormModal with local time handling and timezone offset adjustment 2026-01-27 09:05:40 +01:00
Jeppe Bundgaard 7775f58a29 Add enhanced alert configuration options to GoalFormModal and update display in DepartmentGoals.vue 2026-01-27 08:57:45 +01:00
Jeppe Bundgaard 1d61efbe73 Extend OpenAPI documentation with new progress_alert_* fields for enhanced alert configuration options. 2026-01-27 08:53:32 +01:00
Jeppe Bundgaard 28e7b5f23e Add progress_alert_frequency field in GoalFormModal, handle its display in DepartmentGoals.vue, and update related UI elements. 2026-01-26 20:14:04 +01:00
Jeppe Bundgaard d812e57be7 Add "label" field to goal criteria in GoalFormModal, update fallback naming in DepartmentGoals.vue, and extend OpenAPI documentation 2026-01-26 19:47:50 +01:00
Jeppe Bundgaard a68d7a0b95 Improve caching strategy across ObjectsGlobal methods and update fallback goal naming logic in DepartmentGoals.vue. 2026-01-26 18:56:16 +01:00
Jeppe Bundgaard 39b71e5f2b Refactor GoalFormModal to replace user search with customer search functionality, update related filtering logic, and improve progress calculation in DepartmentGoals.vue. 2026-01-26 18:41:02 +01:00
Jeppe Bundgaard 8257568573 Enhance GoalFormModal with debounced search for users and products, improved filtering logic, and support for fetching missing details during editing. 2026-01-26 18:28:57 +01:00
Jeppe Bundgaard 46afda9fb7 Refactor goal management modals: merge GoalCreateModal and edit functionality into reusable GoalFormModal. Update integration in DepartmentGoals.vue. 2026-01-26 18:24:58 +01:00
Jeppe Bundgaard 09b0b6c80b Add GoalCreateModal component with creation workflow and integrate it into DepartmentGoals.vue 2026-01-26 18:12:17 +01:00
Jeppe Bundgaard 159470d921 Enhance DepartmentGoals.vue with dynamic goals fetching, filtering, and improved UI/UX for goal management 2026-01-26 18:05:15 +01:00
Jeppe Bundgaard 4b158042af Add "Goals" module with navigation, routing, and basic UI structure 2026-01-26 18:02:41 +01:00
Jeppe Bundgaard bf16481b29 Add Goals module with CRUD functionality and OpenAPI documentation 2026-01-26 17:55:52 +01:00
Jeppe Bundgaard 9c236afdeb Enable drag-and-drop reordering of departments with live priority updates 2026-01-26 14:06:37 +01:00
Jeppe Bundgaard 40846dcf2a Add order priority column to DepartmentsTable for future draggable implementation 2026-01-26 13:53:04 +01:00
Jeppe Bundgaard d9516f0e17 Add order_priority field to Departments.vue with support for creation and updates 2026-01-26 13:50:40 +01:00
Jeppe Bundgaard 3e5c5b893c Redirect authenticated users on the landing page and increment TWA app version to 6 2026-01-26 12:40:00 +01:00
gold-dev 9ba2141d42 Feat: reset password + login improvements 2026-01-22 16:03:12 +02:00
gold-dev a51fb8baff Feat: slides 6, 8, 9 2026-01-22 14:22:27 +02:00
Jeppe Bundgaard 1daa7d6660 Simplify date range and department selection logic in DepartmentDailyReport. 2026-01-22 12:59:25 +01:00
Jeppe Bundgaard b99fdd620d Add query params handling for date range and department selection in DepartmentDailyReport
- Enhance department selection logic to filter accessible departments.
- Automatically update URL query parameters based on user selections.
- Add loading state to department navigation buttons.
2026-01-22 12:54:07 +01:00
Jeppe Bundgaard 777dd9ef3c Remove unused navigation menu item for self-serve questions in admin view 2026-01-22 09:00:11 +01:00
Jeppe Bundgaard ac2d71a202 Add sorting by datetime for OrderBookingsPagination and enhance filter initialization 2026-01-22 08:54:22 +01:00
Jeppe Bundgaard 70815ad401 Update DepartmentModulesDisplay to fetch self-serve status on mount and improve toggle switch binding 2026-01-21 10:39:35 +01:00
Jeppe Bundgaard a2aede936e Add self-serve status toggle to DepartmentModulesDisplay and API endpoints for enable/disable actions 2026-01-21 10:32:55 +01:00
Jeppe Bundgaard 28d01cb4dd Add toggle switch to DepartmentModulesDisplay for wash lane settings 2026-01-21 10:27:01 +01:00
Jeppe Bundgaard 1bd3feab66 Remove Privacy Policy link from LayoutV2 navigation menu 2026-01-21 09:54:08 +01:00
Jeppe Bundgaard bf573a9ca9 Add Privacy Policy page and navigation links 2026-01-21 09:49:58 +01:00
Jeppe Bundgaard 825219e264 Update TWA manifest with incremented app version and version code 2026-01-21 09:35:01 +01:00
Jeppe Bundgaard 670324c7fb Add Bubblewrap TWA build and install instructions to README.md 2026-01-21 09:09:09 +01:00
Jeppe Bundgaard 0cf1cc4498 Update TWA manifest with new configurations, asset links, and updated app version 2026-01-21 09:05:59 +01:00
Jeppe Bundgaard c3f99d15c7 Update TWA manifest with new package ID, host, app name, and asset URLs. 2026-01-20 16:20:48 +01:00
Jeppe Bundgaard 7371d235b7 Add PWA support with manifest and TWA integration. Update Vite PWA plugin configuration and scripts for building and updating TWA. 2026-01-20 16:14:50 +01:00
Jeppe Bundgaard b828fb9c77 Remove "force nearest department" superuser controls and update related logic in MyWashStart.vue. 2026-01-20 15:44:34 +01:00
Jeppe Bundgaard e29813e1a3 Add superuser controls for manually forcing nearest department in MyWashStart.vue. 2026-01-20 15:39:10 +01:00
Jeppe Bundgaard 21ae3b23b7 Display loading message in MyWashStart.vue when no vehicle types are available for selection. 2026-01-20 15:18:11 +01:00
Jeppe Bundgaard c0ac599776 Handle empty availableProductIds in MyWashStart.vue by displaying a warning message when self-serve is unavailable. 2026-01-20 15:14:14 +01:00
Jeppe Bundgaard dffd93fe14 Force nearest department to saved one if wash is in progress; add location-based department evaluation in MyWashStart.vue. 2026-01-20 15:10:31 +01:00
Jeppe Bundgaard 52ae521ad6 Comment out excessive logging in MyWashStart.vue to reduce noise during runtime and improve readability. 2026-01-20 15:08:00 +01:00
Jeppe Bundgaard 809540e0ff Merge remote-tracking branch 'origin/master' 2026-01-20 14:58:48 +01:00
Jeppe Bundgaard 781b419a28 Update step labels in MyWashStart.vue for clearer user guidance and streamline step visibility logic 2026-01-20 14:58:13 +01:00
Jeppe Bundgaard ec5ff41bfa Fix inconsistent spacing and indentation in MyWashStart.vue for improved readability and maintainability. 2026-01-20 14:35:11 +01:00
gold-dev 4c9199e66d Feat: slides 3-5 partial 6 2026-01-20 15:31:13 +02:00
gold-dev 74f35b3008 Merge remote-tracking branch 'origin/master' 2026-01-20 15:29:02 +02:00
Jeppe Bundgaard df716ccbaf Comment out unused question description in MyWashStart.vue for cleaner UI. 2026-01-20 13:26:58 +01:00
Jeppe Bundgaard e55b21acae Format self-serve object names to include department, lane, and product details for improved clarity and consistency across questions, tasks, and conditions. 2026-01-20 12:34:43 +01:00
gold-dev 00b9932c40 Feat: add dev-dist to gitignore 2026-01-20 13:28:04 +02:00
gold-dev 6e02618a38 Feat: Slides 1-2 2026-01-20 13:27:35 +02:00
Jeppe Bundgaard 943a143a19 Optimize condition and task name handling by integrating department and product names, add global cache for improved request efficiency, and streamline object fetching methods. 2026-01-20 12:24:44 +01:00
Jeppe Bundgaard d0ddf29235 Refactor self-serve condition and task handling to use formatted names, streamline setters, and optimize attachment methods 2026-01-20 12:21:01 +01:00
Jeppe Bundgaard 80c4d16eff Restrict vehicle type selection and validation in MyWashStart.vue and apply product-based filtering in VehicleTypeSelection.vue. 2026-01-20 12:03:34 +01:00
Jeppe Bundgaard fbf55c6d18 Restrict vehicle type selection in MyWashStart.vue to available product IDs 2026-01-20 11:41:48 +01:00
Jeppe Bundgaard 11dde044e0 Refactor self-serve logic to simplify filters, add task prioritization, and improve attachment handling 2026-01-20 11:12:16 +01:00
Jeppe Bundgaard 0bef66201b Add logging for task attachment fetching and enhance UI with data-fetching status indicators in self-serve modals 2026-01-20 11:04:52 +01:00
Jeppe Bundgaard c4ab40c76f Disable debug mode by default and hide debug button in MyWashStart.vue 2026-01-19 14:56:43 +01:00
Jeppe Bundgaard 5de72344f8 Ensure user ownership of the vehicle before saving conditions in MyWashStart.vue
- Added `doesUserVehicleExist` check to validate ownership before saving conditions to the server.
- Skipped server-side condition save for unowned vehicles with an appropriate log message.
2026-01-19 14:51:08 +01:00
Jeppe Bundgaard 241efe34aa Add detailed logging for restoration and saving processes in MyWashStart.vue
- Introduced `instanceId` for better logging differentiation during multiple component instances.
- Enhanced restoration logic with stricter protections against unintended state changes.
- Updated `saveProgress` to handle triggers, destruction states, and invalid step resets more robustly.
- Improved logging visibility for debugging restoration, saving, and flow issues.
- Streamlined event handling for `beforeunload` and `onUnmounted` scenarios.
2026-01-19 14:46:01 +01:00
Jeppe Bundgaard 017737df19 Enhance wash restoration logic in MyWashStart.vue
- Added a timeout-based restoration process (`isRestoring`) to handle incomplete or timed-out washes.
- Prevented unintended state changes during restoration by refining watchers and condition checks.
- Introduced a 2-hour expiration for saved progress to avoid restoring outdated data.
2026-01-19 14:19:31 +01:00
Jeppe Bundgaard 10fe180ad2 Split "Questions" and "Tasks" into separate steps in MyWashStart.vue to improve navigation and step clarity
- Introduced a dedicated `TASKS` step and adjusted `currentStep` logic accordingly.
- Updated `onStartWash` calls, validation, and clickable step logic to align with the new step structure.
- Refined UI by separating "Questions" and "Tasks" into distinct step components and improving visibility conditions.
2026-01-19 14:15:16 +01:00
Jeppe Bundgaard ac4f3912ff Streamline wash start flow and improve UI logic in MyWashStart.vue
- Simplified step logic with updated `onStartWash` calls and condition checks.
- Added watcher for `allVisibleQuestionsAnswered` to trigger wash start dynamically.
- Enhanced `Confirm and Start Wash` button visibility logic to account for ongoing washes.
- Refined answer and task reset logic to prevent unintended state changes during washes.
2026-01-19 14:09:14 +01:00
Jeppe Bundgaard 632cd83a4a Add "Confirm and Start Wash" button in MyWashStart.vue
- Introduced `onConfirmAndStartWash` method to handle wash start without leaving the questions step.
- Added a conditional button to allow users to confirm and start the wash when all visible questions are answered.
2026-01-19 13:47:56 +01:00
Jeppe Bundgaard 35ffc82aa0 Add editAnswers state management and UI updates in MyWashStart.vue
- Introduced `editAnswers` state to track and toggle edit mode for answers.
- Added watcher to reset `editAnswers` when navigating away from the `QUESTIONS` step.
- Enhanced UI with "Edit Answers" and "Finish" buttons for improved user control.
- Updated visibility and validation logic to account for `editAnswers` state.
2026-01-19 13:42:19 +01:00
Jeppe Bundgaard 989ee5acce Combine "Questions" and "Tasks" steps for streamlined navigation in MyWashStart.vue
- Merged `QUESTIONS` and `TASKS` steps into a single step for improved user flow and consistency.
- Adjusted logic to dynamically display "Questions & Tasks" based on visibility and progress.
- Refactored navigation and validation to simplify step transitions and state handling.
- Consolidated UI for tasks and questions, including conditional visibility and improved answer tracking.
2026-01-19 13:36:05 +01:00
Jeppe Bundgaard 603bef2d44 Simplify rule evaluation logic and condition filtering in useSelfServeLogic
- Removed unnecessary checks for empty sub-rules, allowing rule evaluations to fail gracefully.
- Standardized `parseInt` usage to improve consistency across condition and task filtering.
- Enhanced filtering logic to handle default values for departments, products, and lanes more flexibly.
2026-01-19 13:04:27 +01:00
Jeppe Bundgaard d770da869f Add debug UI for task visibility and improve lane filtering logic
- Added a debug section in `MyWashStart.vue` and `SelfServeTryModal.vue` to display task visibility, conditions, and rule evaluations for enhanced testing and visibility.
- Updated lane filtering logic in `useSelfServeLogic` to handle `null` and missing lane values more consistently.
2026-01-19 12:41:25 +01:00
Jeppe Bundgaard 479962e755 Refactor Self-Serve logic into composable
- Extracted reusable Self-Serve logic into `useSelfServeLogic` composable.
- Replaced redundant data fetching, rule evaluation, and attachment handling logic in `MyWashStart.vue` and `SelfServeTryModal.vue` with `useSelfServeLogic`.
- Improved maintainability and consistency by consolidating shared functionality.
- Added debug UI with conditions and rule evaluations to `MyWashStart.vue` for enhanced visibility and testing.
2026-01-19 12:37:46 +01:00
Jeppe Bundgaard e65f4b2fc6 Refactor filtering and condition rule evaluation across Self-Serve components
- Standardized `filters` usage in `get.all` methods for `MyWashStart.vue`, `SelfServeTryModal.vue`, and `ObjectsGlobal.vue`.
- Updated rule evaluation logic to return `false` for empty condition rules and simplified sub-rule handling.
- Improved filter transformation to handle arrays in the `ObjectsGlobal.vue` API for more flexible requests.
- Consolidated duplicate logic for conditions and tasks across modules.
2026-01-19 12:07:10 +01:00
Jeppe Bundgaard 85b84df7f7 Refactor MyWashStart.vue to enhance wash flow and step navigation
- Simplified `currentStep` assignment by removing redundant `washInProgress` checks.
- Updated `onStartWash` to accept a `targetStep` parameter for better step control.
- Enhanced clickable steps logic to handle ongoing washes consistently.
- Added sticky header UI for "Wash In Progress" state.
- Fixed button disabling logic in navigation for ongoing washes.
2026-01-19 11:51:48 +01:00
Jeppe Bundgaard e7ccb29b05 Add task management and improve navigation flow in MyWashStart.vue and SelfServeTryModal.vue
- Added task completion tracking with `completedTasks` state and checkbox UI.
- Refactored step navigation flow in `MyWashStart.vue` to include `QUESTIONS` and `TASKS` steps.
- Updated validation and data persistence logic for additional steps.
- Enhanced task UI in `SelfServeTryModal.vue` with completion checkboxes and dynamic styling for completed tasks.
2026-01-19 11:35:18 +01:00
Jeppe Bundgaard 3ecaee7aed Add image preview and download link support for task attachments in Self-Serve components
- Updated `MyWashStart.vue` and `SelfServeTryModal.vue` to fetch and display download links for image attachments.
- Enhanced UI to show inline image previews for attachments with valid download links.
- Introduced `isImage` utility function to identify image formats.
2026-01-19 11:23:42 +01:00
Jeppe Bundgaard 2435a85ff9 Add attachment handling and password reset endpoints to Self-Serve module
- Introduced attachment fetching and downloading logic in `MyWashStart.vue` and `SelfServeTryModal.vue`.
- Enhanced task-related UI to display and handle attachments.
- Added password reset API endpoints (`request`, `validate`, `set`) in `openapi.yaml`.
2026-01-19 11:19:52 +01:00
Jeppe Bundgaard f2e82f8812 Extend Self-Serve API with new commands, schemas, and configuration support
- Added `SelfServeLaneStatus` and `SelfServeConfig` schemas to improve data handling and API responses.
- Enhanced `/modules/self-serve/lane/command` to support `RESERVE`, `RELEASE`, and `license_plate`.
- Updated `/modules/self-serve/config` endpoints to include request/response schemas for configuration management.
2026-01-19 10:54:41 +01:00
Jeppe Bundgaard 143ca80eb4 Add license plate and customer number watchers to fetch previous answers in MyWashStart.vue
- Introduced `fetchPreviousAnswers` function to retrieve and populate previous answers based on license plate and customer number.
- Added logic to clear answers state when license plate or customer number changes.
- Updated watchers to trigger data fetching and ensure answers reflect the latest state.
2026-01-15 12:46:01 +01:00
Jeppe Bundgaard 40884fc9e6 Refactor MyWashStart.vue and SelfServeTryModal.vue to optimize rule fetching logic
- Replaced pre-fetching of all condition rules with conditional fetching based on relevant condition IDs.
- Updated question rendering in `MyWashStart.vue` to use `WhiteBoxCard` for improved UI structure.
2026-01-15 12:40:48 +01:00
Jeppe Bundgaard 52529fec3e Add filtering support to get.all methods and enhance Self-Serve data fetching logic
- Updated `get.all` methods across multiple Self-Serve components (`Questions`, `Conditions`, `Tasks`, `ConditionRules`, `Vehicles`) to accept optional filters.
- Refactored `MyWashStart.vue` and `SelfServeTryModal.vue` to leverage filters for context-specific data fetching (e.g., department, product, lane).
2026-01-15 11:42:14 +01:00
Jeppe Bundgaard 2c7d69c458 Add vehicle condition confirmation step in MyWashStart.vue
- Introduced new "Vehicle Configuration" step with dynamic question and task visibility.
- Enhanced `onStartWash` to persist user answers before starting the wash.
- Added `answers` state and related handling for vehicle condition questions.
- Updated navigation logic and UI to incorporate vehicle confirmation.
2026-01-15 11:31:09 +01:00
Jeppe Bundgaard 4bac68f098 Refactor wash commands in MyWashStart.vue to consolidate logic and improve reusability
- Introduced `executeSelfServeCommand` for shared command execution logic across wash actions.
- Replaced custom command handling in `onStartWash`, `onStopWash`, `onReserveWashLane`, and `onReleaseWashLane` with `executeSelfServeCommand`.
- Added new vehicle confirmation step and related UI updates.
- Adjusted default `forceNearestDepartmentEvaluationId` to `6`.
- Updated default behavior and validation logic in `VehicleDataStructure.vue`.
2026-01-15 11:06:28 +01:00
Jeppe Bundgaard 3cf3dc4146 Update forceNearestDepartmentEvaluationId default to 0 in MyWashStart.vue 2026-01-14 21:30:13 +01:00
Jeppe Bundgaard c1873d76c9 Merge remote-tracking branch 'origin/master' 2026-01-14 21:20:10 +01:00
Jeppe Bundgaard 3618c570b5 Update DesktopNavigationBuefy and Viewport layout logic for better responsiveness
- Removed unnecessary visibility check for `DesktopNavigationBuefy`.
- Introduced `watch` in `Viewport` to dynamically update header height on state changes.
- Adjusted grid column spans to handle hidden states and ultra-wide screen devices.
2026-01-13 12:40:02 +01:00
Jeppe Bundgaard b637b9dc5f Add SelfServeVehicleConditions feature to Self-Serve module
- Introduced `SelfServeVehicleConditions` object and related CRUD operations for managing vehicle-specific conditions.
- Added pagination, table, and detail views for managing vehicle conditions within the Department dashboard.
- Updated routing and navigation to include `selfservevehicleconditions` path and entry points.
- Extended `openapi.yaml` to document new endpoints for vehicle condition management.
2026-01-13 12:35:51 +01:00
gold-dev 21e763b25a Feat: remove unused sections from landing page 2026-01-12 18:40:25 +02:00
gold-dev b59d4cff01 Feat: Set mx auto for form 2026-01-12 18:39:17 +02:00
gold-dev 4300f5c646 Feat: Fix sticky bug for employee login 2026-01-12 18:37:10 +02:00
gold-dev 2b7f29b6ef Feat: New pages for 202512 - truckwash.io slides 1-9 2026-01-12 18:33:08 +02:00
Jeppe Bundgaard 70029d72d9 Refactor ActionSettingsWheelButton to adjust lane link behavior based on device type 2026-01-12 10:53:58 +01:00
gold-dev 1749f52f24 Feat: Change styles for 202512 - truckwash.io Set button same width 2026-01-09 16:58:31 +02:00
Jeppe Bundgaard a6867643fc Merge remote-tracking branch 'origin/master' 2026-01-09 15:41:18 +01:00
Jeppe Bundgaard 4ea93ff0c8 Extend SelfServeConditionRules with support for nested evaluation of IS_TRUE_OR_ANY_TRUE and IS_FALSE_OR_ANY_FALSE rule types 2026-01-09 15:26:38 +01:00
Jeppe Bundgaard 36b60038b9 Enhance SelfServeTryModal with tooltips and dynamic rule evaluation
- Added `BTooltip` from Buefy for displaying detailed information about conditions and rules.
- Implemented `getRuleTypeLabel` and `getConditionById` methods for improved condition and rule handling.
- Updated UI to include tooltips with rule descriptions, evaluation states, and fallback text for missing rules.
2026-01-09 15:08:33 +01:00
Jeppe Bundgaard b20953e51b Add IS_TRUE_OR_ANY_TRUE and IS_FALSE_OR_ANY_FALSE rule types to condition evaluation
- Extended `SelfServeConditionRules` and its UI to support new rule types.
- Updated `openapi.yaml` to document the newly added options.
- Refactored `evaluateCondition` logic to handle nested evaluation with added rule types.
2026-01-09 15:03:52 +01:00
Jeppe Bundgaard 0591d39a1d Add "Prøv" button and lane-specific filtering to SelfServeTryModal
- Updated `DepartmentWashLane` to include a "Prøv" button for opening `SelfServeTryModal`.
- Enhanced modal logic to support filtering by department, vehicle type, and lane.
- Improved UI with lane-specific context in the modal's title and dynamic data handling.
2026-01-09 14:33:01 +01:00
Jeppe Bundgaard 66307a9aad Add SelfServeTryModal to DepartmentSelfServeQuestions and enable vehicle-type-specific test flows
- Introduced `SelfServeTryModal` component for handling department and vehicle-type-specific test flows.
- Added a "Prøv" button in `DepartmentSelfServeQuestions` for opening the modal.
- Implemented logic for fetching and filtering questions, conditions, rules, and tasks based on department and vehicle type.
- Enhanced UI to support answering questions, evaluating conditions, and managing tasks within the modal.
2026-01-09 14:29:14 +01:00
Jeppe Bundgaard 32e557a9df Add IS_TRUE_OR_NOT_SET and IS_FALSE_OR_NOT_SET options to SelfServeConditionRules 2026-01-09 14:22:25 +01:00
Jeppe Bundgaard 585e56a87f Add IS_SET and IS_NOT_SET options to SelfServeConditionRules and update UI with new rule creation button
- Extended condition rules with `IS_SET` and `IS_NOT_SET` options.
- Added "Tilføj betingelsesregel" button in `SelfServeConditionRulesModal` for enhanced rule management.
2026-01-09 14:13:56 +01:00
Jeppe Bundgaard 1c13e2c80d Add condition_id support to SelfServeConditions, SelfServeConditionRules, and related components
- Renamed `question_condition` to `condition_id` for consistency across `SelfServeConditions`, `SelfServeTasks`, and `SelfServeQuestions`.
- Introduced CRUD operations for `SelfServeConditionRules` with logic for managing condition rules.
- Enhanced existing components to support `condition_id`, including dynamic filtering and table parsing.
- Updated UI elements to reflect changes, including new rule creation options and improved field handling for `condition_id`.
2026-01-09 14:08:53 +01:00
Jeppe Bundgaard aaa0298bae Rename question_condition to condition_id in SelfServeQuestions for consistency and update related methods, parsing, and table logic 2026-01-09 13:58:30 +01:00
Jeppe Bundgaard b1ffa45bc5 Rename question field to condition_id in SelfServeTasks for consistency and update related filtering, parsing, and table logic 2026-01-09 13:54:20 +01:00
Jeppe Bundgaard cecd7eb64a Add modal for managing condition rules in SelfServeConditionsTable
- Replaced navigation link with a modal for managing condition rules.
- Added `SelfServeConditionRulesModal` component with rule creation and pagination support.
- Improved user interaction with dynamic modal handling (`openModal`, `closeModal`).
2026-01-09 13:28:19 +01:00
Jeppe Bundgaard b2cac639ce Use loose equality (==) instead of strict equality (===) in getLockedValue comparison. 2026-01-09 13:24:07 +01:00
Jeppe Bundgaard 672e6407fd Add onchange support to SelfServeConditionRules for dynamic input handling
- Implemented asynchronous `onchange` events in `creation` config to dynamically update fields based on selected object type.
- Enhanced modal behavior in `ObjectsGlobal` to attach and trigger `onchange` events for configured inputs during initialization.
- Improved user experience with auto-filled `name` and `description` fields for questions and tasks.
2026-01-09 13:10:42 +01:00
Jeppe Bundgaard 67e00e2c99 Add condition_id support to SelfServeConditions with dynamic filtering and table integration
- Introduced `condition_id` field for managing conditional logic in `SelfServeConditions`.
- Enhanced dynamic filtering using `department_id` and `product_id` dependencies.
- Added default "Ingen" option for `condition_id`.
- Updated `SelfServeConditionsTable` with editable `condition_id` column.
- Improved pagination and object creation logic to support `condition_id`.
2026-01-09 13:02:20 +01:00
Jeppe Bundgaard f332ad1f4f Add task-specific rules and caching logic to improve SelfServeTasks and SelfServeConditionRules
- Introduced `getTaskText` function with local task caching for optimized task text retrieval.
- Enhanced `SelfServeConditionRules` options handling to support combined question and task selections.
- Updated `DepartmentSelfServeConditionRules` to include separate buttons for adding question and task rules.
- Improved table parsing logic in `SelfServeConditionRulesTable` to handle tasks alongside questions.
2026-01-09 12:51:45 +01:00
Jeppe Bundgaard 9da48a36c0 Add SelfServeConditions and SelfServeConditionRules modules with dynamic filtering and CRUD support
- Introduced `SelfServeConditions` and `SelfServeConditionRules` modules for managing conditions and rules.
- Added routing, components, and backend integration for CRUD operations.
- Implemented dynamic filtering based on `department_id`, `lane_id`, and `vehicle_type`.
- Enhanced self-serve workflows with condition and rule management for questions and tasks.
- Updated related navigation, tables, and pagination components for seamless integration.
2026-01-09 12:45:31 +01:00
Jeppe Bundgaard 2d7d3265c3 Add question_condition support to SelfServeQuestions with dynamic filtering and table integration
- Introduced `question_condition` field for conditional question handling.
- Enhanced question filtering logic using `department_id` and `product_id`.
- Added default "Ingen" option for `question_condition`.
- Updated `SelfServeQuestionsTable` to include editable `question_condition` column.
- Removed deprecated `image` and `vehicle_type` column handlers.
- Added `question_condition` handling in the backend update logic.
2026-01-09 11:38:21 +01:00
Jeppe Bundgaard e2c31b1db6 Add SelfServeTaskAttachmentsModal component to manage task attachments
- Implemented attachment management (list, upload, download, delete) within a modal interface.
- Integrated file-handling logic with `SessionUser` for authenticated requests.
- Added real-time updates for attachment actions with success/error feedback via `Swal`.
- Designed a responsive modal layout for efficient user interaction.
2026-01-09 11:13:20 +01:00
Jeppe Bundgaard 7962c805e0 Add attachment handling to SelfServeTasks with modal support in task table
- Introduced attachment management (list, upload, delete, download) via `authenticatedRequest`.
- Added `SelfServeTaskAttachmentsModal` for viewing and managing task attachments.
- Updated `SelfServeTasksTable` to include attachment actions with modal integration.
- Adjusted default nearest department evaluation ID in `MyWashStart.vue`.
2026-01-09 11:05:22 +01:00
gold-dev 467365531d Feat: Change styles for 202512 - truckwash.io edits V2 slide 10 and parts 11-14 2026-01-08 18:06:29 +02:00
gold-dev 09f0b76724 Feat: Change styles for 202512 - truckwash.io edits V2 slide 10 and parts 11-14 2026-01-08 18:01:19 +02:00
Jeppe Bundgaard e2492b63b9 Update SelfServeTasks question label from "Spørgsmål" to "Hvis" 2026-01-08 14:43:00 +01:00
Jeppe Bundgaard 3a415a8fd5 Update SelfServeTasks question handling with enhanced filtering and default option
- Made `question` selection mandatory during task creation.
- Enhanced dynamic filtering by including `department_id` and `product_id`.
- Added a default "Altid" option for question selection.
- Improved `showEditObjectFieldForm` by supporting extra `options` parameters for contextual edits.
2026-01-08 14:14:23 +01:00
Jeppe Bundgaard 626c1d56bb Add SelfServeTasksPagination to DepartmentWashLane with dynamic filtering and task creation support 2026-01-08 14:10:13 +01:00
Jeppe Bundgaard 745a70621a Add support for SelfServeTasks with dynamic filtering, drag-and-drop, and enhanced CRUD operations
- Introduced `SelfServeTasks` module with backend integration for tasks CRUD operations.
- Added `SelfServeTasksPagination` and `SelfServeTasksTable` components to handle task listing, filtering, and reordering.
- Enabled dynamic filtering with `department`, `lane`, `product`, and `question`.
- Enhanced drag-and-drop functionality for reordering tasks with immediate visual feedback.
- Added routing and navigation updates for `SelfServeTasks` under department dashboard.
- Integrated `order_priority` handling for task creation and updates.
- Improved consistency with `SelfServeQuestions` by implementing shared logic and components where applicable.
2026-01-08 14:02:25 +01:00
Jeppe Bundgaard af21e028ea Add order_priority to SelfServeQuestions creation and enhance button slot with totalItems
- Enabled dynamic `order_priority` assignment during question creation based on `totalItems`.
- Updated button slot in SelfServeQuestionsPagination and related components to expose `totalItems`.
2026-01-08 13:36:08 +01:00
Jeppe Bundgaard 549b6208ce Update SelfServeQuestionsTable to replace id column with editable order_priority column
- Replaced the `id` column with the `order_priority` column for better ordering functionality.
- Removed redundant definitions of `order_priority` column for cleaner code structure.
2026-01-08 13:31:06 +01:00
Jeppe Bundgaard 8fe1ee2189 Add sorting by order_priority to SelfServeQuestionsTable and improve drag-and-drop behavior
- Introduced computed `sortedList` for dynamic sorting by `order_priority` in `SelfServeQuestionsPagination`.
- Enhanced drag-and-drop implementation with optimistic updates and immediate feedback by using `setList`.
2026-01-08 13:29:03 +01:00
Jeppe Bundgaard 0bf96e7f21 Enable drag-and-drop functionality in SelfServeQuestionsTable and add order management in SelfServeQuestionsPagination
- Added drag-and-drop handling for row reordering in `SelfServeQuestionsTable`.
- Introduced `setOrder` for managing question order in `SelfServeQuestionsPagination`.
2026-01-08 13:23:53 +01:00
Jeppe Bundgaard 178ad88661 Update SelfServeQuestionsTable to use getProductName for product parsing
- Replaced hardcoded `productId` parsing logic with dynamic `getProductName` function for consistency in product name handling.
2026-01-08 13:19:22 +01:00
Jeppe Bundgaard 17df279797 Improve error handling and expose loadList in pagination components
- Added error handling with `Swal.showValidationMessage` across `add`, `set`, and `delete` operations in `ObjectsGlobal.vue`.
- Exposed `loadList` function to `buttons` slot in `TableLabeledPagination.vue` and `PaginationDisplayGeneralSearchReload.vue`.
2026-01-08 13:17:31 +01:00
Jeppe Bundgaard e338b3ced1 Remove vehicle_type field from SelfServeQuestions and update related references
- Replaced `vehicle_type` with `product` in forms and logic.
- Removed `vehicle_type` column and handling across components.
- Adjusted `add` method and table definitions accordingly.
2026-01-08 13:14:02 +01:00
Jeppe Bundgaard 9e3d4cfccb Add config.js for centralizing configuration constants
- Introduced `IS_DEV` flag for environment-based logic.
- Added `POS_STEP_1_VERSION` and `API_URL` configuration exports.
2026-01-08 12:55:38 +01:00
Jeppe Bundgaard 9ff0bcec17 Refactor: Move configuration exports (API_URL, IS_DEV, POS_STEP_1_VERSION) to dedicated config file and update imports across components 2026-01-08 12:55:23 +01:00
Jeppe Bundgaard 79ce34af5f Update SelfServeQuestions component with dynamic filtering and enhanced CRUD operations
- Added `SessionUser` import to expand options data handling.
- Updated `SelfServeQuestions` fields (`product`, `vehicle_type`) to use dynamic `select` types with async options and filtering.
- Enhanced `add` and `set` methods with explicit parameter handling (`department`, `lane`, etc.).
- Refined options handling using locked values and async calls.
- Adjusted `ObjectsGlobal` methods for consistent request formatting and error handling.
2026-01-08 12:40:21 +01:00
Jeppe Bundgaard 67bcbf45f5 Refactor button slots and layouts across Self-Serve and Wash Lanes modules
- Standardized `buttons` slot structure in pagination templates.
- Removed redundant button definitions in `DepartmentWashLane.vue`.
- Updated button styles and layouts for consistency across components.
2026-01-08 12:00:47 +01:00
Jeppe Bundgaard 193915e5f1 Add initial data support to SelfServeQuestions forms and update pagination refs
- Updated `showCreateObjectForm` to accept `initialData` for pre-filling forms dynamically.
- Exposed `loadList` in `SelfServeQuestionsPagination.vue` for external access.
- Integrated `selfServeQuestionsPagination` ref and dynamic filtering into `DepartmentWashLane.vue`.
2026-01-08 11:53:57 +01:00
Jeppe Bundgaard 9ac322151b Add vehicle type filter to Self-Serve Questions module
- Introduced vehicle type filter support across Self-Serve Questions components, including `SelfServeQuestionsPagination`, `SelfServeQuestionsTable`, and `DepartmentSelfServeQuestions`.
- Added `selectedVehicleType` logic and `MyWashStartVehicleTypeSelection` for enhanced filter functionality.
- Updated filtering and pagination logic to handle dynamic vehicle type selection and modifications.
2026-01-08 11:50:11 +01:00
Jeppe Bundgaard 33ee8c1803 Add SelfServeQuestions module with pagination, routing, and admin navigation integration
- Added new `SelfServeQuestionsPagination.vue` and `SelfServeQuestionsTable.vue` components for managing self-service questions with pagination support.
- Introduced routing for self-service questions in the "Self-Serve" module under admin dashboard.
- Updated `NavigationMenuItemsAdmin.vue` to include "Self-Serve Questions" navigation item.
- Integrated filtering and auto-load functionality to support department and lane-specific views.
2026-01-08 11:44:21 +01:00
Jeppe Bundgaard 9c6ffd2297 Add detailed view and routing for individual wash lanes
- Introduced `DepartmentWashLane.vue` for viewing and managing individual wash lane details.
- Added new route for accessing specific wash lanes under the "Wash Lanes" module.
- Updated `ActionSettingsWheelButton.vue` and `departmentLanesTable.vue` to include navigation to detailed wash lane view.
- Refined permissions logic for displaying lane-related actions based on user roles.
2026-01-08 11:37:35 +01:00
Jeppe Bundgaard 1751d98cd3 Add SelfServeQuestions module to SessionUser components
- Introduced `SelfServeQuestions` object for managing self-service questions with metadata, columns, and CRUD operations.
- Integrated `SelfServeQuestions` module into `SessionUser.vue` and its global objects mapping.
2026-01-08 11:19:03 +01:00
Jeppe Bundgaard a27ab7c2a1 Dynamically generate navigation labels using firstToUpperCase and integrate "Wash Lanes" module into admin menu. 2026-01-08 10:43:34 +01:00
Jeppe Bundgaard a5b7fa7cd3 Add advanced view support to DepartmentLanes components
- Introduced `advancedView` prop to enable additional data display and configuration options across `DepartmentLanes` components.
- Updated `DepartmentLanesPagination.vue` and `departmentLanesTable.vue` templates to conditionally render advanced data based on `advancedView`.
- Propagated `advancedView` prop through relevant parent components for consistent functionality.
2026-01-08 10:38:39 +01:00
Jeppe Bundgaard f45c676a14 Refactor DepartmentLanesPagination component and add "Wash Lanes" module routing
- Refactored `DepartmentLanesPagination.vue` to simplify structure using `TableLabeledPagination`.
- Introduced the "Wash Lanes" module with new routing (`DepartmentWashLanes.vue`) and navigation integration.
2026-01-08 10:25:34 +01:00
Jeppe Bundgaard b9cd4bf1fd Add margin-bottom to table section in TableLabeledPagination component 2026-01-08 10:25:21 +01:00
Jeppe Bundgaard e64f936b3b Add "Vaskebaner" module to DepartmentModulesDisplay
- Introduced a new "Vaskebaner" module with navigation and routing functionality.
- Updated layout to display modules in a 4-column grid instead of 3.
- Simplified "Dagsopgørelse" module description.
2026-01-08 10:18:39 +01:00
Jeppe Bundgaard 6f4d7f8699 Add vehicle type selection component to MyWashStart workflow
- Introduced `MyWashStartVehicleTypeSelection.vue` for vehicle type selection with enhanced UI and dynamic fetching.
- Replaced deprecated "Type of vehicle" field with the new selection component.
- Updated logic to handle vehicle type fetching, selection, and state updates in `MyWashStart.vue`.
2026-01-08 10:14:17 +01:00
Jeppe Bundgaard ff98b84acb Enable system orders inclusion in UserOrders component 2026-01-06 15:55:01 +01:00
Jeppe Bundgaard 2dad26078e Add system orders inclusion toggle to InvoiceOrdersPagination
- Introduced `includeSystemOrders` prop in `InvoiceOrdersPagination.vue` to enable inclusion of system orders in pagination.
- Updated logic to add query parameter `show_wash_subscription` when `includeSystemOrders` is true.
- Adjusted `collectedOrderInvoice.vue` to utilize the new prop for enhanced filtering options.
2026-01-06 15:44:44 +01:00
Jeppe Bundgaard c0adca9558 Add exemption option for monthly administration and environmental fee
- Added `exemptFromAdministrationFee` property to customer settings in `PosSelectedCustomer.vue`.
- Enabled toggle to exclude customers from monthly fees with descriptive tooltip and icon.
2026-01-06 15:22:34 +01:00
Jeppe Bundgaard 010b0d8af7 Add environment fee configuration to E-conomic module
- Added `ConfigurationInputNumber` for setting `feeProductId` in `ConfigurationEconomic.vue`.
- Extended `Economic/Config` with getter and setter methods for `feeProductId`.
2026-01-06 13:45:33 +01:00
Jeppe Bundgaard ee0d486101 Fix conditional rendering in EditableTableColumn and add null-check in getProductOptions
- Updated `EditableTableColumn.vue` to improve handling of `virtualColumn` for hover text rendering.
- Added safeguard in `getProductOptions` to return an empty array when the `product` argument is null or undefined.
2026-01-06 13:17:31 +01:00
Jeppe Bundgaard 0b6d2e4045 Add administration and environment fee configuration to E-conomic module
- Introduced `ConfigurationInputNumber` component for setting `adminFeeMonthly` and `adminFeeOrder` in `ConfigurationEconomic.vue`.
- Extended `Economic/Config` module to include getter and setter methods for fee management.
2026-01-06 13:06:55 +01:00
Jeppe Bundgaard 10526cfe6e Add "Stop" localization key to ObjectsGlobal.vue 2026-01-06 12:02:53 +01:00
Jeppe Bundgaard 4a0edb59db Refactor pagination logic: implement usePaginatedList composable and update dependencies
- Added `usePaginatedList` composable to centralize pagination logic, enabling cleaner and reusable code.
- Replaced direct imports of pagination logic with composable injections across multiple components for consistency.
- Updated components to support the new pagination instance-based structure for better maintainability.
- Simplified `paginatedList.vue` and introduced dependency injection using `PaginatedListKey`.
2026-01-06 11:40:58 +01:00
Jeppe Bundgaard 2f16a91007 Fix conditional rendering in ModuleActionLogsTable and remove unused lifecycle hook
- Updated `ModuleActionLogsTable.vue` to handle null or undefined `created_at` and `data` fields gracefully.
- Improved "no logs found" message with localized text using `SessionUser.objects.global.language.no_data`.
- Removed unused `onMounted` lifecycle hook from `ModulesPagination.vue` for cleanup.
2026-01-06 11:34:19 +01:00
Jeppe Bundgaard d5c3f44da7 Introduce reusable ModulesPagination component and refactor DepartmentLane.vue
- Added `ModulesPagination.vue` for handling paginated action logs with dynamic filtering, sorting, and endpoint configuration.
- Replaced `ModuleActionLogsTable` in `DepartmentLane.vue` with `ModulesPagination` for better abstraction and reuse.
- Simplified `ModuleActionLogsTable.vue` to function as a pure presentation component with external data injection.
2026-01-06 11:32:15 +01:00
Jeppe Bundgaard de25e9c5f0 Refactor DepartmentLane.vue to use reusable ModuleActionLogsTable component
- Replaced inline logs table in `DepartmentLane.vue` with reusable `ModuleActionLogsTable` for better modularity.
- Enhanced `ModuleActionLogs` to support pagination and dynamic filtering.
- Introduced new `ModuleActionLogsTable.vue` component to centralize log display logic.
2026-01-06 11:29:30 +01:00
Jeppe Bundgaard e9d72918a7 Add ModuleActionLogs integration and display logs in DepartmentLane
- Introduced `ModuleActionLogs` component under `SessionUser.Objects` for handling action logs.
- Updated `DepartmentLane.vue` to fetch and display module action logs for "selfserve" under a new "Handlingslogs" section.
- Enhanced user experience by providing detailed log data with sortable columns (e.g., action, status code, creation time).
2026-01-06 11:22:37 +01:00
Jeppe Bundgaard 5276322dcc Add detailed view for Department Lanes and introduce washing actions
- Added `DepartmentLane.vue` for viewing lane details, including configuration and status indicators.
- Extended router with dynamic `/superuser/department/lanes/:id` route for lane-specific pages.
- Updated `ActionSettingsWheelButton` to modify lane redirect paths for consistency.
- Enhanced `DepartmentLanesTable` to include washing actions (`stopWashing` and status checks) with improved UI.
- Added utility functions (`isWashing`, `stopWashing`) to `SessionUser.Objects.DepartmentLanes`.
2026-01-06 10:55:43 +01:00
Jeppe Bundgaard cb018cc2ec Add department lane actions to ActionSettingsWheelButton and improve DepartmentLanesTable status indicators
- Added `department_lane_id` prop to `ActionSettingsWheelButton` for department lane-specific actions.
- Implemented "View lane in new tab" action and conditional visibility logic.
- Enhanced `DepartmentLanesTable` with status indicators for operational, non-operational, and unconfigured states.
- Introduced status enumerations and utility methods (`isOperational`, `isConfigured`, `isFaulty`) in `SessionUser.Objects.DepartmentLanes`.
2026-01-06 09:58:38 +01:00
Jeppe Bundgaard 429709e270 Handle error in version update API call in vite.config.js
- Added `try-catch` block to gracefully handle errors when calling the server API.
- Improved logging for both success and failure cases to aid debugging.
2026-01-05 11:20:32 +01:00
Jeppe Bundgaard 7f511dd205 Add project guidelines document and adjust VITE_COMMIT_HASH handling
- Introduced `.junie/guidelines.md` to outline project setup, code conventions, and structure.
- Updated `env.d.ts` and `vite.config.js` to standardize `VITE_COMMIT_HASH` usage.
2026-01-05 11:15:48 +01:00
Jeppe B 0fd65e5eaf Merge pull request #35 from copenhagentruckwash/buefy-integration
buefy-integration
2026-01-05 09:20:36 +01:00
Jeppe Bundgaard 2dd5263087 Update UserProfile.vue: conditionally set module for mobile and add logout button
- Updated `module` bindings to account for mobile devices by displaying empty strings when accessed on mobile.
- Introduced a logout button with confirmation dialog functionality for improved user experience.
2025-12-18 11:51:52 +01:00
Jeppe Bundgaard 3330f20db4 Refactor MobileHeader.vue: replace useRouter with useRoute, update route-based rendering logic, and improve admin features visibility 2025-12-18 11:45:01 +01:00
Jeppe Bundgaard eb6863e4a8 Show wash card in UserDashboard only in development mode using IS_DEV flag 2025-12-18 11:44:54 +01:00
Jeppe Bundgaard 21b8324933 Update MobileFooter.vue: disable "Selv vask" button in production mode using IS_DEV flag 2025-12-18 11:44:47 +01:00
Jeppe Bundgaard ead0ceca39 Refactor MyWashStart.vue: integrate ScrollableSteps, refine guided wash flow, and update footer and assistance logic 2025-12-18 11:10:34 +01:00
Jeppe Bundgaard 815f47004b Add ScrollableSteps.vue and refactor phone call functionality
- Introduced `ScrollableSteps.vue` component with configurable maxHeight and slot-based structure for enhanced reusability.
- Moved phone call functionality to `SessionUser.vue` under reusable `contact` property.
- Updated `MobileHeader.vue` to utilize centralized phone call logic for consistency.
2025-12-18 11:00:51 +01:00
Jeppe Bundgaard 895ab6ffd2 Add call phone button to MobileHeader.vue with dynamic styling and visibility handling
- Implemented a phone call button for quick access with `tel` protocol.
- Added conditional rendering of the button based on `showProfile`.
- Applied dynamic icon styling for development and production modes.
2025-12-18 10:55:44 +01:00
Jeppe Bundgaard 16d8b120f7 Refactor footer visibility logic and improve route-based rendering in MobileHeader.vue
- Extracted `showFooterInContent` into a shared module for reusability.
- Updated `MobileHeader.vue` to use a computed property (`showProfile`) for improved route-based condition handling.
- Renamed `showFooterInContent` to `isFooterInContent` in `Viewport.vue` for clarity and consistency.
2025-12-18 10:12:09 +01:00
Jeppe Bundgaard aac14e474a Update Viewport.vue: add mobile-specific class to header spacer for improved layout handling on mobile devices 2025-12-18 09:44:11 +01:00
Jeppe Bundgaard fba30ba2ac Update MobileHeader.vue: conditionally show profile link and logo based on route
- Added `useRouter` to dynamically check the current route and display the profile button or logo depending on whether the path starts with `/user`.
2025-12-18 09:41:14 +01:00
Jeppe Bundgaard 7a6d2e0b8d Update Viewport.vue: refine footer visibility and enhance mobile footer display
- Adjusted `showFooterInContent` logic to conditionally render footer only on mobile devices using new device detection.
- Updated footer layout to include copyright text and refined styling for improved presentation.
2025-12-18 09:36:47 +01:00
Jeppe Bundgaard 16ccda0c33 Update Viewport.vue: adjust independentScroll logic, add spacer for header, and refine max-height calculation
- Modified `independentScrollMaxHeight` to include `footerHeight` for accurate layout adjustment.
- Added spacer element to prevent content overlap with the fixed header.
- Updated `.independent-scroll` styles for consistency in max-height calculation.
2025-12-18 09:31:16 +01:00
Jeppe Bundgaard 096b878d3d Refactor department dashboard: add "washes" tracking, update calculations for average earnings, and improve subtitle generation logic 2025-12-18 09:14:05 +01:00
Jeppe Bundgaard aab494b239 Improve department navigation: add loading state, skeleton loaders, and optimize department list rendering 2025-12-18 07:54:35 +01:00
Jeppe Bundgaard 8a2b30b117 Add descending order support to paginated list methods across components
- Updated `OrderBookings.vue`, `Orders.vue`, and `ObjectsGlobal.vue` to include `order: 'id:DESC'` in pagination options, ensuring consistent sorting by ID in descending order.
2025-12-18 07:43:38 +01:00
Jeppe Bundgaard e66b7c8853 Add profile link to MobileHeader.vue and dynamic footer visibility in Viewport.vue
- Included user profile button in `MobileHeader.vue` with authentication check and styling for development mode.
- Updated `Viewport.vue` to conditionally show footer content based on route using new computed property.
- Adjusted layout styles, added new color filter classes, and refined footer handling logic for specific paths.
2025-12-17 16:04:15 +01:00
Jeppe Bundgaard 203e39aa6c Refactor DepartmentsOverviewObject.vue: use defineComponent for clarity and export consistency 2025-12-17 15:26:19 +01:00
Jeppe Bundgaard ce2c313f63 Add guided wash flow to MyWashStart.vue with step-by-step instructions, brush details, and improved user navigation 2025-12-17 15:19:57 +01:00
Jeppe Bundgaard da45e23324 Refactor MyWashStart.vue: simplify customer number validation, improve step navigation logic, and ensure reactive updates 2025-12-17 12:20:39 +01:00
Jeppe Bundgaard 4c0cd44a82 Refactor ViewportFooter.vue: replace deprecated slot syntax with v-slot and conditionally render footer component in Viewport.vue 2025-12-17 12:14:09 +01:00
Jeppe Bundgaard 3370bf7469 Refactor department dashboard: replace date shortcuts with DatePeriodSelector, improve loading state handling, and enhance transaction fetch logic 2025-12-17 12:03:26 +01:00
Jeppe Bundgaard b860417cc4 Refactor DepartmentDashboardMyDepartmentsOverview.vue: replace unused BookingsPagination component, add tabbed display for daily reports, and improve department list rendering 2025-12-17 10:05:57 +01:00
Jeppe Bundgaard 58c6a528e3 Enable "Selv vask" button in MobileFooter.vue and remove unused v-show property in UserDashboard.vue 2025-12-16 14:06:40 +01:00
Jeppe Bundgaard 8c88052784 Update MobileFooter.vue: add disabled state to navigation items and bind to button logic 2025-12-16 13:30:41 +01:00
Jeppe Bundgaard 7b5262cebb Add MobileFooter.vue and enhance MyWashStart.vue navigation
- Added `MobileFooter.vue` for improved mobile navigation with dedicated page links.
- Updated `MyWashStart.vue` to refine customer number step validation and clickable state logic.
- Set default `forceNearestDepartmentEvaluationId` to 0 for consistency.
2025-12-16 13:25:14 +01:00
Jeppe Bundgaard 7e64e9f1aa Refactor footers: replace unused content slots with footer components and add ViewportFooter to Viewport.vue 2025-12-16 11:59:30 +01:00
Jeppe Bundgaard 32ae94069b Refactor MyWashStart.vue: set default forceNearestDepartmentEvaluationId to 0 and remove unused console warnings 2025-12-16 11:45:40 +01:00
Jeppe Bundgaard 333fecd2c4 Update MyWashStart.vue: add persistence for in-progress washes using localStorage 2025-12-16 11:44:19 +01:00
Jeppe Bundgaard 6cc425dd1e Update MyWashStart.vue: validate vehicle type selection for step navigation and button state 2025-12-16 11:15:08 +01:00
Jeppe Bundgaard 6e300cd5c3 Update MyWashStart.vue: add vehicle management, enhance autocomplete for license plates, and fetch vehicle types 2025-12-16 11:12:41 +01:00
Jeppe Bundgaard e3db468d0b Update OrderBookingsTable.vue: add margin to calendar icon for better spacing 2025-12-16 09:36:08 +01:00
Jeppe Bundgaard dc5533ccb0 Update MyWashStart.vue: fix nearestDepartment name rendering in lane availability message 2025-12-15 16:02:01 +01:00
Jeppe Bundgaard 08ad376e6d Update MyWashStart.vue: enhance lane availability message with dynamic department name rendering 2025-12-15 15:56:05 +01:00
Jeppe Bundgaard f6784bc815 "Update MyWashStart.vue: set forceNearestDepartmentEvaluationId default value to 0" 2025-12-15 15:52:39 +01:00
Jeppe Bundgaard 6e2eb81d5b "Refactor MyWashStart.vue and ordersTable.vue: enhance wash timer display, add lane labeling, and improve department access validation logic in navigation." 2025-12-15 15:49:55 +01:00
Jeppe Bundgaard 7300cb5722 "Refactor MyWashStart.vue: add onCloseCompleted action to reset flow state, update UI for Completed step, and improve navigation button logic." 2025-12-15 15:34:34 +01:00
Jeppe Bundgaard 617793830b "Refactor MyWashStart.vue: add completed wash duration tracking, reset logic, and display total time in UI after completion." 2025-12-15 15:30:56 +01:00
Jeppe Bundgaard 72edbf338d "Refactor MyWashStart.vue: add elapsed wash timer with start/stop logic, integrate onUnmounted for cleanup, and enhance UI with completed wash step." 2025-12-15 15:28:38 +01:00
Jeppe Bundgaard a9f8e59433 "Refactor MyWashStart.vue: improve wash process with machine/manual options, lane availability checks, and enhanced step-based flow using Buefy components." 2025-12-15 15:24:05 +01:00
Jeppe Bundgaard b50f07b409 "Update MyWashStart.vue: set forceNearestDepartmentEvaluationId to 0 for production" 2025-12-15 13:38:14 +01:00
Jeppe Bundgaard 35439fb963 "Update UserDashboard.vue: change wash certificate link to orders page and remove redundant disabled state" 2025-12-15 13:28:01 +01:00
Jeppe Bundgaard 16866155c1 "Refactor MyWashStart.vue: enhance wash process flow with step-based navigation, integrate Buefy components for improved UI, add forced nearest department evaluation for debugging, and streamline input validation logic." 2025-12-15 13:26:37 +01:00
Jeppe Bundgaard e94e2f0541 "Refactor OrderBookingsTable.vue: enhance editable table rows, add hover tooltips for item details, integrate customizable themes in EditableTableColumn.vue, and improve overall table usability and styling." 2025-12-15 11:46:39 +01:00
Jeppe Bundgaard a861af5a9c "Update InvoiceOrdersPagination.vue: replace hardcoded label with dynamic label from SessionUser objects for improved localization support." 2025-12-11 14:12:56 +01:00
Jeppe Bundgaard d5b83f64cc "Update InvoiceOrdersPagination.vue: adjust label text to 'Historiske vaske' for improved clarity and accuracy." 2025-12-11 14:11:06 +01:00
Jeppe Bundgaard c84d0d2851 "Refactor DatePeriodSelector.vue and InvoiceOrdersPagination.vue: integrate shortcut visibility options, replace manual date filter shortcuts with DatePeriodSelector, and improve filter structure for better maintainability and usability." 2025-12-11 14:09:15 +01:00
Jeppe Bundgaard bfad04aa85 "Add responsive mobile layout to DatePeriodSelector.vue with updated date, month, and year selectors using Buefy components." 2025-12-11 13:22:44 +01:00
Jeppe Bundgaard 97809d2e43 "Integrate DesktopNavigationBuefy into MobileNavigation.vue and update menu structure for improved component reuse and maintainability." 2025-12-11 12:49:20 +01:00
Jeppe Bundgaard 94f1528d4a "Add tablet-specific header component and responsive layout updates for improved device compatibility." 2025-12-11 12:35:19 +01:00
Jeppe Bundgaard f71451ad88 "Update TableLabeledPagination.vue: adjust label styling and class for improved readability" 2025-12-10 14:39:26 +01:00
Jeppe Bundgaard b035da7984 "Update TableLabeledPagination.vue: adjust label styling and class for improved readability" 2025-12-10 14:25:47 +01:00
Jeppe Bundgaard 3071e7f777 "Refactor MyInvoicesPagination.vue: integrate TableLabeledPagination for improved structure, update InvoiceCollectionsTable label to 'total_price_amount', and adjust locale strings for clarity." 2025-12-10 14:19:32 +01:00
Jeppe Bundgaard 824840d729 "Refactor OrdersPagination.vue: replace nested components with TableLabeledPagination, adjust filters and table integration for improved structure and maintainability." 2025-12-10 14:16:21 +01:00
Jeppe Bundgaard d17c84a42c "Update UserDashboard pagination components: adjust column classes, add spacing labels for better layout alignment, and remove redundant label element in TableLabeledPagination.vue." 2025-12-10 14:12:49 +01:00
Jeppe Bundgaard 2314f02239 "Refactor OrderBookingsTable.vue: simplify table logic by removing unnecessary filters and pagination handling, migrate pagination to OrderBookingsPagination.vue, and update components for improved code maintainability and usability." 2025-12-10 14:01:24 +01:00
Jeppe Bundgaard b34bb0b0dc "Update ordersTable.vue: rename 'Total' label to 'Beløb' for locale consistency." 2025-12-10 13:11:00 +01:00
Jeppe Bundgaard 65d6e510d1 "Refactor VehiclesPagination.vue: consolidate pagination logic into new TableLabeledPagination component, remove unused imports, and simplify VehiclesTable template structure for improved maintainability and readability." 2025-12-10 12:39:04 +01:00
Jeppe Bundgaard d63b28977f "Add minHeight to independent-scroll in Viewport for consistent scrollable area styling" 2025-12-10 12:30:41 +01:00
Jeppe Bundgaard 4c6f8df45d "Update UserDashboard labels for clarity: revise messaging in booking, vehicle management, wash certificates, and invoices cards." 2025-12-10 11:10:44 +01:00
Jeppe Bundgaard 4a76137a90 "Implement dynamic card height adjustment in UserDashboard for improved layout consistency across device types." 2025-12-10 11:04:13 +01:00
Jeppe Bundgaard 60dcf3e227 "Add optional CSS class support for navigation items, dynamic header height handling in Viewport, locale-based label updates, and device type checks." 2025-12-10 10:54:18 +01:00
Jeppe Bundgaard 27d3200c3b "Update DesktopHeader.vue to rename 'Opret konto' to 'Opret bruger' for label consistency." 2025-12-09 16:00:24 +01:00
Jeppe Bundgaard 1c67f64c7e "Add back-office, department, and return-to-account buttons in DesktopHeader.vue with session-based visibility and dynamic routing for improved navigation functionality." 2025-12-09 15:55:42 +01:00
Jeppe Bundgaard 39adc6536d "Refactor navigation components: optimize computed properties, update department_id logic, improve menu item handling, and add dynamic session-based routes in DesktopHeader for enhanced maintainability and functionality." 2025-12-09 15:34:51 +01:00
Jeppe Bundgaard f7c75f75fa "Remove unused imports and redundant components in DesktopNavigation and DesktopHeader for cleaner code and improved maintainability." 2025-12-09 14:22:23 +01:00
Jeppe Bundgaard 06d84872ff "Add 'Start Wash' feature with MyWash, MyWashStart components, dynamic route integration, and user location-based functionality in UserDashboard." 2025-12-09 14:14:47 +01:00
Jeppe Bundgaard f019c43853 "Replace session redirection with new dashboard cards for streamlined user actions and enhanced UI functionality in UserDashboard.vue." 2025-12-09 11:43:03 +01:00
Jeppe Bundgaard 75ccc4ab1e "Improve navigation menu styles, add dynamic visibility for logout link, and enhance mobile menu layout and usability." 2025-12-09 11:05:20 +01:00
Jeppe Bundgaard 03e28c6070 "Update labels for consistency in PaginationDisplay.vue and improve table styling by adding bordered class in DepartmentLanesTable.vue." 2025-12-09 11:05:03 +01:00
Jeppe Bundgaard 3831471f54 "Add Qodana configuration file (qodana.yaml) for code quality analysis and CI/CD integration." 2025-12-09 11:04:44 +01:00
Jeppe Bundgaard f808caff31 "Add relay_machine_id column to DepartmentLanes table and backend for improved data management and editability." 2025-12-09 10:27:17 +01:00
Jeppe Bundgaard 3ddb6c168e "Add SelfServe module configuration, routes, and UI integration in SuperUserDashboard for enhanced functionality and manageability." 2025-12-09 09:07:46 +01:00
Jeppe Bundgaard 40b90ff2d1 "Remove unused imports across multiple components for cleaner code and improved maintainability." 2025-12-07 11:07:15 +01:00
Jeppe Bundgaard 66f458014c "Remove TypeScript declaration from <script setup> in Viewport and related header components to simplify and align with current codebase practices." 2025-12-07 11:03:13 +01:00
Jeppe Bundgaard 45c9e87380 "Remove unused imports and redundant components across pagination and dashboard files for cleaner code and improved maintainability." 2025-12-06 20:41:30 +01:00
Jeppe Bundgaard 7945e0996b "Update Vehicles.vue and vehiclesTable.vue for label consistency, improved localization, and cleaned up empty column headers." 2025-12-06 20:39:31 +01:00
Jeppe Bundgaard a74d4ab042 "Replace search input and LoadButtonWhileAwait with PaginationDisplayGeneralSearchReload in MyInvoicesPagination.vue for cleaner design and enhanced reusability." 2025-12-06 20:34:43 +01:00
Jeppe Bundgaard 00995e38aa "Add 'create vehicle' button in VehiclesPagination.vue for user-specific routes, improve responsiveness with isSmall ref, and enhance button styling with dynamic colors." 2025-12-06 20:28:40 +01:00
Jeppe Bundgaard f2f9d24652 "Improve filter reset UI in PaginationDisplayFilters.vue, update translation for 'reload' label, and remove redundant LoadButtonWhileAwait component in VehiclesPagination.vue for cleaner code and enhanced UX." 2025-12-06 20:12:38 +01:00
Jeppe Bundgaard d2de664186 "Refactor orders table to dynamically fetch localized labels and improve column editability; enhance navigation and pagination with context-sensitive filters and dynamic menu visibility." 2025-12-06 19:59:48 +01:00
Jeppe Bundgaard 70949630fb "Enhance navigation menu with context-aware active route highlighting and dynamic visibility based on department selection status." 2025-12-06 15:38:13 +01:00
Jeppe Bundgaard bc6c382b9e "Add optional 'hidden' property to NavigationItemProps for improved flexibility in navigation item visibility." 2025-12-06 15:37:57 +01:00
Jeppe Bundgaard 5021b99ca1 "Adjust label styling in OrdersPagination.vue for smaller font size and improved UI consistency." 2025-12-05 20:30:28 +01:00
Jeppe Bundgaard dd2dcc9043 "Update field labels in Orders.vue for improved clarity and consistency in UI text." 2025-12-05 20:30:13 +01:00
Jeppe Bundgaard 5329b62bc5 "Add Buefy for navigation menu; implement DesktopNavigationBuefy.vue and integrate into viewport layout." 2025-12-05 20:29:46 +01:00
Jeppe Bundgaard 83bc1246fb "Refactor NavigationMenuDepartment button formatting for improved readability in mobile tooltip layout." 2025-12-05 20:19:45 +01:00
Jeppe Bundgaard 54cc7c298c "Add responsive department selection menu with tooltip for mobile; optimize desktop dropdown layout and styling." 2025-12-05 20:09:24 +01:00
1072 changed files with 166723 additions and 20419 deletions
View File
@@ -0,0 +1,257 @@
---
apply: always
---
# Guidelines for Creating and Maintaining Tests
## When to Create Tests
Tests **MUST** be created when any of the following criteria are met:
1. **New Feature Development**: Any new feature, component, or functionality requires accompanying tests
2. **Bug Fixes**: When fixing a bug, write a test that reproduces the issue first, then verify the fix
3. **API Changes**: Changes to APIs, services, or data-fetching logic require updated or new tests
4. **Critical User Flows**: Any modification to authentication, payments, bookings, or POS flows
5. **Component Behavior Changes**: When modifying Vue component logic, props, or events
6. **i18n/Localization Changes**: When adding or modifying translation keys
## Running Tests When Adding Tests
When creating or modifying tests, you **MUST**:
1. **Run the specific test file** to verify it passes:
```bash
npx playwright test tests/your-test-file.spec.ts
```
2. **Run the full test suite** before committing to ensure no regressions:
```bash
npx playwright test
```
3. **Verify test failures before fixes**: If writing a test for a bug, confirm the test fails before applying the fix
## Testing Framework
This project uses **Playwright** as the primary testing framework. Playwright provides reliable end-to-end testing with auto-waiting, powerful selectors, and built-in assertions.
## Running Tests
```bash
# Run full test suite
npx playwright test
# Run tests in headed mode (visible browser)
npx playwright test --headed
# Run tests in a specific browser
npx playwright test --project=chromium
npx playwright test --project=firefox
npx playwright test --project=webkit
# Run tests with UI mode for debugging
npx playwright test --ui
# Generate HTML report
npx playwright show-report
```
## Test File Location and Naming
- **Location**: All test files should be placed in `tests/` or `tests/specs/`
- **Naming Convention**: Use kebab-case with `.spec.ts` suffix
- ✅ `i18n-settings-wheel.spec.ts`
- ✅ `user-authentication.spec.ts`
- ❌ `UserAuth.test.js`
## Test Structure
### Basic Template
```typescript
import { test, expect } from '@playwright/test';
/**
* Brief description of what this test suite covers
*/
test.describe('Feature or Component Name', () => {
test('should describe expected behavior', async ({ page }) => {
await page.goto('/');
// Test implementation
await expect(page).toHaveTitle(/Expected Text/);
});
});
```
### Key Conventions
1. **Use descriptive test names**: Start with `should` to describe expected behavior
2. **Always use `async/await`**: All Playwright interactions are asynchronous
3. **Include JSDoc comments**: Add a comment block at the top describing the test purpose
4. **Group related tests**: Use `test.describe` blocks to organize related test cases
## Writing Tests
### Navigation
```typescript
// Navigate to a page
await page.goto('/');
await page.goto('/dashboard');
// Wait for navigation
await page.goto('/dashboard', { waitUntil: 'networkidle' });
```
### Page Interactions
```typescript
// Fill input fields
await page.fill('input[name="username"]', 'testuser');
await page.fill('input[name="password"]', 'password123');
// Click elements
await page.click('button[id="login-button"]');
// Wait for elements
await page.waitForSelector('input[name="2fa_code"]');
// Get element text
const text = await page.locator('.message').textContent();
// Get page title
const title = await page.title();
// Execute JavaScript in browser context
const result = await page.evaluate(() => {
return document.querySelector('.data')?.textContent;
});
```
### Locators (Recommended)
```typescript
// Use locators for better reliability
const submitButton = page.locator('button[type="submit"]');
await submitButton.click();
// Locator with text
const loginButton = page.locator('button:has-text("Login")');
// Get by role (accessibility-friendly)
const heading = page.getByRole('heading', { name: 'Welcome' });
// Get by test ID
const element = page.getByTestId('submit-button');
```
### Assertions
```typescript
// Use Playwright's built-in expect assertions
await expect(page).toHaveURL('/dashboard');
await expect(page).toHaveTitle(/Dashboard/);
await expect(page.locator('.message')).toBeVisible();
await expect(page.locator('.message')).toHaveText('Success');
await expect(page.locator('input')).toHaveValue('expected value');
await expect(page.locator('.items')).toHaveCount(5);
```
## Authentication Helpers
Create reusable authentication helpers in `tests/fixtures/`:
```typescript
import { Page, expect } from '@playwright/test';
/**
* Login as a customer user
* @param page - Playwright page object
* @param credentials - User credentials
*/
export async function loginAsUser(
page: Page,
credentials: { customerNumber: string; password: string }
) {
await page.goto('/login');
await page.fill('input[name="customer_number"]', credentials.customerNumber);
await page.fill('input[name="password"]', credentials.password);
await page.click('button[id="login-button"]');
await expect(page).toHaveURL('/user');
}
```
## Best Practices
### DO:
- ✅ Test one behavior per `test` block
- ✅ Use meaningful variable names
- ✅ Use Playwright's auto-waiting (avoid manual waits when possible)
- ✅ Use locators for element interactions
- ✅ Use `expect` assertions with auto-retry
- ✅ Clean up test state when necessary
- ✅ Use test fixtures for setup/teardown
### DON'T:
- ❌ Write tests that depend on execution order
- ❌ Hardcode sensitive data (use environment variables)
- ❌ Use `page.waitForTimeout()` for synchronization (use proper waits)
- ❌ Leave commented-out code in test files
## Testing i18n/Translations
When testing internationalization:
1. Define expected translation keys as an array
2. Fetch locale files via page context
3. Verify all required keys exist in each locale
4. Check parity between locales (same keys in all languages)
```typescript
import { test, expect } from '@playwright/test';
const requiredKeys = ['key1', 'key2', 'key3'];
test('should have all translations in English', async ({ page }) => {
await page.goto('/');
const result = await page.evaluate(async (keys) => {
const response = await fetch('/src/i18n/locales/en.json');
const data = await response.json();
const missingKeys = keys.filter(key => !(key in data));
return { success: missingKeys.length === 0, missingKeys };
}, requiredKeys);
expect(result.success).toBe(true);
});
```
## Mobile Testing
Playwright supports mobile emulation out of the box:
```typescript
import { test, devices } from '@playwright/test';
// Use device presets
test.use({ ...devices['iPhone 13'] });
test('should work on mobile', async ({ page }) => {
await page.goto('/');
// Test mobile-specific behavior
});
```
Configure mobile projects in `playwright.config.ts`:
```typescript
projects: [
{ name: 'Mobile Chrome', use: { ...devices['Pixel 5'] } },
{ name: 'Mobile Safari', use: { ...devices['iPhone 12'] } },
]
```
## Maintaining Tests
1. **Keep tests updated**: When modifying features, update corresponding tests
2. **Review failing tests**: Investigate failures before marking as skipped
3. **Remove obsolete tests**: Delete tests for removed features
4. **Refactor shared logic**: Extract common test utilities to helper files in `tests/fixtures/`
+24
View File
@@ -0,0 +1,24 @@
# THIS IS AUTOGENERATED. DO NOT EDIT MANUALLY
version = 1
name = "pleno-vue"
[setup]
script = '''
npm ci
npx playwright install
'''
[[actions]]
name = "Run dev"
icon = "run"
command = "npm run dev"
[[actions]]
name = "Run all tests"
icon = "test"
command = "npm run test:all"
[[actions]]
name = "Run debug"
icon = "debug"
command = "npx playwright test --debug"
+28
View File
@@ -0,0 +1,28 @@
name: Qodana Configuration Upload
on:
push:
branches: [ main, dev ]
pull_request:
branches: [ main ]
workflow_dispatch:
jobs:
upload-qodana-config:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Run Qodana Configuration Uploader
env:
QODANA_CONFIGURATIONS_TOKEN: ${{ secrets.QODANA_CONFIGURATIONS_TOKEN }}
run: |
docker run --rm \
-v $(pwd):/workspace \
-w /workspace \
-e QODANA_CONFIGURATIONS_TOKEN=$QODANA_CONFIGURATIONS_TOKEN \
jetbrains/qodana-configuration-uploader:latest \
--global-configs-file qodana-global-configurations.yaml \
--qodana-host https://qodana.cloud
+28
View File
@@ -0,0 +1,28 @@
name: Qodana Configuration Upload
on:
push:
branches: [ main, dev ]
pull_request:
branches: [ main ]
workflow_dispatch:
jobs:
upload-qodana-config:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Run Qodana Configuration Uploader
env:
QODANA_CONFIGURATIONS_TOKEN: ${{ secrets.QODANA_CONFIGURATIONS_TOKEN }}
run: |
docker run --rm \
-v $(pwd):/workspace \
-w /workspace \
-e QODANA_CONFIGURATIONS_TOKEN=$QODANA_CONFIGURATIONS_TOKEN \
jetbrains/qodana-configuration-uploader:latest \
--global-configs-file qodana-global-configurations.yaml \
--qodana-host https://qodana.cloud
+103
View File
@@ -0,0 +1,103 @@
name: Automated Tests
on:
pull_request:
push:
branches: [main, dev]
workflow_dispatch:
schedule:
- cron: "0 2 * * *"
jobs:
build-and-unit:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci --legacy-peer-deps
- name: Build sanity check
run: npm run build
- name: Unit tests
run: npm run test:unit
e2e-smoke:
if: github.event_name != 'schedule'
needs: build-and-unit
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
project: [chromium-desktop, chromium-mobile]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci --legacy-peer-deps
- name: Install Playwright browsers
run: npx playwright install --with-deps chromium
- name: Run Playwright smoke tests (${{ matrix.project }})
run: npx playwright test --grep @smoke --project="${{ matrix.project }}"
- name: Upload Playwright report
if: always()
uses: actions/upload-artifact@v4
with:
name: playwright-report-smoke-${{ matrix.project }}
path: |
output/playwright/report
output/playwright/test-results
if-no-files-found: ignore
retention-days: 7
e2e-full:
if: github.event_name == 'schedule' || github.ref == 'refs/heads/main'
needs: build-and-unit
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci --legacy-peer-deps
- name: Install Playwright browsers
run: npx playwright install --with-deps
- name: Run full Playwright suite
run: npm run test:e2e:ci
- name: Upload Playwright report
if: always()
uses: actions/upload-artifact@v4
with:
name: playwright-report-full
path: |
output/playwright/report
output/playwright/test-results
if-no-files-found: ignore
retention-days: 14
+3
View File
@@ -13,6 +13,7 @@ dist
dist-ssr
coverage
*.local
dev-dist
/cypress/videos/
/cypress/screenshots/
@@ -28,3 +29,5 @@ coverage
*.sw?
*.tsbuildinfo
output/playwright/
playwright-report/
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
@@ -0,0 +1,2 @@
#Wed Jan 21 08:19:23 CET 2026
gradle.version=8.11.1
Binary file not shown.
Binary file not shown.
View File
+77
View File
@@ -0,0 +1,77 @@
# Project Guidelines
## Project Overview
This repository contains a Vue 3 single-page application built with Vite. It powers dashboard-style pages and modules such as bookings and POS flows. The UI is primarily styled with Bulma. The app leverages libraries like FullCalendar and Chart.js for scheduling and analytics.
- Tech stack: Vue 3, Vite 5, Vue Router, Vuex, Bulma, FullCalendar, Chart.js
- Notable integrations: toast notifications, QR/Barcode utilities, and PWA/devtools plugins
- Target: modern browsers and mobile WebView contexts
Local development
- Requirements: Node.js 18+ (recommended to match Vite 5), npm 9+
- Install dependencies: `npm install`
- Start dev server: `npm run dev` (default at http://localhost:5173)
Build and preview
- Production build: `npm run build` (output in `dist/`)
- Preview build locally: `npm run preview`
Testing
- Framework: WebdriverIO (wdio) with Vite service; Appium available for mobile testing
- Common commands:
- `npm run wdio` — run test suite per `wdio.conf.js`
- `npm run test:mobile` — run tests excluding Safari
- `npm run test:android` — run Android-targeted specs
- Prerequisites for mobile tests may include Android SDK/emulator or iOS tooling and Appium drivers
Environment configuration
- Place environment variables in `.env.*` files (Vite loads `VITE_`-prefixed vars into the client)
See the sections below for code style and detailed project structure.
## Code Style and Conventions
### Vue Components
- Use PascalCase for component names (e.g., `UserProfile.vue`)
- Implement Single File Components (SFC) pattern
- Keep components focused and single-responsibility
- Use composition API for new components
- Document component props and events
### JavaScript/TypeScript
- Use ES6+ features
- Maintain consistent naming conventions (camelCase for variables/methods)
- Document complex logic with clear comments
- Use TypeScript for type safety when possible
## Project Structure
### Root Directory Structure
- `/src` - Source code files
- `/assets` - Static assets (images, fonts, etc.)
- `/components` - Reusable Vue components
- `/views` - Page components
- `/router` - Vue Router configuration
- `/store` - Vuex store modules
- `/services` - API and external service integrations
- `/utils` - Utility functions and helpers
- `/styles` - Global styles and variables
### Configuration Files
- `vite.config.js` - Vite configuration
- `.env.*` - Environment variables
- `package.json` - Project dependencies and scripts
- `jsconfig.json` - JavaScript/TypeScript tooling and path aliases
### File Naming Conventions
- Components: PascalCase (e.g., `UserProfile.vue`)
- Utilities: camelCase (e.g., `formatDate.js`)
- Store modules: camelCase (e.g., `userStore.js`)
- Style files: kebab-case (e.g., `main-styles.scss`)
- Test files: `*.spec.js` or `*.test.js`
+16
View File
@@ -27,3 +27,19 @@ npm run dev
```sh
npm run build
```
## Bubblewrap (TWA) Build and Install
To build and install the Trusted Web Activity (TWA) using Bubblewrap, use the following commands:
### Build the TWA
```sh
bubblewrap build
```
### Install the TWA on a connected device
```sh
bubblewrap install
```
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+217
View File
@@ -0,0 +1,217 @@
/*
* Copyright 2019 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import groovy.xml.MarkupBuilder
plugins {
id 'com.android.application'
}
def twaManifest = [
applicationId: 'io.truckwash.twa',
hostName: 'truckwash.io', // The domain being opened in the TWA.
launchUrl: '/', // The start path for the TWA. Must be relative to the domain.
name: 'Truck Wash', // The application name.
launcherName: 'Truck Wash', // The name shown on the Android Launcher.
themeColor: '#063651', // The color used for the status bar.
themeColorDark: '#000000', // The color used for the dark status bar.
navigationColor: '#000000', // The color used for the navigation bar.
navigationColorDark: '#000000', // The color used for the dark navbar.
navigationDividerColor: '#000000', // The navbar divider color.
navigationDividerColorDark: '#000000', // The dark navbar divider color.
backgroundColor: '#0787BB', // The color used for the splash screen background.
enableNotifications: true, // Set to true to enable notification delegation.
// Every shortcut must include the following fields:
// - name: String that will show up in the shortcut.
// - short_name: Shorter string used if |name| is too long.
// - url: Absolute path of the URL to launch the app with (e.g '/create').
// - icon: Name of the resource in the drawable folder to use as an icon.
shortcuts: [],
// The duration of fade out animation in milliseconds to be played when removing splash screen.
splashScreenFadeOutDuration: 300,
generatorApp: 'bubblewrap-cli', // Application that generated the Android Project
// The fallback strategy for when Trusted Web Activity is not available. Possible values are
// 'customtabs' and 'webview'.
fallbackType: 'customtabs',
enableSiteSettingsShortcut: 'true',
orientation: 'portrait',
]
android {
compileSdkVersion 36
namespace "io.truckwash.twa"
defaultConfig {
applicationId "io.truckwash.twa"
minSdkVersion 21
targetSdkVersion 35
versionCode 6
versionName "6"
// The name for the application
resValue "string", "appName", twaManifest.name
// The name for the application on the Android Launcher
resValue "string", "launcherName", twaManifest.launcherName
// The URL that will be used when launching the TWA from the Android Launcher
def launchUrl = "https://" + twaManifest.hostName + twaManifest.launchUrl
resValue "string", "launchUrl", launchUrl
resValue "string", "launchHandlerClientMode", 'navigate-existing'
// The URL the Web Manifest for the Progressive Web App that the TWA points to. This
// is used by Chrome OS and Meta Quest to open the Web version of the PWA instead of
// the TWA, as it will probably give a better user experience for non-mobile devices.
resValue "string", "webManifestUrl", 'https://truckwash.io/manifest.webmanifest'
// This is used by Meta Quest.
resValue "string", "fullScopeUrl", 'https://truckwash.io/'
// The hostname is used when building the intent-filter, so the TWA is able to
// handle Intents to open host url of the application.
resValue "string", "hostName", twaManifest.hostName
// This attribute sets the status bar color for the TWA. It can be either set here or in
// `res/values/colors.xml`. Setting in both places is an error and the app will not
// compile. If not set, the status bar color defaults to #FFFFFF - white.
resValue "color", "colorPrimary", twaManifest.themeColor
// This attribute sets the dark status bar color for the TWA. It can be either set here or in
// `res/values/colors.xml`. Setting in both places is an error and the app will not
// compile. If not set, the status bar color defaults to #000000 - white.
resValue "color", "colorPrimaryDark", twaManifest.themeColorDark
// This attribute sets the navigation bar color for the TWA. It can be either set here or
// in `res/values/colors.xml`. Setting in both places is an error and the app will not
// compile. If not set, the navigation bar color defaults to #FFFFFF - white.
resValue "color", "navigationColor", twaManifest.navigationColor
// This attribute sets the dark navigation bar color for the TWA. It can be either set here
// or in `res/values/colors.xml`. Setting in both places is an error and the app will not
// compile. If not set, the navigation bar color defaults to #000000 - black.
resValue "color", "navigationColorDark", twaManifest.navigationColorDark
// This attribute sets the navbar divider color for the TWA. It can be either
// set here or in `res/values/colors.xml`. Setting in both places is an error and the app
// will not compile. If not set, the divider color defaults to #00000000 - transparent.
resValue "color", "navigationDividerColor", twaManifest.navigationDividerColor
// This attribute sets the dark navbar divider color for the TWA. It can be either
// set here or in `res/values/colors.xml`. Setting in both places is an error and the
//app will not compile. If not set, the divider color defaults to #000000 - black.
resValue "color", "navigationDividerColorDark", twaManifest.navigationDividerColorDark
// Sets the color for the background used for the splash screen when launching the
// Trusted Web Activity.
resValue "color", "backgroundColor", twaManifest.backgroundColor
// Defines a provider authority for the Splash Screen
resValue "string", "providerAuthority", twaManifest.applicationId + '.fileprovider'
// The enableNotification resource is used to enable or disable the
// TrustedWebActivityService, by changing the android:enabled and android:exported
// attributes
resValue "bool", "enableNotification", twaManifest.enableNotifications.toString()
twaManifest.shortcuts.eachWithIndex { shortcut, index ->
resValue "string", "shortcut_name_$index", "$shortcut.name"
resValue "string", "shortcut_short_name_$index", "$shortcut.short_name"
}
// The splashScreenFadeOutDuration resource is used to set the duration of fade out animation in milliseconds
// to be played when removing splash screen. The default is 0 (no animation).
resValue "integer", "splashScreenFadeOutDuration", twaManifest.splashScreenFadeOutDuration.toString()
resValue "string", "generatorApp", twaManifest.generatorApp
resValue "string", "fallbackType", twaManifest.fallbackType
resValue "bool", "enableSiteSettingsShortcut", twaManifest.enableSiteSettingsShortcut
resValue "string", "orientation", twaManifest.orientation
}
buildTypes {
release {
minifyEnabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
checkReleaseBuilds false
}
}
task generateShorcutsFile {
assert twaManifest.shortcuts.size() < 5, "You can have at most 4 shortcuts."
twaManifest.shortcuts.eachWithIndex { s, i ->
assert s.name != null, 'Missing `name` in shortcut #' + i
assert s.short_name != null, 'Missing `short_name` in shortcut #' + i
assert s.url != null, 'Missing `icon` in shortcut #' + i
assert s.icon != null, 'Missing `url` in shortcut #' + i
}
def shortcutsFile = new File("$projectDir/src/main/res/xml", "shortcuts.xml")
def xmlWriter = new StringWriter()
def xmlMarkup = new MarkupBuilder(new IndentPrinter(xmlWriter, " ", true))
xmlMarkup
.'shortcuts'('xmlns:android': 'http://schemas.android.com/apk/res/android') {
twaManifest.shortcuts.eachWithIndex { s, i ->
'shortcut'(
'android:shortcutId': 'shortcut' + i,
'android:enabled': 'true',
'android:icon': '@drawable/' + s.icon,
'android:shortcutShortLabel': '@string/shortcut_short_name_' + i,
'android:shortcutLongLabel': '@string/shortcut_name_' + i) {
'intent'(
'android:action': 'android.intent.action.MAIN',
'android:targetPackage': twaManifest.applicationId,
'android:targetClass': twaManifest.applicationId + '.LauncherActivity',
'android:data': s.url)
'categories'('android:name': 'android.intent.category.LAUNCHER')
}
}
}
shortcutsFile.text = xmlWriter.toString() + '\n'
}
preBuild.dependsOn(generateShorcutsFile)
repositories {
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.google.androidbrowserhelper:locationdelegation:1.1.2'
implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.6.2'
}
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Automatically generated file. DO NOT MODIFY -->
<!-- Value from default config. -->
<bool name="enableNotification">true</bool>
<!-- Value from default config. -->
<bool name="enableSiteSettingsShortcut">true</bool>
<!-- Value from default config. -->
<color name="backgroundColor">#0787BB</color>
<!-- Value from default config. -->
<color name="colorPrimary">#063651</color>
<!-- Value from default config. -->
<color name="colorPrimaryDark">#000000</color>
<!-- Value from default config. -->
<color name="navigationColor">#000000</color>
<!-- Value from default config. -->
<color name="navigationColorDark">#000000</color>
<!-- Value from default config. -->
<color name="navigationDividerColor">#000000</color>
<!-- Value from default config. -->
<color name="navigationDividerColorDark">#000000</color>
<!-- Value from default config. -->
<integer name="splashScreenFadeOutDuration">300</integer>
<!-- Value from default config. -->
<string name="appName" translatable="false">Truck Wash</string>
<!-- Value from default config. -->
<string name="fallbackType" translatable="false">customtabs</string>
<!-- Value from default config. -->
<string name="fullScopeUrl" translatable="false">https://truckwash.io/</string>
<!-- Value from default config. -->
<string name="generatorApp" translatable="false">bubblewrap-cli</string>
<!-- Value from default config. -->
<string name="hostName" translatable="false">truckwash.io</string>
<!-- Value from default config. -->
<string name="launchHandlerClientMode" translatable="false">navigate-existing</string>
<!-- Value from default config. -->
<string name="launchUrl" translatable="false">https://truckwash.io/</string>
<!-- Value from default config. -->
<string name="launcherName" translatable="false">Truck Wash</string>
<!-- Value from default config. -->
<string name="orientation" translatable="false">portrait</string>
<!-- Value from default config. -->
<string name="providerAuthority" translatable="false">io.truckwash.twa.fileprovider</string>
<!-- Value from default config. -->
<string name="webManifestUrl" translatable="false">https://truckwash.io/manifest.webmanifest</string>
</resources>
@@ -0,0 +1,55 @@
-keep class androidx.core.app.CoreComponentFactory { <init>(); }
-keep class androidx.core.content.FileProvider { <init>(); }
-keep class androidx.profileinstaller.ProfileInstallReceiver { <init>(); }
-keep class androidx.startup.InitializationProvider { <init>(); }
-keep class com.google.android.gms.common.api.GoogleApiActivity { <init>(); }
-keep class com.google.androidbrowserhelper.locationdelegation.PermissionRequestActivity { <init>(); }
-keep class com.google.androidbrowserhelper.trusted.FocusActivity { <init>(); }
-keep class com.google.androidbrowserhelper.trusted.ManageDataLauncherActivity { <init>(); }
-keep class com.google.androidbrowserhelper.trusted.NotificationPermissionRequestActivity { <init>(); }
-keep class com.google.androidbrowserhelper.trusted.WebViewFallbackActivity { <init>(); }
-keep class io.truckwash.twa.Application { <init>(); }
-keep class io.truckwash.twa.DelegationService { <init>(); }
-keep class io.truckwash.twa.LauncherActivity { <init>(); }
-keep class android.widget.Space { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.app.AlertController$RecycleListView { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.view.menu.ActionMenuItemView { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.view.menu.ExpandedMenuView { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.view.menu.ListMenuItemView { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.ActionBarContainer { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.ActionBarContextView { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.ActionBarOverlayLayout { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.ActionMenuView { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.ActivityChooserView$InnerLayout { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.AlertDialogLayout { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.ButtonBarLayout { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.ContentFrameLayout { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.DialogTitle { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.FitWindowsFrameLayout { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.FitWindowsLinearLayout { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.SearchView$SearchAutoComplete { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.Toolbar { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.appcompat.widget.ViewStubCompat { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.browser.browseractions.BrowserActionsFallbackMenuView { <init>(android.content.Context, android.util.AttributeSet); }
-keep class androidx.core.widget.NestedScrollView { <init>(android.content.Context, android.util.AttributeSet); }
@@ -0,0 +1,2 @@
#- File Locator -
listingFile=../../../../outputs/apk/release/output-metadata.json
@@ -0,0 +1,2 @@
appMetadataVersion=1.1
androidGradlePluginVersion=8.9.1
@@ -0,0 +1,18 @@
{
"version": 3,
"artifactType": {
"type": "BUNDLE",
"kind": "RegularFile"
},
"applicationId": "io.truckwash.twa",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"outputFile": "../../../../outputs/bundle/release/app-release.aab"
}
],
"elementType": "File"
}
@@ -0,0 +1,2 @@
#- File Locator -
listingFile=../../../bundle_ide_model/release/produceReleaseBundleIdeListingFile/output-metadata.json
@@ -0,0 +1,222 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2019 Google Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
The "package" attribute is rewritten by the Gradle build with the value of applicationId.
It is still required here, as it is used to derive paths, for instance when referring
to an Activity by ".MyActivity" instead of the full name. If more Activities are added to the
application, the package attribute will need to reflect the correct path in order to use
the abbreviated format.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.truckwash.twa"
android:versionCode="6"
android:versionName="6" >
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="35" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
</intent>
</queries>
<permission
android:name="io.truckwash.twa.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"
android:protectionLevel="signature" />
<uses-permission android:name="io.truckwash.twa.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" />
<application
android:name="io.truckwash.twa.Application"
android:allowBackup="true"
android:appComponentFactory="androidx.core.app.CoreComponentFactory"
android:extractNativeLibs="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/appName"
android:manageSpaceActivity="com.google.androidbrowserhelper.trusted.ManageDataLauncherActivity"
android:supportsRtl="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
<meta-data
android:name="asset_statements"
android:resource="@string/assetStatements" />
<meta-data
android:name="web_manifest_url"
android:value="@string/webManifestUrl" />
<meta-data
android:name="twa_generator"
android:value="@string/generatorApp" />
<activity android:name="com.google.androidbrowserhelper.trusted.ManageDataLauncherActivity" >
<meta-data
android:name="android.support.customtabs.trusted.MANAGE_SPACE_URL"
android:value="@string/launchUrl" />
</activity>
<activity
android:name="io.truckwash.twa.LauncherActivity"
android:alwaysRetainTaskState="true"
android:exported="true"
android:label="@string/launcherName" >
<meta-data
android:name="android.support.customtabs.trusted.DEFAULT_URL"
android:value="@string/launchUrl" />
<meta-data
android:name="android.support.customtabs.trusted.STATUS_BAR_COLOR"
android:resource="@color/colorPrimary" />
<meta-data
android:name="android.support.customtabs.trusted.LAUNCH_HANDLER_CLIENT_MODE"
android:value="@string/launchHandlerClientMode" />
<meta-data
android:name="android.support.customtabs.trusted.STATUS_BAR_COLOR_DARK"
android:resource="@color/colorPrimaryDark" />
<meta-data
android:name="android.support.customtabs.trusted.NAVIGATION_BAR_COLOR"
android:resource="@color/navigationColor" />
<meta-data
android:name="android.support.customtabs.trusted.NAVIGATION_BAR_COLOR_DARK"
android:resource="@color/navigationColorDark" />
<meta-data
android:name="androix.browser.trusted.NAVIGATION_BAR_DIVIDER_COLOR"
android:resource="@color/navigationDividerColor" />
<meta-data
android:name="androix.browser.trusted.NAVIGATION_BAR_DIVIDER_COLOR_DARK"
android:resource="@color/navigationDividerColorDark" />
<meta-data
android:name="android.support.customtabs.trusted.SPLASH_IMAGE_DRAWABLE"
android:resource="@drawable/splash" />
<meta-data
android:name="android.support.customtabs.trusted.SPLASH_SCREEN_BACKGROUND_COLOR"
android:resource="@color/backgroundColor" />
<meta-data
android:name="android.support.customtabs.trusted.SPLASH_SCREEN_FADE_OUT_DURATION"
android:value="@integer/splashScreenFadeOutDuration" />
<meta-data
android:name="android.support.customtabs.trusted.FILE_PROVIDER_AUTHORITY"
android:value="@string/providerAuthority" />
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
<meta-data
android:name="android.support.customtabs.trusted.FALLBACK_STRATEGY"
android:value="@string/fallbackType" />
<meta-data
android:name="android.support.customtabs.trusted.SCREEN_ORIENTATION"
android:value="@string/orientation" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:autoVerify="true" >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="@string/hostName"
android:scheme="https" />
</intent-filter>
</activity>
<activity android:name="com.google.androidbrowserhelper.trusted.FocusActivity" />
<activity
android:name="com.google.androidbrowserhelper.trusted.WebViewFallbackActivity"
android:configChanges="orientation|screenSize" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="@string/providerAuthority"
android:exported="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
<service
android:name="io.truckwash.twa.DelegationService"
android:enabled="@bool/enableNotification"
android:exported="@bool/enableNotification" >
<meta-data
android:name="android.support.customtabs.trusted.SMALL_ICON"
android:resource="@drawable/ic_notification_icon" />
<intent-filter>
<action android:name="android.support.customtabs.trusted.TRUSTED_WEB_ACTIVITY_SERVICE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
<activity android:name="com.google.androidbrowserhelper.trusted.NotificationPermissionRequestActivity" />
<activity android:name="com.google.androidbrowserhelper.locationdelegation.PermissionRequestActivity" />
<activity
android:name="com.google.android.gms.common.api.GoogleApiActivity"
android:exported="false"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="io.truckwash.twa.androidx-startup"
android:exported="false" >
<meta-data
android:name="androidx.emoji2.text.EmojiCompatInitializer"
android:value="androidx.startup" />
<meta-data
android:name="androidx.lifecycle.ProcessLifecycleInitializer"
android:value="androidx.startup" />
<meta-data
android:name="androidx.profileinstaller.ProfileInstallerInitializer"
android:value="androidx.startup" />
</provider>
<receiver
android:name="androidx.profileinstaller.ProfileInstallReceiver"
android:directBootAware="false"
android:enabled="true"
android:exported="true"
android:permission="android.permission.DUMP" >
<intent-filter>
<action android:name="androidx.profileinstaller.action.INSTALL_PROFILE" />
</intent-filter>
<intent-filter>
<action android:name="androidx.profileinstaller.action.SKIP_FILE" />
</intent-filter>
<intent-filter>
<action android:name="androidx.profileinstaller.action.SAVE_PROFILE" />
</intent-filter>
<intent-filter>
<action android:name="androidx.profileinstaller.action.BENCHMARK_OPERATION" />
</intent-filter>
</receiver>
</application>
</manifest>
@@ -0,0 +1,873 @@
Landroidx/activity/a;
Landroidx/activity/ComponentActivity$4;
Landroidx/lifecycle/j;
Landroidx/lifecycle/k;
HSPLandroidx/activity/ComponentActivity$4;->h(Landroidx/lifecycle/l;Landroidx/lifecycle/g$a;)V
Landroidx/activity/b;
Landroidx/core/app/b;
Landroidx/lifecycle/l;
Landroidx/lifecycle/E;
Landroidx/lifecycle/f;
LI/d;
Landroidx/activity/c;
HSPLandroidx/activity/c;-><init>(Z)V
HSPLandroidx/activity/c;->a()V
PLandroidx/activity/c;->b(Landroidx/activity/a;)V
HSPLandroidx/activity/c;->c(Z)V
Landroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;
PLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->d()V
HSPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->h(Landroidx/lifecycle/l;Landroidx/lifecycle/g$a;)V
Landroidx/activity/OnBackPressedDispatcher;
HSPLandroidx/activity/OnBackPressedDispatcher;->a(Landroidx/activity/c;)Landroidx/activity/a;
Lc/a;
Lc/d;
Lc/e;
Lc/f;
Lc/g;
Lc/h;
Lc/i;
HSPLc/i;-><clinit>()V
Ld/a;
HSPLd/a;-><init>(II)V
Le/a;
Lg/b;
Lh/a;
HSPLh/a;-><init>(Landroid/content/Context;)V
HSPLh/a;->a(Landroid/content/Context;)Lh/a;
HSPLh/a;->b()I
HSPLh/a;->c()I
HSPLh/a;->d()Z
Lh/b;
HSPLh/b;-><clinit>()V
HSPLh/b;-><init>(Landroid/content/Context;)V
Li/a;
Ls/b;
HSPLi/a;-><init>(Landroid/content/Context;IIIILjava/lang/CharSequence;)V
Landroidx/appcompat/view/menu/a;
Landroidx/appcompat/view/menu/h;
HSPLandroidx/appcompat/view/menu/a;-><init>(Landroid/content/Context;II)V
HSPLandroidx/appcompat/view/menu/a;->k(Landroid/content/Context;Landroidx/appcompat/view/menu/d;)V
PLandroidx/appcompat/view/menu/a;->a(Landroidx/appcompat/view/menu/d;Z)V
HSPLandroidx/appcompat/view/menu/a;->f(Landroidx/appcompat/view/menu/h$a;)V
HSPLandroidx/appcompat/view/menu/a;->j(Z)V
Landroidx/appcompat/view/menu/d$a;
Landroidx/appcompat/view/menu/d$b;
Landroidx/appcompat/view/menu/d;
Ls/a;
HSPLandroidx/appcompat/view/menu/d;-><clinit>()V
HSPLandroidx/appcompat/view/menu/d;-><init>(Landroid/content/Context;)V
HSPLandroidx/appcompat/view/menu/d;->b(Landroidx/appcompat/view/menu/h;Landroid/content/Context;)V
PLandroidx/appcompat/view/menu/d;->close()V
PLandroidx/appcompat/view/menu/d;->d(Z)V
HSPLandroidx/appcompat/view/menu/d;->h(Z)V
HSPLandroidx/appcompat/view/menu/d;->q()V
HSPLandroidx/appcompat/view/menu/d;->r()Ljava/util/ArrayList;
HSPLandroidx/appcompat/view/menu/d;->v()Ljava/util/ArrayList;
HSPLandroidx/appcompat/view/menu/d;->A()Ljava/util/ArrayList;
HSPLandroidx/appcompat/view/menu/d;->hasVisibleItems()Z
HSPLandroidx/appcompat/view/menu/d;->H(Z)V
HSPLandroidx/appcompat/view/menu/d;->M(Landroidx/appcompat/view/menu/d$a;)V
HSPLandroidx/appcompat/view/menu/d;->setQwertyMode(Z)V
HSPLandroidx/appcompat/view/menu/d;->U(Z)V
HSPLandroidx/appcompat/view/menu/d;->size()I
HSPLandroidx/appcompat/view/menu/d;->V()V
HSPLandroidx/appcompat/view/menu/d;->W()V
Landroidx/appcompat/view/menu/h$a;
Landroidx/appcompat/view/menu/i;
Landroidx/appcompat/widget/a$a;
HSPLandroidx/appcompat/widget/a$a;-><init>(Landroidx/appcompat/widget/a;)V
Landroidx/appcompat/widget/a;
HSPLandroidx/appcompat/widget/a;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
Landroidx/appcompat/widget/b;
HSPLandroidx/appcompat/widget/b;-><init>(Landroidx/appcompat/widget/ActionBarContainer;)V
HSPLandroidx/appcompat/widget/b;->draw(Landroid/graphics/Canvas;)V
HSPLandroidx/appcompat/widget/b;->getOpacity()I
HSPLandroidx/appcompat/widget/b;->getOutline(Landroid/graphics/Outline;)V
Landroidx/appcompat/widget/ActionBarContainer;
HSPLandroidx/appcompat/widget/ActionBarContainer;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
HSPLandroidx/appcompat/widget/ActionBarContainer;->drawableStateChanged()V
HSPLandroidx/appcompat/widget/ActionBarContainer;->jumpDrawablesToCurrentState()V
HSPLandroidx/appcompat/widget/ActionBarContainer;->onFinishInflate()V
HSPLandroidx/appcompat/widget/ActionBarContainer;->onLayout(ZIIII)V
HSPLandroidx/appcompat/widget/ActionBarContainer;->onMeasure(II)V
HSPLandroidx/appcompat/widget/ActionBarContainer;->setTabContainer(Landroidx/appcompat/widget/G;)V
PLandroidx/appcompat/widget/ActionBarContainer;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z
Landroidx/appcompat/widget/ActionBarContextView;
HSPLandroidx/appcompat/widget/ActionBarContextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
HSPLandroidx/appcompat/widget/ActionBarContextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
PLandroidx/appcompat/widget/ActionBarContextView;->onDetachedFromWindow()V
Landroidx/appcompat/widget/ActionBarOverlayLayout$a;
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout$a;-><init>(Landroidx/appcompat/widget/ActionBarOverlayLayout;)V
Landroidx/appcompat/widget/ActionBarOverlayLayout$b;
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout$b;-><init>(Landroidx/appcompat/widget/ActionBarOverlayLayout;)V
Landroidx/appcompat/widget/ActionBarOverlayLayout$c;
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout$c;-><init>(Landroidx/appcompat/widget/ActionBarOverlayLayout;)V
Landroidx/appcompat/widget/ActionBarOverlayLayout$d;
Landroidx/appcompat/widget/ActionBarOverlayLayout$e;
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout$e;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
Landroidx/appcompat/widget/ActionBarOverlayLayout;
Landroidx/core/view/o;
Landroidx/core/view/p;
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;-><clinit>()V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->h(Landroid/view/View;Landroid/graphics/Rect;ZZZZ)Z
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->k(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/ActionBarOverlayLayout$e;
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->l(Landroid/view/View;)Landroidx/appcompat/widget/u;
PLandroidx/appcompat/widget/ActionBarOverlayLayout;->m()V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->n(Landroid/content/Context;)V
PLandroidx/appcompat/widget/ActionBarOverlayLayout;->onDetachedFromWindow()V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->onLayout(ZIIII)V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->onMeasure(II)V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->f(Landroid/view/View;Landroid/view/View;II)Z
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->onWindowVisibilityChanged(I)V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->q()V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->setActionBarVisibilityCallback(Landroidx/appcompat/widget/ActionBarOverlayLayout$d;)V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->setHasNonEmbeddedTabs(Z)V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->setWindowCallback(Landroid/view/Window$Callback;)V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->setWindowTitle(Ljava/lang/CharSequence;)V
HSPLandroidx/appcompat/widget/ActionBarOverlayLayout;->shouldDelayChildPressedState()Z
Landroidx/appcompat/widget/c$d$a;
Landroidx/appcompat/widget/y;
HSPLandroidx/appcompat/widget/c$d$a;-><init>(Landroidx/appcompat/widget/c$d;Landroid/view/View;Landroidx/appcompat/widget/c;)V
Landroidx/appcompat/widget/c$d;
Landroidx/appcompat/widget/l;
Landroidx/appcompat/widget/ActionMenuView$a;
HSPLandroidx/appcompat/widget/c$d;-><init>(Landroidx/appcompat/widget/c;Landroid/content/Context;)V
Landroidx/appcompat/widget/c$f;
HSPLandroidx/appcompat/widget/c$f;-><init>(Landroidx/appcompat/widget/c;)V
Landroidx/appcompat/widget/c;
HSPLandroidx/appcompat/widget/c;-><init>(Landroid/content/Context;)V
PLandroidx/appcompat/widget/c;->w()Z
HSPLandroidx/appcompat/widget/c;->h()Z
PLandroidx/appcompat/widget/c;->z()Z
PLandroidx/appcompat/widget/c;->A()Z
HSPLandroidx/appcompat/widget/c;->k(Landroid/content/Context;Landroidx/appcompat/view/menu/d;)V
PLandroidx/appcompat/widget/c;->a(Landroidx/appcompat/view/menu/d;Z)V
HSPLandroidx/appcompat/widget/c;->D(Z)V
HSPLandroidx/appcompat/widget/c;->E(Landroidx/appcompat/widget/ActionMenuView;)V
HSPLandroidx/appcompat/widget/c;->j(Z)V
Landroidx/appcompat/widget/ActionMenuView$e;
Landroidx/appcompat/widget/ActionMenuView;
Landroidx/appcompat/widget/z;
HSPLandroidx/appcompat/widget/ActionMenuView;-><init>(Landroid/content/Context;)V
HSPLandroidx/appcompat/widget/ActionMenuView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
PLandroidx/appcompat/widget/ActionMenuView;->w()V
HSPLandroidx/appcompat/widget/ActionMenuView;->C(Landroidx/appcompat/view/menu/d;)V
PLandroidx/appcompat/widget/ActionMenuView;->onDetachedFromWindow()V
HSPLandroidx/appcompat/widget/ActionMenuView;->onLayout(ZIIII)V
HSPLandroidx/appcompat/widget/ActionMenuView;->onMeasure(II)V
HSPLandroidx/appcompat/widget/ActionMenuView;->G()Landroidx/appcompat/view/menu/d;
HSPLandroidx/appcompat/widget/ActionMenuView;->H(Landroidx/appcompat/view/menu/h$a;Landroidx/appcompat/view/menu/d$a;)V
HSPLandroidx/appcompat/widget/ActionMenuView;->setOnMenuItemClickListener(Landroidx/appcompat/widget/ActionMenuView$e;)V
HSPLandroidx/appcompat/widget/ActionMenuView;->setOverflowReserved(Z)V
HSPLandroidx/appcompat/widget/ActionMenuView;->setPopupTheme(I)V
HSPLandroidx/appcompat/widget/ActionMenuView;->setPresenter(Landroidx/appcompat/widget/c;)V
Landroidx/appcompat/widget/e;
HSPLandroidx/appcompat/widget/e;-><init>(Landroid/view/View;)V
HSPLandroidx/appcompat/widget/e;->b()V
HSPLandroidx/appcompat/widget/e;->e(Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/e;->k()Z
Landroidx/appcompat/widget/f$a;
Landroidx/appcompat/widget/D$f;
HSPLandroidx/appcompat/widget/f$a;-><init>()V
HSPLandroidx/appcompat/widget/f$a;->f([II)Z
HSPLandroidx/appcompat/widget/f$a;->a(Landroidx/appcompat/widget/D;Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;
HSPLandroidx/appcompat/widget/f$a;->b(Landroid/content/Context;I)Landroid/content/res/ColorStateList;
HSPLandroidx/appcompat/widget/f$a;->d(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z
HSPLandroidx/appcompat/widget/f$a;->c(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z
Landroidx/appcompat/widget/f;
HSPLandroidx/appcompat/widget/f;-><clinit>()V
HSPLandroidx/appcompat/widget/f;-><init>()V
HSPLandroidx/appcompat/widget/f;->a()Landroid/graphics/PorterDuff$Mode;
HSPLandroidx/appcompat/widget/f;->b()Landroidx/appcompat/widget/f;
HSPLandroidx/appcompat/widget/f;->e(Landroid/content/Context;I)Landroid/content/res/ColorStateList;
HSPLandroidx/appcompat/widget/f;->f()V
Landroidx/appcompat/widget/g;
HSPLandroidx/appcompat/widget/g;-><init>(Landroid/widget/EditText;)V
HSPLandroidx/appcompat/widget/g;->a(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener;
HSPLandroidx/appcompat/widget/g;->c(Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/g;->e(Z)V
Landroidx/appcompat/widget/h;
HSPLandroidx/appcompat/widget/h;-><init>(Landroid/widget/TextView;)V
HSPLandroidx/appcompat/widget/h;->a([Landroid/text/InputFilter;)[Landroid/text/InputFilter;
HSPLandroidx/appcompat/widget/h;->b(Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/h;->d(Z)V
Landroidx/appcompat/widget/j;
HSPLandroidx/appcompat/widget/j;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/j;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/j;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V
Landroidx/appcompat/widget/k;
HSPLandroidx/appcompat/widget/k;-><init>(Landroid/widget/ImageView;)V
HSPLandroidx/appcompat/widget/k;->b()V
HSPLandroidx/appcompat/widget/k;->c()V
HSPLandroidx/appcompat/widget/k;->g(Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/l;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/l;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/l;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V
Landroidx/appcompat/widget/n;
HSPLandroidx/appcompat/widget/n;-><init>(Landroid/widget/TextView;)V
Landroidx/appcompat/widget/o$a;
Landroidx/core/content/res/h$e;
HSPLandroidx/appcompat/widget/o$a;-><init>(Landroidx/appcompat/widget/o;IILjava/lang/ref/WeakReference;)V
HSPLandroidx/appcompat/widget/o$a;->f(I)V
Landroidx/appcompat/widget/o;
HSPLandroidx/appcompat/widget/o;-><init>(Landroid/widget/TextView;)V
HSPLandroidx/appcompat/widget/o;->b()V
HSPLandroidx/appcompat/widget/o;->d(Landroid/content/Context;Landroidx/appcompat/widget/f;I)Landroidx/appcompat/widget/J;
HSPLandroidx/appcompat/widget/o;->m(Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/o;->o(ZIIII)V
HSPLandroidx/appcompat/widget/o;->q(Landroid/content/Context;I)V
HSPLandroidx/appcompat/widget/o;->y(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/o;->C(Landroid/content/Context;Landroidx/appcompat/widget/L;)V
Landroidx/appcompat/widget/p;
Landroidx/core/widget/h;
HSPLandroidx/appcompat/widget/p;-><init>(Landroid/content/Context;)V
HSPLandroidx/appcompat/widget/p;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
HSPLandroidx/appcompat/widget/p;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/p;->r()V
HSPLandroidx/appcompat/widget/p;->drawableStateChanged()V
HSPLandroidx/appcompat/widget/p;->getEmojiTextViewHelper()Landroidx/appcompat/widget/h;
HSPLandroidx/appcompat/widget/p;->getText()Ljava/lang/CharSequence;
HSPLandroidx/appcompat/widget/p;->onLayout(ZIIII)V
HSPLandroidx/appcompat/widget/p;->onMeasure(II)V
HSPLandroidx/appcompat/widget/p;->onTextChanged(Ljava/lang/CharSequence;III)V
HSPLandroidx/appcompat/widget/p;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/p;->setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/p;->setFilters([Landroid/text/InputFilter;)V
HSPLandroidx/appcompat/widget/p;->setTextAppearance(Landroid/content/Context;I)V
HSPLandroidx/appcompat/widget/p;->setTypeface(Landroid/graphics/Typeface;I)V
Landroidx/appcompat/widget/q$b;
Landroidx/appcompat/widget/q$d;
HSPLandroidx/appcompat/widget/q$b;-><init>()V
Landroidx/appcompat/widget/q$c;
HSPLandroidx/appcompat/widget/q$c;-><init>()V
HSPLandroidx/appcompat/widget/q$d;-><init>()V
Landroidx/appcompat/widget/q;
HSPLandroidx/appcompat/widget/q;-><clinit>()V
HSPLandroidx/appcompat/widget/q;-><init>(Landroid/widget/TextView;)V
HSPLandroidx/appcompat/widget/q;->j()I
HSPLandroidx/appcompat/widget/q;->o(Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/q;->y()Z
Landroidx/appcompat/widget/ContentFrameLayout$a;
Landroidx/appcompat/widget/ContentFrameLayout;
HSPLandroidx/appcompat/widget/ContentFrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
HSPLandroidx/appcompat/widget/ContentFrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMajor()Landroid/util/TypedValue;
HSPLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMinor()Landroid/util/TypedValue;
HSPLandroidx/appcompat/widget/ContentFrameLayout;->onAttachedToWindow()V
PLandroidx/appcompat/widget/ContentFrameLayout;->onDetachedFromWindow()V
HSPLandroidx/appcompat/widget/ContentFrameLayout;->onMeasure(II)V
HSPLandroidx/appcompat/widget/ContentFrameLayout;->setAttachListener(Landroidx/appcompat/widget/ContentFrameLayout$a;)V
Landroidx/appcompat/widget/u;
Landroidx/appcompat/widget/v;
HSPLandroidx/appcompat/widget/y;-><init>(Landroid/view/View;)V
HSPLandroidx/appcompat/widget/z;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
HSPLandroidx/appcompat/widget/z;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/z;->getVirtualChildCount()I
HSPLandroidx/appcompat/widget/z;->p(IIII)V
HSPLandroidx/appcompat/widget/z;->s(II)V
HSPLandroidx/appcompat/widget/z;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V
HSPLandroidx/appcompat/widget/z;->onLayout(ZIIII)V
HSPLandroidx/appcompat/widget/z;->onMeasure(II)V
HSPLandroidx/appcompat/widget/z;->setBaselineAligned(Z)V
HSPLandroidx/appcompat/widget/z;->setDividerDrawable(Landroid/graphics/drawable/Drawable;)V
Landroidx/appcompat/widget/D$c;
Lp/h;
Landroidx/appcompat/widget/D;
Landroidx/appcompat/widget/E;
Landroidx/appcompat/widget/F;
HSPLandroidx/appcompat/widget/F;-><init>()V
HSPLandroidx/appcompat/widget/F;->a()I
HSPLandroidx/appcompat/widget/F;->d()I
HSPLandroidx/appcompat/widget/F;->e(II)V
HSPLandroidx/appcompat/widget/F;->f(Z)V
HSPLandroidx/appcompat/widget/F;->g(II)V
Landroidx/appcompat/widget/H;
HSPLandroidx/appcompat/widget/H;-><clinit>()V
HSPLandroidx/appcompat/widget/H;->a(Landroid/view/View;Landroid/content/Context;)V
Landroidx/appcompat/widget/I;
HSPLandroidx/appcompat/widget/I;-><clinit>()V
HSPLandroidx/appcompat/widget/I;->a(Landroid/content/Context;)Z
HSPLandroidx/appcompat/widget/I;->b(Landroid/content/Context;)Landroid/content/Context;
Landroidx/appcompat/widget/K;
Landroidx/appcompat/widget/L;
HSPLandroidx/appcompat/widget/L;-><init>(Landroid/content/Context;Landroid/content/res/TypedArray;)V
HSPLandroidx/appcompat/widget/L;->a(IZ)Z
HSPLandroidx/appcompat/widget/L;->b(II)I
HSPLandroidx/appcompat/widget/L;->c(I)Landroid/content/res/ColorStateList;
HSPLandroidx/appcompat/widget/L;->d(II)I
HSPLandroidx/appcompat/widget/L;->e(II)I
HSPLandroidx/appcompat/widget/L;->f(I)Landroid/graphics/drawable/Drawable;
HSPLandroidx/appcompat/widget/L;->g(IF)F
HSPLandroidx/appcompat/widget/L;->h(IILandroidx/core/content/res/h$e;)Landroid/graphics/Typeface;
HSPLandroidx/appcompat/widget/L;->i(II)I
HSPLandroidx/appcompat/widget/L;->j(II)I
HSPLandroidx/appcompat/widget/L;->k(II)I
HSPLandroidx/appcompat/widget/L;->l(II)I
HSPLandroidx/appcompat/widget/L;->m(I)Ljava/lang/String;
HSPLandroidx/appcompat/widget/L;->n(I)Ljava/lang/CharSequence;
HSPLandroidx/appcompat/widget/L;->o()Landroid/content/res/TypedArray;
HSPLandroidx/appcompat/widget/L;->p(I)Z
HSPLandroidx/appcompat/widget/L;->q(Landroid/content/Context;I[I)Landroidx/appcompat/widget/L;
HSPLandroidx/appcompat/widget/L;->r(Landroid/content/Context;Landroid/util/AttributeSet;[I)Landroidx/appcompat/widget/L;
HSPLandroidx/appcompat/widget/L;->s(Landroid/content/Context;Landroid/util/AttributeSet;[III)Landroidx/appcompat/widget/L;
HSPLandroidx/appcompat/widget/L;->u()V
Landroidx/appcompat/widget/Toolbar$a;
HSPLandroidx/appcompat/widget/Toolbar$a;-><init>(Landroidx/appcompat/widget/Toolbar;)V
Landroidx/appcompat/widget/Toolbar$b;
HSPLandroidx/appcompat/widget/Toolbar$b;-><init>(Landroidx/appcompat/widget/Toolbar;)V
Landroidx/appcompat/widget/Toolbar$f;
HSPLandroidx/appcompat/widget/Toolbar$f;-><init>(Landroidx/appcompat/widget/Toolbar;)V
HSPLandroidx/appcompat/widget/Toolbar$f;->h()Z
HSPLandroidx/appcompat/widget/Toolbar$f;->k(Landroid/content/Context;Landroidx/appcompat/view/menu/d;)V
PLandroidx/appcompat/widget/Toolbar$f;->a(Landroidx/appcompat/view/menu/d;Z)V
HSPLandroidx/appcompat/widget/Toolbar$f;->j(Z)V
Landroidx/appcompat/widget/Toolbar$g;
HSPLandroidx/appcompat/widget/Toolbar$g;-><init>(II)V
Landroidx/appcompat/widget/Toolbar;
HSPLandroidx/appcompat/widget/Toolbar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
HSPLandroidx/appcompat/widget/Toolbar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/Toolbar;->b(Ljava/util/List;I)V
HSPLandroidx/appcompat/widget/Toolbar;->c(Landroid/view/View;Z)V
HSPLandroidx/appcompat/widget/Toolbar;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
HSPLandroidx/appcompat/widget/Toolbar;->f()V
HSPLandroidx/appcompat/widget/Toolbar;->i()V
HSPLandroidx/appcompat/widget/Toolbar;->j()V
HSPLandroidx/appcompat/widget/Toolbar;->k()Landroidx/appcompat/widget/Toolbar$g;
HSPLandroidx/appcompat/widget/Toolbar;->o(Landroid/view/View;I)I
HSPLandroidx/appcompat/widget/Toolbar;->p(I)I
HSPLandroidx/appcompat/widget/Toolbar;->getContentInsetEnd()I
HSPLandroidx/appcompat/widget/Toolbar;->getContentInsetStart()I
HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetEnd()I
HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetLeft()I
HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetRight()I
HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetStart()I
HSPLandroidx/appcompat/widget/Toolbar;->q(Landroid/view/View;)I
HSPLandroidx/appcompat/widget/Toolbar;->getNavigationContentDescription()Ljava/lang/CharSequence;
HSPLandroidx/appcompat/widget/Toolbar;->getNavigationIcon()Landroid/graphics/drawable/Drawable;
HSPLandroidx/appcompat/widget/Toolbar;->getSubtitle()Ljava/lang/CharSequence;
HSPLandroidx/appcompat/widget/Toolbar;->getTitle()Ljava/lang/CharSequence;
HSPLandroidx/appcompat/widget/Toolbar;->r(Landroid/view/View;)I
HSPLandroidx/appcompat/widget/Toolbar;->s(Ljava/util/List;[I)I
HSPLandroidx/appcompat/widget/Toolbar;->getWrapper()Landroidx/appcompat/widget/u;
PLandroidx/appcompat/widget/Toolbar;->t()Z
HSPLandroidx/appcompat/widget/Toolbar;->w(Landroid/view/View;)Z
HSPLandroidx/appcompat/widget/Toolbar;->z(Landroid/view/View;I[II)I
HSPLandroidx/appcompat/widget/Toolbar;->A(Landroid/view/View;IIII[I)I
HSPLandroidx/appcompat/widget/Toolbar;->B(Landroid/view/View;IIIII)V
PLandroidx/appcompat/widget/Toolbar;->onDetachedFromWindow()V
HSPLandroidx/appcompat/widget/Toolbar;->onLayout(ZIIII)V
HSPLandroidx/appcompat/widget/Toolbar;->onMeasure(II)V
HSPLandroidx/appcompat/widget/Toolbar;->onRtlPropertiesChanged(I)V
HSPLandroidx/appcompat/widget/Toolbar;->setCollapsible(Z)V
HSPLandroidx/appcompat/widget/Toolbar;->F(II)V
HSPLandroidx/appcompat/widget/Toolbar;->setNavigationContentDescription(Ljava/lang/CharSequence;)V
HSPLandroidx/appcompat/widget/Toolbar;->setNavigationIcon(Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/Toolbar;->setNavigationOnClickListener(Landroid/view/View$OnClickListener;)V
HSPLandroidx/appcompat/widget/Toolbar;->setPopupTheme(I)V
HSPLandroidx/appcompat/widget/Toolbar;->setSubtitle(Ljava/lang/CharSequence;)V
HSPLandroidx/appcompat/widget/Toolbar;->G(Landroid/content/Context;I)V
HSPLandroidx/appcompat/widget/Toolbar;->setTitle(Ljava/lang/CharSequence;)V
HSPLandroidx/appcompat/widget/Toolbar;->H(Landroid/content/Context;I)V
HSPLandroidx/appcompat/widget/Toolbar;->I()Z
HSPLandroidx/appcompat/widget/Toolbar;->J(Landroid/view/View;)Z
Landroidx/appcompat/widget/P$a;
HSPLandroidx/appcompat/widget/P$a;-><init>(Landroidx/appcompat/widget/P;)V
Landroidx/appcompat/widget/P;
HSPLandroidx/appcompat/widget/P;-><init>(Landroidx/appcompat/widget/Toolbar;Z)V
HSPLandroidx/appcompat/widget/P;-><init>(Landroidx/appcompat/widget/Toolbar;ZII)V
HSPLandroidx/appcompat/widget/P;->e()Landroid/content/Context;
HSPLandroidx/appcompat/widget/P;->g(I)V
HSPLandroidx/appcompat/widget/P;->h(I)V
HSPLandroidx/appcompat/widget/P;->l(Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/P;->o(Ljava/lang/CharSequence;)V
HSPLandroidx/appcompat/widget/P;->c(Landroid/view/Window$Callback;)V
HSPLandroidx/appcompat/widget/P;->b(Ljava/lang/CharSequence;)V
HSPLandroidx/appcompat/widget/P;->q()V
Landroidx/appcompat/widget/Q;
HSPLandroidx/appcompat/widget/Q;->a(Landroid/view/View;Ljava/lang/CharSequence;)V
Landroidx/appcompat/widget/W;
HSPLandroidx/appcompat/widget/W;-><clinit>()V
HSPLandroidx/appcompat/widget/W;->b()Z
HSPLandroidx/appcompat/widget/W;->c()Z
Landroidx/appcompat/widget/X;
HSPLandroidx/appcompat/widget/X;-><clinit>()V
HSPLandroidx/appcompat/widget/X;->a(Landroid/view/View;)Z
LE/b;
LE/c;
HSPLE/c;-><clinit>()V
Landroidx/fragment/app/a;
Landroidx/fragment/app/y;
Landroidx/fragment/app/q$h;
HSPLandroidx/fragment/app/a;-><init>(Landroidx/fragment/app/q;)V
HSPLandroidx/fragment/app/a;->i(I)V
HSPLandroidx/fragment/app/a;->g(ILandroidx/fragment/app/Fragment;Ljava/lang/String;I)V
HSPLandroidx/fragment/app/a;->k()V
HSPLandroidx/fragment/app/a;->m(Ljava/util/ArrayList;Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/a;->a(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z
HSPLandroidx/fragment/app/a;->n()V
Landroidx/fragment/app/d;
Landroidx/fragment/app/E;
HSPLandroidx/fragment/app/d;-><init>(Landroid/view/ViewGroup;)V
Landroidx/fragment/app/Fragment$a;
HSPLandroidx/fragment/app/Fragment$a;-><init>(Landroidx/fragment/app/Fragment;)V
Landroidx/fragment/app/Fragment$c;
Landroidx/fragment/app/g;
HSPLandroidx/fragment/app/Fragment$c;-><init>(Landroidx/fragment/app/Fragment;)V
Landroidx/fragment/app/Fragment$d;
HSPLandroidx/fragment/app/Fragment$d;-><init>()V
Landroidx/fragment/app/Fragment$e;
PLandroidx/fragment/app/Fragment$e;->a(Landroid/view/View;)V
Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/Fragment;-><clinit>()V
HSPLandroidx/fragment/app/Fragment;-><init>()V
HSPLandroidx/fragment/app/Fragment;->h()Landroidx/fragment/app/g;
HSPLandroidx/fragment/app/Fragment;->i()Landroidx/fragment/app/Fragment$d;
HSPLandroidx/fragment/app/Fragment;->equals(Ljava/lang/Object;)Z
HSPLandroidx/fragment/app/Fragment;->j()Landroidx/fragment/app/e;
HSPLandroidx/fragment/app/Fragment;->n()Landroidx/fragment/app/q;
HSPLandroidx/fragment/app/Fragment;->o()Landroid/content/Context;
HSPLandroidx/fragment/app/Fragment;->v()Landroid/view/View;
HSPLandroidx/fragment/app/Fragment;->w(Landroid/os/Bundle;)Landroid/view/LayoutInflater;
HSPLandroidx/fragment/app/Fragment;->g()Landroidx/lifecycle/g;
HSPLandroidx/fragment/app/Fragment;->x()I
HSPLandroidx/fragment/app/Fragment;->z()Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/Fragment;->A()Landroidx/fragment/app/q;
HSPLandroidx/fragment/app/Fragment;->E()F
HSPLandroidx/fragment/app/Fragment;->b()Landroidx/savedstate/a;
HSPLandroidx/fragment/app/Fragment;->M()Landroid/view/View;
HSPLandroidx/fragment/app/Fragment;->c()Landroidx/lifecycle/D;
HSPLandroidx/fragment/app/Fragment;->N()V
PLandroidx/fragment/app/Fragment;->O()V
HSPLandroidx/fragment/app/Fragment;->P()Z
HSPLandroidx/fragment/app/Fragment;->S()Z
HSPLandroidx/fragment/app/Fragment;->U(Landroid/os/Bundle;)V
HSPLandroidx/fragment/app/Fragment;->V(Landroid/os/Bundle;)V
PLandroidx/fragment/app/Fragment;->b0()V
PLandroidx/fragment/app/Fragment;->c0()V
HSPLandroidx/fragment/app/Fragment;->d0(Landroid/os/Bundle;)Landroid/view/LayoutInflater;
HSPLandroidx/fragment/app/Fragment;->f0(Landroid/content/Context;Landroid/util/AttributeSet;Landroid/os/Bundle;)V
PLandroidx/fragment/app/Fragment;->h0()V
HSPLandroidx/fragment/app/Fragment;->j0(Z)V
HSPLandroidx/fragment/app/Fragment;->k0()V
HSPLandroidx/fragment/app/Fragment;->m0()V
PLandroidx/fragment/app/Fragment;->n0()V
HSPLandroidx/fragment/app/Fragment;->o0(Landroid/view/View;Landroid/os/Bundle;)V
HSPLandroidx/fragment/app/Fragment;->p0(Landroid/os/Bundle;)V
HSPLandroidx/fragment/app/Fragment;->q0(Landroid/os/Bundle;)V
HSPLandroidx/fragment/app/Fragment;->r0()V
HSPLandroidx/fragment/app/Fragment;->t0(Landroid/os/Bundle;)V
HSPLandroidx/fragment/app/Fragment;->u0(Landroid/view/Menu;Landroid/view/MenuInflater;)Z
HSPLandroidx/fragment/app/Fragment;->v0(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)V
PLandroidx/fragment/app/Fragment;->w0()V
PLandroidx/fragment/app/Fragment;->x0()V
HSPLandroidx/fragment/app/Fragment;->y0(Landroid/os/Bundle;)Landroid/view/LayoutInflater;
PLandroidx/fragment/app/Fragment;->B0()V
HSPLandroidx/fragment/app/Fragment;->C0(Landroid/view/Menu;)Z
HSPLandroidx/fragment/app/Fragment;->D0()V
HSPLandroidx/fragment/app/Fragment;->E0()V
HSPLandroidx/fragment/app/Fragment;->G0()V
PLandroidx/fragment/app/Fragment;->H0()V
HSPLandroidx/fragment/app/Fragment;->I0()V
HSPLandroidx/fragment/app/Fragment;->L0()Landroid/content/Context;
HSPLandroidx/fragment/app/Fragment;->M0()Landroid/view/View;
HSPLandroidx/fragment/app/Fragment;->N0(Landroid/os/Bundle;)V
HSPLandroidx/fragment/app/Fragment;->O0()V
HSPLandroidx/fragment/app/Fragment;->P0(Landroid/os/Bundle;)V
HSPLandroidx/fragment/app/Fragment;->Q0(IIII)V
HSPLandroidx/fragment/app/Fragment;->R0(Landroid/view/View;)V
HSPLandroidx/fragment/app/Fragment;->S0(I)V
HSPLandroidx/fragment/app/Fragment;->T0(Z)V
HSPLandroidx/fragment/app/Fragment;->U0(F)V
HSPLandroidx/fragment/app/Fragment;->V0(Ljava/util/ArrayList;Ljava/util/ArrayList;)V
HSPLandroidx/fragment/app/Fragment;->toString()Ljava/lang/String;
Landroidx/fragment/app/e;
HSPLandroidx/fragment/app/g;-><init>()V
Landroidx/fragment/app/h;
PLandroidx/fragment/app/h;->a(Landroid/view/View;)V
HSPLandroidx/fragment/app/h;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
HSPLandroidx/fragment/app/h;->dispatchDraw(Landroid/graphics/Canvas;)V
HSPLandroidx/fragment/app/h;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z
PLandroidx/fragment/app/h;->removeView(Landroid/view/View;)V
Landroidx/fragment/app/i;
HSPLandroidx/fragment/app/i;-><clinit>()V
HSPLandroidx/fragment/app/i;-><init>()V
HSPLandroidx/fragment/app/i;->b(Ljava/lang/ClassLoader;Ljava/lang/String;)Z
HSPLandroidx/fragment/app/i;->c(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;
Landroidx/fragment/app/j;
Landroidx/fragment/app/k;
HSPLandroidx/fragment/app/k;-><init>(Landroidx/fragment/app/q;)V
HSPLandroidx/fragment/app/k;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
Landroidx/fragment/app/l;
HSPLandroidx/fragment/app/l;-><init>(Landroidx/fragment/app/q;)V
HSPLandroidx/fragment/app/l;->a(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V
HSPLandroidx/fragment/app/l;->b(Landroidx/fragment/app/Fragment;Z)V
HSPLandroidx/fragment/app/l;->c(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V
PLandroidx/fragment/app/l;->d(Landroidx/fragment/app/Fragment;Z)V
PLandroidx/fragment/app/l;->e(Landroidx/fragment/app/Fragment;Z)V
HSPLandroidx/fragment/app/l;->f(Landroidx/fragment/app/Fragment;Z)V
HSPLandroidx/fragment/app/l;->g(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V
HSPLandroidx/fragment/app/l;->h(Landroidx/fragment/app/Fragment;Z)V
HSPLandroidx/fragment/app/l;->j(Landroidx/fragment/app/Fragment;Z)V
PLandroidx/fragment/app/l;->k(Landroidx/fragment/app/Fragment;Z)V
HSPLandroidx/fragment/app/l;->l(Landroidx/fragment/app/Fragment;Landroid/view/View;Landroid/os/Bundle;Z)V
PLandroidx/fragment/app/l;->m(Landroidx/fragment/app/Fragment;Z)V
Landroidx/fragment/app/q$a;
HSPLandroidx/fragment/app/q$a;-><init>(Landroidx/fragment/app/q;Z)V
Landroidx/fragment/app/q$b;
Landroidx/core/view/l;
HSPLandroidx/fragment/app/q$b;-><init>(Landroidx/fragment/app/q;)V
Landroidx/fragment/app/q$c;
HSPLandroidx/fragment/app/q$c;-><init>(Landroidx/fragment/app/q;)V
Landroidx/fragment/app/q$d;
Landroidx/fragment/app/F;
HSPLandroidx/fragment/app/q$d;-><init>(Landroidx/fragment/app/q;)V
Landroidx/fragment/app/FragmentManager$6;
Landroidx/fragment/app/q$f;
Landroidx/fragment/app/u;
Landroidx/fragment/app/q;
HSPLandroidx/fragment/app/q;-><clinit>()V
HSPLandroidx/fragment/app/q;-><init>()V
HSPLandroidx/fragment/app/q;->h(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/w;
HSPLandroidx/fragment/app/q;->i(Landroidx/fragment/app/u;)V
HSPLandroidx/fragment/app/q;->j(Landroidx/fragment/app/j;Landroidx/fragment/app/g;Landroidx/fragment/app/Fragment;)V
HSPLandroidx/fragment/app/q;->l()Landroidx/fragment/app/y;
HSPLandroidx/fragment/app/q;->m()Z
HSPLandroidx/fragment/app/q;->n()V
PLandroidx/fragment/app/q;->o()V
HSPLandroidx/fragment/app/q;->p()Ljava/util/Set;
HSPLandroidx/fragment/app/q;->q(Ljava/util/ArrayList;II)Ljava/util/Set;
HSPLandroidx/fragment/app/q;->r(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/w;
HSPLandroidx/fragment/app/q;->t()V
HSPLandroidx/fragment/app/q;->v()V
HSPLandroidx/fragment/app/q;->w(Landroid/view/Menu;Landroid/view/MenuInflater;)Z
PLandroidx/fragment/app/q;->x()V
PLandroidx/fragment/app/q;->y()V
HSPLandroidx/fragment/app/q;->C(Landroidx/fragment/app/Fragment;)V
PLandroidx/fragment/app/q;->D()V
HSPLandroidx/fragment/app/q;->E(Landroid/view/Menu;)Z
HSPLandroidx/fragment/app/q;->F()V
HSPLandroidx/fragment/app/q;->G()V
HSPLandroidx/fragment/app/q;->H()V
HSPLandroidx/fragment/app/q;->I(I)V
PLandroidx/fragment/app/q;->J()V
HSPLandroidx/fragment/app/q;->K()V
HSPLandroidx/fragment/app/q;->L()V
PLandroidx/fragment/app/q;->M()V
HSPLandroidx/fragment/app/q;->N(Z)V
HSPLandroidx/fragment/app/q;->O(Z)Z
HSPLandroidx/fragment/app/q;->Q(Ljava/util/ArrayList;Ljava/util/ArrayList;II)V
HSPLandroidx/fragment/app/q;->R(Ljava/util/ArrayList;Ljava/util/ArrayList;II)V
HSPLandroidx/fragment/app/q;->S(Ljava/lang/String;)Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/q;->T(I)Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/q;->Y(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z
HSPLandroidx/fragment/app/q;->Z()I
HSPLandroidx/fragment/app/q;->a0(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/t;
HSPLandroidx/fragment/app/q;->b0()Landroidx/fragment/app/g;
HSPLandroidx/fragment/app/q;->c0(Landroidx/fragment/app/Fragment;)Landroid/view/ViewGroup;
HSPLandroidx/fragment/app/q;->d0()Landroidx/fragment/app/i;
HSPLandroidx/fragment/app/q;->e0()Landroidx/fragment/app/j;
HSPLandroidx/fragment/app/q;->f0()Landroidx/fragment/app/l;
HSPLandroidx/fragment/app/q;->g0()Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/q;->h0()Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/q;->i0()Landroidx/fragment/app/F;
HSPLandroidx/fragment/app/q;->j0()LF/c$c;
HSPLandroidx/fragment/app/q;->k0(Landroid/view/View;)Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/q;->l0(Landroidx/fragment/app/Fragment;)Landroidx/lifecycle/D;
PLandroidx/fragment/app/q;->o0()Z
HSPLandroidx/fragment/app/q;->p0(I)Z
HSPLandroidx/fragment/app/q;->q0(Landroidx/fragment/app/Fragment;)Z
HSPLandroidx/fragment/app/q;->t0(Landroidx/fragment/app/Fragment;)Z
HSPLandroidx/fragment/app/q;->u0(Landroidx/fragment/app/Fragment;)Z
HSPLandroidx/fragment/app/q;->v0(I)Z
HSPLandroidx/fragment/app/q;->w0()Z
HSPLandroidx/fragment/app/q;->x0(IZ)V
HSPLandroidx/fragment/app/q;->y0()V
HSPLandroidx/fragment/app/q;->A0(Landroidx/fragment/app/w;)V
HSPLandroidx/fragment/app/q;->C0(Ljava/util/ArrayList;Ljava/util/ArrayList;)V
HSPLandroidx/fragment/app/q;->H0(Landroidx/fragment/app/Fragment;Z)V
HSPLandroidx/fragment/app/q;->J0(Landroidx/fragment/app/Fragment;)V
HSPLandroidx/fragment/app/q;->M0()V
HSPLandroidx/fragment/app/q;->N0()V
Landroidx/fragment/app/r;
HSPLandroidx/fragment/app/r;-><init>()V
Landroidx/fragment/app/t$a;
Landroidx/lifecycle/A$b;
HSPLandroidx/fragment/app/t$a;-><init>()V
HSPLandroidx/fragment/app/t$a;->b(Ljava/lang/Class;)Landroidx/lifecycle/z;
Landroidx/fragment/app/t;
Landroidx/lifecycle/z;
HSPLandroidx/fragment/app/t;-><clinit>()V
HSPLandroidx/fragment/app/t;-><init>(Z)V
PLandroidx/fragment/app/t;->f(Landroidx/fragment/app/Fragment;)V
PLandroidx/fragment/app/t;->g(Ljava/lang/String;)V
HSPLandroidx/fragment/app/t;->i(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/t;
HSPLandroidx/fragment/app/t;->k(Landroidx/fragment/app/Fragment;)Landroidx/lifecycle/D;
PLandroidx/fragment/app/t;->d()V
HSPLandroidx/fragment/app/t;->m(Z)V
PLandroidx/fragment/app/t;->n(Landroidx/fragment/app/Fragment;)Z
Landroidx/fragment/app/w$a;
HSPLandroidx/fragment/app/w$a;-><init>(Landroidx/fragment/app/w;Landroid/view/View;)V
HSPLandroidx/fragment/app/w$a;->onViewAttachedToWindow(Landroid/view/View;)V
Landroidx/fragment/app/w$b;
HSPLandroidx/fragment/app/w$b;-><clinit>()V
Landroidx/fragment/app/w;
HSPLandroidx/fragment/app/w;-><init>(Landroidx/fragment/app/l;Landroidx/fragment/app/x;Landroidx/fragment/app/Fragment;)V
HSPLandroidx/fragment/app/w;->a()V
HSPLandroidx/fragment/app/w;->b()V
HSPLandroidx/fragment/app/w;->c()V
HSPLandroidx/fragment/app/w;->d()I
HSPLandroidx/fragment/app/w;->e()V
HSPLandroidx/fragment/app/w;->f()V
PLandroidx/fragment/app/w;->g()V
PLandroidx/fragment/app/w;->h()V
PLandroidx/fragment/app/w;->i()V
HSPLandroidx/fragment/app/w;->j()V
HSPLandroidx/fragment/app/w;->k()Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/w;->m()V
PLandroidx/fragment/app/w;->n()V
HSPLandroidx/fragment/app/w;->o()V
PLandroidx/fragment/app/w;->r()V
HSPLandroidx/fragment/app/w;->s(I)V
HSPLandroidx/fragment/app/w;->t()V
PLandroidx/fragment/app/w;->u()V
Landroidx/fragment/app/x;
HSPLandroidx/fragment/app/x;-><init>()V
HSPLandroidx/fragment/app/x;->a(Landroidx/fragment/app/Fragment;)V
HSPLandroidx/fragment/app/x;->b()V
HSPLandroidx/fragment/app/x;->c(Ljava/lang/String;)Z
HSPLandroidx/fragment/app/x;->d(I)V
HSPLandroidx/fragment/app/x;->e(Ljava/lang/String;)Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/x;->f(I)Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/x;->h(Landroidx/fragment/app/Fragment;)I
HSPLandroidx/fragment/app/x;->i()Ljava/util/List;
HSPLandroidx/fragment/app/x;->j()Ljava/util/List;
HSPLandroidx/fragment/app/x;->l(Ljava/lang/String;)Landroidx/fragment/app/w;
HSPLandroidx/fragment/app/x;->m()Ljava/util/List;
PLandroidx/fragment/app/x;->n()Landroidx/fragment/app/t;
HSPLandroidx/fragment/app/x;->p(Landroidx/fragment/app/w;)V
PLandroidx/fragment/app/x;->q(Landroidx/fragment/app/w;)V
HSPLandroidx/fragment/app/x;->r()V
HSPLandroidx/fragment/app/x;->y(Landroidx/fragment/app/t;)V
Landroidx/fragment/app/y$a;
HSPLandroidx/fragment/app/y$a;-><init>(ILandroidx/fragment/app/Fragment;)V
HSPLandroidx/fragment/app/y$a;-><init>(ILandroidx/fragment/app/Fragment;Z)V
HSPLandroidx/fragment/app/y;-><init>(Landroidx/fragment/app/i;Ljava/lang/ClassLoader;)V
HSPLandroidx/fragment/app/y;->d(Landroidx/fragment/app/y$a;)V
HSPLandroidx/fragment/app/y;->g(ILandroidx/fragment/app/Fragment;Ljava/lang/String;I)V
HSPLandroidx/fragment/app/y;->h(Z)Landroidx/fragment/app/y;
Landroidx/fragment/app/C;
HSPLandroidx/fragment/app/C;-><init>(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/D;)V
HSPLandroidx/fragment/app/C;->g()Landroidx/lifecycle/g;
HSPLandroidx/fragment/app/C;->b()Landroidx/savedstate/a;
HSPLandroidx/fragment/app/C;->d(Landroidx/lifecycle/g$a;)V
HSPLandroidx/fragment/app/C;->e()V
HSPLandroidx/fragment/app/C;->h(Landroid/os/Bundle;)V
PLandroidx/fragment/app/C;->i(Landroid/os/Bundle;)V
Landroidx/fragment/app/E$a;
HSPLandroidx/fragment/app/E$a;-><init>(Landroidx/fragment/app/E;Landroidx/fragment/app/E$d;)V
HSPLandroidx/fragment/app/E$a;->run()V
Landroidx/fragment/app/E$b;
HSPLandroidx/fragment/app/E$b;-><init>(Landroidx/fragment/app/E;Landroidx/fragment/app/E$d;)V
HSPLandroidx/fragment/app/E$b;->run()V
Landroidx/fragment/app/E$c;
HSPLandroidx/fragment/app/E$c;-><clinit>()V
Landroidx/fragment/app/E$d;
Landroidx/fragment/app/E$e;
HSPLandroidx/fragment/app/E$d;-><init>(Landroidx/fragment/app/E$e$c;Landroidx/fragment/app/E$e$b;Landroidx/fragment/app/w;Landroidx/core/os/b;)V
HSPLandroidx/fragment/app/E$d;->c()V
HSPLandroidx/fragment/app/E$d;->l()V
Landroidx/fragment/app/E$e$a;
Landroidx/core/os/b$a;
HSPLandroidx/fragment/app/E$e$a;-><init>(Landroidx/fragment/app/E$e;)V
Landroidx/fragment/app/E$e$b;
HSPLandroidx/fragment/app/E$e$b;-><clinit>()V
HSPLandroidx/fragment/app/E$e$b;-><init>(Ljava/lang/String;I)V
HSPLandroidx/fragment/app/E$e$b;->values()[Landroidx/fragment/app/E$e$b;
Landroidx/fragment/app/E$e$c;
HSPLandroidx/fragment/app/E$e$c;-><clinit>()V
HSPLandroidx/fragment/app/E$e$c;-><init>(Ljava/lang/String;I)V
HSPLandroidx/fragment/app/E$e$c;->a(Landroid/view/View;)V
HSPLandroidx/fragment/app/E$e$c;->b(I)Landroidx/fragment/app/E$e$c;
HSPLandroidx/fragment/app/E$e$c;->values()[Landroidx/fragment/app/E$e$c;
HSPLandroidx/fragment/app/E$e;-><init>(Landroidx/fragment/app/E$e$c;Landroidx/fragment/app/E$e$b;Landroidx/fragment/app/Fragment;Landroidx/core/os/b;)V
HSPLandroidx/fragment/app/E$e;->a(Ljava/lang/Runnable;)V
HSPLandroidx/fragment/app/E$e;->b()V
HSPLandroidx/fragment/app/E$e;->c()V
HSPLandroidx/fragment/app/E$e;->e()Landroidx/fragment/app/E$e$c;
HSPLandroidx/fragment/app/E$e;->f()Landroidx/fragment/app/Fragment;
HSPLandroidx/fragment/app/E$e;->g()Landroidx/fragment/app/E$e$b;
HSPLandroidx/fragment/app/E$e;->h()Z
HSPLandroidx/fragment/app/E$e;->k(Landroidx/fragment/app/E$e$c;Landroidx/fragment/app/E$e$b;)V
HSPLandroidx/fragment/app/E;-><init>(Landroid/view/ViewGroup;)V
HSPLandroidx/fragment/app/E;->a(Landroidx/fragment/app/E$e$c;Landroidx/fragment/app/E$e$b;Landroidx/fragment/app/w;)V
HSPLandroidx/fragment/app/E;->b(Landroidx/fragment/app/E$e$c;Landroidx/fragment/app/w;)V
PLandroidx/fragment/app/E;->d(Landroidx/fragment/app/w;)V
HSPLandroidx/fragment/app/E;->g()V
HSPLandroidx/fragment/app/E;->h(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/E$e;
HSPLandroidx/fragment/app/E;->i(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/E$e;
HSPLandroidx/fragment/app/E;->j()V
HSPLandroidx/fragment/app/E;->l(Landroidx/fragment/app/w;)Landroidx/fragment/app/E$e$b;
HSPLandroidx/fragment/app/E;->n(Landroid/view/ViewGroup;Landroidx/fragment/app/q;)Landroidx/fragment/app/E;
HSPLandroidx/fragment/app/E;->o(Landroid/view/ViewGroup;Landroidx/fragment/app/F;)Landroidx/fragment/app/E;
HSPLandroidx/fragment/app/E;->p()V
HSPLandroidx/fragment/app/E;->q()V
HSPLandroidx/fragment/app/E;->r(Z)V
LF/c$a;
HSPLF/c$a;->a()[LF/c$a;
HSPLF/c$a;-><clinit>()V
HSPLF/c$a;-><init>(Ljava/lang/String;I)V
LF/c$c$a;
HSPLF/c$c$a;-><init>()V
HSPLF/c$c$a;-><init>(Lt0/d;)V
LF/c$c;
HSPLF/c$c;-><clinit>()V
HSPLF/c$c;-><init>(Ljava/util/Set;LF/c$b;Ljava/util/Map;)V
HSPLF/c$c;->a()Ljava/util/Set;
LF/c;
HSPLF/c;-><clinit>()V
HSPLF/c;-><init>()V
HSPLF/c;->b(Landroidx/fragment/app/Fragment;)LF/c$c;
HSPLF/c;->e(LF/d;)V
LF/d;
HSPLF/d;-><init>(Landroidx/fragment/app/Fragment;Ljava/lang/String;)V
Landroidx/lifecycle/d;
HSPLandroidx/lifecycle/d;-><init>()V
HSPLandroidx/lifecycle/d;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
PLandroidx/lifecycle/d;->onActivityDestroyed(Landroid/app/Activity;)V
PLandroidx/lifecycle/d;->onActivityPaused(Landroid/app/Activity;)V
HSPLandroidx/lifecycle/d;->onActivityResumed(Landroid/app/Activity;)V
HSPLandroidx/lifecycle/d;->onActivityStarted(Landroid/app/Activity;)V
PLandroidx/lifecycle/d;->onActivityStopped(Landroid/app/Activity;)V
Landroidx/lifecycle/i$a;
HSPLandroidx/lifecycle/i$a;-><init>()V
HSPLandroidx/lifecycle/i$a;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
Landroidx/lifecycle/i;
HSPLandroidx/lifecycle/i;-><clinit>()V
HSPLandroidx/lifecycle/i;->a(Landroid/content/Context;)V
Landroidx/lifecycle/m$b;
HSPLandroidx/lifecycle/m$b;-><init>(Landroidx/lifecycle/k;Landroidx/lifecycle/g$b;)V
HSPLandroidx/lifecycle/m$b;->a(Landroidx/lifecycle/l;Landroidx/lifecycle/g$a;)V
Landroidx/lifecycle/m;
Landroidx/lifecycle/g;
HSPLandroidx/lifecycle/m;-><init>(Landroidx/lifecycle/l;)V
HSPLandroidx/lifecycle/m;-><init>(Landroidx/lifecycle/l;Z)V
HSPLandroidx/lifecycle/m;->a(Landroidx/lifecycle/k;)V
HPLandroidx/lifecycle/m;->d(Landroidx/lifecycle/l;)V
HSPLandroidx/lifecycle/m;->e(Landroidx/lifecycle/k;)Landroidx/lifecycle/g$b;
HSPLandroidx/lifecycle/m;->f(Ljava/lang/String;)V
HSPLandroidx/lifecycle/m;->g(Landroidx/lifecycle/l;)V
HSPLandroidx/lifecycle/m;->b()Landroidx/lifecycle/g$b;
HSPLandroidx/lifecycle/m;->h(Landroidx/lifecycle/g$a;)V
HSPLandroidx/lifecycle/m;->i()Z
HSPLandroidx/lifecycle/m;->j(Landroidx/lifecycle/g$b;)V
HSPLandroidx/lifecycle/m;->k()V
HSPLandroidx/lifecycle/m;->l(Landroidx/lifecycle/g$b;)V
HSPLandroidx/lifecycle/m;->c(Landroidx/lifecycle/k;)V
HSPLandroidx/lifecycle/m;->m()V
Landroidx/lifecycle/LiveData$a;
HSPLandroidx/lifecycle/LiveData$a;-><init>(Landroidx/lifecycle/LiveData;)V
HSPLandroidx/lifecycle/LiveData$a;->run()V
Landroidx/lifecycle/LiveData$LifecycleBoundObserver;
Landroidx/lifecycle/LiveData$b;
PLandroidx/lifecycle/LiveData$LifecycleBoundObserver;->i()V
HSPLandroidx/lifecycle/LiveData$LifecycleBoundObserver;->h(Landroidx/lifecycle/l;Landroidx/lifecycle/g$a;)V
HSPLandroidx/lifecycle/LiveData$LifecycleBoundObserver;->j()Z
HSPLandroidx/lifecycle/LiveData$b;->d(Z)V
HSPLandroidx/lifecycle/LiveData$b;->i()V
Landroidx/lifecycle/LiveData;
HSPLandroidx/lifecycle/LiveData;-><clinit>()V
HSPLandroidx/lifecycle/LiveData;-><init>()V
HSPLandroidx/lifecycle/LiveData;->a(Ljava/lang/String;)V
HSPLandroidx/lifecycle/LiveData;->b(I)V
HSPLandroidx/lifecycle/LiveData;->c(Landroidx/lifecycle/LiveData$b;)V
HSPLandroidx/lifecycle/LiveData;->d(Landroidx/lifecycle/LiveData$b;)V
HSPLandroidx/lifecycle/LiveData;->e()V
HSPLandroidx/lifecycle/LiveData;->f()V
HSPLandroidx/lifecycle/LiveData;->g(Landroidx/lifecycle/q;)V
HSPLandroidx/lifecycle/LiveData;->h(Ljava/lang/Object;)V
Landroidx/lifecycle/p;
HSPLandroidx/lifecycle/p;-><init>()V
HSPLandroidx/lifecycle/p;->h(Ljava/lang/Object;)V
Landroidx/lifecycle/ProcessLifecycleInitializer;
LJ/a;
HSPLandroidx/lifecycle/ProcessLifecycleInitializer;-><init>()V
HSPLandroidx/lifecycle/ProcessLifecycleInitializer;->c(Landroid/content/Context;)Landroidx/lifecycle/l;
HSPLandroidx/lifecycle/ProcessLifecycleInitializer;->b(Landroid/content/Context;)Ljava/lang/Object;
HSPLandroidx/lifecycle/ProcessLifecycleInitializer;->a()Ljava/util/List;
Landroidx/lifecycle/t;
HSPLandroidx/lifecycle/t;-><clinit>()V
HSPLandroidx/lifecycle/t;-><init>()V
HSPLandroidx/lifecycle/t;->g()Landroidx/lifecycle/g;
Landroidx/lifecycle/u$c;
HSPLandroidx/lifecycle/u$c;-><init>()V
HSPLandroidx/lifecycle/u$c;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
PLandroidx/lifecycle/u$c;->onActivityDestroyed(Landroid/app/Activity;)V
PLandroidx/lifecycle/u$c;->onActivityPaused(Landroid/app/Activity;)V
HSPLandroidx/lifecycle/u$c;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
HSPLandroidx/lifecycle/u$c;->onActivityPostResumed(Landroid/app/Activity;)V
HSPLandroidx/lifecycle/u$c;->onActivityPostStarted(Landroid/app/Activity;)V
PLandroidx/lifecycle/u$c;->onActivityPreDestroyed(Landroid/app/Activity;)V
PLandroidx/lifecycle/u$c;->onActivityPrePaused(Landroid/app/Activity;)V
PLandroidx/lifecycle/u$c;->onActivityPreStopped(Landroid/app/Activity;)V
HSPLandroidx/lifecycle/u$c;->onActivityResumed(Landroid/app/Activity;)V
HSPLandroidx/lifecycle/u$c;->onActivityStarted(Landroid/app/Activity;)V
PLandroidx/lifecycle/u$c;->onActivityStopped(Landroid/app/Activity;)V
HSPLandroidx/lifecycle/u$c;->registerIn(Landroid/app/Activity;)V
Landroidx/lifecycle/u;
HSPLandroidx/lifecycle/u;-><init>()V
HSPLandroidx/lifecycle/u;->a(Landroidx/lifecycle/g$a;)V
HSPLandroidx/lifecycle/u;->b(Landroidx/lifecycle/u$a;)V
HSPLandroidx/lifecycle/u;->c(Landroidx/lifecycle/u$a;)V
HSPLandroidx/lifecycle/u;->d(Landroidx/lifecycle/u$a;)V
HSPLandroidx/lifecycle/u;->onActivityCreated(Landroid/os/Bundle;)V
PLandroidx/lifecycle/u;->onDestroy()V
PLandroidx/lifecycle/u;->onPause()V
HSPLandroidx/lifecycle/u;->onResume()V
HSPLandroidx/lifecycle/u;->onStart()V
PLandroidx/lifecycle/u;->onStop()V
HSPLandroidx/lifecycle/z;-><init>()V
PLandroidx/lifecycle/z;->a()V
PLandroidx/lifecycle/z;->d()V
Landroidx/lifecycle/A;
HSPLandroidx/lifecycle/A;-><init>(Landroidx/lifecycle/D;Landroidx/lifecycle/A$b;)V
HSPLandroidx/lifecycle/A;->a(Ljava/lang/Class;)Landroidx/lifecycle/z;
HSPLandroidx/lifecycle/A;->b(Ljava/lang/String;Ljava/lang/Class;)Landroidx/lifecycle/z;
Landroidx/lifecycle/D;
HSPLandroidx/lifecycle/D;-><init>()V
PLandroidx/lifecycle/D;->a()V
HSPLandroidx/lifecycle/D;->b(Ljava/lang/String;)Landroidx/lifecycle/z;
HSPLandroidx/lifecycle/D;->d(Ljava/lang/String;Landroidx/lifecycle/z;)V
Landroidx/lifecycle/F;
HSPLandroidx/lifecycle/F;->a(Landroid/view/View;Landroidx/lifecycle/l;)V
Landroidx/lifecycle/G;
HSPLandroidx/lifecycle/G;->a(Landroid/view/View;Landroidx/lifecycle/E;)V
Landroidx/startup/a;
HSPLandroidx/startup/a;-><clinit>()V
HSPLandroidx/startup/a;-><init>(Landroid/content/Context;)V
HSPLandroidx/startup/a;->a()V
HSPLandroidx/startup/a;->b(Landroid/os/Bundle;)V
HSPLandroidx/startup/a;->c(Ljava/lang/Class;)Ljava/lang/Object;
HSPLandroidx/startup/a;->d(Ljava/lang/Class;Ljava/util/Set;)Ljava/lang/Object;
HSPLandroidx/startup/a;->e(Landroid/content/Context;)Landroidx/startup/a;
HSPLandroidx/startup/a;->f(Ljava/lang/Class;)Ljava/lang/Object;
HSPLandroidx/startup/a;->g(Ljava/lang/Class;)Z
Landroidx/appcompat/widget/N;
HSPLandroidx/appcompat/widget/N;-><init>(Landroidx/appcompat/widget/Toolbar;)V
HSPLandroidx/appcompat/widget/N;->run()V
Landroidx/fragment/app/m;
Lw/a;
HSPLandroidx/fragment/app/m;-><init>(Landroidx/fragment/app/q;)V
Landroidx/fragment/app/n;
HSPLandroidx/fragment/app/n;-><init>(Landroidx/fragment/app/q;)V
Landroidx/fragment/app/o;
HSPLandroidx/fragment/app/o;-><init>(Landroidx/fragment/app/q;)V
Landroidx/fragment/app/p;
HSPLandroidx/fragment/app/p;-><init>(Landroidx/fragment/app/q;)V
Landroidx/lifecycle/s;
HSPLandroidx/lifecycle/s;-><init>(Landroidx/lifecycle/t;)V
Lh/c;
HSPLh/c;->a(Ljava/lang/Object;)V
@@ -0,0 +1,10 @@
{
"version": 3,
"artifactType": {
"type": "COMPATIBLE_SCREEN_MANIFEST",
"kind": "Directory"
},
"applicationId": "io.truckwash.twa",
"variantName": "release",
"elements": []
}
@@ -0,0 +1,89 @@
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
#
# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with
# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and
# will be ignored by new version of the Android plugin for Gradle.
# Optimizations: If you don't want to optimize, use the proguard-android.txt configuration file
# instead of this one, which turns off the optimization flags.
-allowaccessmodification
# Preserve some attributes that may be required for reflection.
-keepattributes AnnotationDefault,
EnclosingMethod,
InnerClasses,
RuntimeVisibleAnnotations,
RuntimeVisibleParameterAnnotations,
RuntimeVisibleTypeAnnotations,
Signature
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.google.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.google.android.vending.licensing.ILicensingService
# For native methods, see https://www.guardsquare.com/manual/configuration/examples#native
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
# Keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see https://www.guardsquare.com/manual/configuration/examples#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
# Preserve annotated Javascript interface methods.
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# The support libraries contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontnote android.support.**
-dontnote androidx.**
-dontwarn android.support.**
-dontwarn androidx.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
# These classes are duplicated between android.jar and org.apache.http.legacy.jar.
-dontnote org.apache.http.**
-dontnote android.net.http.**
# These classes are duplicated between android.jar and core-lambda-stubs.jar.
-dontnote java.lang.invoke.**
@@ -0,0 +1,95 @@
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
#
# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with
# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and
# will be ignored by new version of the Android plugin for Gradle.
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize steps (and performs some
# of these optimizations on its own).
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
-dontoptimize
# Preserve some attributes that may be required for reflection.
-keepattributes AnnotationDefault,
EnclosingMethod,
InnerClasses,
RuntimeVisibleAnnotations,
RuntimeVisibleParameterAnnotations,
RuntimeVisibleTypeAnnotations,
Signature
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.google.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.google.android.vending.licensing.ILicensingService
# For native methods, see https://www.guardsquare.com/manual/configuration/examples#native
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
# Keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see https://www.guardsquare.com/manual/configuration/examples#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
# Preserve annotated Javascript interface methods.
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# The support libraries contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontnote android.support.**
-dontnote androidx.**
-dontwarn android.support.**
-dontwarn androidx.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
# These classes are duplicated between android.jar and org.apache.http.legacy.jar.
-dontnote org.apache.http.**
-dontnote android.net.http.**
# These classes are duplicated between android.jar and core-lambda-stubs.jar.
-dontnote java.lang.invoke.**
@@ -0,0 +1,89 @@
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
#
# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with
# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and
# will be ignored by new version of the Android plugin for Gradle.
# Optimizations can be turned on and off in the 'postProcessing' DSL block.
# The configuration below is applied if optimizations are enabled.
-allowaccessmodification
# Preserve some attributes that may be required for reflection.
-keepattributes AnnotationDefault,
EnclosingMethod,
InnerClasses,
RuntimeVisibleAnnotations,
RuntimeVisibleParameterAnnotations,
RuntimeVisibleTypeAnnotations,
Signature
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.google.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.google.android.vending.licensing.ILicensingService
# For native methods, see https://www.guardsquare.com/manual/configuration/examples#native
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
# Keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see https://www.guardsquare.com/manual/configuration/examples#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
# Preserve annotated Javascript interface methods.
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# The support libraries contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontnote android.support.**
-dontnote androidx.**
-dontwarn android.support.**
-dontwarn androidx.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
# These classes are duplicated between android.jar and org.apache.http.legacy.jar.
-dontnote org.apache.http.**
-dontnote android.net.http.**
# These classes are duplicated between android.jar and core-lambda-stubs.jar.
-dontnote java.lang.invoke.**
@@ -0,0 +1,5 @@
31=0/.dm
2147483647=0/.dm
28=1/.dm
29=1/.dm
30=1/.dm
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\2jepp\WebstormProjects\pleno-vue\app\src\main\assets"/></dataSet><dataSet config="release" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\2jepp\WebstormProjects\pleno-vue\app\src\release\assets"/></dataSet><dataSet config="generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\2jepp\WebstormProjects\pleno-vue\app\build\intermediates\shader_assets\release\compileReleaseShaders\out"/></dataSet></merger>
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\2jepp\WebstormProjects\pleno-vue\app\src\main\jniLibs"/></dataSet><dataSet config="release" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\2jepp\WebstormProjects\pleno-vue\app\src\release\jniLibs"/></dataSet></merger>
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\2jepp\WebstormProjects\pleno-vue\app\src\main\shaders"/></dataSet><dataSet config="release" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="C:\Users\2jepp\WebstormProjects\pleno-vue\app\src\release\shaders"/></dataSet></merger>
@@ -0,0 +1,4 @@
#Thu Jan 22 13:48:32 CET 2026
base.0=C\:\\Users\\2jepp\\WebstormProjects\\pleno-vue\\app\\build\\intermediates\\dex\\release\\minifyReleaseWithR8\\classes.dex
renamed.0=classes.dex
path.0=classes.dex

Some files were not shown because too many files have changed in this diff Show More