Cruise Offer Management - UI Requirements Specification
1. Introduction
1.1 Purpose
This document defines the user interface requirements for the Cruise Offer Management module. It specifies the layout, components, interactions, and visual design for the three dedicated cruise management pages.
1.2 Scope
This specification covers the cruise management administration interface accessible to internal users across three pages: Dashboard, Itinerary Management, and Agent Booking. It does not cover the public-facing booking interface (which will be specified separately).
1.3 References
1.4 Design Language
The UI follows the established TQPro design language:
- CSS Framework: Bootstrap 5.3.0
- Icons: Bootstrap Icons + FontAwesome 6
- Color Scheme: Primary (#362c5d), Secondary (#FFC166), semantic colors for status, company-specific colors
- Typography: Inter/Noto Sans font family, Montserrat for body
- Components: Accordions, card grids, pill buttons, modals, status badges, tables, breadcrumbs
- JS Libraries: jQuery 3.7.1, ES6 Modules, Notify.js
2. Page Structure
2.1 Three-Page Architecture
The cruise management module is split across three dedicated pages, each with a focused responsibility. All three pages are accessible from the main navigation menu under "Cruises".
| Page |
URL |
Purpose |
| Dashboard |
cruise-dash.html |
High-level overview, company/ship management, itinerary grid |
| Itinerary Management |
cruise-itin.html?itineraryId=N |
Single itinerary editing, template, pricing, sailing management |
| Agent Booking |
cruise-agt-book.html?cruiseId=N or ?bookingId=N |
Booking creation and management for agents |
2.2 Navigation Flow
Main Nav Menu
└── Cruises → cruise-dash.html (Dashboard)
│
├── "Manage" link on itinerary card
│ └── cruise-itin.html?itineraryId=N (Itinerary Page)
│ │
│ └── Booking row click
│ └── cruise-agt-book.html?bookingId=N (Agent Booking)
│
└── (future: direct link to booking page)
└── cruise-agt-book.html?cruiseId=N (Agent Booking)
2.3 Navigation Entry Point
| ID |
Requirement |
| UI-NAV-001 |
The cruise management pages shall be accessible from the main navigation menu. |
| UI-NAV-002 |
A "Cruises" menu item shall appear in the top navigation bar. |
| UI-NAV-003 |
The menu item shall use an appropriate cruise/ship icon (fa-ship). |
| UI-NAV-004 |
Each page shall display a breadcrumb bar for context navigation (e.g., Dashboard > Cruises > [Itinerary Name]). |
2.4 Shared Page Structure
| ID |
Requirement |
| UI-LAY-001 |
All pages use <body class="cruise-page" style="visibility:hidden"> for auth-gated display. |
| UI-LAY-002 |
All pages include the shared header template header_bootstrap.html. |
| UI-LAY-003 |
All pages include cruise.css for shared cruise-specific styles. |
| UI-LAY-004 |
The main content container uses container-fluid cruise-container with margin-top: 80px. |
| UI-LAY-005 |
All pages use Bootstrap 5 grid system (row, col-md-*, gx-3). |
2.5 Authentication Pattern
All pages use the same authentication pattern:
<body class="cruise-page" style="visibility:hidden">
await $site.setGlobalHandlers({ requireAuth: true });
document.body.style.visibility = 'visible';
3. Dashboard - Left Pane (Company Accordion)
3.1 Layout
The left pane occupies col-md-3 and contains a company accordion with management controls.
┌──────────────────────┐
│ <ship> Companies │
│ [+ Co] [⚙] │
├──────────────────────┤
│ [Company 1] ▼ │ ← company-colored header
│ Ship A │
│ Ship B │
│ [+ Ship] [Edit Co] │
│ [+ Itin] [Del Co] │
├──────────────────────┤
│ [Company 2] ► │
│ │
└──────────────────────┘
| ID |
Requirement |
| UI-DASH-001 |
The header shall display title "Companies" with a ship icon (fa-solid fa-ship). |
| UI-DASH-002 |
The header shall contain two action buttons: Add Company (btn btn-sm btn-primary, bi-plus-lg) and Settings (btn btn-sm btn-outline-secondary, bi-gear). |
| UI-DASH-003 |
The Settings button shall open the Settings modal for managing dimensional data (areas, ports, cabin types, charge types). |
3.3 Company Accordion Structure
| ID |
Requirement |
| UI-DASH-010 |
The accordion shall use Bootstrap's .accordion component (id="companyAccordion"). |
| UI-DASH-011 |
Each company shall be a collapsible accordion item with its name as the header text. |
| UI-DASH-012 |
Each company header shall use the company's color field as the background/accent color. |
| UI-DASH-013 |
Inside each expanded company section, the ship list shall be displayed. |
| UI-DASH-014 |
Each company section shall have action buttons: Add Ship, Edit Company, Add Itinerary, Delete Company. |
| UI-DASH-015 |
Clicking a company header shall expand/collapse its section. |
3.4 Settings Dialog (Dimension Data)
| ID |
Requirement |
| UI-DASH-020 |
The Settings modal (id="settingsModal") shall use Bootstrap tabs for different dimension data types. |
| UI-DASH-021 |
Tabs: Areas, Ports, Cabin Types, Charge Types. |
| UI-DASH-022 |
Each tab shall display a table with code, name/description, and action columns. |
| UI-DASH-023 |
Each tab shall have an Add button (btn btn-success btn-sm, bi-plus-lg) to open a sub-dialog for creating entries. |
| UI-DASH-024 |
Table action buttons shall include Edit (btn btn-sm btn-primary, bi-pencil) and Delete (btn btn-sm btn-danger, bi-trash). |
4. Dashboard - Right Pane (Itinerary Overview)
4.1 Layout
The right pane occupies col-md-9 and contains KPI summary cards, a filter bar, and an itinerary card grid.
┌──────────────────────────────────────────┐
│ KPI Cards │
│ [Areas] [Ships] [Itineraries] [Sailings]│
├──────────────────────────────────────────┤
│ Filter Bar │
│ [Area ▼] [Company ▼] [Status ▼] [+New] │
├──────────────────────────────────────────┤
│ Itinerary Cards Grid │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Itin 1 │ │ Itin 2 │ │ Itin 3 │ │
│ │ 7N Gulf │ │ 5N Med │ │ 3N Greek │ │
│ │ [Manage] │ │ [Manage] │ │ [Manage] │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└──────────────────────────────────────────┘
4.2 KPI Summary Cards
| ID |
Requirement |
| UI-DASH-030 |
The KPI strip shall display five summary cards in a CSS Grid row (grid-template-columns: repeat(5, 1fr)). |
| UI-DASH-031 |
Card 1: "Sailing Areas" (bi-globe2, primary color), showing total area count. |
| UI-DASH-032 |
Card 2: "Ships" (fa-solid fa-ship, info color), showing total ship count. |
| UI-DASH-033 |
Card 3: "Itineraries" (fa-solid fa-route, success color), showing total itinerary count. |
| UI-DASH-034 |
Card 4: "Sailings" (bi-calendar3, warning color), showing total sailing count. |
| UI-DASH-034a |
Card 5: "Bookings" (bi-person-vcard, secondary color), showing total booking count across all sailings. |
| UI-DASH-035 |
Each KPI card shall use the .kpi-card class with icon, value, and title elements. |
4.3 Filter Bar
| ID |
Requirement |
| UI-DASH-040 |
The filter bar shall display dropdown filters and an action button in a flex row. |
| UI-DASH-041 |
Filters: Area dropdown (filterArea), Company dropdown (filterCompany), Status dropdown (filterStatus). |
| UI-DASH-042 |
Status dropdown options: All Statuses, Draft, Active, Suspended, Archived. |
| UI-DASH-043 |
A "New Itinerary" button (btn btn-primary btn-sm, bi-plus-lg) shall appear at the right end. Creating a new itinerary shall redirect to cruise-itin.html?itineraryId=N after save. |
| UI-DASH-044 |
Changing any filter shall immediately refresh the itinerary card grid. |
4.4 Itinerary Card Grid
| ID |
Requirement |
| UI-DASH-050 |
Itinerary cards shall be displayed in a responsive grid, 3 per row on desktop (col-md-4). |
| UI-DASH-051 |
Each card shall show: itinerary name, code, ship name, duration (nights), port count (loaded from templates), area name, status badge, sailing count. |
| UI-DASH-052 |
Each card footer shall have four buttons: Edit (opens itinerary dialog), Copy (opens itinerary dialog pre-populated with source data, name suffixed with "(Copy)", redirects after save), Manage (navigates to cruise-itin.html?itineraryId=N), Print (opens cruise-itin.html?itineraryId=N&print=true in new tab). |
| UI-DASH-053 |
Cards shall use the .itin-card CSS class from cruise.css. |
| UI-DASH-054 |
If no itineraries match filters, show empty state: "No Itineraries Found" with water icon (bi-water). |
5. Itinerary Page - Left Pane
5.1 Layout
The itinerary page uses a two-pane, 50/50 split layout (col-md-6 each). The left pane contains the itinerary info form, template table, and pricing templates.
┌── Itinerary Information ───────┐
│ <route> Itinerary Information │
│ [Status Badge] [Save][St][X] │
│ Code: [____] Name: [________] │
│ Duration: [__] │
│ Area: [▼_____] Ship: [▼_____] │
└────────────────────────────────┘
┌── Itinerary Template ──────────┐
│ <list> Itinerary Template [+] │
│ # | Port | DayA | Arr | DayD.. │
│ 1 | Dubai | 0 | 08:00 | 0.. │
│ 2 | Doha | 1 | 06:00 | 1.. │
└────────────────────────────────┘
┌── Pricing Template ────────────┐
│ <$> Pricing Template [Init] │
│ │
│ <bed> Cabin Prices (Default) │
│ CabinType | Pax | Amt | Curr.. │
│ │
│ <receipt> Other Charges [+] │
│ Charge | Amt | Curr | Mand |.. │
└────────────────────────────────┘
| ID |
Requirement |
| UI-ITN-001 |
The itinerary info section shall display editable fields for the selected itinerary. |
| UI-ITN-002 |
Fields: Code (text, maxlength 10), Name (text, maxlength 100), Duration in nights (number, min 1, max 365). |
| UI-ITN-003 |
Dropdowns: Area (edit_itin_area, populated from dimension data), Ship (edit_itin_ship, populated from dimension data). |
| UI-ITN-004 |
A status badge (itin_status_badge) shall display the current itinerary status next to the section title. |
| UI-ITN-005 |
Action buttons in the section header: Save (btn-success, bi-check-lg), Status dropdown (btn-secondary, bi-arrow-repeat), Delete (btn-danger, bi-trash). |
| UI-ITN-006 |
The Status dropdown shall show valid status transitions (Draft, Active, Suspended, Archived). |
| UI-ITN-007 |
Delete itinerary shall show confirmation dialog and redirect to cruise-dash.html on success. |
| UI-ITN-008 |
When the page is loaded with ?print=true URL parameter, window.print() shall be auto-triggered after a 500ms delay. Existing @media print CSS hides interactive elements. |
5.3 Template Table
| ID |
Requirement |
| UI-ITN-010 |
The template section shall display the itinerary port sequence in a table. |
| UI-ITN-011 |
Table columns: # (stop sequence), Port, Day (Arr), Arrive (time), Day (Dep), Depart (time), Actions. |
| UI-ITN-012 |
An Add button (btn-success, bi-plus-lg) in the section header shall open the template entry dialog. |
| UI-ITN-013 |
Each row shall have Edit (bi-pencil) and Delete (bi-trash) action buttons. |
| UI-ITN-014 |
Template entries shall be sorted by stop sequence ascending. |
5.4 Pricing Templates
The pricing template section has two sub-sections: cabin prices and other charges.
5.4.1 Cabin Price Templates
| ID |
Requirement |
| UI-ITN-020 |
The "Cabin Prices (Default)" sub-section shall display a table of default cabin pricing. |
| UI-ITN-021 |
Table columns: Cabin Type, Pax (max passengers), Amount, Curr (currency), Actions. |
| UI-ITN-022 |
An "Init Cabins" button (fa-solid fa-wand-magic-sparkles) in the section header shall auto-create templates for all ship cabins of the itinerary's ship. |
| UI-ITN-023 |
Each row shall have an Edit action button that opens the cabin price template dialog with exchange rate auto-fill. |
5.4.2 Other Charge Templates
| ID |
Requirement |
| UI-ITN-030 |
The "Other Charges (Default)" sub-section shall display a table of default additional charges. |
| UI-ITN-031 |
Table columns: Charge (type name), Amount, Curr, Mand (mandatory flag), Ind (indicator badge), Pax (type), Actions. |
| UI-ITN-032 |
An Add button (btn-success, bi-plus-lg) shall open the charge template dialog. |
| UI-ITN-033 |
The Ind column shall display a single-letter indicator badge (.indicator-badge span) when set. |
| UI-ITN-034 |
Each row shall have Edit and Delete action buttons. |
5.5 Itinerary Page - Right Pane
5.5.1 Layout
The right pane displays sailing management: a sailing bar and detailed sections for the selected sailing.
┌── Sailing Information ─────────┐
│ <cal> Sailing Information [+] │
│ [15 Mar] [22 Mar] [29 Mar] │ ← pill-shaped buttons
└────────────────────────────────┘
┌── Sailing Details ─────────────┐
│ Cruise: 15 Mar 2026 (7 nights) │
│ [Regen Points] [Status ▼] [X] │
│ │
│ <anchor> Sailing Details │
│ # | Port | Arrival | Departure │
│ │
│ <bed> Cabin Pricing [Prebook] │
│ Cabin|Pax|Amt|Curr|Prebk|Avail │
│ │
│ <receipt> Other Charges [+] │
│ Charge|Amt|Curr|Mand|Ind|Pax │
│ │
│ <person> Bookings │
│ Customer|Cabin|#Pax|Amt|Status │
└────────────────────────────────┘
5.5.2 Sailing Bar
| ID |
Requirement |
| UI-SAL-001 |
The sailing bar shall display pill-shaped buttons for each sailing of the itinerary. |
| UI-SAL-002 |
Each pill shall show the start date formatted as "DD MMM" (e.g., "15 Mar"). |
| UI-SAL-003 |
Pills shall be ordered by start date ascending. |
| UI-SAL-004 |
The selected sailing pill shall have a visual highlight (primary color background). |
| UI-SAL-005 |
An "Add New" button (btn-success, bi-plus-lg) shall appear in the section header to create a new sailing. |
| UI-SAL-006 |
If no sailings exist, show message: "No sailings. Click Add New to create one." |
| ID |
Requirement |
| UI-SAL-010 |
When a sailing is selected, an action toolbar shall appear below the sailing bar. |
| UI-SAL-011 |
The toolbar shall show sailing date and duration text. |
| UI-SAL-012 |
Actions: Regen Points (btn-info, fa-solid fa-rotate), Status dropdown (btn-secondary, bi-arrow-repeat), Delete (btn-warning, bi-trash). |
| UI-SAL-013 |
Regen Points shall show a confirmation dialog before regenerating cruise points from the template. |
5.5.4 Cruise Points Table
| ID |
Requirement |
| UI-SAL-020 |
The cruise points section shall display the sailing route in a table. |
| UI-SAL-021 |
Table columns: # (sequence), Port, Arrival (date/time), Departure (date/time), Actions. |
| UI-SAL-022 |
Each row shall have an Edit action button that opens the cruise point edit dialog. |
| UI-SAL-023 |
If no cruise points exist, show message prompting to generate from template. |
5.5.5 Cabin Charges Table
| ID |
Requirement |
| UI-SAL-030 |
The cabin pricing section shall display cabin charges for the selected sailing. |
| UI-SAL-031 |
Table columns: Cabin (type name), Pax (max passengers), Amount, Curr, Prebk (pre-booking count), Avail (available pre-bookings), Actions. |
| UI-SAL-032 |
The Prebk column shall show the count of pre-bookings for this cabin type and sailing. |
| UI-SAL-033 |
The Avail column shall show pre-bookings minus booked/reserved (minimum 0). |
| UI-SAL-034 |
A "Prebook" button (btn-primary, fa-solid fa-bookmark) in the section header shall open the pre-booking management dialog. |
| UI-SAL-035 |
Each row shall have an Edit action button that opens the cabin charge edit dialog. |
5.5.6 Other Charges Table
| ID |
Requirement |
| UI-SAL-040 |
The other charges section shall display additional charges for the selected sailing. |
| UI-SAL-041 |
Table columns: Charge (type name), Amt, Curr, Mand (mandatory), Ind (indicator badge), Pax (type), Actions. |
| UI-SAL-042 |
An Add button shall open the other charge dialog. |
| UI-SAL-043 |
The Ind column shall display the single-letter indicator badge when set. |
| UI-SAL-044 |
Each row shall have Edit and Delete action buttons. |
5.5.7 Bookings Table
| ID |
Requirement |
| UI-SAL-050 |
The bookings section shall display current bookings for the selected sailing. |
| UI-SAL-051 |
Table columns: Customer (lead passenger name), Cabin / Add-ons (badges), #Pax, Amount, Status. |
| UI-SAL-052 |
Add-on badges shall be small indicator circles, deduplicated from the booking's add-ons. |
| UI-SAL-053 |
Rows shall be clickable, navigating to cruise-agt-book.html?bookingId=N. |
| UI-SAL-054 |
Status column shall use the statusBadge() helper for consistent badge rendering. |
5.6 Agent Booking Page - Sailing Strip
5.6.1 Layout
The sailing strip spans the full page width and provides scrollable navigation across all available sailings.
┌─────────────────────────────────────────────────────────┐
│ <ship> Available Sailings │
│ ◄ [15 Mar MED7] [22 Mar MED7] [29 Mar GRK5] [5 Apr] ► │
└─────────────────────────────────────────────────────────┘
5.6.2 Sailing Strip Requirements
| ID |
Requirement |
| UI-AGT-001 |
The sailing strip shall display pill-shaped buttons for all available sailings across itineraries. |
| UI-AGT-002 |
Each pill shall show the start date and itinerary code (e.g., "15 Mar MED7"). |
| UI-AGT-003 |
Pill borders shall use the company's color field for visual identification. |
| UI-AGT-004 |
The strip shall be horizontally scrollable with left/right scroll buttons (bi-chevron-left, bi-chevron-right). |
| UI-AGT-005 |
The strip container uses .sailing-strip-container with .sailing-strip inner div. |
| UI-AGT-006 |
Clicking a pill shall select that sailing and load its data (cabin availability, bookings). |
| UI-AGT-007 |
The selected pill shall have visual highlight (filled background). |
5.7 Agent Booking Page - Left Pane
5.7.1 Layout
The left pane occupies col-md-6 (class booking-pane-left) and shows cabin availability and bookings for the selected sailing. Both left and right panes scroll independently with max-height: calc(100vh - 160px); overflow-y: auto; (disabled in @media print).
┌── Cabin Availability ─────────┐
│ <bed> Cabin Availability [Pbk] │
│ Type | Prebkd | Avail | Price │
│ Suite| 2 | 1 | $500 │
│ Ocean| 0 | 0 | $300 │
└────────────────────────────────┘
┌── Bookings ───────────────────┐
│ <person> Bookings [+] │
│ ID | Cabins | Pax | Amt | St │
│ PT-2302-AB.. | 2 | 4 | $800.. │
│ PT-2302-CD.. | 1 | 2 | $300.. │
└────────────────────────────────┘
5.7.2 Cabin Availability Table
| ID |
Requirement |
| UI-AGT-010 |
The cabin availability section shall display available cabin types for the selected sailing. |
| UI-AGT-011 |
Table columns: Type (cabin type name), Prebkd (pre-booked count, --- if no prebooks), Avail (available count, --- if no prebooks), Price (charge amount), Actions. |
| UI-AGT-012 |
The Prebkd column shall show the count of pre-bookings for each cabin type. |
| UI-AGT-013 |
The Avail column shall show pre-bookings minus booked/reserved (minimum 0). |
| UI-AGT-014 |
A "Prebook" button (btn-primary, fa-solid fa-bookmark) shall open the quick prebook management dialog. |
5.7.3 Bookings List
| ID |
Requirement |
| UI-AGT-020 |
The bookings section shall display all bookings for the selected sailing. |
| UI-AGT-021 |
Table columns: ID (booking number, truncated), Customer (lead passenger name), Pax (total), Cabins (count), Amount, Status (badge). |
| UI-AGT-022 |
A "New" button (btn-success, bi-plus-lg) shall open the new booking dialog. |
| UI-AGT-023 |
Clicking a booking row shall select it and display its details in the right pane. |
| UI-AGT-024 |
The selected booking row shall have visual highlight. |
5.8 Agent Booking Page - Right Pane
5.8.1 Layout
The right pane occupies col-md-6 (class booking-pane-right) and shows full booking details when a booking is selected. When no booking is selected, an empty state is shown. Scrolls independently from the left pane.
┌── Booking Header ─────────────┐
│ <ticket> PT-2302-AB12CD34 │
│ [Status Badge] │
│ [Status ▼] [Delete] │
└────────────────────────────────┘
┌── Passengers ─────────────────┐
│ <users> Passengers [+] │
│ Name | Nationality | Age | .. │
│ J. Smith | US [visa] | Adult │
│ M. Smith | US [visa] | Child │
└────────────────────────────────┘
┌── Cabins Booked ──────────────┐
│ <bed> Cabins Booked [+] │
│ Cabin | Pax | Own | Amt | St │
│ Suite | 4 | [Own]| $500 |.. │
│ Total: $500 │
└────────────────────────────────┘
┌── Add-ons ────────────────────┐
│ <receipt> Add-ons [+] │
│ Add-On | Passenger | Amt | .. │
│ Port Tax | J. Smith | $25 |.. │
│ Total: $75 │
└────────────────────────────────┘
| ID |
Requirement |
| UI-AGT-030 |
The booking header shall display the booking number (format: PT-DDMM-XXXXXXXX). |
| UI-AGT-031 |
A status badge shall display the current booking status. |
| UI-AGT-032 |
Actions: Status dropdown (btn-secondary, bi-arrow-repeat) with valid transitions, Delete (btn-danger, bi-trash), New (btn-success, bi-plus-lg) to create a new booking. |
| UI-AGT-033 |
When no booking is selected, show empty state: "No Booking Selected" with ticket icon. |
5.8.3 Passengers Table
| ID |
Requirement |
| UI-AGT-040 |
The passengers table shall display all passengers of the selected booking. The section header shall show a passenger count in "X of Y" format (current count of expected total). |
| UI-AGT-041 |
Table columns: Name (first + last, lead passenger marked), Nationality (ISO code), Age (category badge), Remark, Actions. |
| UI-AGT-041a |
A capacity warning alert (alert-danger, hidden by default) shall appear below the passengers table when total passengers exceed the sum of maxPax across all booked cabins. |
| UI-AGT-042 |
Age column shall display a computed age category badge: Adult (>=12), Child (2-11), Infant (<2), based on date of birth relative to sailing start date. |
| UI-AGT-043 |
Visa information shall be displayed per passenger based on destination ports (via visa API). |
| UI-AGT-044 |
An Add button (btn-success, bi-plus-lg) shall open the passenger dialog. |
| UI-AGT-045 |
Each row shall have Edit (bi-pencil) and Delete (bi-trash) action buttons. |
5.8.4 Booked Cabins Table
| ID |
Requirement |
| UI-AGT-050 |
The booked cabins table shall display cabins assigned to the booking. |
| UI-AGT-051 |
Table columns: Cabin (type name), Pax (number of passengers), Own (own/prebook badge), Amount (price), Status, Actions. |
| UI-AGT-052 |
The Own column shall display a badge indicating whether the cabin is from the company's own pre-booked inventory (isOwn=true) or external. |
| UI-AGT-053 |
A table footer (<tfoot>) shall display the cabin total amount. |
| UI-AGT-054 |
An Add button (btn-success, bi-plus-lg) shall open the add cabin dialog. |
| UI-AGT-055 |
Each row shall have a Delete action button. |
| UI-AGT-056 |
When adding a cabin, numPax shall be validated against the cabin type's maxPax. The NumPax input field shall have a dynamic max attribute set from the selected cabin type. Both client-side and server-side (error CRU0207) validation shall prevent exceeding cabin capacity. |
5.8.5 Add-ons Table
| ID |
Requirement |
| UI-AGT-060 |
The add-ons table shall display optional charges attached to the booking. |
| UI-AGT-061 |
Table columns: Add-On (charge type name), Passenger (assigned passenger name or "All"), Amount, Actions. |
| UI-AGT-062 |
A table footer (<tfoot>) shall display the add-on total amount. |
| UI-AGT-063 |
An Add button (btn-success, bi-plus-lg) shall open the add add-on dialog. |
| UI-AGT-064 |
Each row shall have a Delete action button. |
| UI-AGT-065 |
Booking total amount shall be automatically recalculated from cabin prices plus add-on amounts whenever cabins or add-ons change. |
| UI-AGT-066 |
When adding an add-on, the passenger dropdown shall be filtered by the charge type's paxType attribute: "adult" excludes passengers with age < 12, "child" excludes passengers with age >= 12, "per_cabin" disables the passenger dropdown, "all" shows all passengers. |
6. Dialogs
6.1 Dialog Design Standards
| ID |
Requirement |
| UI-DLG-001 |
All dialogs shall use Bootstrap 5's Modal component with data-bs-backdrop="static" and data-bs-keyboard="false". |
| UI-DLG-002 |
Dialogs shall have consistent structure: .modal-header (icon + title + close button), .modal-body (form fields), .modal-footer (Cancel + Save/Confirm). |
| UI-DLG-003 |
Dialog headers shall include a FontAwesome icon and descriptive title. |
| UI-DLG-004 |
Dialog footers shall have Cancel (btn btn-secondary, data-bs-dismiss="modal") and Save (btn btn-success, bi-check-lg). |
| UI-DLG-005 |
Destructive actions (delete) shall use danger-colored confirm buttons with bi-trash icon. |
| UI-DLG-006 |
Footer left side shall display "* Required" hint text (small text-muted me-auto). |
| UI-DLG-007 |
Form validation errors shall display inline below the relevant field. |
Dialog Footer Pattern:
<div class="modal-footer">
<small class="text-muted me-auto">* Required</small>
<button class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button class="btn btn-success" id="entity_save"><i class="bi bi-check-lg"></i> Save</button>
</div>
6.2 Dashboard Dialogs
6.2.1 Company Dialog (company_dlg)
| ID |
Requirement |
| UI-DLG-010 |
Company dialog shall allow creating/editing a cruise company. |
| UI-DLG-011 |
Fields: Code (required, max 10 chars), Name (required, max 50 chars), Logo URL (optional), Color (color picker, default #362c5d). |
| UI-DLG-012 |
Title shall change based on mode: "New Company" or "Edit Company". |
6.2.2 Ship Dialog (ship_dlg)
| ID |
Requirement |
| UI-DLG-020 |
Ship dialog shall allow creating/editing a cruise ship. |
| UI-DLG-021 |
Fields: Code (required, max 10 chars), Name (required, max 50 chars), Description (textarea), Document URL. |
| UI-DLG-022 |
Cabin Assignment sub-section: display all cabin types as checkboxes with Max Passengers input for each checked type. |
| UI-DLG-023 |
On save, system shall create/update/delete ship cabin assignments via bulkAssignCabins(). |
6.2.3 Itinerary Dialog (itinerary_dlg)
| ID |
Requirement |
| UI-DLG-030 |
Itinerary dialog shall allow creating a new itinerary from the dashboard. |
| UI-DLG-031 |
Fields: Code (max 10), Name (max 100), Duration in nights, Ship dropdown (filtered by selected company), Area dropdown, Image URL. |
6.2.4 Settings Sub-Dialogs
| ID |
Requirement |
| UI-DLG-040 |
Area dialog (area_dlg): Code (max 10), Name (max 50). Icon: fa-solid fa-globe. |
| UI-DLG-041 |
Port dialog (port_dlg): Code (max 10), Name (max 50), Country (max 50). Icon: fa-solid fa-anchor. |
| UI-DLG-042 |
Cabin Type dialog (cabintype_dlg): Code (max 10), Name (max 50), Description (textarea). Icon: fa-solid fa-bed. |
| UI-DLG-043 |
Charge Type dialog (chargetype_dlg): Code (max 10), Name (max 50), Description (textarea). Icon: fa-solid fa-dollar-sign. |
6.3 Itinerary Page Dialogs
6.3.1 Template Entry Dialog (template_dlg)
| ID |
Requirement |
| UI-DLG-050 |
Template entry dialog shall allow creating/editing itinerary template entries. |
| UI-DLG-051 |
Fields: Stop Sequence (number, 1-99), Port (dropdown), Day Offset Arrival (number, 0-365), Arrival Time (time picker), Day Offset Departure, Departure Time, Description (textarea). |
6.3.2 Cabin Price Template Dialog (cabintemplate_dlg)
| ID |
Requirement |
| UI-DLG-055 |
Cabin price template dialog shall allow editing default cabin pricing. |
| UI-DLG-056 |
Read-only fields: Cabin Type name, Max Passengers (displayed but not editable). |
| UI-DLG-057 |
Editable fields: Amount (number, step 0.01), Currency (dropdown, cruise-currency-select), Exchange Rate (number, step 0.0001, auto-filled but editable). |
6.3.3 Charge Template Dialog (chargetemplate_dlg)
| ID |
Requirement |
| UI-DLG-060 |
Charge template dialog shall allow creating/editing default other charges. |
| UI-DLG-061 |
Fields: Charge Type (dropdown), Amount, Currency (auto-fill exrate), Exchange Rate, Passenger Type (All/Adults/Children/Per Cabin), Indicator (single character, max 1), Mandatory (checkbox). |
6.3.4 Sailing Dialog (sailing_dlg)
| ID |
Requirement |
| UI-DLG-070 |
Sailing dialog shall allow creating a new cruise instance. |
| UI-DLG-071 |
Fields: Start Date (date picker, required). |
| UI-DLG-072 |
Display: Itinerary name for reference. |
| UI-DLG-073 |
Checkbox: "Generate sailing points from template" (checked by default). |
6.3.5 Cruise Point Edit Dialog (cruisepoint_dlg)
| ID |
Requirement |
| UI-DLG-075 |
Cruise point dialog shall allow editing a sailing point. |
| UI-DLG-076 |
Fields: Stop # (number), Port (dropdown), Arrival Date/Time (datetime-local), Departure Date/Time (datetime-local), Description (textarea). |
6.3.6 Cabin Charge Dialog (cabincharge_dlg)
| ID |
Requirement |
| UI-DLG-080 |
Cabin charge dialog shall allow editing sailing-specific cabin pricing. |
| UI-DLG-081 |
Read-only fields: Cabin Type name, Max Passengers. |
| UI-DLG-082 |
Editable fields: Amount, Currency (auto-fill exrate), Exchange Rate, Available (checkbox). |
6.3.7 Other Charge Dialog (othercharge_dlg)
| ID |
Requirement |
| UI-DLG-085 |
Other charge dialog shall allow creating/editing sailing-specific charges. |
| UI-DLG-086 |
Fields: Charge Type (dropdown), Amount, Currency (auto-fill exrate), Exchange Rate, Passenger Type, Indicator (single char), Mandatory (checkbox). |
6.3.8 Pre-Booking Dialog (prebook_dlg)
| ID |
Requirement |
| UI-DLG-090 |
Pre-booking dialog shall allow managing cabin pre-bookings for the selected sailing. |
| UI-DLG-091 |
Fields: Cabin Type (dropdown from ship cabins), Total Cabins (target count), Cost per Cabin, Price per Cabin, Commission %, "Apply price to all" checkbox. |
| UI-DLG-092 |
On cabin type selection: display info panel (.prebook-info) showing current count and booked/reserved count. |
| UI-DLG-093 |
Validation: target count cannot be reduced below the number of non-Available (Reserved + Booked) pre-bookings. |
| UI-DLG-094 |
Uses CruiseAPI.managePrebookings() for smart add/reduce logic. |
6.4 Agent Booking Page Dialogs
6.4.1 New Booking Dialog (newbooking_dlg)
| ID |
Requirement |
| UI-DLG-100 |
New booking dialog shall allow creating a new booking for the selected sailing. |
| UI-DLG-101 |
Pax count fields: Adults (number, min 1, default 2), Children (number, min 0), Infants (number, min 0). Total auto-calculated. |
| UI-DLG-102 |
Cabin fields: Cabin Type (dropdown from available cabin charges), Cabins (count), Pax/Cabin. |
| UI-DLG-103 |
Lead passenger section: First Name, Last Name, Nationality (text input with autocomplete from restcountries.com), Date of Birth, Passport #. |
| UI-DLG-104 |
Nationality input shall have an autocomplete dropdown (.nationality-autocomplete) with a hidden field for alpha2 code. |
| UI-DLG-105 |
On save: generate booking number (PT-DDMM-XXXXXXXX), create booking with "Documents pending" status, create lead passenger, assign cabin (checking for available pre-bookings for own assignment), recalculate totals. |
| UI-DLG-106 |
Uses modal-lg size for wider layout. |
6.4.2 Passenger Dialog (passenger_dlg)
| ID |
Requirement |
| UI-DLG-110 |
Passenger dialog shall allow adding/editing passengers. |
| UI-DLG-111 |
Fields: First Name, Last Name, Nationality (autocomplete), Date of Birth, Lead Passenger (checkbox), Passport #, Passport Expiry. |
| UI-DLG-112 |
Age indicator (passenger_age_indicator): shown below DOB field, displays computed category (Adult/Child/Infant) based on sailing start date. |
| UI-DLG-113 |
Visa info area (passenger_visa_info): displays visa requirement badges per destination port when nationality is selected. |
6.4.3 Add Cabin Dialog (addcabin_dlg)
| ID |
Requirement |
| UI-DLG-120 |
Add cabin dialog shall allow adding a cabin to a booking. |
| UI-DLG-121 |
Fields: Cabin Type (dropdown), Num Passengers (number, min 1, max 10, default 2). |
| UI-DLG-122 |
Info panel (.prebook-info): shows prebook availability and own/non-own indicator when cabin type is selected. |
| UI-DLG-123 |
On save: check for Available pre-bookings, assign as own if available, otherwise assign as non-own. Price auto-filled from cabin charge. |
6.4.4 Add Add-on Dialog (addaddon_dlg)
| ID |
Requirement |
| UI-DLG-130 |
Add add-on dialog shall allow adding optional charges to a booking. |
| UI-DLG-131 |
Fields: Charge Type (dropdown from sailing's non-mandatory other charges), Passenger (dropdown, optional, "All passengers" default), Amount (pre-filled from selected charge type). |
6.4.5 Prebook Dialog (Agent Page) (prebook_dlg)
| ID |
Requirement |
| UI-DLG-135 |
Quick prebook dialog on the agent page shall function identically to the itinerary page prebook dialog (see UI-DLG-090 through UI-DLG-094). |
6.5 Confirmation Dialog (confirm_dlg)
| ID |
Requirement |
| UI-DLG-140 |
All three pages include a generic confirmation dialog. |
| UI-DLG-141 |
The dialog shall display a message and have Cancel and Delete/Confirm buttons. |
| UI-DLG-142 |
Delete confirmations shall clearly state what will be deleted. |
7. Exchange Rate Auto-Fill Behavior
7.1 Overview
When a currency dropdown (.cruise-currency-select) value changes in any pricing dialog, the exchange rate field is automatically populated.
7.2 Auto-Fill Logic
| ID |
Requirement |
| UI-EXR-001 |
If the selected currency equals the local currency (from server config), the exchange rate shall be set to 1.0. |
| UI-EXR-002 |
Otherwise, the rate shall be fetched from exchange-rate-service.js using the fetchRates() function. |
| UI-EXR-003 |
Rates are cached in localStorage with a 24-hour TTL (tqpro_exchange_rates key). |
| UI-EXR-004 |
The exchange rate field shall remain editable for manual override after auto-fill. |
| UI-EXR-005 |
Each rate field displays a hint: "Auto-filled, editable" (small text-muted). |
| UI-EXR-006 |
Currency config is loaded once via loadCurrencyConfig() and cached in memory. |
7.3 Applied Dialogs
Exchange rate auto-fill is applied to the following dialogs:
- Cabin Price Template (cabintemplate_dlg)
- Charge Template (chargetemplate_dlg)
- Cabin Charge (cabincharge_dlg)
- Other Charge (othercharge_dlg)
7.4 Currency Dropdown Population
| ID |
Requirement |
| UI-EXR-010 |
Currency dropdowns shall be populated by populateCurrencySelect() from the exchange rate service. |
| UI-EXR-011 |
Options include currency code and name (e.g., "USD - US Dollar"). |
| UI-EXR-012 |
Available currencies come from the server-side quotationCurrencies config. |
8. Status Indicators
8.1 Itinerary Status Colors
| Status |
Badge Class |
Bootstrap Color |
| Draft |
bg-secondary |
Gray |
| Active |
bg-success |
Green |
| Suspended |
bg-warning |
Yellow |
| Archived |
bg-dark |
Dark |
8.2 Sailing (Cruise) Status Colors
| Status |
Badge Class |
Bootstrap Color |
| Draft |
bg-secondary |
Gray |
| Active |
bg-success |
Green |
| Suspended |
bg-warning |
Yellow |
| Cancelled |
bg-danger |
Red |
| Completed |
bg-info |
Blue |
8.3 Booking Status Colors
| Status |
Badge Class |
Bootstrap Color |
Description |
| Documents pending |
bg-info |
Light blue |
Initial status after booking creation |
| Availability pending |
bg-primary |
Blue |
Documents received, checking availability |
| Payment pending |
bg-warning |
Yellow |
Availability confirmed, awaiting payment |
| Voucher pending |
bg-secondary |
Gray |
Payment received, generating voucher |
| Vouchered |
bg-success |
Green |
Booking complete, voucher issued |
| Cancelled-NonRefundable |
bg-danger |
Red |
Cancelled, no refund |
| Cancelled-RefundPending |
bg-dark |
Dark |
Cancelled, refund in progress |
| Cancelled-Refunded |
bg-dark |
Dark |
Cancelled, refund completed |
8.4 Status Badge Rendering
All status badges are rendered via the shared statusBadge(status) function from cruise-common.js:
const statusColors = {
'Draft': 'secondary',
'Active': 'success',
'Suspended': 'warning',
'Archived': 'dark',
'Cancelled': 'danger',
'Completed': 'info'
};
export function statusBadge(status) {
const color = statusColors[status] || 'secondary';
return `<span class="badge bg-${color}">${escapeHtml(status || '')}</span>`;
}
8.5 Indicator Badges
| ID |
Requirement |
| UI-STS-001 |
Other charge templates and charges with an indicator field shall display a single-letter badge. |
| UI-STS-002 |
The badge uses the .indicator-badge CSS class from cruise.css. |
| UI-STS-003 |
The indicator is a single character (maxlength=1) set during charge creation/editing. |
9. Empty States
9.1 Empty State Design
| ID |
Requirement |
| UI-EMP-001 |
Empty states shall have centered layout with icon, heading, and description. |
| UI-EMP-002 |
Empty states use the .cruise-empty-state CSS class. |
| UI-EMP-003 |
Icons shall use display-1 or display-4 size class. |
9.2 Empty State Messages
| Context |
Page |
Icon |
Heading |
Description |
| No itineraries match filters |
Dashboard |
bi-water |
No Itineraries Found |
Create a new itinerary to get started. |
| No sailing selected |
Itinerary |
fa-solid fa-calendar |
No Sailing Selected |
Select a sailing above or create a new one. |
| No booking selected |
Agent Booking |
fa-solid fa-ticket |
No Booking Selected |
Select a booking from the list or create a new one. |
10.1 Validation Rules
| Field |
Validation |
Error Message |
| Company Code |
Required, max 10 chars |
"Code is required" |
| Company Name |
Required, max 50 chars |
"Name is required" |
| Ship Code |
Required, max 10 chars |
"Code is required" |
| Ship Name |
Required, max 50 chars |
"Name is required" |
| Itinerary Code |
Required, max 10 chars |
"Code is required" |
| Itinerary Duration |
Required, positive integer, 1-365 |
"Duration must be a positive number" |
| Template Sequence |
Required, 1-99 |
"Sequence is required" |
| Template Port |
Required (dropdown) |
"Port is required" |
| Cruise Start Date |
Required, valid date |
"Start date is required" |
| Charge Amount |
Required, positive number |
"Amount must be positive" |
| Currency |
Required, from config |
"Select a valid currency" |
| Template Time |
Required, HH:mm format |
"Enter time in HH:mm format" |
| Booking Adults |
Required, min 1 |
"At least one adult required" |
| Lead Passenger Name |
Required (first + last) |
"Lead passenger name is required" |
| Pre-Booking Count |
Cannot reduce below reserved+booked |
"Cannot reduce below reserved count" |
10.2 Validation Display
| ID |
Requirement |
| UI-VAL-001 |
Invalid fields shall have red border (Bootstrap is-invalid class). |
| UI-VAL-002 |
Error messages shall appear below the field in red text. |
| UI-VAL-003 |
Form submission shall be blocked until all validations pass. |
| UI-VAL-004 |
First invalid field shall receive focus on validation failure. |
11. Loading States
11.1 Loading Indicators
| ID |
Requirement |
| UI-LOD-001 |
API calls shall show loading indicator. |
| UI-LOD-002 |
Tables shall show "Loading..." row during data fetch. |
| UI-LOD-003 |
Buttons shall show spinner and be disabled during save operations. |
| UI-LOD-004 |
Page body uses visibility:hidden until auth completes. |
12. Notifications
12.1 Notification Types
| Type |
Style |
Duration |
Use Case |
| Success |
Green |
3 seconds |
Save successful, create successful |
| Error |
Red |
5 seconds |
API error, validation error |
| Warning |
Yellow |
4 seconds |
Cascade delete warning, validation warning |
| Info |
Blue |
3 seconds |
Status change, informational |
12.2 Notification Implementation
| ID |
Requirement |
| UI-NOT-001 |
Notifications shall use the $.notify() library (existing in project). |
| UI-NOT-002 |
Notifications shall appear in top-right corner. |
| UI-NOT-003 |
Multiple notifications shall stack vertically. |
| UI-NOT-004 |
Notifications shall be dismissible by clicking. |
13. Responsive Behavior
13.1 Breakpoints
| Breakpoint |
Dashboard Left |
Dashboard Right |
Itinerary Panes |
Booking Panes |
| Large (1200px+) |
col-md-3 |
col-md-9 |
col-md-6 each |
col-md-6 each |
| Medium (768-1199px) |
Full width |
Full width |
Full width |
Full width |
| Small (<768px) |
Full width |
Full width |
Full width |
Full width |
13.2 Mobile Adaptations
| ID |
Requirement |
| UI-RES-001 |
On small screens, columns shall stack vertically. |
| UI-RES-002 |
The sailing strip shall remain horizontally scrollable with scroll buttons. |
| UI-RES-003 |
Tables shall become scrollable horizontally on small screens. |
| UI-RES-004 |
Dialogs shall be full-width on mobile. |
14. Keyboard Accessibility
14.1 Keyboard Navigation
| Key |
Action |
| Tab |
Move between interactive elements |
| Enter |
Activate button/link, submit form |
| Escape |
Close dialog, cancel operation |
| Space |
Toggle checkbox, activate button |
14.2 Focus Management
| ID |
Requirement |
| UI-ACC-001 |
Focus shall be visible with outline style. |
| UI-ACC-002 |
Dialog open shall move focus to first input. |
| UI-ACC-003 |
Dialog close shall return focus to triggering element. |
| UI-ACC-004 |
Form validation error shall move focus to first invalid field. |
15. JavaScript Module Structure
15.1 Module Organization
tqweb-adm/
├── cruise-dash.html # Dashboard page
├── cruise-itin.html # Itinerary management page
├── cruise-agt-book.html # Agent booking page
├── css/
│ └── cruise.css # All cruise-specific styles (~680 lines)
└── js/modules/
├── cruise-common.js # Shared CruiseAPI client + utilities (~200 lines)
├── exchange-rate-service.js # Currency config + rate fetching (~200 lines)
├── cruise-dash.js # Dashboard module (~1060 lines)
├── cruise-itin.js # Itinerary management module (~1500 lines)
└── cruise-agt-book.js # Agent booking module (~1600 lines)
15.2 Shared Module: cruise-common.js
| Export |
Type |
Purpose |
CruiseAPI |
Object |
All API endpoint methods (company, ship, itinerary, template, pricing, cruise, booking, etc.) |
initCommon() |
Function |
Loads all dimension data (companies, areas, ports, cabin types, charge types, ships) in parallel |
getCompanies(), getAreas(), getPorts(), getCabinTypes(), getChargeTypes(), getShips() |
Functions |
Cached dimension data getters |
findCompany(), findArea(), findPort(), findCabinType(), findChargeType(), findShip() |
Functions |
Lookup by ID helpers |
reloadCompanies(), reloadAreas(), etc. |
Functions |
Reload individual dimension from server |
statusBadge(status) |
Function |
Returns Bootstrap badge HTML for a status value |
paxTypeLabels |
Object |
Passenger type display labels: All, Adults, Children, Per Cabin |
15.3 Shared Module: exchange-rate-service.js
| Export |
Type |
Purpose |
loadCurrencyConfig() |
Function |
Loads local currency and quotation currencies from server config |
fetchRates(baseCurrency) |
Function |
Fetches rates from open.er-api.com with 24h localStorage cache |
populateCurrencySelect(selector) |
Function |
Populates <select> elements with currency options |
convertToLocal(amount, currency, rates, localCurrency) |
Function |
Converts amount to local currency |
convertFromLocal(amount, currency, rates, localCurrency) |
Function |
Converts amount from local currency |
convertAmount(amount, from, to, rates, localCurrency) |
Function |
Converts between any two currencies via local |
15.4 Page Module: cruise-dash.js
State:
let companies = [];
let ships = [];
let itineraries = [];
let areas = [];
let selectedCompany = null;
Key Functions:
| Function |
Purpose |
initializePage() |
Load dimension data, companies, ships, itineraries; render UI |
renderCompanyAccordion() |
Build Bootstrap accordion HTML from companies + ships |
renderKpiCards() |
Display summary counts in KPI strip |
renderItineraryCards() |
Filter and display itinerary card grid |
applyFilters() |
Apply area/company/status filters to itinerary cards |
showCompanyDialog() |
Open company create/edit dialog |
showShipDialog() |
Open ship create/edit dialog with cabin assignment |
showSettingsModal() |
Open dimension data management tabs |
15.5 Page Module: cruise-itin.js
State:
let itinerary = null;
let templates = [];
let cabinPriceTemplates = [];
let otherChargeTemplates = [];
let cruises = []; // sailings for this itinerary
let selectedCruise = null;
let cruisePoints = [];
let cabinCharges = [];
let otherCharges = [];
let prebookings = [];
let bookings = [];
let shipCabins = [];
let currencyConfig = null;
Key Functions:
| Function |
Purpose |
initializePage() |
Parse URL params, load itinerary + all related data |
loadItineraryData() |
Load itinerary, templates, pricing templates |
renderItineraryInfo() |
Populate info form fields and status badge |
renderTemplateTable() |
Build template port sequence table |
renderCabinPriceTemplates() |
Build cabin pricing template table |
renderOtherChargeTemplates() |
Build charge template table with indicator badges |
renderSailingBar() |
Build sailing pill buttons |
selectSailing(cruiseId) |
Load all sailing detail sections |
renderCruisePoints() |
Build cruise points table |
renderCabinCharges() |
Build cabin charges with Prebk/Avail columns |
renderOtherCharges() |
Build other charges with indicator badges |
renderBookings() |
Build bookings table with clickable rows |
showPrebookDialog() |
Open pre-booking management dialog |
handleCurrencyChange() |
Auto-fill exchange rate from cached rates |
15.6 Page Module: cruise-agt-book.js
State:
let allSailingData = []; // all sailings across itineraries for the company
let selectedCruise = null;
let selectedItinerary = null;
let selectedCompany = null;
let shipCabins = [];
let cabinCharges = [];
let otherCharges = [];
let prebookings = [];
let cruisePoints = [];
let bookings = [];
let selectedBooking = null;
let passengers = [];
let bookedCabins = [];
let addons = [];
let countryList = [];
let currencyConfig = null;
Key Functions:
| Function |
Purpose |
initializePage() |
Parse URL params, load all sailings, render UI |
loadAllSailings() |
Load all cruises with itinerary data for the sailing strip |
renderSailingStrip() |
Build scrollable pill buttons with company-colored borders |
selectSailing(cruiseId) |
Load cabin availability, prebookings, bookings for a sailing |
renderCabinAvailability() |
Build cabin table with charge, prebook count |
renderBookingsList() |
Build bookings table for the selected sailing |
selectBooking(bookingId) |
Load and display booking details (passengers, cabins, addons) |
createNewBooking() |
Open new booking dialog, handle creation flow |
generateBookingNumber() |
Generate PT-DDMM-XXXXXXXX using createId('', 8) |
renderPassengers() |
Build passengers table with visa/age badges |
renderBookedCabins() |
Build cabins table with own badges and totals |
renderAddons() |
Build add-ons table with totals |
findAvailablePrebook(shipCabinId) |
Check for Available prebookings to assign as own |
checkVisaForPassenger(passengerId) |
Call visa API for each destination port |
setupNationalityAutocomplete(inputId) |
Attach country autocomplete to nationality input |
computeAgeCategory(dob, sailingDate) |
Return Adult/Child/Infant based on age |
updateBookingTotals() |
Recalculate and save totalAmount from cabins + addons |
15.7 API Integration Pattern
import { CruiseAPI, initCommon, statusBadge } from './cruise-common.js';
import { loadCurrencyConfig, fetchRates, populateCurrencySelect } from './exchange-rate-service.js';
import { escapeHtml, formatDisplayDate, formatDisplayDateTime, createId, tlinq } from './globals.js';
import { modalShow, modalHide, loadBootstrapTemplates } from './pageutil.js';
Module import from HTML:
<script type="module">
import * as $mod from './js/modules/cruise-dash.js';
import * as $site from './js/modules/globals.js';
$(document).ready(async function() {
await $site.setGlobalHandlers({ requireAuth: true });
$mod.initializePage();
window.CruiseDash = $mod;
});
</script>
16. File Deliverables
16.1 Delivered Files
| File |
Description |
Lines |
tqweb-adm/cruise-dash.html |
Dashboard page with company accordion, KPI cards, itinerary grid, 8 modal dialogs |
~517 |
tqweb-adm/js/modules/cruise-dash.js |
Dashboard module: company/ship/itinerary CRUD, settings management, filtering |
~1060 |
tqweb-adm/cruise-itin.html |
Itinerary management page with two-pane layout, 9 modal dialogs |
~759 |
tqweb-adm/js/modules/cruise-itin.js |
Itinerary module: template, pricing, sailing, prebook, booking management |
~1500 |
tqweb-adm/cruise-agt-book.html |
Agent booking page with sailing strip, 6 modal dialogs |
~496 |
tqweb-adm/js/modules/cruise-agt-book.js |
Booking module: booking creation, passenger/cabin/addon management |
~1600 |
tqweb-adm/js/modules/cruise-common.js |
Shared CruiseAPI client, dimension data cache, status badge utility |
~198 |
tqweb-adm/js/modules/exchange-rate-service.js |
Currency config, rate fetching with 24h cache, select population |
~204 |
tqweb-adm/css/cruise.css |
All cruise-specific styles: CSS variables, components, tables, print rules |
~681 |
16.2 Key Dependencies
| Module |
Used For |
cruise-common.js |
CruiseAPI, initCommon(), dimension getters/finders, statusBadge() |
exchange-rate-service.js |
loadCurrencyConfig(), fetchRates(), populateCurrencySelect(), convertAmount() |
globals.js |
escapeHtml, formatDisplayDate, formatDisplayDateTime, formatDateTimeLocal, createId, tlinq, getUserSession |
pageutil.js |
modalShow(), modalHide(), loadBootstrapTemplates() |
site.js |
setGlobalHandlers() for authentication |
17. Appendix: Component Reference
17.1 Bootstrap Components Used
- Grid System (
container-fluid, row, col-md-*, gx-3)
- Buttons (
.btn, .btn-sm, .btn-group)
- Forms (
.form-control, .form-select, .form-check)
- Tables (
.table, .table-hover, .table-sm, .itin-table)
- Modals (
.modal, .modal-dialog, .modal-lg)
- Accordion (
.accordion, .accordion-item)
- Tabs (
.nav-tabs, .tab-content, .tab-pane)
- Badges (
.badge, .bg-*)
- Breadcrumb (
.breadcrumb, .breadcrumb-item)
- Dropdowns (
.dropdown-toggle, .dropdown-menu)
| Action Type |
Button Classes |
Icon |
Example |
| Add/Create |
btn btn-sm btn-success |
bi-plus-lg |
<button class="btn btn-sm btn-success"><i class="bi bi-plus-lg"></i></button> |
| Save/Confirm |
btn btn-success |
bi-check-lg |
<button class="btn btn-success"><i class="bi bi-check-lg"></i> Save</button> |
| Edit |
btn btn-sm btn-primary |
bi-pencil |
<button class="btn btn-sm btn-primary"><i class="bi bi-pencil"></i></button> |
| Delete |
btn btn-sm btn-danger |
bi-trash |
<button class="btn btn-sm btn-danger"><i class="bi bi-trash"></i></button> |
| Cancel |
btn btn-secondary |
(none) |
<button class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button> |
| Status |
btn btn-sm btn-secondary dropdown-toggle |
bi-arrow-repeat |
Status dropdown toggle |
| Settings |
btn btn-sm btn-outline-secondary |
bi-gear |
Settings button |
| Prebook |
btn btn-sm btn-primary |
fa-solid fa-bookmark |
Prebook management button |
| Init Cabins |
btn btn-sm btn-success |
fa-solid fa-wand-magic-sparkles |
Initialize cabin prices |
| Regen Points |
btn btn-sm btn-info |
fa-solid fa-rotate |
Regenerate cruise points |
17.3 CSS Variables (from cruise.css)
:root {
--cruise-primary: #362c5d;
--cruise-primary-dark: #2a2149;
--cruise-secondary: #FFC166;
--cruise-success: #28a745;
--cruise-info: #17a2b8;
--cruise-warning: #ffc107;
--cruise-danger: #dc3545;
--cruise-light-bg: #f8f9fa;
--cruise-border: #e1e4e8;
}
17.4 Icon Reference
| Purpose |
Icon Class |
Library |
| Company/Ship |
fa-solid fa-ship |
FontAwesome |
| Itinerary/Route |
fa-solid fa-route |
FontAwesome |
| Sailing/Calendar |
fa-solid fa-calendar |
FontAwesome |
| Port/Anchor |
fa-solid fa-anchor |
FontAwesome |
| Cabin/Bed |
fa-solid fa-bed |
FontAwesome |
| Pricing/Dollar |
fa-solid fa-dollar-sign |
FontAwesome |
| Booking/Ticket |
fa-solid fa-ticket |
FontAwesome |
| Passengers |
fa-solid fa-users |
FontAwesome |
| Passenger |
fa-solid fa-user |
FontAwesome |
| Charges/Receipt |
fa-solid fa-receipt |
FontAwesome |
| Globe/Area |
fa-solid fa-globe |
FontAwesome |
| Template/List |
fa-solid fa-list-ol |
FontAwesome |
| Regenerate |
fa-solid fa-rotate |
FontAwesome |
| Init Cabins |
fa-solid fa-wand-magic-sparkles |
FontAwesome |
| Bookmark/Prebook |
fa-solid fa-bookmark |
FontAwesome |
| Add |
bi-plus-lg |
Bootstrap Icons |
| Edit |
bi-pencil |
Bootstrap Icons |
| Delete/Trash |
bi-trash |
Bootstrap Icons |
| Save/Check |
bi-check-lg |
Bootstrap Icons |
| Settings/Gear |
bi-gear |
Bootstrap Icons |
| Status/Repeat |
bi-arrow-repeat |
Bootstrap Icons |
| Home |
bi-house-door |
Bootstrap Icons |
| Water/Cruise |
bi-water |
Bootstrap Icons |
| Warning |
bi-exclamation-triangle |
Bootstrap Icons |
| Close |
btn-close |
Bootstrap Icons |
| Scroll Left |
bi-chevron-left |
Bootstrap Icons |
| Scroll Right |
bi-chevron-right |
Bootstrap Icons |
| Person/Booking |
bi-person-vcard |
Bootstrap Icons |
| Calendar |
bi-calendar3 |
Bootstrap Icons |
| Globe (KPI) |
bi-globe2 |
Bootstrap Icons |
17.5 CSS Class Reference (from cruise.css)
| Class |
Component |
Page |
.cruise-page |
Body class for all cruise pages |
All |
.cruise-container |
Main content container |
All |
.cruise-breadcrumb |
Breadcrumb navigation bar |
All |
.cruise-empty-state |
Centered empty state display |
All |
.company-accordion |
Company accordion container |
Dashboard |
.kpi-cards |
KPI strip flex container |
Dashboard |
.kpi-card |
Individual KPI card |
Dashboard |
.itin-card |
Itinerary card in grid |
Dashboard |
.filter-bar |
Filter controls bar |
Dashboard |
.itin-section |
Section container with title |
Itinerary, Booking |
.itin-section-title |
Section header with flex layout |
Itinerary, Booking |
.itin-table |
Compact data table |
Itinerary, Booking |
.sailing-bar |
Sailing pill container (itinerary page) |
Itinerary |
.sailing-pill |
Individual sailing date pill button |
Itinerary, Booking |
.sailing-strip-container |
Full-width sailing strip wrapper |
Booking |
.sailing-strip |
Scrollable sailing pill row |
Booking |
.sailing-strip-scroll-btn |
Scroll arrow buttons |
Booking |
.indicator-badge |
Single-letter charge indicator |
Itinerary |
.prebook-info |
Pre-booking info display panel |
Itinerary, Booking |
.bookings-table |
Bookings table with clickable rows |
Itinerary, Booking |
.nationality-autocomplete |
Country autocomplete dropdown |
Booking |
.visa-badge |
Visa requirement badge |
Booking |
.age-badge |
Age category badge |
Booking |
.own-badge |
Own cabin indicator badge |
Booking |