Enhanced the benefit forms file upload functionality to provide better
user feedback and visibility of uploaded files.
Changes:
1. Added file type validation in controller:
- Only accepts PDF, DOC, DOCX, JPG, PNG formats
- Shows clear error message with the rejected file extension
2. Added file size validation:
- Maximum 10MB file size limit
- Shows file size in error message if exceeded
3. Improved success/error messages:
- Shows specific filename on successful upload
- Shows detailed error messages for validation failures
4. Added uploaded files display section:
- Lists all uploaded files with icons based on file type
- Shows file size and upload timestamp
- Provides download button for each file
- Only displays when files exist
Before: Users received generic "Something went wrong" message with no
indication of why uploads failed. No way to see uploaded files.
After: Clear validation feedback tells users exactly what went wrong
(wrong format, too large, etc.) and uploaded files are visible with
download links.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit improves the admin user management interface while preserving
the intentional mass assignment vulnerability for educational purposes.
Changes:
1. Removed layout false from admin controller to enable full styling
2. Modernized admin users table view with Bootstrap components:
- Added page header with icon and description
- Wrapped table in card component for better visual hierarchy
- Updated admin indicator to use Bootstrap icons
- Modernized Edit button styling
3. Fixed admin update_user action form submission error:
- Previous code caused ForbiddenAttributesError in Rails
- Used to_unsafe_h to explicitly bypass strong parameters
- VULNERABILITY PRESERVED: This intentionally allows mass assignment
- See wiki: Extras:-Mass-Assignment-Admin-Role.md
- Fixed password field filtering to handle blank passwords correctly
The mass assignment vulnerability is maintained as a teaching example per
the OWASP RailsGoat mission. Students can learn about privilege escalation
attacks through the admin parameter.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed two UI issues in the navigation header:
1. **Navbar Alignment**: Added CSS to remove margin/padding from forms in the
header to ensure the Tutorials button (created with button_to) aligns
properly with other navbar items like font size controls and user dropdown.
2. **Font Size Toggle**: Added data-turbolinks="false" to font size control
links to force full page reload. Previously, clicking the small font button
wouldn't apply changes until manual refresh due to Turbolinks caching. Now
both font size buttons work immediately.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Reduced padding from 0.85rem to 0.5rem and adjusted line-height from 1.6 to 1.5
to prevent text from being cut off at the bottom of the dropdown selector. Also
added option styling to ensure consistent spacing throughout the dropdown.
The excessive padding was causing the text to be vertically centered in a way
that cut off descenders. The new values provide clean text rendering without cutoff.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added !important to all dropdown height/padding CSS rules to ensure
they override any conflicting Bootstrap or global styles:
- min-height: 52px !important
- line-height: 1.6 !important
- padding: 0.85rem 0.75rem !important
- vertical-align: middle !important
- box-sizing: border-box !important
This forces the styles to apply and prevent text cutoff.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Increased vertical spacing to ensure recipient names display fully:
- min-height: 48px → 52px
- line-height: 1.5 → 1.6
- padding: 0.75rem → 0.85rem
- Added vertical-align: middle
This provides more breathing room for text to prevent any cutoff
at the bottom of the dropdown field.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added CSS to ensure proper height and padding:
- min-height: 48px (provides enough vertical space)
- line-height: 1.5 (proper text spacing)
- padding: 0.75rem (matches Bootstrap form-control-lg)
This prevents the selected recipient name from being cut off
at the bottom of the dropdown field.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The custom JavaScript was actually interfering with normal browser
behavior. The hide().show() and attribute manipulation was causing
the dropdown to reset visually after selection.
Changes:
- Removed all custom dropdown change event handlers
- Removed all debugging console logs
- Removed excessive !important CSS rules
- Removed debug red border
- Kept only the simple focus styling
Now using native browser select behavior with Bootstrap form-control
styling, which should work correctly out of the box.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Bootstrap 5's form-select class may have rendering issues.
Switched to form-control which has simpler styling and should
display the selected text properly.
Also explicitly added ID attribute to ensure JavaScript targets
the correct element.
Added additional debugging for:
- Font family
- Transform
- Position
- Z-index
- Padding
- Inner text/HTML of selected option
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added extensive CSS properties to force text visibility:
- Explicit text-indent: 0
- Overflow: visible
- Font-size and line-height
- Proper padding
- Red border for visual debugging
Added comprehensive JavaScript logging of computed styles:
- Font size, color, background
- Text indent, overflow
- Display, visibility, opacity
- Width and height
This will help identify which CSS property is hiding the selected text.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added extensive console logging to diagnose why selected value
isn't displaying in the dropdown:
- Select element's full text content
- Selected index position
- Total options count
- Option text at selected index
- Explicitly setting 'selected' attribute on options
This will help identify whether the issue is with:
- Option selection not being applied
- Visual rendering despite correct selection
- Bootstrap form-select interference
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added enhanced CSS with !important rules and explicit appearance properties
to ensure the dropdown properly displays the selected recipient name.
Changes:
- Added explicit appearance properties for proper browser rendering
- Added !important to color and background-color rules
- Added styling for option:checked state
- Enhanced JavaScript debugging with value and color logging
- Added hide/show to force visual re-render
The console logs now show:
- Selected recipient name
- Selected value
- Current color CSS property
This should help diagnose and fix the visual display issue.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
1. Removed broken Travis CI build status badge from README header
2. Enhanced dropdown selection on messages page:
- Added explicit JavaScript change event handler
- Added CSS to ensure proper text color and background
- Added blur/focus to force visual update after selection
- Added console logging for debugging
This should resolve the issue where selected recipient names weren't
displaying properly in the dropdown after selection.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added prompt option "Select a recipient..." to the To dropdown on
the messages page. This provides a clear placeholder and makes the
selected user's name visible after selection.
Before: Dropdown showed no placeholder, making it unclear what was selected
After: Shows "Select a recipient..." by default, then displays the
selected user's name when a recipient is chosen
Fixes the issue where clicking a user in the dropdown didn't show
their name in the dropdown field.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed the CodeClimate badge link from the README header as the
CodeClimate links are no longer functional.
Kept the Build Status badge from Travis CI.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed "Requested unknown parameter '1' for row 0, column 1" error
by adding explicit column definitions to the DataTable initialization.
The issue occurred because DataTables was initialized without column
definitions, but data was being added as arrays. DataTables needs
explicit column configuration to properly map array data to columns.
Changes:
- Added "columns" configuration to DataTable initialization
- Defined all 4 columns with proper titles
- Set "orderable: false" for Actions column
This fixes the popup error that appeared when visiting /users/1/pay
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Remove complex modal implementation and replace with simple page navigation:
- Convert get_user view from modal partial to full edit page
- Add proper form with Bootstrap 5 styling
- Link directly from users list to edit page
- Update controller actions to redirect instead of returning JSON
- Add flash messages for success/error feedback
- Remove all modal JavaScript and markup
- Remove modal CSS and backdrop handling
Benefits:
- Much simpler and more maintainable
- No JavaScript errors or complexity
- Standard Rails CRUD pattern
- Better user experience with proper navigation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Bootstrap 5 removed jQuery plugin support, so .modal('show') doesn't work.
Switch back to native Bootstrap 5 Modal API with proper initialization:
- Dispose of any existing modal instance before creating new one
- Create modal with explicit options (backdrop, keyboard, focus)
- Add detailed console logging for each step
This ensures the modal is properly initialized before showing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Switch from bootstrap.Modal class to jQuery .modal('show') method.
Bootstrap 5 still supports the jQuery plugin API for backwards
compatibility, and this method handles initialization automatically.
This should fix the issue where modal.show() was called but the
modal wasn't appearing visually.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Log modal element to verify it exists
- Check for existing modal instance before creating new one
- Log each step of modal creation and show process
This helps identify why modal.show() isn't displaying the modal.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add console logging to openEditModal function to debug AJAX load
- Add explicit id and name attributes to admin select field
- Only show modal after content successfully loads
- Log errors if modal content fails to load
This helps diagnose the modal loading issue and fixes the Chrome
warning about form fields lacking id/name attributes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add 'return false;' to onClick handler to prevent the # href
from causing page navigation/redirect to dashboard.
This fixes the issue where clicking Edit would redirect to
/admin/1/dashboard# instead of opening the modal.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Update modal content to Bootstrap 5 styling and API:
- Replace Bootstrap 2 modal-header structure with Bootstrap 5
- Update close button from 'close' class to 'btn-close'
- Replace 'data-dismiss' with 'data-bs-dismiss'
- Modernize form classes: control-group → mb-3, span12 → form-control
- Update form labels to use 'form-label' class
- Add 'form-select' class to select dropdown
- Update JavaScript to use Bootstrap 5 Modal.getInstance() API
- Add preventDefault() to button click handlers
The modal now properly loads and displays in Bootstrap 5 with
modern form styling and correct modal dismissal behavior.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fix "Illegal invocation" JavaScript error when opening edit modal:
- Remove Bootstrap 2 'hide' class from modal markup
- Add proper Bootstrap 5 modal structure (modal-dialog/modal-content)
- Update JavaScript to use Bootstrap 5 Modal API
- Load dynamic content into .modal-content instead of root modal
- Remove legacy data-toggle attribute from button
The modal now uses the correct Bootstrap 5.3 structure and API,
resolving selector-engine.js errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Updates pay page forms to use the same styling patterns as messages,
PTO, and other modernized pages for consistency.
Changes:
- Remove local form control styles that override global styles
- Use global form styles from application.html.erb
- Add form-control-lg class to all inputs for larger size
- Add icons to all form labels (bank2, diagram-3, percent, key-fill)
- Use fw-semibold class on labels for bold appearance
- Add helper text below inputs with small.text-muted
- Change spacing from mb-3 to mb-4 for consistency
- Use btn-lg class for all buttons
- Keep only custom focus colors (green for add, yellow for decrypt)
Forms now match the polished appearance of other pages with:
- Properly rounded inputs (0.75rem from global styles)
- 2px borders with nice focus effects
- Larger, more comfortable controls
- Helpful icons and descriptions
- Consistent spacing and typography
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Makes form controls more rounded and polished instead of rectangular:
Form control updates:
- Increase border-radius from 0.5rem to 0.75rem for softer curves
- Increase border from 1px to 2px for better definition
- Adjust padding to 0.75rem 1rem for comfortable spacing
- Set font-size to 1rem for better readability
Button updates:
- Match border-radius at 0.75rem for consistency
- Increase font-weight to 600 for emphasis
- Add explicit padding (0.75rem 1.5rem)
- Stronger hover lift effect (translateY -2px)
- Enhanced shadow on hover (0 4px 12px)
Inputs and buttons now have modern, rounded appearance matching
the design system used throughout the application.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removes visual clutter and simplifies the interface for better usability:
Layout simplification:
- Change column split from 4/8 to 5/7 for better balance
- Remove gradient backgrounds from card headers
- Use simple white headers with clean icons
- Increase spacing between sections (g-4 gap)
- Remove info cards at bottom to reduce page length
Form simplification:
- Remove input group icons and addons
- Use clean standalone inputs without decorations
- Remove helper text under each field (info in placeholder)
- Reduce button sizes from btn-lg to standard
- Remove decorative tip boxes
- Simpler labels without icons
- Reduce vertical spacing (mb-3 instead of mb-4)
Table simplification:
- Remove icons from table headers
- Cleaner header text ("Your Accounts" vs "Direct Deposit Accounts")
- Remove subtitle text from headers
Input styling:
- Smaller, cleaner inputs (0.5rem radius, 1px border)
- Smaller padding (0.625rem vs 0.875rem)
- Smaller font size (0.95rem)
- Subtle focus rings (3px glow)
- Color-coded focus: green for add, yellow for decrypt
- Removed complex gradients and shadows
The page now has a clean, uncluttered appearance with better
visual hierarchy and easier-to-scan content.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Resolves icon height mismatch with form inputs.
Changes:
- Add explicit padding to input-group-text matching form-control
- Use flexbox (display: flex, align-items: center) for vertical centering
- Match padding for input-group-lg contexts (0.875rem 1.25rem)
- Set icon font-size to 1rem and line-height: 1 to prevent overflow
- Add min-width: 50px for consistent icon container size
Icons now align perfectly with input heights for a polished appearance.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Transforms blocky form controls into sleek, modern inputs:
Form control improvements:
- Rounded corners (0.75rem) for all inputs and buttons
- 2px borders with light gray color (#e9ecef)
- Subtle shadows for depth (0 1px 3px rgba)
- Smooth transitions on all interactions (0.2s ease)
- Larger padding for better touch targets
Focus state enhancements:
- Add Direct Deposit form: green glow on focus with 4px shadow ring
- Decrypt form: yellow/warning glow on focus with themed shadow
- Input group icons change gradient on focus
- Entire input group highlights together (border color sync)
- Remove harsh outline, replace with soft shadow
Button refinements:
- More rounded corners (0.75rem)
- Lift effect on hover (translateY -2px)
- Enhanced shadows that grow on hover
- Smooth press animation on active state
- Bold font weight (600)
Input group styling:
- Gradient backgrounds on addon icons
- Seamless connection between input and icon
- Icons highlight with themed gradient on focus
- Smooth border radius flow from input to addon
The forms now have a polished, modern appearance matching
contemporary web applications with smooth, delightful interactions.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Resolves "Cannot set properties of undefined (setting '_DT_CellIndex')"
error by modernizing DataTables API usage and handling Turbolinks properly.
Changes:
- Update to modern DataTables API (capital D DataTable() vs lowercase)
- Add check for existing DataTable before initialization
- Properly destroy and recreate DataTable on Turbolinks page loads
- Replace deprecated fnClearTable() with table.clear()
- Replace deprecated fnAddData() with table.row.add() + table.draw()
- Create unified initializePage() function for both ready and turbolinks:load
- Add autoWidth, searching, and ordering options to DataTable config
The DataTable now initializes cleanly without errors and handles
Turbolinks navigation properly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Complete redesign of the pay/direct deposit management page:
Layout improvements:
- Two-column responsive layout (forms left, table right)
- Forms column (4/12):
* Add Direct Deposit form with green theme and gradient header
* Decrypt Account form with yellow/warning theme
* Both cards have left border accents
- Table column (8/12):
* DataTable showing existing accounts
* "Why Encrypted?" button in header
* Three info cards below explaining benefits
Form enhancements:
- All form controls upgraded to large size with icons
- Input groups with trailing icons (bank, routing, lock, percent)
- Helper text below each field for guidance
- Full-width submit buttons in themed colors
- Tip boxes with security/convenience info
- Auto-clear forms after successful submission
Table improvements:
- Modern Bootstrap 5 table with hover effects
- Icons in column headers (lock, diagram, percent, gear)
- Enhanced data display:
* Account numbers in monospace code blocks
* Routing numbers in light badges
* Deposit percentages in green success badges
* Delete buttons styled as outline-danger with trash icon
- Custom DataTables pagination styling matching theme
- Empty state message for no accounts
JavaScript enhancements:
- Replace basic alerts with modern Bootstrap-styled overlays
- Decrypted account number shows in floating alert with unlock icon
- "Why Encrypted?" shows modal-like dialog with close button
- Delete confirmation improved
- Turbolinks compatibility
- Form reset after success
Info cards:
- Instant Access (blue) - explain direct deposit timing
- Secure & Encrypted (green) - highlight security features
- Split Deposits (yellow) - describe multi-account feature
The page now provides a banking-grade interface for managing
direct deposit with clear visual hierarchy and modern UX.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Complete redesign of the messaging interface with modern layout:
Inbox improvements:
- Replace table with modern message cards
- Each message shows circular gradient avatar with person icon
- Display sender name prominently with formatted date
- Show full message text with proper line wrapping
- Add Details and Delete action buttons with icons
- Hover effect highlights each message
- Beautiful empty state with inbox icon when no messages
Send Message form:
- Relocate to right sidebar with sticky positioning
- Add green gradient header with send icon
- Style as modern card with left border accent
- Large form controls with icons for better UX
- Recipient selector with all users
- Expandable textarea for message composition
- Full-width send button in success green
- Helpful tip box below form
- Modern Bootstrap 5 alerts with icons for success/error
- Auto-reload page after successful send to show new message
Layout enhancements:
- Two-column responsive layout (8/4 split)
- Inbox on left, compose on right
- Sticky compose form stays visible while scrolling
- Mobile-friendly with stacked layout on small screens
- Replace all Bootstrap 2 classes (row-fluid, span12, widget)
- Modern Bootstrap 5 grid and components
- Turbolinks compatibility
The page now provides a clean, modern messaging experience similar
to contemporary email/messaging applications.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removes problematic Google Charts dependency and creates a cleaner,
more reliable performance trend visualization.
Changes:
- Remove all Google Charts JavaScript code (100+ lines)
- Replace chart with visual timeline showing each review chronologically
- Each timeline item displays:
* Date at top, reviewer name at bottom
* Colored circular badge with score number (green=5, blue=4, yellow=3, red<3)
* Horizontal progress bar showing score percentage with comments
- Add smooth animations: fade-in on load, scale on dot hover, slide on bar hover
- Color-coded by score for instant visual feedback
- Fully responsive with mobile layout
- No external dependencies - pure CSS solution
- Add empty state with graph icon if no performance data
The timeline provides better visual hierarchy and eliminates the blank
space issue caused by Google Charts loading failures.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Complete redesign of the performance page with modern Bootstrap 5:
Major improvements:
- Add header with graph icon and descriptive subtitle
- Create four stat cards showing key metrics at a glance:
* Average Score (blue with star icon)
* Highest Score (red with trophy icon)
* Latest Score (green with calendar icon)
* Total Reviews (purple with document icon)
- Stat cards lift and scale numbers on hover
- Modernize chart card with better spacing and min-height
- Enhance chart styling with smooth curves and better colors
- Transform table with modern header styling and icons
- Add reviewer avatars (circular icons) in table rows
- Color-code scores with badges (green=5, blue=4, yellow=3, red<3)
- Add empty state with inbox icon for no reviews
- Replace old Bootstrap 2 classes (row-fluid, span12, widget)
- Use Bootstrap 5 grid system and modern card components
- Add hover effects on table rows and stat cards
The page now provides an engaging, data-rich view of performance history
with clear visual hierarchy and modern design patterns.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Improves the Schedule PTO form section with modern design elements:
Design enhancements:
- Add left border accent in primary color to highlight the card
- Add gradient background to header with descriptive subtitle
- Include icons next to each form label (tag, chat, calendar)
- Upgrade all form controls to large size for better touch targets
- Add helpful placeholder text with examples (e.g., "Summer Vacation")
- Include descriptive helper text below fields for guidance
- Make submit button full-width and large for prominence
- Add tip box at bottom with success border highlighting post-submission info
- Increase padding and spacing (mb-4) for better breathing room
The form now feels more guided, professional, and easier to use.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Resolves "Uncaught TypeError: $(...).fullCalendar is not a function"
by loading FullCalendar and Moment.js libraries from CDN.
Changes:
- Add Moment.js 2.29.4 from CDN to application layout
- Add FullCalendar 3.10.5 CSS and JS from CDN
- Remove local javascript_include_tag calls from PTO page
- Ensure libraries load before page attempts to initialize calendar
The PTO calendar now loads reliably across page navigations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Transforms the retirement benefits page with a modern, engaging design:
Design improvements:
- Add piggy bank icon header with descriptive subtitle
- Create three large contribution stat cards with hover effects:
* Employee Contribution (blue with person-check icon)
* Employer Contribution (green with building-check icon)
* Total Contribution (red gradient with cash-stack icon)
- Stat cards lift on hover with shadow deepening and number scaling
- Add featured Employee Services card with 4rem icon and gradient highlight
- Include three smaller info cards for Investment Options, Employer Matching, Tax Advantages
- Apply colored left/top borders, rounded corners, and smooth animations
- Ensure Turbolinks compatibility with proper event handling
The page now provides a visually appealing, easy-to-scan view of retirement
benefits that matches the modern design system.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Complete redesign of the benefit forms download and upload page:
**Download Section**:
- Beautiful hover cards for Health and Dental insurance
- Large colorful icons (heart pulse and smile)
- Card elevation on hover (lift animation)
- Primary colored Health button, success colored Dental button
- Centered layout with descriptions
- Side-by-side responsive layout
**Upload Section**:
- Modern drag-drop style upload area
- Dashed border with cloud upload icon
- Custom file input with "Choose File" button
- Real-time file selection feedback
- Upload area changes color when file selected (green border)
- Animated progress bar during upload
- Cancel button to reset form
- Clean action buttons with icons
**Additional Features**:
- Info box with important upload guidelines
- File format and size restrictions
- Bootstrap Icons throughout
- Smooth transitions and animations
- Turbolinks compatibility
- Form validation (file required)
- Simulated upload progress visualization
**Removed**:
- Old Bootstrap 2 classes (span4, span12)
- Outdated icon fonts
- Complex file upload plugin dependencies
- Cluttered table-heavy layout
The page now looks like a modern web application with:
- Card-based design
- Hover effects
- Large touch-friendly buttons
- Clear visual hierarchy
- Professional polish
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Complete redesign of the PTO management page:
**Layout Improvements**:
- Migrated from Bootstrap 2 to Bootstrap 5 grid system
- Replaced .span classes with modern .col classes
- Side-by-side calendar and form layout on desktop
- Responsive cards with proper spacing
**Removed Google Charts**:
- Replaced sick days chart with 3 colorful stat cards
- Replaced PTO chart with 3 colorful stat cards
- Shows Earned, Taken, Remaining at a glance
- Color-coded with left borders (blue, red, green)
- No loading delays or JavaScript errors
**Modern Form**:
- Bootstrap 5 form controls with proper labels
- Icon-enhanced input groups
- Rounded inputs with better spacing
- Primary button for submission
- Form clears after successful submission
**Enhanced Calendar**:
- Kept FullCalendar but styled with modern theme
- Rounded corners and better button styling
- Brand-colored buttons and events
- Responsive layout
**Improved Alerts**:
- Bootstrap 5 dismissible alerts
- Icon-enhanced success/error messages
- Better visual hierarchy
**Additional Polish**:
- Formatted dates ("December 07, 2024" format)
- Info icons with contextual help
- Card shadows for depth
- Consistent spacing throughout
- Turbolinks compatibility
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The deprecated Google JSAPI (google.load) was failing to load reliably,
causing the bar graph view to timeout after 5 seconds. Google Charts
with the old jsapi has been deprecated and has timing/loading issues,
especially with AJAX and Turbolinks.
Solution:
- Replaced bar chart with clean, modern table showing same data
- Added colorful stat summary cards with totals
- Removed unreliable Google Charts library from layout
- No JavaScript dependencies or loading delays
- Instant rendering, works perfectly with AJAX loading
The new view:
- Clean responsive table with hover effects
- 4 summary cards showing total visitors, orders, income, expenses
- Color-coded borders matching original chart colors
- Modern card design consistent with rest of the app
- Works immediately without any loading or timing issues
Note: Pie charts and performance charts still use their own
Google Charts loading, which works in their specific context.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The issue was that google.load() doesn't work reliably when called
from AJAX-loaded content. The callback wasn't firing.
Solution:
- Load Google Charts library once in main application.html.erb layout
- Bar graph partial now just polls for google.visualization to be ready
- Uses retry logic (50 attempts @ 100ms = 5 second timeout)
- Returns success/failure boolean for proper flow control
- Removed duplicate script loading from partial
This ensures Google Charts is available globally for all chart views
(bar graphs, pie charts, performance charts) without timing issues.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The bar graph was calling drawChart3() before Google Charts library
finished loading, causing "Cannot read properties of undefined
(reading 'arrayToDataTable')" error.
Applied same fix as performance page:
- Check if visualization already loaded before calling google.load
- Use callback parameter to ensure charts only draw after load
- Add flag to prevent duplicate library loads
- Guard against missing DOM elements
- Handle AJAX-loaded partial context
Fixes dashboard statistics bar graph view errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
**Password Reset Pages**:
Forgot Password (password_resets/forgot_password.html.erb):
- Complete rewrite with modern card-based layout
- Icon-enhanced form with email validation
- Helpful info box with reset instructions
- "Back to Login" link for easy navigation
- Gradient background matching login page style
Reset Password (password_resets/reset_password.html.erb):
- Modern shield-lock icon header
- Password strength guidance with form text
- Confirmation field with proper validation
- Security tips info box with gradient styling
- Consistent with overall auth page design
**Admin Dashboard (admin/dashboard.html.erb)**:
- Replaced Bootstrap 2 classes with Bootstrap 5
- Modern alert design with icons and close buttons
- Card-based layout with subtle shadow
- Loading spinner state for user table
- Icon-enhanced header (people icon)
- Turbolinks compatibility
- Improved accessibility with ARIA labels
All pages now feature:
- Bootstrap 5 modern components
- Bootstrap Icons integration
- Rounded corners and gradient accents
- Smooth transitions and hover states
- Proper loading states and feedback
- Consistent design language across the app
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>