- Add global logout callback registration and retrieval functions in User context
- Integrate logout callback in response interceptor to handle 401 errors on token refresh
- Ensure fallback logout mechanism if callback is not registered, clearing cookies and redirecting to sign-in
- Extract MainLayout component from ConditionalLayout to reduce nesting and improve code organization
- Add useIsMobile hook to MainLayout for responsive behavior and prevent layout reflow on mobile
- Implement collapsed sidebar state for mobile devices showing only icons (70px width)
- Add MenuExpandIcon component to sidebar icons for collapsed state UI
- Update sidebar to display favicon instead of full logo when collapsed on mobile
- Remove menu toggle button and logo from header, consolidate in sidebar for better UX
- Improve sidebar styling with conditional padding and alignment for collapsed state
- Update sidebar navigation items to hide text labels when collapsed, showing only icons
- Refactor header component to remove mobile-specific logic now handled in MainLayout
- Enhance mobile navigation by maintaining sidebar space reservation to avoid layout reflow
- Upgrade next package from 15.1.6 to 15.1.9
- Upgrade eslint-config-next from 15.1.6 to 15.1.9
- Sort axios imports alphabetically in response-interceptor
- Skip token refresh for login endpoint to prevent infinite redirect loops
- Add check to prevent automatic token refresh when login request fails
- Add `required` to username, email, role, and type fields
- Make companies selection optional (remove validation)
- Require password only in create mode (`!editMode`)
- Switch language field from text `InputGroup` to `Select` with `Languages` options,
`GlobeIcon`, clearable support, and conditional disable/require for companies
- Remove manual length validation as Select ensures valid predefined values
- Update `Countries` values from ISO-2 to ISO-3 codes for consistency
- Remove isSubmitting prop from ChangeStatusForm component interface
- Remove isSubmitting parameter from ChangeStatusForm component destructuring
- Remove isChangingStatus variable from useChangeInquiryStatus hook
- Remove isSubmitting prop passed to ChangeStatusForm in InquiriesTable
- Remove isChangingStatus from presenter return object
- Simplify status change form by eliminating unused loading state management
- Remove custom EditIcon SVG component definition from inquiries table
- Import PencilSquareIcon from assets/icons instead of custom implementation
- Update change status button to use PencilSquareIcon component
- Improve code maintainability by using centralized icon library
- Format ListHeader component props for better readability
- Create ChangeStatusForm component with status, reason, and description fields
- Add change status modal to inquiries table with form integration
- Implement useChangeInquiryStatus hook integration in presenter
- Add edit icon button to trigger status change modal for each inquiry
- Update Status component to accept status prop for proper styling
- Update FormFooter component to support form submission handling
- Add isChangeStatusModalOpen state management to presenter
- Update TInquiries type definitions to include change status credentials
- Enhance inquiries list with status change workflow alongside existing delete functionality
- Add useChangeInquiryStatus hook for managing inquiry status mutations
- Add STATUS endpoint to inquiries API endpoints configuration
- Add changeInquiryStatus method to inquiries service with error handling
- Add TChangeInquiryStatusCredentials type with validation schema
- Include description, reason, and status fields in status change credentials
- Invalidate inquiries query cache on successful status update
- Display success toast notification after status change completes
- Import and integrate Pagination component into inquiries table
- Add allInquiries data exposure to access pagination metadata
- Expose setParams function to allow dynamic pagination updates
- Initialize default offset and limit parameters (10 items per page)
- Reset offset to 0 when applying new filters for consistent pagination
- Implement page change handler to update offset based on selected page
- Maintain filter state while navigating between pages
- Create new InquiriesListFilters component with search and status filter fields
- Integrate filter modal into inquiries table with form handling
- Add INQUIRY_STATUS enum with pending, reviewed, approved, and rejected statuses
- Implement URL-based query parameter management for filter persistence
- Add form state management using react-hook-form with watch and setValue utilities
- Connect filter search to useGetInquiries hook to fetch filtered results
- Support clearing individual filter fields and closing filter modal
- Add "Inquiries" nav item to sidebar data with `/inquiries` URL and BriefcaseTimer icon
- Implement BriefcaseTimer SVG icon component
- Add `INQUIRIES` base endpoint to API_ENDPOINTS
- Cleanup: remove commented details button in CmsTable, reorder imports
- Add delete button with trash icon to contact us table rows
- Implement confirmation modal for delete action
- Create useDeleteContactUs mutation hook with success callback
- Add deleteContactUs method to contact-us service
- Update API endpoints to support BASE() function for dynamic ID routing
- Add state management for modal open/close and current contact selection
- Integrate toast notifications for delete success feedback
- Add tooltip component to delete button for better UX
- Update query key to use BASE() endpoint for consistency
- Enable Contact Us navigation menu item in sidebar with visible flag set to true
- Create TContacts type schema with Zod validation for API responses
- Add type safety to contactUsService.getAllContactUs() with return type annotation
- Implement contact list table rendering with proper data mapping
- Display contact information columns: full name, email, status, phone, created date
- Add date formatting using unixToDate utility for created_at timestamps
- Update useContactUsListPresenter to return properly structured contacts data
- Refactor table columns array to include all contact detail fields
- Follows established pattern from recent filtering feature implementations
- Add ChangeEvent import for proper TypeScript typing
- Remove unused register function from useForm hook
- Refactor onChange handler with explicit ChangeEvent<HTMLSelectElement> type annotation
- Extract target value into variable for improved readability
- Ensure consistent form field updates between setValue and setCompanies calls
- Improve type safety and reduce potential runtime errors in form handling
- Remove unused FormErrorMessages import
- Add watch and setValue hooks from useForm for better form state management
- Implement useEffect to properly initialize company_ids field with default values
- Replace register-based validation with controlled component pattern
- Move onChange handler from register to Select component onChange prop
- Add selectedCompanyId state tracking using watch hook
- Change required validation from register config to component prop
- Improve form field synchronization between react-hook-form and component state
- Add default value of 0 for schedule_at field when not provided
- Restructure credentials object to explicitly set schedule_at before mutation
- Prevent undefined values from being sent to the API when schedule_at is empty
- Reorganize imports in alphabetical order for better maintainability
- Add value binding to role select field using watch hook for proper form state synchronization
- Add value binding to type select field using watch hook for consistent form behavior
- Ensure form fields properly reflect current values during editing and user interaction
- Create CmsListFilters component with search and key filter fields
- Add filter modal to CMS table with open/close functionality
- Implement useForm hook integration for filter form management
- Update useCmsTablePresenter to handle filter state and search logic
- Modify useGetCmsList query hook to accept and pass filter parameters
- Update cms-service.getCms method to support query parameters
- Add URL-based query string management for filter persistence
- Integrate filter button in ListHeader component
- Add isMutating state tracking for loading indicator during search
- Create CompanyCategoryListFilters component with search and published status filters
- Integrate ListHeader component to replace inline create button
- Add filter modal with form handling and submission logic
- Implement useForm hook for filter form state management
- Add search parameter synchronization with URL query params
- Support clearing individual filter fields and resetting filters
- Add loading state indicator during filter search operations
- Maintain consistency with existing filtering patterns used in companies and tenders tables
- Create CompanyListFilters component with form fields for name, email, phone, currency, and employee count
- Integrate filter modal into CompaniesTable component with open/close state management
- Update useCompanyListPresenter hook to handle filter form state and search parameters
- Replace inline create button with ListHeader component for consistent UI patterns
- Add support for URL-based query parameters to persist filter state
- Implement form reset and filter clearing functionality
- Add isMutating state tracking for loading indicators during filter searches
- Update constants/enums to support currency filtering optionsfor
- Create new CustomerListFilters component with status, role, and type filter options
- Integrate filter modal into customer list table with open/close functionality
- Add filter form handling with react-hook-form for managing filter state
- Implement search functionality triggered by filter form submission
- Add EmptyListWrapper component to display message when no customers found
- Replace inline create button with reusable ListHeader component
- Add clearable select fields for better filter UX
- Update customer table to safely handle optional customer properties
- Add new CustomerStatus and CustomerType enums to support filtering options
- Improve table organization with proper imports and component structure
- Create new TenderListFilters component with title, status, and country code filter fields
- Add filter modal to TendersTable component with open/close state management
- Implement useForm hook in useTenderListPresenter for filter form handling
- Add ListHeader component with filter button to tender table
- Replace debounced search with URL search params-based filtering
- Integrate filter form submission with tender query parameters
- Add isMutating state tracking for loading indicator during filter operations
- Remove deprecated useDebounce hook and search state from presenter
- Improve filter UX with modal dialog and clear button functionality
Implement sanitizeHtmlWithStyles utility to safely render HTML content in notification messages while removing dangerous tags and attributes. Update NotificationDetailsCard to use dangerouslySetInnerHTML with sanitization for message display.
Added defensive programming by adding null checks for document object before accessing its properties and methods across multiple components (MultiSelect, ConfirmationModal, Dropdown, Modal). Also implemented lazy initialization for Firebase messaging to prevent SSR-related errors and ensure messaging is only initialized on the client side. These changes improve server-side rendering compatibility and prevent potential runtime errors.
- Commented out the "Contact Us" navigation item in sidebar data
- Removed unused navigation entry to clean up sidebar configuration
- Maintains existing navigation structure while reducing clutter
- Add support for initial data in all marketing wizard step components
- Update step presenters to accept and handle initial data
- Modify forwardRef implementations to include initialData prop
- Add TypeScript interfaces for step component props
- Improve type safety and data handling across marketing wizard steps
- Prepare components for edit and create workflows with consistent data management
- Implement CMS table with row listing and pagination
- Add delete functionality for CMS entries with confirmation modal
- Introduce edit button to navigate to edit page for specific CMS entry
- Update page type form to include new 'key' field for CMS entries
- Modify CMS service and types to support new data structure
- Enhance table presenter with additional actions and state management
Resolves data management and user interaction improvements for CMS module
- Move all marketing wizard components from `create/_components` to `_components` directory
- Update import paths in `create/page.tsx` to reflect new component locations
- Add countries constant to support country selection in page type configuration
- Minor formatting and cleanup of `.vscode/settings.json`
- Prepare for more modular and consistent component structure in marketing wizard
- Implement new edit marketing page with dynamic routing
- Update CMS and contact us table components with placeholder content
- Add new query hook for fetching CMS details by ID
- Modify CMS service to support fetching individual CMS details
- Update type definitions for CMS-related data structures
- Add initial breadcrumb navigation for edit marketing page
- Prepare infrastructure for future CMS editing functionality
- Add page type selection (company or organization) with dynamic form fields
- Implement conditional validation for company-specific fields (language, company name, country)
- Update HeroStep with URL pattern validation for GIF file input
- Modify page submission to include page type and related configuration data
- Enhance form handling with react-hook-form for page type configuration
- Add input groups and select components for page type configuration section
- Rename field names across step components for consistency
- Update chart step to use more generic data structure
- Modify input field names to follow consistent naming convention
- Refactor chart step to use key-value pairs instead of x-y coordinates
- Update form field names in multiple marketing wizard steps
- Improve type consistency and naming across marketing wizard components
- Add forwardRef to all marketing wizard step components
- Implement useImperativeHandle for consistent data collection across steps
- Remove redundant collectData static methods
- Add displayName to each component for better debugging
- Simplify data retrieval pattern using ref-based getData method
- Remove duplicate code and improve component consistency
- Ensure each step component follows the same structural pattern
- Moved all marketing wizard step components to `create/_components` directory
- Added `collectData` static method to each step component for data retrieval
- Reorganized file structure to improve component modularity
- Prepared steps for dynamic data collection in wizard workflow
- Added VSCode settings file for project configuration
- Introduced new CMS-related components and services
- Updated API endpoints and added new query hooks
This commit introduces a new "Contacts" section to the marketing page, which is now the fifth step in the page's flow.
Additionally, the Checkbox component has been enhanced with a smooth transition effect on state change. This provides better visual feedback and a more polished user experience.
When navigating between steps, the new content could appear below the fold, requiring the user to scroll up manually.
This change introduces an automatic smooth scroll to the top of the page whenever the user navigates to the next or previous step. This improves the user experience by ensuring the start of the new step's content is always visible.
Reduces code duplication in the marketing page forms by creating a generic `SectionStep` component. This new component encapsulates the shared UI and logic for sections that include a title, description, and a dynamic list of fields (e.g., feature cards, pricing points).
The `FeaturesStep` component has been refactored to use this new `SectionStep`, resulting in a much cleaner and more maintainable implementation.