oceanhelm 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oceanhelm.umd.js","sources":["../src/components/ConfigurableSidebar.vue","../src/components/VesselList.vue","../src/components/DashHead.vue","../src/components/OceanHelmMaintenance.vue","../src/components/ActivityLogs.vue","../src/components/CrewManagement.vue","../src/utils/sidebarConfig.js","../src/utils/permissions.js","../src/index.js"],"sourcesContent":["<template>\n <nav id=\"sidebar\" :class=\"sidebarClasses\">\n <!-- Logo Section -->\n <div class=\"logo d-flex align-items-center left\" v-if=\"showLogo\">\n <i :class=\"logoIcon\" class=\"me-2\"></i>\n <span>{{ brandName }}</span>\n </div>\n \n <!-- Navigation Items -->\n <ul class=\"list-unstyled components mt-4\">\n <li \n v-for=\"(item, index) in filteredMenuItems\" \n :key=\"index\"\n :class=\"{ 'active': item.active, 'dropdown': item.type === 'dropdown' }\"\n @click=\"handleItemClick(item)\"\n >\n <!-- Regular Link -->\n <a \n v-if=\"item.type === 'link'\" \n :href=\"item.href || '#'\"\n @click.prevent=\"handleNavigation(item)\"\n >\n <i :class=\"item.icon\" v-if=\"item.icon\"></i> \n {{ item.label }}\n </a>\n \n <!-- Button/Action -->\n <a \n v-else-if=\"item.type === 'button'\" \n @click.prevent=\"handleAction(item)\"\n style=\"cursor: pointer;\"\n >\n <i :class=\"item.icon\" v-if=\"item.icon\"></i> \n {{ item.label }}\n </a>\n \n <!-- Dropdown -->\n <template v-else-if=\"item.type === 'dropdown'\">\n <a \n class=\"dropdown-toggle\" \n type=\"button\" \n data-bs-toggle=\"dropdown\" \n aria-expanded=\"false\"\n >\n <i :class=\"item.icon\" v-if=\"item.icon\"></i> \n {{ item.label }}\n </a>\n <div class=\"dropdown-menu\" aria-labelledby=\"dropdownMenuLink\">\n <a \n v-for=\"(subItem, subIndex) in item.children\" \n :key=\"subIndex\"\n class=\"dropdown-item black\" \n @click.prevent=\"handleAction(subItem)\"\n style=\"cursor: pointer;\"\n >\n {{ subItem.label }}\n </a>\n </div>\n </template>\n \n <!-- Separator -->\n <div \n v-else-if=\"item.type === 'separator'\" \n class=\"dropdown-divider\"\n ></div>\n \n <!-- Static Text -->\n <a v-else-if=\"item.type === 'text'\">\n {{ item.label }}\n </a>\n </li>\n </ul>\n \n <!-- Custom Slot for Additional Content -->\n <slot name=\"footer\"></slot>\n </nav>\n </template>\n \n <script>\n export default {\n name: 'ConfigurableSidebar',\n \n props: {\n // Brand configuration\n brandName: {\n type: String,\n default: 'OceanHelm'\n },\n logoIcon: {\n type: String,\n default: 'bi bi-water'\n },\n showLogo: {\n type: Boolean,\n default: true\n },\n \n // Menu items configuration\n menuItems: {\n type: Array,\n required: true,\n default: () => []\n },\n \n // User profile for role-based filtering\n userProfile: {\n type: Object,\n default: () => ({})\n },\n \n // Sidebar behavior\n responsive: {\n type: Boolean,\n default: true\n },\n \n // Custom classes\n customClasses: {\n type: String,\n default: ''\n },\n \n // Permission checker function\n permissionChecker: {\n type: Function,\n default: null\n }\n },\n \n computed: {\n sidebarClasses() {\n return this.customClasses;\n },\n \n filteredMenuItems() {\n return this.menuItems.filter(item => this.hasPermission(item));\n }\n },\n \n mounted() {\n if (this.responsive) {\n this.initializeResponsiveBehavior();\n }\n },\n \n methods: {\n // Permission checking\n hasPermission(item) {\n // Use custom permission checker if provided\n if (this.permissionChecker) {\n return this.permissionChecker(item, this.userProfile);\n }\n \n // Default role-based checking\n if (!item.roles || item.roles.length === 0) {\n return true; // No role restriction\n }\n \n return item.roles.includes(this.userProfile.role);\n },\n \n // Navigation handling\n handleNavigation(item) {\n this.$emit('navigate', item);\n \n // Default behavior if no custom handler\n if (item.href && !item.preventDefault) {\n if (item.external) {\n window.open(item.href, '_blank');\n } else {\n this.$router?.push(item.href);\n }\n }\n },\n \n // Action handling\n handleAction(item) {\n this.$emit('action', item);\n },\n \n // Item click handling\n handleItemClick(item) {\n this.$emit('item-click', item);\n \n if (item.type === 'dropdown') {\n // Handle dropdown specific logic if needed\n }\n },\n \n // Responsive behavior\n initializeResponsiveBehavior() {\n const sidebarToggle = document.getElementById('sidebarToggle');\n const sidebar = document.getElementById('sidebar');\n const content = document.getElementById('content');\n \n if (!sidebarToggle || !sidebar || !content) return;\n \n // Initial state for desktop\n if (window.innerWidth >= 768) {\n sidebar.classList.toggle('active');\n content.classList.toggle('active');\n }\n \n // Toggle functionality\n sidebarToggle.addEventListener('click', () => {\n sidebar.classList.toggle('active');\n content.classList.toggle('active');\n });\n \n // Close sidebar on outside click (mobile)\n document.addEventListener('click', (event) => {\n const isClickInsideSidebar = sidebar.contains(event.target);\n const isClickOnToggleBtn = sidebarToggle.contains(event.target);\n \n if (!isClickInsideSidebar && !isClickOnToggleBtn && \n window.innerWidth < 768 && \n sidebar.classList.contains('active')) {\n sidebar.classList.remove('active');\n content.classList.remove('active');\n }\n });\n }\n },\n \n emits: ['navigate', 'action', 'item-click']\n }\n </script>\n \n <style scoped>\n .left {\n margin-left: 20px;\n }\n \n .black {\n color: black !important;\n }\n \n /* Add any other necessary styles */\n </style>","<template>\n <!-- Fleet Summary -->\n <div class=\"row mb-3\">\n <div class=\"col-md-4\">\n <div class=\"card border-0 shadow-sm\">\n <div class=\"card-body d-flex align-items-center\">\n <div class=\"rounded-circle bg-primary bg-opacity-10 p-3 me-3\">\n <i class=\"bi bi-check-circle-fill text-primary fs-4\"></i>\n </div>\n <div>\n <h6 class=\"mb-0\">Active Vessels</h6>\n <h3 class=\"mt-2 mb-0\">{{ activeVesselsCount }}</h3>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-4\">\n <div class=\"card border-0 shadow-sm\">\n <div class=\"card-body d-flex align-items-center\">\n <div class=\"rounded-circle bg-secondary bg-opacity-10 p-3 me-3\">\n <i class=\"bi bi-pause-circle-fill text-secondary fs-4\"></i>\n </div>\n <div>\n <h6 class=\"mb-0\">Inactive</h6>\n <h3 class=\"mt-2 mb-0\">{{ inactiveVesselsCount }}</h3>\n </div>\n </div>\n </div>\n </div>\n <!-- Register New Fleet -->\n <div class=\"col-md-4\" v-if=\"canAddVessel\">\n <div class=\"card border-0 shadow-sm\" @click=\"handleAddVessel\">\n <div class=\"card-body d-flex align-items-center\">\n <div class=\"rounded-circle bg-success bg-opacity-10 p-3 me-3\">\n <i class=\"bi bi-patch-plus-fill text-success fs-4\"></i>\n </div>\n <div>\n <h6 class=\"mb-0\">Add New Vessel</h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <h4 class=\"mb-4\"><i class=\"bi bi-ship me-2\"></i>Registered Vessels</h4>\n \n <!-- Loading State -->\n <div v-if=\"loading\" class=\"text-center py-4\">\n <div class=\"spinner-border text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n <p class=\"mt-2\">Loading vessels...</p>\n </div>\n \n <!-- Empty State -->\n <div v-else-if=\"!vessels.length\" class=\"alert alert-primary\" role=\"alert\">\n <h4 class=\"alert-heading\">Empty Fleet!</h4>\n <p>You have an empty fleet, you have not added any vessel yet.</p>\n <hr>\n <p class=\"mb-0\">Click on the add vessel button above, to start adding vessels to your fleet</p>\n </div>\n \n <!-- Vessel Cards -->\n <div v-else class=\"row\">\n <div class=\"col-lg-6\" v-for=\"vessel in vessels\" :key=\"vessel.registrationNumber || vessel.id\">\n <div class=\"vessel-card\" @click=\"handleVesselClick(vessel)\">\n <div class=\"card-body d-flex align-items-center\">\n <div class=\"vessel-icon left\">\n <i class=\"fas fa-ship\"></i>\n </div>\n <div class=\"flex-grow-1\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <h5 class=\"card-title mb-0\">{{ vessel.name }}</h5>\n <span :class=\"['vessel-status', statusClass(vessel.status)]\">{{ vessel.status }}</span>\n </div>\n <div class=\"row\">\n <div class=\"col-6\">\n <small class=\"text-muted\">Registration #:</small>\n <p class=\"mb-0\">{{ vessel.registrationNumber }}</p>\n </div>\n <div class=\"col-6\">\n <small class=\"text-muted\">Next Maintenance:</small>\n <p class=\"mb-0\">{{ vessel.nextMaintenance || 'Not scheduled' }}</p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"action-icon left delete\">\n <i class=\"bi bi-trash\" @click.stop=\"handleDeleteVessel(vessel)\"></i>\n </div>\n <button class=\"btn btn-primary\" @click.stop=\"handleToggleStatus(vessel)\">\n {{ vessel.status === 'Active' ? 'Mark Inactive' : 'Mark Active' }}\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: 'VesselList',\n \n props: {\n // Required props\n vessels: {\n type: Array,\n required: true,\n default: () => []\n },\n userProfile: {\n type: Object,\n required: true,\n default: () => ({ role: 'viewer', vessel: null })\n },\n \n // Optional props\n loading: {\n type: Boolean,\n default: false\n },\n currentRoute: {\n type: String,\n default: 'dashboard' // 'dashboard', 'maintenanceroute', 'crewroute'\n },\n \n // Configuration props\n config: {\n type: Object,\n default: () => ({\n enableAdd: true,\n enableEdit: true,\n enableDelete: true,\n enableStatusToggle: true,\n showCertifications: true\n })\n }\n },\n \n emits: [\n 'vessel-add',\n 'vessel-click', \n 'vessel-edit',\n 'vessel-delete',\n 'vessel-toggle-status',\n 'vessel-navigate',\n 'access-denied'\n ],\n \n computed: {\n activeVesselsCount() {\n return this.vessels.filter(vessel => vessel.status === \"Active\").length;\n },\n \n inactiveVesselsCount() {\n return this.vessels.filter(vessel => vessel.status === \"Inactive\").length;\n },\n \n canAddVessel() {\n return this.config.enableAdd && \n (this.userProfile.role === 'owner' || this.userProfile.role === 'staff');\n }\n },\n \n methods: {\n // Event handlers that emit to parent\n handleAddVessel() {\n if (!this.canAddVessel) {\n this.handleAccessDenied('add vessel');\n return;\n }\n this.$emit('vessel-add');\n },\n \n handleVesselClick(vessel) {\n const navigationData = {\n vessel,\n route: this.currentRoute,\n id: vessel.registrationNumber,\n name: vessel.name\n };\n \n if (this.currentRoute === 'dashboard') {\n this.$emit('vessel-click', vessel);\n } else {\n this.$emit('vessel-navigate', navigationData);\n }\n },\n \n handleDeleteVessel(vessel) {\n if (!this.grantAccess(vessel)) {\n this.handleAccessDenied('delete vessel');\n return;\n }\n \n if (!this.config.enableDelete) {\n return;\n }\n \n this.$emit('vessel-delete', vessel);\n },\n \n handleToggleStatus(vessel) {\n if (!this.grantAccess(vessel)) {\n this.handleAccessDenied('change vessel status');\n return;\n }\n \n if (!this.config.enableStatusToggle) {\n return;\n }\n \n this.$emit('vessel-toggle-status', vessel);\n },\n \n handleEditVessel(vessel) {\n if (!this.grantAccess(vessel)) {\n this.handleAccessDenied('edit vessel');\n return;\n }\n \n if (!this.config.enableEdit) {\n return;\n }\n \n this.$emit('vessel-edit', vessel);\n },\n \n handleAccessDenied(action) {\n this.$emit('access-denied', { action, userProfile: this.userProfile });\n },\n \n // Utility methods (keep these in component as they're UI-related)\n statusClass(status) {\n const normalized = status?.toLowerCase() || '';\n return `status-${normalized}`;\n },\n \n grantAccess(vessel) {\n const { role, vessel: userVessel } = this.userProfile;\n \n return role === 'owner' || \n role === 'staff' || \n (role === 'captain' && userVessel === vessel.name);\n },\n \n getDaysToExpiry(expiry_date) {\n if (!expiry_date) return null;\n \n const today = new Date();\n const expiry = new Date(expiry_date);\n const diffTime = expiry - today;\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n return diffDays;\n },\n\n getExpiryClass(expiry_date) {\n const days = this.getDaysToExpiry(expiry_date);\n if (days === null) return '';\n if (days < 30) return 'cert-critical';\n if (days < 90) return 'cert-warning';\n return '';\n }\n }\n}\n</script>\n\n<style>\n.left {\n margin-left: 20px;\n}\n\n.vessel-card {\n background: white;\n border-radius: 10px;\n box-shadow: 0 8px 16px rgba(0, 105, 192, 0.15);\n transition: all 0.3s ease;\n margin-bottom: 20px;\n overflow: hidden;\n border-left: 4px solid var(--accent-color);\n}\n\n.vessel-card:hover {\n transform: translateY(-5px);\n box-shadow: 0 12px 20px rgba(0, 105, 192, 0.2);\n}\n\n.vessel-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 50px;\n height: 50px;\n background-color: #e3f2fd;\n border-radius: 10px;\n color: var(--accent-color);\n font-size: 24px;\n margin-right: 15px;\n}\n\n.black {\n color: black !important;\n}\n\n.action-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border-radius: 20px;\n color: var(--accent-color);\n font-size: 16px;\n margin-right: 15px;\n margin-top: 20px;\n margin-bottom: 10px;\n}\n\n.delete {\n background-color: var(--danger);\n}\n\n.edit {\n background-color: var(--success);\n}\n\n.vessel-status {\n display: inline-block;\n padding: 5px 12px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.status-active {\n background-color: #e8f5e9;\n color: #2e7d32;\n}\n\n.status-maintenance {\n background-color: #fff8e1;\n color: #f57f17;\n}\n\n.status-inactive {\n background-color: #f5f5f5;\n color: #757575;\n}\n</style>","<template>\n <div class=\"page-header d-flex justify-content-between align-items-center\">\n <h2 style=\"margin-left: 20px;\">{{ name }}</h2>\n <div class=\"d-flex\">\n <button class=\"btn btn-outline-primary me-2\" @click=\"addUser()\" v-if=\"this.userProfile.role == 'owner'\">\n <i class=\"bi bi-bell\"></i>\n <span class=\"badge bg-danger\">1</span>\n </button>\n <button class=\"btn btn-outline-primary\" @click=\"loggedIn()\">\n <i class=\"bi bi-person-circle\"></i>\n </button>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: 'DashHead',\n \n props: {\n name: {\n type: String,\n required: true\n },\n userProfile: {\n type: Object,\n required: true,\n default: () => ({ role: 'viewer', vessel: null })\n }\n },\n\n emits: [\n 'add-user',\n 'logged-in'\n ],\n\n methods: {\n addUser() {\n this.$emit('add-user');\n },\n loggedIn() {\n this.$emit('logged-in');\n }\n }\n}\n</script>\n\n<style>\n.page-header {\n margin-bottom: 30px;\n border-bottom: 1px solid #e0e0e0;\n padding-bottom: 15px;\n}\n</style>","<template>\n <div v-if=\"ready\">\n <div>\n <nav v-show=\"!showReport\">\n <button v-for=\"section in sections\" :key=\"section.id\" class=\"nav-btn\"\n :class=\"{ active: activeSection === section.id }\" @click=\"handleSectionClick(section)\">\n {{ section.icon }} {{ section.name }}\n </button>\n </nav>\n \n <div class=\"content\" v-show=\"!showReport\">\n <!-- Maintenance Tasks Form -->\n <section :class=\"['form-section', { active: activeSection === 'maintenance' }]\"\n v-show=\"activeSection === 'maintenance'\">\n <h2>🛠️ Maintenance Tasks</h2>\n <!-- Loading indicator -->\n <div class=\"loading-container\" v-if=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n <p>Loading checklist...</p>\n </div>\n <form v-if=\"!isLoading\">\n <div class=\"container\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <h1>Maintenance Checklist</h1>\n <button v-if=\"showAddTaskButton\" class=\"btn btn-outline-custom\" @click.prevent=\"addTask()\">\n Manually Add Task\n <i class=\"fas fa-plus\"></i>\n </button>\n </div>\n\n <div class=\"progress-container\">\n <div class=\"progress-info\">\n Progress: {{ progress }}% ({{ completedCount.length }}/{{ checklists.length }})\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" :style=\"{ width: progress + '%' }\"></div>\n </div>\n </div>\n\n <ul class=\"checklist\">\n <li v-for=\"checklist in checklists\" :key=\"checklist.id\" class=\"checklist-item\">\n <div class=\"checkbox\" :class=\"{ 'checked': checklist.completed }\"\n @click=\"toggleTask(checklist)\">\n <span v-if=\"checklist.completed\">✓</span>\n </div>\n <span class=\"task-text\" :class=\"{ 'completed': checklist.completed }\"\n @click=\"toggleTask(checklist)\">\n {{ checklist.text }}\n </span>\n <button v-if=\"showAddTaskButton\" class=\"delete-btn\" @click=\"deleteTask(checklist.id)\"\n title=\"Delete task\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"3,6 5,6 21,6\"></polyline>\n <path\n d=\"m19,6v14a2,2 0 0,1 -2,2H7a2,2 0 0,1 -2,-2V6m3,0V4a2,2 0 0,1 2,-2h4a2,2 0 0,1 2,2v2\">\n </path>\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"></line>\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"></line>\n </svg>\n </button>\n </li>\n </ul>\n\n <div v-if=\"after\">\n <label>Upload Image Evidence</label>\n <ul class=\"checklist\">\n <li class=\"checklist-item\">\n <span class=\"task-text\">\n Image Evidence Already Uploaded\n </span>\n <button type=\"button\" class=\"delete-btn\" @click=\"deleteEvidence()\"\n title=\"Delete Image\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <polyline points=\"3,6 5,6 21,6\"></polyline>\n <path\n d=\"m19,6v14a2,2 0 0,1 -2,2H7a2,2 0 0,1 -2,-2V6m3,0V4a2,2 0 0,1 2,-2h4a2,2 0 0,1 2,2v2\">\n </path>\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"></line>\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"></line>\n </svg>\n </button>\n </li>\n </ul>\n </div>\n\n <div class=\"form-group\" v-else :key=\"refreshKey || 'default'\">\n <label>Upload Image Evidence</label>\n <p>You can only upload one image evidence here.</p>\n <div class=\"attachment-area\">\n <p>{{ fileText }}</p>\n <input type=\"file\" id=\"evidence-files\" class=\"file-input\" @change=\"handleImg\">\n <label for=\"evidence-files\" class=\"file-label\">Browse Files</label>\n </div>\n </div>\n\n <div class=\"status\" v-if=\"completedCount === checklists.length\">\n All tasks completed! ✅\n </div>\n\n <button class=\"reset-button\" @click.prevent=\"resetTasks\">{{ checklistButtonLabel }}</button>\n </div>\n </form>\n </section>\n\n <!-- Maintenance Schedule Form -->\n <section :class=\"['form-section', { active: activeSection === 'schedule' }]\"\n v-show=\"activeSection === 'schedule'\">\n <h2>📅 Maintenance Schedule</h2>\n <form>\n <div class=\"form-group\">\n <label for=\"task-name\">Task Name</label>\n <input type=\"text\" id=\"task-name\" v-model=\"form.taskName\" required>\n </div>\n\n <div class=\"form-group\">\n <label for=\"task-description\">Description</label>\n <textarea id=\"task-description\" v-model=\"form.description\" required></textarea>\n </div>\n\n <div class=\"input-group\">\n <div class=\"form-group\">\n <label for=\"maintenance-type\">Maintenance Type</label>\n <select id=\"maintenance-type\" v-model=\"form.maintenanceType\" required>\n <option value=\"\">-- Select Type --</option>\n <option value=\"preventive\">Preventive</option>\n <option value=\"corrective\">Corrective</option>\n <option value=\"predictive\">Predictive</option>\n <option value=\"condition\">Condition-Based</option>\n </select>\n </div>\n\n <div class=\"form-group\">\n <label for=\"component\">Component/System</label>\n <select id=\"component\" v-model=\"form.component\" required>\n <option value=\"\">-- Select Component --</option>\n <option value=\"engine\">Engine</option>\n <option value=\"hull\">Hull</option>\n <option value=\"electronics\">Electronics</option>\n <option value=\"deck\">Deck Machinery</option>\n <option value=\"plumbing\">Plumbing</option>\n <option value=\"electrical\">Electrical</option>\n <option value=\"hvac\">HVAC</option>\n <option value=\"safety\">Safety Systems</option>\n <option value=\"Other\">Other</option>\n </select>\n <input v-if=\"form.component === 'Other'\" type=\"text\"\n placeholder=\"Enter custom component/system\" v-model=\"form.customComponent\"\n style=\"margin-top: 8px;\">\n </div>\n </div>\n\n <div class=\"input-group\">\n <div class=\"form-group\">\n <label for=\"priority\">Priority</label>\n <select id=\"priority\" v-model=\"form.priority\" required>\n <option value=\"low\">Low</option>\n <option value=\"medium\">Medium</option>\n <option value=\"high\">High</option>\n <option value=\"critical\">Critical</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label for=\"status\">Status</label>\n <input type=\"text\" id=\"status\" v-model=\"form.status\" readonly>\n </div>\n </div>\n\n <div class=\"input-group\">\n <div class=\"form-group\">\n <label for=\"estimated-hours\">Estimated Hours</label>\n <input type=\"number\" id=\"estimated-hours\" v-model=\"form.estimatedHours\" min=\"0\" step=\"0.5\">\n </div>\n </div>\n\n <div class=\"form-group\">\n <label for=\"assigned-to\">Assigned To</label>\n <select id=\"assigned-to\" v-model=\"form.assignedTo\">\n <option value=\"\">-- Select Personnel --</option>\n <option v-for=\"member in vesselCrew\" :key=\"member.id\"\n :value=\"`${member.name} - ${member.role}`\">\n {{ member.name }} - {{ member.role }}\n </option>\n </select>\n </div>\n\n <div class=\"input-group\">\n <div class=\"form-group\">\n <label for=\"recurrence-type\">Recurrence</label>\n <select id=\"recurrence-type\" v-model=\"form.recurrence\" required>\n <option value=\"once\">One-time</option>\n <option value=\"daily\">Daily</option>\n <option value=\"weekly\">Weekly</option>\n <option value=\"monthly\">Monthly</option>\n <option value=\"quarterly\">Quarterly</option>\n <option value=\"semi-annual\">Semi-annually</option>\n <option value=\"annual\">Annually</option>\n <option value=\"custom\">Custom Interval</option>\n </select>\n </div>\n </div>\n\n <div class=\"input-group\">\n <div class=\"form-group\">\n <label for=\"last-performed\">Last Performed Date</label>\n <input type=\"date\" id=\"last-performed\" v-model=\"form.lastPerformed\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"next-due\">Due Date</label>\n <input type=\"date\" id=\"next-due\" v-model=\"form.nextDue\" required>\n </div>\n </div>\n\n <div class=\"form-group\">\n <label>Notifications</label>\n <div class=\"checkbox-group\">\n <div class=\"checkbox-item\">\n <input type=\"checkbox\" id=\"notify-email\" v-model=\"form.notifyEmail\">\n <label for=\"notify-email\">Email Notification</label>\n </div>\n <div class=\"checkbox-item\">\n <input type=\"checkbox\" id=\"notify-sms\" v-model=\"form.notifySms\">\n <label for=\"notify-sms\">SMS Notification</label>\n </div>\n </div>\n </div>\n\n <div class=\"input-group\">\n <div class=\"form-group\">\n <label for=\"reminder-days\">Reminder (Days Before)</label>\n <select id=\"reminder-days\" v-model=\"form.reminderDays\">\n <option value=\"1\">1 day</option>\n <option value=\"3\">3 days</option>\n <option value=\"7\">1 week</option>\n <option value=\"14\">2 weeks</option>\n <option value=\"30\">1 month</option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group\">\n <label for=\"schedule-notes\">Notes</label>\n <textarea id=\"schedule-notes\" v-model=\"form.notes\"></textarea>\n </div>\n\n <div class=\"form-group\">\n <label>Attachments</label>\n <div class=\"attachment-area\">\n <p>{{ imgText }}</p>\n <input type=\"file\" id=\"maintenance-files\" class=\"file-input\" @change=\"handleFiles\" multiple>\n <label for=\"maintenance-files\" class=\"file-label\">Browse Files</label>\n </div>\n </div>\n\n <div class=\"action-buttons\">\n <button type=\"button\" class=\"btn btn-primary\" @click.prevent=\"saveSchedule\"\n :disabled=\"isSaving\">\n {{ isSaving ? 'Saving...' : 'Save Schedule' }}\n </button>\n </div>\n </form>\n </section>\n\n <!-- Inventory Form -->\n <section :class=\"['form-section', { active: activeSection === 'inventory' }]\"\n v-show=\"activeSection === 'inventory'\">\n <h2>All Maintenance</h2>\n <div class=\"task-table-wrapper\">\n <!-- Filters and Controls -->\n <div class=\"table-controls\">\n <div class=\"filters\">\n <button :class=\"{ active: activeFilter === 'due' }\" @click=\"setFilter('due')\">Due</button>\n <button :class=\"{ active: activeFilter === 'all' }\" @click=\"setFilter('all')\">All</button>\n <button :class=\"{ active: activeFilter === 'completed' }\"\n @click=\"setFilter('completed')\">Completed</button>\n <input type=\"text\" v-model=\"searchQuery\" placeholder=\"Search...\" />\n </div>\n </div>\n\n <!-- Task Table -->\n <table class=\"task-table\">\n <thead>\n <tr>\n <th>Equipment</th>\n <th>Task Name</th>\n <th>Assigned To</th>\n <th>Intervals</th>\n <th>Remaining</th>\n <th>Next Due</th>\n <th>Status</th>\n <th>Action</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"task in filteredTasks\" :key=\"task.id\">\n <td>{{ task.component }}</td>\n <td>{{ task.taskName }}</td>\n <td>{{ task.assignedTo }}</td>\n <td>{{ task.recurrence }}</td>\n <td>{{ task.remainingDays }}</td>\n <td>{{ task.nextDue }}</td>\n <td>\n <span :class=\"['status-badge', task.status.toLowerCase().replace(' ', '-')]\">\n {{ task.status }}\n </span>\n </td>\n <td>\n <button @click=\"printMaintenance(task.component)\" v-if=\"task.status === 'Completed'\"\n class=\"status-action\">Print</button>\n <button @click=\"showMaintenance(task.component)\" v-else\n class=\"status-action\">Start</button>\n </td>\n </tr>\n </tbody>\n </table>\n\n <!-- Empty schedule -->\n <div v-if=\"!tasks.length\">\n <div class=\"alert alert-primary\" role=\"alert\">\n <h4 class=\"alert-heading\">Such Empty!!!</h4>\n <p>You have no maintenance, because you have not scheduled any for this ship.</p>\n <hr>\n <p class=\"mb-0\">Navigate to the schedule tab, to start scheduling. Or click on this button\n to\n <button type=\"button\" class=\"btn btn-primary\"\n @click=\"switchSchedule()\">Schedule</button>\n </p>\n </div>\n </div>\n </div>\n </section>\n </div>\n\n <div class=\"report-container\" ref=\"reportContainer\" v-show=\"showReport\">\n <div class=\"header\">\n <div class=\"report-title\">MAINTENANCE TASK REPORT</div>\n </div>\n\n <div class=\"report-info\">\n <div class=\"info-box\">\n <div class=\"info-label\">Report Generated:</div>\n <div>{{ reportDate }}</div>\n </div>\n <div class=\"info-box\">\n <div class=\"info-label\">Report ID:</div>\n <div>{{ reportId }}</div>\n </div>\n <div class=\"info-box\">\n <div class=\"info-label\">Total Tasks:</div>\n <div>{{ maintenanceTasks.length }}</div>\n </div>\n <div class=\"info-box\">\n <div class=\"info-label\">Generated By:</div>\n <div>OceanHelm System</div>\n </div>\n </div>\n\n <div class=\"section\">\n <div class=\"section-title\">📊 Task Summary</div>\n <div class=\"summary-grid\">\n <div class=\"summary-card\">\n <div class=\"summary-number\">1</div>\n <div class=\"summary-label\">Completed</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-number\">0</div>\n <div class=\"summary-label\">Pending</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-number\">0</div>\n <div class=\"summary-label\">Overdue</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-number\">{{ totalEstimatedHours }}</div>\n <div class=\"summary-label\">Total Hours</div>\n </div>\n </div>\n </div>\n\n <div class=\"section\">\n <div class=\"section-title\">🔧 Maintenance Tasks</div>\n <div v-for=\"task in maintenanceTasks\" :key=\"task.taskName\"\n :class=\"['task-item', getTaskStatusClass(task)]\">\n\n <div class=\"task-header\">\n <div>\n <div class=\"task-title\">\n {{ task.taskName }}\n <span :class=\"['maintenance-type', 'type-' + task.maintenanceType]\">\n {{ task.maintenanceType }}\n </span>\n </div>\n <div class=\"task-component\">Component: {{ task.component }}</div>\n </div>\n <span :class=\"['status-badge', 'status-' + task.status.toLowerCase().replace(' ', '-')]\">\n {{ task.status }}\n </span>\n </div>\n\n <div class=\"task-details\">\n <div class=\"detail-item\">\n <div class=\"detail-label\">Assigned To</div>\n <div class=\"detail-value\">{{ task.assignedTo }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Estimated Hours</div>\n <div class=\"detail-value\">{{ task.estimatedHours }} hours</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Last Performed</div>\n <div class=\"detail-value\">{{ formatDate(task.lastPerformed) }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Next Due</div>\n <div class=\"detail-value\">{{ formatDate(task.nextDue) }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Recurrence</div>\n <div class=\"detail-value\">{{ task.recurrence }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Remaining Days</div>\n <div class=\"detail-value\">{{ task.remainingDays }} days</div>\n </div>\n </div>\n\n <div v-if=\"task.description\"\n style=\"margin: 15px 0; padding: 10px; background: white; border-radius: 5px;\">\n <div class=\"detail-label\">Description</div>\n <div class=\"detail-value\">{{ task.description }}</div>\n </div>\n\n <div v-if=\"task.notes\"\n style=\"margin: 15px 0; padding: 10px; background: white; border-radius: 5px;\">\n <div class=\"detail-label\">Notes</div>\n <div class=\"detail-value\">{{ task.notes }}</div>\n </div>\n\n <div v-if=\"task.checklistProgress && task.checklistProgress.length > 0\" class=\"checklist-progress\">\n <div class=\"detail-label\">Checklist Progress</div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" :style=\"{ width: getChecklistProgress(task) + '%' }\"></div>\n </div>\n <div style=\"font-size: 0.9em; color: #666; margin-top: 5px;\">\n {{ getCompletedChecklistItems(task) }} of {{ task.checklistProgress.length }} items\n completed\n ({{ getChecklistProgress(task) }}%)\n </div>\n <div class=\"checklist-items\">\n <div v-for=\"(item, index) in task.checklistProgress\" :key=\"index\" class=\"checklist-item\">\n <span class=\"checklist-icon\">{{ item.completed ? '✅' : '⭕' }}</span>\n <span>{{ item.text || 'Checklist Item ' + (index + 1) }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"section\">\n <div class=\"section-title\">📋 Recommendations</div>\n <div class=\"info-box\">\n <ul>\n <li v-for=\"recommendation in generateRecommendations()\" :key=\"recommendation\">\n {{ recommendation }}\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"signature-section\">\n <div class=\"signature-box\">\n <div><strong>Report Generated By</strong></div>\n <div style=\"margin-top: 10px; color: #666;\">OceanHelm Maintenance System</div>\n </div>\n <div class=\"signature-box\">\n <div><strong>Date</strong></div>\n <div style=\"margin-top: 10px; color: #666;\">{{ reportDate }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: 'OceanHelmMaintenance',\n props: {\n vesselInfo: {\n type: Object,\n required: true\n },\n tasks: {\n type: Array,\n default: () => []\n },\n vesselCrew: {\n type: Array,\n default: () => []\n },\n companyInfo: {\n type: Object,\n default: () => ({})\n },\n userProfile: {\n type: Object,\n required: true\n }\n },\n emits: [\n 'dashboard-navigate',\n 'load-checklist',\n 'save-schedule',\n 'update-task',\n 'upload-file',\n 'delete-evidence',\n 'access-denied',\n 'show-message',\n 'generate-checklist'\n ],\n data() {\n return {\n ready: true,\n isSaving: false,\n after: null,\n lastSection: '',\n currentTask: '',\n imgText: 'Choose file to upload',\n fileText: 'Drag and drop files here or',\n fileattachments: {},\n refreshKey: 0,\n activeSection: 'inventory',\n sections: [\n { id: 'schedule', name: 'Schedule', icon: '📅' },\n { id: 'inventory', name: 'All Maintenance', icon: '♻️' },\n {\n id: 'dashboard', \n name: 'Dashboard', \n icon: '☰', \n onClick: () => this.$emit('dashboard-navigate')\n }\n ],\n activeFilter: 'all',\n searchQuery: '',\n checklists: [],\n isLoading: false,\n form: {\n taskName: '',\n description: '',\n maintenanceType: '',\n component: '',\n priority: '',\n dueDate: '',\n estimatedHours: null,\n assignedTo: '',\n recurrence: '',\n lastPerformed: '',\n nextDue: '',\n notifyEmail: true,\n notifySms: true,\n reminderDays: '1',\n estimatedDuration: null,\n notes: '',\n status: 'Soon',\n email: '',\n remainingDays: null,\n attachments: {}\n },\n maintenanceTasks: [],\n showReport: false,\n reportDate: new Date().toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n }),\n reportId: 'MT-' + Math.random().toString(36).substr(2, 9).toUpperCase(),\n };\n },\n watch: {\n 'form.lastPerformed': 'calculateNextDue',\n 'form.recurrence': 'calculateNextDue',\n 'form.nextDue': function (newDate) {\n this.calculateRemainingDays();\n }\n },\n computed: {\n filteredTasks() {\n let result = [...this.tasks];\n if (this.activeFilter === 'all') {\n result = result.filter(task => task.status === 'Overdue' || task.status === 'Soon' || task.status === 'Completed');\n }\n else if (this.activeFilter === 'due') {\n result = result.filter(task => task.status === 'Overdue' || task.status === 'Soon');\n } else if (this.activeFilter === 'completed') {\n result = result.filter(task => task.status === 'Completed');\n }\n\n if (this.searchQuery) {\n const query = this.searchQuery.toLowerCase();\n result = result.filter(task =>\n task.component.toLowerCase().includes(query) ||\n task.taskName.toLowerCase().includes(query) ||\n task.assignedTo.toLowerCase().includes(query)\n );\n }\n\n return result;\n },\n completedCount() {\n return this.checklists.filter(item => item.completed);\n },\n progress() {\n return Math.round((this.completedCount.length / this.checklists.length) * 100);\n },\n checklistButtonLabel() {\n return this.lastSection === 'schedule' ? 'Approve Maintenance' : 'Save Checklist';\n },\n showAddTaskButton() {\n return this.checklistButtonLabel !== 'Save Checklist';\n },\n totalEstimatedHours() {\n return this.maintenanceTasks.reduce((total, task) => total + (task.estimatedHours || 0), 0);\n },\n },\n methods: {\n grantAccess(vessel) {\n const profile = this.userProfile;\n return profile.role === 'owner' || \n profile.role === 'staff' || \n (profile.role === 'captain' && profile.vessel === vessel);\n },\n deepAccess() {\n const profile = this.userProfile;\n if (profile.role === 'owner' || profile.role === 'captain') {\n return true;\n } else {\n this.$emit('access-denied', 'You do not have access to do this');\n return false;\n }\n },\n deleteTask(taskId) {\n this.checklists = this.checklists.filter(checklist => checklist.id !== taskId);\n },\n addTask(event) {\n if (event) event.preventDefault();\n \n this.$emit('show-message', {\n type: 'prompt',\n title: 'Add New Task',\n message: 'Enter the task details',\n callback: (result) => {\n if (result) {\n const newTask = {\n id: Date.now(),\n text: result,\n completed: false\n };\n this.checklists.push(newTask);\n }\n }\n });\n },\n setFilter(filter) {\n this.activeFilter = filter;\n },\n loadChecklist(taskComponent) {\n this.isLoading = true;\n this.$emit('generate-checklist', {\n component: taskComponent,\n callback: (checklist) => {\n this.checklists = checklist.map(item => ({\n ...item,\n completed: false\n }));\n this.isLoading = false;\n }\n });\n },\n showMaintenance(taskComponent) {\n if (this.deepAccess()) {\n const task = this.tasks.find(t => t.component === taskComponent);\n\n if (task && task.checklistProgress) {\n this.checklists = [...task.checklistProgress];\n } else {\n this.loadChecklist(taskComponent);\n }\n\n this.after = task?.after;\n this.currentTask = taskComponent;\n this.lastSection = 'inventory';\n this.activeSection = 'maintenance';\n }\n },\n printMaintenance(taskComponent) {\n const task = this.tasks.find(t => t.component === taskComponent);\n this.maintenanceTasks = [task];\n this.loadMaintenanceData();\n\n this.showReport = true;\n\n this.$nextTick(() => {\n setTimeout(() => {\n window.print();\n this.showReport = false;\n }, 100);\n });\n },\n switchSchedule() {\n if (this.deepAccess()) {\n this.activeSection = 'schedule';\n }\n },\n handleFiles(event) {\n this.imgText = event.target.files[0].name;\n this.form.attachments = {\n file: event.target.files[0]\n };\n },\n handleImg(event) {\n this.fileText = event.target.files[0].name;\n this.fileattachments = {\n file: event.target.files[0]\n };\n },\n validateForm() {\n const requiredFields = [\n 'taskName',\n 'description',\n 'maintenanceType',\n 'component',\n 'priority',\n 'estimatedHours',\n 'recurrence',\n 'lastPerformed',\n 'assignedTo'\n ];\n\n for (const field of requiredFields) {\n if (!this.form[field]) {\n this.$emit('show-message', {\n type: 'error',\n title: 'Missing info',\n message: `Please fill in the required field: ${field}`\n });\n return false;\n }\n }\n\n return true;\n },\n handleSectionClick(section) {\n this.activeSection = section.id;\n if (typeof section.onClick === 'function') {\n section.onClick();\n }\n },\n calculateNextDue() {\n const date = this.form.lastPerformed ? new Date(this.form.lastPerformed) : null;\n const recurrence = this.form.recurrence;\n\n if (!date || !recurrence) return;\n\n let nextDate = new Date(date);\n\n switch (recurrence) {\n case 'daily':\n nextDate.setDate(nextDate.getDate() + 1);\n break;\n case 'weekly':\n nextDate.setDate(nextDate.getDate() + 7);\n break;\n case 'monthly':\n nextDate.setMonth(nextDate.getMonth() + 1);\n break;\n case 'quarterly':\n nextDate.setMonth(nextDate.getMonth() + 3);\n break;\n case 'semi-annual':\n nextDate.setMonth(nextDate.getMonth() + 6);\n break;\n case 'annual':\n nextDate.setFullYear(nextDate.getFullYear() + 1);\n break;\n case 'once':\n case 'custom':\n return;\n }\n\n this.form.nextDue = nextDate.toISOString().split('T')[0];\n },\n calculateRemainingDays() {\n if (!this.form.nextDue) {\n this.form.remainingDays = null;\n return;\n }\n\n const today = new Date();\n const nextDueDate = new Date(this.form.nextDue);\n\n today.setHours(0, 0, 0, 0);\n nextDueDate.setHours(0, 0, 0, 0);\n\n const diffTime = nextDueDate - today;\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\n this.form.remainingDays = `${diffDays} Days`;\n },\n async saveSchedule() {\n this.isSaving = true;\n \n if (!this.validateForm()) {\n this.isSaving = false;\n return;\n }\n\n const taskData = { ...this.form };\n\n if (this.form.component === 'Other' && this.form.customComponent) {\n taskData.component = this.form.customComponent;\n }\n\n taskData.email = this.companyInfo.email;\n\n // Check for duplicate component\n const hasDuplicateComponent = this.tasks.some(task => task.component === taskData.component);\n\n if (hasDuplicateComponent) {\n this.$emit('show-message', {\n type: 'error',\n title: 'Duplicate Component',\n message: `A task with the component \"${taskData.component}\" already exists in maintenance`\n });\n this.isSaving = false;\n return;\n }\n\n delete taskData.customComponent;\n\n this.$emit('save-schedule', {\n taskData,\n file: taskData.attachments.file,\n callback: (success) => {\n this.isSaving = false;\n if (success) {\n this.loadChecklist(taskData.component);\n this.lastSection = 'schedule';\n this.currentTask = taskData.component;\n this.resetForm();\n this.activeSection = 'maintenance';\n }\n }\n });\n },\n resetForm() {\n this.form = {\n taskName: '',\n description: '',\n maintenanceType: '',\n component: '',\n priority: '',\n dueDate: '',\n estimatedHours: null,\n assignedTo: '',\n recurrence: '',\n lastPerformed: '',\n nextDue: '',\n notifyEmail: true,\n notifySms: true,\n reminderDays: '1',\n estimatedDuration: null,\n notes: '',\n status: 'Soon',\n remainingDays: null,\n attachments: {}\n };\n },\n toggleTask(task) {\n task.completed = !task.completed;\n },\n async resetTasks() {\n const allCompleted = this.checklists.every(item => item.completed);\n const status = allCompleted ? 'Completed' : 'In Progress';\n \n const updateData = {\n checklistProgress: [...this.checklists],\n status,\n component: this.currentTask,\n after: this.after\n };\n\n this.$emit('update-task', {\n updateData,\n file: this.fileattachments.file,\n callback: (success, updatedAfter) => {\n if (success) {\n if (updatedAfter) {\n this.after = updatedAfter;\n }\n this.fileattachments = {};\n this.fileText = 'Drag and drop files here or';\n this.refreshKey += 1;\n this.activeSection = 'inventory';\n }\n }\n });\n },\n loadMaintenanceData() {\n this.reportId = 'MT-' + Math.random().toString(36).substr(2, 9).toUpperCase();\n this.reportDate = new Date().toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n });\n },\n formatDate(dateString) {\n if (!dateString) return 'N/A';\n return new Date(dateString).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n },\n getTaskStatusClass(task) {\n if (task.status === 'Completed') return 'completed';\n if (task.status === 'Overdue') return 'overdue';\n if (task.status === 'In Progress') return 'in-progress';\n return 'pending';\n },\n getChecklistProgress(task) {\n if (!task.checklistProgress || task.checklistProgress.length === 0) return 0;\n const completed = task.checklistProgress.filter(item => item.completed).length;\n return Math.round((completed / task.checklistProgress.length) * 100);\n },\n getCompletedChecklistItems(task) {\n if (!task.checklistProgress) return 0;\n return task.checklistProgress.filter(item => item.completed).length;\n },\n generateRecommendations() {\n return [\n 'Maintain regular communication with assigned technicians',\n 'Ensure all safety protocols are followed during maintenance activities',\n 'Update task progress and notes in real-time for accurate reporting'\n ];\n },\n deleteEvidence() {\n this.$emit('delete-evidence', {\n currentTask: this.currentTask,\n callback: (success) => {\n if (success) {\n this.after = null;\n this.fileText = 'Drag and drop files here or';\n this.fileattachments = {};\n this.refreshKey += 1;\n }\n }\n });\n }\n }\n};\n</script>\n\n<style>\n.progress-container {\n margin-bottom: 20px;\n}\n\n.progress-bar {\n background-color: #e9ecef;\n border-radius: 4px;\n height: 10px;\n margin-top: 8px;\n}\n\n.progress-fill {\n background-color: #00a8e8;\n height: 100%;\n border-radius: 4px;\n transition: width 0.3s ease;\n}\n\n.checklist {\n list-style-type: none;\n padding: 0;\n}\n\n.checklist-item {\n display: flex;\n align-items: center;\n padding: 10px 0;\n border-bottom: 1px solid #eee;\n cursor: pointer;\n}\n\n.checkbox {\n margin-right: 15px;\n width: 20px;\n height: 20px;\n border: 2px solid #00a8e8;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.checkbox.checked {\n background-color: #00a8e8;\n color: white;\n}\n\n.task-text {\n flex-grow: 1;\n}\n\n.task-text.completed {\n text-decoration: line-through;\n color: #6c757d;\n}\n\n.status {\n margin-top: 20px;\n font-weight: bold;\n text-align: center;\n}\n\n.reset-button {\n background-color: #005792;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n margin-top: 20px;\n font-weight: bold;\n}\n\n.btn-outline-custom {\n color: #005792;\n /* your custom text color */\n border: 2px solid #005792;\n /* your custom border color */\n background-color: transparent;\n padding: 8px 16px;\n border-radius: 4px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.3s, color 0.3s;\n}\n\n.btn-outline-custom:hover {\n background-color: #005792;\n /* custom hover background */\n color: white;\n /* text color on hover */\n}\n\n.reset-button:hover {\n background-color: #003d5b;\n}\n\nheader {\n background-color: var(--maitprimary);\n color: white;\n padding: 1rem;\n text-align: center;\n border-radius: 5px 5px 0 0;\n}\n\nnav {\n background-color: var(--maitsecondary);\n padding: 10px;\n display: flex;\n justify-content: center;\n}\n\nnav button {\n background-color: var(--maitsecondary);\n color: white;\n border: none;\n padding: 10px 20px;\n margin: 0 5px;\n cursor: pointer;\n font-weight: bold;\n border-radius: 3px;\n transition: background-color 0.3s;\n}\n\nnav button:hover,\nnav button.active {\n background-color: var(--maitprimary);\n}\n\n.content {\n background-color: white;\n padding: 20px;\n border-radius: 0 0 5px 5px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n}\n\nh2 {\n color: var(--dark);\n margin-bottom: 20px;\n border-bottom: 2px solid var(--light);\n padding-bottom: 10px;\n}\n\n.form-section {\n display: none;\n animation: fadeIn 0.5s;\n}\n\n.form-section.active {\n display: block;\n}\n\n.form-row {\n margin-bottom: 15px;\n}\n\n.form-group {\n margin-bottom: 20px;\n}\n\nlabel {\n display: block;\n margin-bottom: 5px;\n font-weight: bold;\n color: var(--dark);\n}\n\ninput,\nselect,\ntextarea {\n width: 100%;\n padding: 10px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 16px;\n}\n\n.input-group {\n display: flex;\n gap: 10px;\n}\n\n.input-group>div {\n flex: 1;\n}\n\ntextarea {\n height: 120px;\n resize: vertical;\n}\n\n.btn {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n transition: background-color 0.3s;\n}\n\n.btn-primary {\n background-color: var(--maitprimary);\n color: white;\n}\n\n.btn-primary:hover {\n background-color: var(--dark);\n}\n\n.btn-success {\n background-color: var(--success);\n color: white;\n}\n\n.btn-success:hover {\n background-color: #219653;\n}\n\n.action-buttons {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n margin-top: 20px;\n}\n\n.status-badge {\n display: inline-block;\n padding: 5px 10px;\n border-radius: 15px;\n font-size: 14px;\n font-weight: bold;\n color: white;\n}\n\n.status-pending {\n background-color: var(--warning);\n}\n\n.status-progress {\n background-color: var(--accent);\n}\n\n.status-completed {\n background-color: var(--success);\n}\n\n.attachment-area {\n border: 2px dashed #ddd;\n padding: 20px;\n text-align: center;\n border-radius: 5px;\n margin-bottom: 20px;\n}\n\n.file-input {\n display: none;\n}\n\n.file-label {\n display: inline-block;\n padding: 10px 20px;\n background-color: var(--accent);\n color: white;\n border-radius: 4px;\n cursor: pointer;\n transition: background-color 0.3s;\n}\n\n.file-label:hover {\n background-color: var(--maitsecondary);\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n.form-section h3 {\n margin-top: 30px;\n margin-bottom: 15px;\n color: var(--maitsecondary);\n}\n\n.checkbox-group {\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n margin-top: 10px;\n}\n\n.checkbox-item {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.checkbox-item input {\n width: auto;\n}\n\n.status-badge {\n padding: 0.3em 0.6em;\n border-radius: 4px;\n color: white;\n font-weight: bold;\n font-size: 0.85rem;\n}\n\n.status-action {\n padding: 0.3em 0.6em;\n border-radius: 4px;\n color: white;\n font-weight: bold;\n font-size: 0.85rem;\n background-color: var(--maitprimary);\n}\n\n.status-badge.overdue {\n background-color: red;\n}\n\n.status-badge.soon {\n background-color: orange;\n}\n\n/* Wrapper layout */\n.task-table-wrapper {\n font-family: 'Inter', sans-serif;\n padding: 1rem;\n}\n\n/* Controls section */\n.table-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1rem;\n flex-wrap: wrap;\n gap: 1rem;\n}\n\n.filters {\n display: flex;\n gap: 0.5rem;\n flex-wrap: wrap;\n}\n\n.filters button,\n.filters input {\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: 1px solid #ccc;\n background-color: #f5f5f5;\n font-weight: 500;\n cursor: pointer;\n}\n\n.filters button.active {\n background-color: #002f6c;\n color: white;\n}\n\n.filters input {\n border: 1px solid #bbb;\n}\n\n.filter-badge {\n background-color: #eee;\n color: #333;\n}\n\n/* Print and Add buttons */\n.table-controls>div:last-child button {\n padding: 0.5rem 1rem;\n border: 1px solid var(--maitprimary);\n border-radius: 6px;\n background-color: white;\n color: var(--maitprimary);\n ;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.2s;\n}\n\n.table-controls>div:last-child button:last-child {\n background-color: var(--maitprimary);\n ;\n color: white;\n}\n\n/* Table */\n.task-table {\n width: 100%;\n border-collapse: collapse;\n box-shadow: 0 0 0 1px #ccc;\n}\n\n.task-table thead {\n background-color: var(--maitprimary);\n ;\n color: white;\n}\n\n.task-table th,\n.task-table td {\n padding: 0.75rem;\n text-align: left;\n border-bottom: 1px solid #eee;\n white-space: pre-line;\n /* so \\n works */\n}\n\n.task-table tbody tr:hover {\n background-color: #f9f9f9;\n}\n\n/* Status badges */\n.status-badge {\n padding: 0.3em 0.6em;\n border-radius: 6px;\n font-weight: bold;\n font-size: 0.85rem;\n color: white;\n display: inline-block;\n text-align: center;\n min-width: 90px;\n}\n\n.status-badge.complete {\n background-color: #4dffd0;\n}\n\n.status-badge.soon {\n background-color: #ffa500;\n}\n\n.status-badge.completed {\n background-color: #4caf50;\n}\n\n.delete-btn {\n background: none;\n border: none;\n color: #dc3545;\n cursor: pointer;\n padding: 6px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n opacity: 1;\n margin-left: 8px;\n flex-shrink: 0;\n transform: scale(1.1);\n}\n\n.checklist-item:hover .delete-btn {\n opacity: 1;\n}\n\n.delete-btn:hover {\n background-color: #dc3545;\n color: white;\n transform: scale(1.1);\n}\n\n.delete-btn:active {\n transform: scale(0.95);\n}\n\n.print-only-container {\n text-align: center;\n}\n\n.initial-print-btn {\n background: linear-gradient(135deg, #0066cc, #004499);\n color: white;\n border: none;\n padding: 20px 40px;\n font-size: 1.3em;\n border-radius: 12px;\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 6px 20px rgba(0, 102, 204, 0.3);\n display: flex;\n align-items: center;\n gap: 15px;\n margin: 0 auto;\n}\n\n.initial-print-btn:hover {\n background: linear-gradient(135deg, #004499, #003366);\n transform: translateY(-3px);\n box-shadow: 0 8px 25px rgba(0, 102, 204, 0.4);\n}\n\n.initial-print-btn:active {\n transform: translateY(0);\n}\n\n.company-branding {\n margin-bottom: 30px;\n}\n\n.company-logo {\n font-size: 3em;\n font-weight: bold;\n color: #0066cc;\n margin-bottom: 10px;\n}\n\n.company-tagline {\n font-size: 1.1em;\n color: #666;\n}\n\n/* Report Styles - Hidden Initially */\n.report-container {\n display: none;\n max-width: 900px;\n margin: 0 auto;\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);\n}\n\n.header {\n text-align: center;\n border-bottom: 3px solid #0066cc;\n padding-bottom: 20px;\n margin-bottom: 30px;\n}\n\n.report-logo {\n font-size: 2.5em;\n font-weight: bold;\n color: #0066cc;\n margin-bottom: 10px;\n}\n\n.report-title {\n font-size: 1.8em;\n color: #333;\n margin: 10px 0;\n}\n\n.report-info {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.info-box {\n background: #f8f9fa;\n padding: 15px;\n border-radius: 8px;\n border-left: 4px solid #0066cc;\n}\n\n.info-box ul li {\n margin-left: 15px;\n}\n\n.info-label {\n font-weight: bold;\n color: #0066cc;\n margin-bottom: 5px;\n}\n\n.section {\n margin-bottom: 30px;\n}\n\n.section-title {\n font-size: 1.3em;\n font-weight: bold;\n color: #0066cc;\n border-bottom: 2px solid #e9ecef;\n padding-bottom: 10px;\n margin-bottom: 15px;\n}\n\n.task-item {\n background: #f8f9fa;\n margin: 15px 0;\n padding: 20px;\n border-radius: 8px;\n border-left: 4px solid #28a745;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n}\n\n.task-item.pending {\n border-left-color: #ffc107;\n}\n\n.task-item.overdue {\n border-left-color: #dc3545;\n}\n\n.task-item.in-progress {\n border-left-color: #17a2b8;\n}\n\n.task-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 15px;\n flex-wrap: wrap;\n gap: 10px;\n}\n\n.task-title {\n font-size: 1.2em;\n font-weight: bold;\n color: #333;\n}\n\n.task-component {\n font-size: 0.9em;\n color: #666;\n margin-top: 5px;\n}\n\n.status-badge {\n display: inline-block;\n padding: 6px 12px;\n border-radius: 20px;\n font-size: 0.8em;\n font-weight: bold;\n text-transform: uppercase;\n}\n\n.status-completed {\n background: #d4edda;\n color: #155724;\n}\n\n.status-pending {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-overdue {\n background: #f8d7da;\n color: #721c24;\n}\n\n.status-in-progress {\n background: #d1ecf1;\n color: #0c5460;\n}\n\n.task-details {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n margin: 15px 0;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n}\n\n.detail-label {\n font-weight: bold;\n font-size: 0.85em;\n color: #0066cc;\n margin-bottom: 3px;\n}\n\n.detail-value {\n font-size: 0.95em;\n color: #333;\n}\n\n.checklist-progress {\n margin-top: 15px;\n}\n\n.progress-bar {\n width: 100%;\n height: 20px;\n background: #e9ecef;\n border-radius: 10px;\n overflow: hidden;\n margin: 10px 0;\n}\n\n.progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #28a745, #20c997);\n transition: width 0.3s ease;\n}\n\n.checklist-items {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n margin-top: 10px;\n}\n\n.checklist-item {\n display: flex;\n align-items: center;\n padding: 8px;\n background: white;\n border-radius: 5px;\n font-size: 0.9em;\n}\n\n.checklist-icon {\n margin-right: 8px;\n font-size: 1.1em;\n}\n\n.summary-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 15px;\n margin: 20px 0;\n}\n\n.summary-card {\n background: white;\n padding: 20px;\n border-radius: 8px;\n text-align: center;\n border: 2px solid #e9ecef;\n}\n\n.summary-number {\n font-size: 2em;\n font-weight: bold;\n color: #0066cc;\n}\n\n.summary-label {\n font-size: 0.9em;\n color: #666;\n margin-top: 5px;\n}\n\n.signature-section {\n margin-top: 40px;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 40px;\n}\n\n.signature-box {\n padding-top: 10px;\n text-align: center;\n}\n\n.maintenance-type {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: bold;\n text-transform: uppercase;\n margin-left: 10px;\n}\n\n.type-corrective {\n background: #fff3cd;\n color: #856404;\n}\n\n.type-preventive {\n background: #d4edda;\n color: #155724;\n}\n\n.type-predictive {\n background: #d1ecf1;\n color: #0c5460;\n}\n\n/* Print Styles */\n@media print {\n body {\n background: white;\n padding: 0;\n display: block;\n }\n\n .print-only-container {\n display: none !important;\n }\n\n .report-container {\n display: block !important;\n box-shadow: none;\n padding: 0;\n margin: 0;\n max-width: none;\n }\n}\n</style>","<template>\n <div class=\"activity-logs\">\n <!-- Header -->\n <div class=\"header\">\n <h1>Activity Logs</h1>\n <p>Monitor and track all system activities in real-time</p>\n </div>\n \n <!-- Controls -->\n <div class=\"controls\">\n <div class=\"search-box\">\n <input\n type=\"text\"\n placeholder=\"Search activities, users, or actions...\"\n :value=\"searchTerm\"\n @input=\"$emit('update:searchTerm', $event.target.value)\"\n />\n </div>\n <select\n class=\"filter-select\"\n :value=\"selectedFilter\"\n @change=\"$emit('update:selectedFilter', $event.target.value)\"\n >\n <option value=\"all\">All Activities</option>\n <option value=\"login\">Login</option>\n <option value=\"logout\">Logout</option>\n <option value=\"create\">Create</option>\n <option value=\"update\">Update</option>\n <option value=\"delete\">Delete</option>\n <option value=\"view\">View</option>\n </select>\n <button class=\"btn btn-primary\" @click=\"$emit('refresh')\">🔄 Refresh</button>\n <button class=\"btn btn-secondary\" @click=\"$emit('download')\">📥 Download Report</button>\n </div>\n \n <!-- Stats -->\n <div class=\"stats-grid\">\n <div class=\"stat-card\">\n <h3>Total Activities</h3>\n <div class=\"value\">{{ totalActivities }}</div>\n </div>\n <div class=\"stat-card\">\n <h3>Today's Activities</h3>\n <div class=\"value\">{{ todayActivities }}</div>\n </div>\n <div class=\"stat-card\">\n <h3>Active Users</h3>\n <div class=\"value\">{{ activeUsers }}</div>\n </div>\n <div class=\"stat-card\">\n <h3>Important</h3>\n <div class=\"badge-danger\">\n Logs are deleted at the end of every month, please download a copy\n </div>\n </div>\n </div>\n \n <!-- Logs Table -->\n <div class=\"logs-container\">\n <div v-if=\"loading\" class=\"loading\">\n <div class=\"spinner\"></div>\n <p>Loading activity logs...</p>\n </div>\n \n <div v-else-if=\"logs.length === 0\" class=\"no-logs\">\n <h3>No activities found</h3>\n <p>Try adjusting your search or filter criteria</p>\n </div>\n \n <div v-else>\n <table class=\"logs-table\">\n <thead>\n <tr>\n <th>Timestamp</th>\n <th>User Name</th>\n <th>Action</th>\n <th>Details</th>\n <th>Section</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"log in paginatedLogs\" :key=\"log.id\">\n <td>{{ formatDate(log.timestamp) }}</td>\n <td>\n <div>{{ log.user_name }}</div>\n <small style=\"color: gray\">{{ log.email }}</small>\n </td>\n <td>\n <span class=\"activity-badge\" :class=\"getBadgeClass(log.action)\">\n {{ log.action }}\n </span>\n </td>\n <td>\n {{ log.details.status }}\n <div v-for=\"(change, key) in log.details.information\" :key=\"key\">\n <strong>{{ key }}: </strong>\n <small style=\"color: gray\">\n {{ change.from || \"\" }} → {{ change.to || change }}\n </small>\n </div>\n </td>\n <td>{{ log.table_name }}</td>\n </tr>\n </tbody>\n </table>\n \n <!-- Pagination -->\n <div class=\"pagination\">\n <button @click=\"$emit('change-page', currentPage - 1)\" :disabled=\"currentPage === 1\">\n Previous\n </button>\n <button\n v-for=\"page in totalPages\"\n :key=\"page\"\n @click=\"$emit('change-page', page)\"\n :class=\"{ active: currentPage === page }\"\n >\n {{ page }}\n </button>\n <button @click=\"$emit('change-page', currentPage + 1)\" :disabled=\"currentPage === totalPages\">\n Next\n </button>\n </div>\n </div>\n </div>\n </div>\n </template>\n \n <script>\n export default {\n name: \"ActivityLogs\",\n props: {\n loading: Boolean,\n searchTerm: String,\n selectedFilter: String,\n logs: Array,\n paginatedLogs: Array,\n totalActivities: Number,\n todayActivities: Number,\n activeUsers: Number,\n totalPages: Number,\n currentPage: Number,\n },\n emits: [\"update:searchTerm\", \"update:selectedFilter\", \"refresh\", \"download\", \"change-page\"],\n methods: {\n formatDate(timestamp) {\n return new Date(timestamp).toLocaleString();\n },\n getBadgeClass(action) {\n const classes = {\n login: \"badge-login\",\n logout: \"badge-logout\",\n create: \"badge-create\",\n update: \"badge-update\",\n delete: \"badge-delete\",\n view: \"badge-view\",\n };\n return classes[action] || \"badge-view\";\n },\n },\n };\n </script>\n \n<style>\n.header {\n background: linear-gradient(135deg, var(--dashprimary-color), var(--dashsecondary-color));\n color: white;\n padding: 2rem 0;\n margin-bottom: 2rem;\n border-radius: 12px;\n box-shadow: 0 10px 30px rgba(52, 153, 64, 0.3);\n}\n\n.header h1 {\n font-size: 2.5rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n text-align: center;\n}\n\n.header p {\n text-align: center;\n opacity: 0.9;\n font-size: 1.1rem;\n}\n\n.controls {\n display: flex;\n gap: 1rem;\n margin-bottom: 2rem;\n flex-wrap: wrap;\n align-items: center;\n}\n\n.search-box {\n flex: 1;\n min-width: 250px;\n position: relative;\n}\n\n.search-box input {\n width: 100%;\n padding: 12px 16px;\n border: 2px solid #e0e0e0;\n border-radius: 8px;\n font-size: 1rem;\n transition: all 0.3s ease;\n}\n\n.search-box input:focus {\n outline: none;\n border-color: var(--dashsecondary-color);\n box-shadow: 0 0 0 3px rgba(52, 153, 64, 0.1);\n}\n\n.filter-select {\n padding: 12px 16px;\n border: 2px solid #e0e0e0;\n border-radius: 8px;\n font-size: 1rem;\n background: white;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.filter-select:focus {\n outline: none;\n border-color: var(--dashsecondary-color);\n box-shadow: 0 0 0 3px rgba(52, 153, 64, 0.1);\n}\n\n.btn {\n padding: 12px 24px;\n border: none;\n border-radius: 8px;\n font-size: 1rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-primary {\n background: var(--primary);\n color: white;\n}\n\n.btn-primary:hover {\n background: var(--primary-dark);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(52, 153, 64, 0.3);\n}\n\n.btn-secondary {\n background: var(--secondary);\n color: var(--dark);\n}\n\n.btn-secondary:hover {\n background: #e6a200;\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(244, 180, 0, 0.3);\n}\n\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.stat-card {\n background: white;\n padding: 1.5rem;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);\n transition: transform 0.3s ease;\n}\n\n.stat-card:hover {\n transform: translateY(-2px);\n}\n\n.stat-card h3 {\n color: var(--gray);\n font-size: 0.9rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 0.5rem;\n}\n\n.stat-card .value {\n font-size: 2rem;\n font-weight: 700;\n color: var(--dashsecondary-color);\n}\n\n.logs-container {\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);\n overflow: hidden;\n}\n\n.logs-header {\n background: var(--light);\n padding: 1.5rem;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.logs-header h2 {\n color: var(--dark);\n font-size: 1.3rem;\n font-weight: 600;\n}\n\n.logs-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.logs-table th,\n.logs-table td {\n padding: 1rem;\n text-align: left;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.logs-table th {\n background: var(--light);\n font-weight: 600;\n color: var(--dark);\n font-size: 0.9rem;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.logs-table tr:hover {\n background: #f8f9fa;\n}\n\n.activity-badge {\n padding: 4px 12px;\n border-radius: 20px;\n font-size: 0.8rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.badge-login {\n background: var(--success);\n color: white;\n}\n\n.badge-logout {\n background: var(--gray);\n color: white;\n}\n\n.badge-create {\n background: var(--dashprimary-color);\n color: white;\n}\n\n.badge-update {\n background: var(--warning);\n color: white;\n}\n\n.badge-delete {\n background: var(--danger);\n color: white;\n}\n\n.badge-danger {\n color: var(--danger);\n}\n\n.badge-view {\n background: var(--maitsecondary);\n color: white;\n}\n\n.pagination {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 0.5rem;\n padding: 1.5rem;\n background: var(--light);\n}\n\n.pagination button {\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.pagination button:hover {\n background: var(--primary);\n color: white;\n border-color: var(--primary);\n}\n\n.pagination button.active {\n background: var(--primary);\n color: white;\n border-color: var(--primary);\n}\n\n.pagination button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.no-logs {\n text-align: center;\n padding: 3rem;\n color: var(--gray);\n}\n\n.no-logs h3 {\n font-size: 1.5rem;\n margin-bottom: 1rem;\n}\n\n.loading {\n text-align: center;\n padding: 3rem;\n color: var(--gray);\n}\n\n.spinner {\n border: 3px solid #f3f3f3;\n border-top: 3px solid var(--primary);\n border-radius: 50%;\n width: 40px;\n height: 40px;\n animation: spin 1s linear infinite;\n margin: 0 auto 1rem;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@media (max-width: 768px) {\n .controls {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n min-width: 100%;\n }\n\n .stats-grid {\n grid-template-columns: 1fr;\n }\n\n .logs-table {\n font-size: 0.9rem;\n }\n\n .logs-table th,\n .logs-table td {\n padding: 0.5rem;\n }\n}\n</style>","<template>\n <div class=\"crew-management\">\n <!-- Wave background -->\n <div class=\"wave-bg\" v-if=\"config.showWaveBackground\"></div>\n\n <div class=\"crew-section\">\n <div class=\"section-header\">\n <h2>{{ sectionTitle }}</h2>\n <button \n class=\"btn btn-primary\" \n @click=\"handleToggleAddForm\"\n v-if=\"canAddCrew\"\n >\n {{ showAddForm ? 'Cancel' : '+ Add Crew Member' }}\n </button>\n </div>\n\n <!-- Search and Filter -->\n <div class=\"search-filter\">\n <input \n type=\"text\" \n placeholder=\"Search crew by name or role...\" \n v-model=\"searchQuery\"\n @input=\"handleSearch\"\n >\n <select v-model=\"filterStatus\" @change=\"handleFilter\">\n <option value=\"all\">All Statuses</option>\n <option value=\"available\">Available</option>\n <option value=\"onduty\">On Duty</option>\n <option value=\"unavailable\">Unavailable</option>\n </select>\n </div>\n\n <!-- Loading State -->\n <div v-if=\"loading\" class=\"loading-state\">\n <div class=\"spinner-border text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading crew...</span>\n </div>\n <p>Loading crew members...</p>\n </div>\n\n <!-- Crew Grid -->\n <div class=\"crew-grid\" v-else-if=\"filteredCrew.length > 0\">\n <div \n v-for=\"member in filteredCrew\" \n :key=\"member.id\" \n class=\"crew-card\"\n :class=\"{ 'unavailable': member.status === 'unavailable' }\"\n >\n <div :class=\"['status-badge', getStatusClass(member.status)]\">\n {{ formatStatus(member.status) }}\n </div>\n \n <div class=\"crew-name\">{{ member.name }}</div>\n <div class=\"crew-role\">{{ member.role }}</div>\n \n <!-- Certifications -->\n <div class=\"crew-certifications\">\n <div \n v-for=\"cert in member.certifications\" \n :key=\"cert.name\" \n class=\"certification-tag\" \n :class=\"getCertificationClass(cert.expiryDate)\"\n @click=\"handleViewCertification(cert, member)\"\n >\n {{ cert.name }}\n </div>\n <i \n class=\"bi bi-patch-plus-fill icon\" \n @click=\"handleAddCertification(member)\"\n v-if=\"canEditCrew\"\n ></i>\n </div>\n \n <!-- Crew Details -->\n <div class=\"crew-availability\">\n <strong>Embarkation Date:</strong> {{ member.nextShift || 'Not Scheduled' }}\n </div>\n <div class=\"crew-availability\">\n <strong>Expected Days Onboard (in days):</strong> {{ member.onBoard || 'Not Scheduled' }}\n </div>\n \n <!-- Action Buttons -->\n <div class=\"action-buttons\">\n <div v-if=\"member.vessel\" class=\"status-available crew-availability vcard\">\n Vessel: {{ member.vessel }}\n </div>\n <div v-else class=\"status-unavailable crew-availability vcard\">\n Vessel: Unassigned\n </div>\n <button \n class=\"btn btn-primary\"\n @click=\"handleAssignShift(member)\"\n v-if=\"canAssignShift\"\n >\n Assign Shift\n </button>\n </div>\n \n <!-- Delete Button -->\n <i \n class=\"bi bi-trash icon delete-icon\" \n @click=\"handleDeleteCrew(member)\"\n v-if=\"canDeleteCrew\"\n ></i>\n </div>\n </div>\n\n <!-- No Results -->\n <div v-else-if=\"!loading\" class=\"no-results\">\n {{ crew.length === 0 ? 'No crew members found.' : 'No crew members found matching your search criteria.' }}\n </div>\n\n <!-- Add Crew Form -->\n <div class=\"add-crew-form\" v-if=\"showAddForm\">\n <h2>Add New Crew Member</h2>\n \n <!-- Basic Information -->\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label for=\"crew-name\">Full Name *</label>\n <input \n type=\"text\" \n id=\"crew-name\" \n v-model=\"newCrew.name\"\n :class=\"{ 'error': formErrors.name }\"\n >\n <div v-if=\"formErrors.name\" class=\"error-message\">{{ formErrors.name }}</div>\n </div>\n <div class=\"form-group\">\n <label for=\"crew-role\">Role/Position *</label>\n <select id=\"crew-role\" v-model=\"newCrew.role\">\n <option v-for=\"role in availableRoles\" :key=\"role\" :value=\"role\">\n {{ role }}\n </option>\n <option value=\"Other\">Other</option>\n </select>\n <input \n v-if=\"newCrew.role === 'Other'\" \n type=\"text\" \n placeholder=\"Enter custom role\" \n v-model=\"newCrew.customRole\"\n style=\"margin-top: 8px;\"\n >\n </div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label for=\"crew-status\">Status *</label>\n <select id=\"crew-status\" v-model=\"newCrew.status\">\n <option value=\"available\">Available</option>\n <option value=\"onduty\">On Duty</option>\n <option value=\"unavailable\">Unavailable</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label for=\"crew-email\">Email Address *</label>\n <input \n type=\"email\" \n id=\"crew-email\" \n v-model=\"newCrew.email\"\n :class=\"{ 'error': formErrors.email }\"\n >\n <div v-if=\"formErrors.email\" class=\"error-message\">{{ formErrors.email }}</div>\n </div>\n </div>\n\n <!-- Certifications Section -->\n <div class=\"certification-section\">\n <h3>Certifications</h3>\n <div v-for=\"(cert, index) in newCrew.certifications\" :key=\"index\" class=\"certification-entry\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Certification Name</label>\n <input type=\"text\" v-model=\"cert.name\" placeholder=\"Enter certification name\">\n </div>\n <div class=\"form-group\">\n <label>Expiry Date</label>\n <input type=\"date\" v-model=\"cert.expiryDate\">\n </div>\n <div class=\"form-group\">\n <button \n type=\"button\" \n class=\"btn btn-danger btn-sm\" \n @click=\"removeCertification(index)\" \n v-if=\"newCrew.certifications.length > 1\"\n >\n Remove\n </button>\n </div>\n </div>\n </div>\n \n <button type=\"button\" class=\"btn btn-secondary btn-sm\" @click=\"addCertificationEntry\">\n + Add More Certification\n </button>\n </div>\n\n <!-- Notes -->\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label for=\"crew-notes\">Notes</label>\n <textarea id=\"crew-notes\" rows=\"3\" v-model=\"newCrew.notes\"></textarea>\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button class=\"btn btn-secondary\" @click=\"handleCancelForm\">Cancel</button>\n <button class=\"btn btn-primary\" @click=\"handleAddCrewMember\">Add Crew Member</button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: 'CrewManagement',\n \n props: {\n // Required props\n crew: {\n type: Array,\n required: true,\n default: () => []\n },\n vesselName: {\n type: String,\n default: ''\n },\n userProfile: {\n type: Object,\n default: () => ({ role: 'viewer' })\n },\n \n // Optional props\n loading: {\n type: Boolean,\n default: false\n },\n availableRoles: {\n type: Array,\n default: () => ['Captain', 'First Officer', 'Engineer', 'Deckhand', 'Mechanic', 'Cook']\n },\n \n // Configuration props\n config: {\n type: Object,\n default: () => ({\n showWaveBackground: true,\n enableAdd: true,\n enableEdit: true,\n enableDelete: true,\n enableAssignShift: true,\n enableCertificationManagement: true\n })\n }\n },\n \n emits: [\n 'crew-add',\n 'crew-edit',\n 'crew-delete',\n 'crew-assign-shift',\n 'crew-add-certification',\n 'crew-view-certification',\n 'search-changed',\n 'filter-changed',\n 'access-denied'\n ],\n \n data() {\n return {\n searchQuery: '',\n filterStatus: 'all',\n showAddForm: false,\n formErrors: {},\n newCrew: {\n name: '',\n role: 'Deckhand',\n customRole: '',\n status: 'available',\n nextShift: '',\n certifications: [{ name: '', expiryDate: '' }],\n notes: '',\n email: '',\n onBoard: ''\n }\n }\n },\n \n computed: {\n sectionTitle() {\n return this.vesselName ? `Current Crew for ${this.vesselName}` : 'All Fleet Crew'\n },\n \n filteredCrew() {\n return this.crew.filter(member => {\n const matchesSearch = this.searchQuery === '' || \n member.name.toLowerCase().includes(this.searchQuery.toLowerCase()) ||\n member.role.toLowerCase().includes(this.searchQuery.toLowerCase()) ||\n (member.vessel && member.vessel.toLowerCase().includes(this.searchQuery.toLowerCase()))\n \n const matchesStatus = this.filterStatus === 'all' || member.status === this.filterStatus\n \n return matchesSearch && matchesStatus\n })\n },\n \n canAddCrew() {\n return this.config.enableAdd && this.hasPermission('add')\n },\n \n canEditCrew() {\n return this.config.enableEdit && this.hasPermission('edit')\n },\n \n canDeleteCrew() {\n return this.config.enableDelete && this.hasPermission('delete')\n },\n \n canAssignShift() {\n return this.config.enableAssignShift && this.hasPermission('assign')\n }\n },\n \n methods: {\n // Permission checking\n hasPermission(action) {\n const { role } = this.userProfile\n const permissions = {\n 'owner': ['add', 'edit', 'delete', 'assign', 'view'],\n 'staff': ['add', 'edit', 'assign', 'view'],\n 'captain': ['assign', 'view'],\n 'viewer': ['view']\n }\n return permissions[role]?.includes(action) || false\n },\n \n // Event handlers\n handleToggleAddForm() {\n if (!this.canAddCrew) {\n this.$emit('access-denied', { action: 'add crew', userProfile: this.userProfile })\n return\n }\n this.showAddForm = !this.showAddForm\n if (!this.showAddForm) {\n this.resetForm()\n }\n },\n \n handleSearch() {\n this.$emit('search-changed', this.searchQuery)\n },\n \n handleFilter() {\n this.$emit('filter-changed', this.filterStatus)\n },\n \n handleAddCrewMember() {\n if (!this.validateForm()) {\n return\n }\n \n const validCertifications = this.newCrew.certifications.filter(cert => \n cert.name.trim() !== '' && cert.expiryDate !== ''\n )\n \n const finalRole = this.newCrew.role === 'Other' ? this.newCrew.customRole : this.newCrew.role\n \n const newMember = {\n name: this.newCrew.name,\n role: finalRole,\n status: this.newCrew.status,\n certifications: validCertifications,\n notes: this.newCrew.notes,\n vessel: this.vesselName,\n email: this.newCrew.email,\n onBoard: this.newCrew.onBoard,\n nextShift: this.newCrew.nextShift\n }\n \n this.$emit('crew-add', newMember)\n this.resetForm()\n this.showAddForm = false\n },\n \n handleCancelForm() {\n this.showAddForm = false\n this.resetForm()\n },\n \n handleDeleteCrew(member) {\n if (!this.canDeleteCrew) {\n this.$emit('access-denied', { action: 'delete crew', userProfile: this.userProfile })\n return\n }\n \n this.$emit('crew-delete', member)\n },\n \n handleAssignShift(member) {\n if (!this.canAssignShift) {\n this.$emit('access-denied', { action: 'assign shift', userProfile: this.userProfile })\n return\n }\n \n this.$emit('crew-assign-shift', member)\n },\n \n handleAddCertification(member) {\n if (!this.canEditCrew) {\n this.$emit('access-denied', { action: 'add certification', userProfile: this.userProfile })\n return\n }\n \n this.$emit('crew-add-certification', member)\n },\n \n handleViewCertification(certification, member) {\n this.$emit('crew-view-certification', { certification, member })\n },\n \n // Form management\n resetForm() {\n this.newCrew = {\n name: '',\n role: 'Deckhand',\n customRole: '',\n status: 'available',\n nextShift: '',\n certifications: [{ name: '', expiryDate: '' }],\n notes: '',\n email: '',\n onBoard: ''\n }\n this.formErrors = {}\n },\n \n validateForm() {\n this.formErrors = {}\n \n const requiredFields = {\n name: 'Full Name',\n email: 'Email Address'\n }\n \n // Check required fields\n Object.keys(requiredFields).forEach(field => {\n if (!this.newCrew[field] || this.newCrew[field].trim() === '') {\n this.formErrors[field] = `${requiredFields[field]} is required`\n }\n })\n \n // Validate email format\n if (this.newCrew.email && !this.isValidEmail(this.newCrew.email)) {\n this.formErrors.email = 'Please enter a valid email address'\n }\n \n // Validate custom role\n if (this.newCrew.role === 'Other' && (!this.newCrew.customRole || this.newCrew.customRole.trim() === '')) {\n this.formErrors.customRole = 'Custom role is required when \"Other\" is selected'\n }\n \n return Object.keys(this.formErrors).length === 0\n },\n \n isValidEmail(email) {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n },\n \n addCertificationEntry() {\n this.newCrew.certifications.push({ name: '', expiryDate: '' })\n },\n \n removeCertification(index) {\n this.newCrew.certifications.splice(index, 1)\n },\n \n // Utility methods\n formatStatus(status) {\n return status ? status.charAt(0).toUpperCase() + status.slice(1) : ''\n },\n \n getStatusClass(status) {\n const statusMap = {\n 'available': 'status-available',\n 'onduty': 'status-onduty',\n 'unavailable': 'status-unavailable'\n }\n return statusMap[status] || ''\n },\n \n getCertificationClass(expiryDate) {\n const status = this.getExpiryStatus(expiryDate)\n const classMap = {\n 'expired': 'text-danger',\n 'expiringSoon': 'text-warning',\n 'valid': 'text-success'\n }\n return classMap[status] || ''\n },\n \n getExpiryStatus(dateStr) {\n if (!dateStr) return 'none'\n\n const expiry = new Date(dateStr)\n const today = new Date()\n const oneMonthFromNow = new Date()\n oneMonthFromNow.setMonth(today.getMonth() + 1)\n\n if (expiry <= today) return 'expired'\n if (expiry <= oneMonthFromNow) return 'expiringSoon'\n return 'valid'\n }\n }\n}\n</script>\n\n<style>\nh1,\nh2 {\n color: #005792;\n}\n\n.crew-section {\n margin-bottom: 30px;\n}\n\n.crew-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.crew-card {\n background-color: #f8f9fa;\n border-radius: 6px;\n padding: 15px;\n box-shadow: 0 1px 5px rgba(0, 0, 0, 0.08);\n border-left: 4px solid #00a8e8;\n position: relative;\n}\n\n.crew-card.unavailable {\n border-left-color: #dc3545;\n opacity: 0.8;\n}\n\n.crew-name {\n font-weight: bold;\n font-size: 1.1em;\n margin-bottom: 5px;\n color: #005792;\n}\n\n.crew-role {\n color: #6c757d;\n font-size: 0.9em;\n margin-bottom: 10px;\n}\n\n.crew-certifications,\n.crew-availability {\n font-size: 0.85em;\n margin: 5px 0;\n}\n\n.certification-tag {\n display: inline-block;\n background-color: #e6f7ff;\n color: #005792;\n border-radius: 4px;\n padding: 2px 8px;\n margin-right: 5px;\n margin-bottom: 5px;\n font-size: 0.85em;\n}\n\n.status-badge {\n position: absolute;\n top: 15px;\n right: 15px;\n font-size: 0.75em;\n padding: 3px 8px;\n border-radius: 12px;\n font-weight: bold;\n}\n\n.status-available {\n background-color: #d4edda;\n color: #155724;\n}\n\n.status-unavailable {\n background-color: #f8d7da;\n color: #721c24;\n}\n\n.status-onduty {\n background-color: #cce5ff;\n color: #004085;\n}\n\n.action-buttons {\n display: flex;\n justify-content: space-between;\n margin-top: 15px;\n}\n\n.btn {\n padding: 6px 12px;\n border-radius: 4px;\n border: none;\n cursor: pointer;\n font-size: 0.9em;\n transition: background-color 0.2s;\n}\n\n.btn-primary {\n background-color: #005792;\n color: white;\n}\n\n.btn-primary:hover {\n background-color: #004675;\n}\n\n.btn-secondary {\n background-color: #e9ecef;\n color: #495057;\n}\n\n.btn-secondary:hover {\n background-color: #dde2e6;\n}\n\n.search-filter {\n display: flex;\n margin-bottom: 20px;\n gap: 10px;\n}\n\n.search-filter input,\n.search-filter select {\n padding: 8px 12px;\n border: 1px solid #ced4da;\n border-radius: 4px;\n}\n\n.search-filter input {\n flex-grow: 1;\n}\n\n.search-filter select {\n width: 30%;\n}\n\n.add-crew-form {\n background-color: #f8f9fa;\n padding: 20px;\n border-radius: 6px;\n margin-top: 30px;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n margin-bottom: 15px;\n}\n\n.form-group {\n flex: 1;\n min-width: 200px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 5px;\n font-weight: bold;\n color: #495057;\n}\n\n.text-danger {\n color: red;\n font-weight: bolder;\n}\n\n.text-warning {\n color: orange;\n font-weight: bolder;\n}\n\n.text-success {\n color: green;\n font-weight: bolder;\n}\n\n.icon {\n font-size: 20px;\n}\n\n.form-group input,\n.form-group select,\n.form-group textarea {\n width: 100%;\n padding: 8px;\n border: 1px solid #ced4da;\n border-radius: 4px;\n}\n\n.form-actions {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n margin-top: 20px;\n}\n\n.no-results {\n text-align: center;\n padding: 20px;\n color: #6c757d;\n}\n\n.section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.vcard {\n border-radius: 6px;\n padding: 5px;\n}\n\n#content.active {\n margin-left: var(--sidebar-width);\n width: calc(100% - var(--sidebar-width));\n}\n</style>","// ===== src/utils/sidebarConfig.js =====\nexport const createSidebarConfig = (options = {}) => {\n return {\n brandName: options.brandName || 'OceanHelm',\n logoIcon: options.logoIcon || 'bi bi-water',\n showLogo: options.showLogo !== false,\n responsive: options.responsive !== false,\n ...options\n }\n}\n\nexport const defaultMenuItems = [\n {\n type: 'link',\n label: 'Dashboard',\n icon: 'bi bi-speedometer2',\n href: '/app/dashboard',\n active: true\n },\n {\n type: 'link',\n label: 'Activity Log',\n icon: 'bi bi-activity',\n href: '/activity-log',\n roles: ['owner'] // Role-based visibility\n },\n {\n type: 'text',\n label: 'Services'\n },\n {\n type: 'button',\n label: 'Maintenance',\n icon: 'bi bi-tools',\n action: 'maintenance'\n },\n {\n type: 'dropdown',\n label: 'Crew Management',\n icon: 'bi bi-people',\n children: [\n {\n label: 'All Crew',\n action: 'crew-all',\n roles: ['owner', 'staff']\n },\n {\n type: 'separator'\n },\n {\n label: 'Get Crew by Vessel',\n action: 'crew-by-vessel'\n }\n ]\n },\n {\n type: 'link',\n label: 'Inventory Management',\n icon: 'bi bi-clipboard-data',\n href: '/app/inventory'\n },\n {\n type: 'link',\n label: 'Requisition Processing',\n icon: 'bi bi-calendar-check',\n href: '/app/requisition'\n },\n {\n type: 'button',\n label: 'Voyage Manager',\n icon: 'fas fa-ship',\n action: 'coming-soon'\n },\n {\n type: 'button',\n label: 'Settings',\n icon: 'bi bi-gear',\n action: 'settings',\n roles: ['owner', 'staff']\n },\n {\n type: 'button',\n label: 'Help & Support',\n icon: 'bi bi-question-circle',\n action: 'help'\n }\n]","// ===== src/utils/permissions.js =====\nexport const defaultPermissionChecker = (item, userProfile) => {\n // No role restrictions\n if (!item.roles || item.roles.length === 0) {\n return true\n }\n\n // Check if user role is in allowed roles\n return item.roles.includes(userProfile?.role)\n}","// src/index.js - Library entry point\nimport ConfigurableSidebar from './components/ConfigurableSidebar.vue'\nimport VesselList from './components/VesselList.vue'\nimport DashHead from './components/DashHead.vue' \nimport OceanHelmMaintenance from './components/OceanHelmMaintenance.vue'\nimport ActivityLogs from './components/ActivityLogs.vue'\nimport CrewManagement from './components/CrewManagement.vue'\nimport { createSidebarConfig, defaultMenuItems } from './utils/sidebarConfig'\nimport { defaultPermissionChecker } from './utils/permissions'\n\n// Export main components\nexport { ConfigurableSidebar, VesselList, DashHead, CrewManagement, ActivityLogs, OceanHelmMaintenance }\n\n// Export utilities\nexport { createSidebarConfig, defaultMenuItems, defaultPermissionChecker }\n\n// Export types for TypeScript users\nexport * from './types'\n\n// Default export for plugin-style usage\nexport default {\n install(app, options = {}) {\n app.component('ConfigurableSidebar', ConfigurableSidebar)\n app.component('VesselList', VesselList)\n app.component('DashHead', DashHead)\n app.component('ActivityLogs', ActivityLogs)\n app.component('CrewManagement', CrewManagement)\n app.component('DashHead', OceanHelmMaintenance)\n\n // Provide global configuration\n app.provide('sidebarConfig', options)\n }\n}"],"names":["_sfc_main","item","_a","sidebarToggle","sidebar","content","event","isClickInsideSidebar","isClickOnToggleBtn","_hoisted_2","_createElementBlock","$options","$props","_openBlock","_hoisted_1","_createElementVNode","_normalizeClass","_Fragment","_renderList","index","$event","_withModifiers","_toDisplayString","_hoisted_6","_hoisted_7","subItem","subIndex","_hoisted_8","_hoisted_9","_hoisted_10","_renderSlot","_ctx","vessel","navigationData","action","status","role","userVessel","expiry_date","today","diffTime","days","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_cache","args","_hoisted_11","_hoisted_13","_hoisted_26","_hoisted_12","newDate","result","task","query","total","profile","taskId","checklist","newTask","filter","taskComponent","t","requiredFields","field","section","date","recurrence","nextDate","nextDueDate","diffDays","taskData","success","updateData","updatedAfter","dateString","completed","_hoisted_25","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_57","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_85","_hoisted_87","_hoisted_89","_hoisted_90","_hoisted_91","_hoisted_92","_hoisted_93","_hoisted_94","_hoisted_95","_hoisted_96","_hoisted_97","$data","_withDirectives","_hoisted_14","_vModelText","_vModelSelect","member","_hoisted_32","_vModelCheckbox","_hoisted_48","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_58","_hoisted_84","_hoisted_86","_hoisted_88","_normalizeStyle","recommendation","timestamp","log","_createTextVNode","change","key","page","matchesSearch","matchesStatus","validCertifications","cert","finalRole","newMember","certification","email","expiryDate","dateStr","expiry","oneMonthFromNow","createSidebarConfig","options","defaultMenuItems","defaultPermissionChecker","userProfile","app","ConfigurableSidebar","VesselList","DashHead","ActivityLogs","CrewManagement","OceanHelmMaintenance"],"mappings":"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"}
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .left[data-v-5c9320f4]{margin-left:20px}.black[data-v-5c9320f4]{color:#000!important}.left{margin-left:20px}.vessel-card{background:white;border-radius:10px;box-shadow:0 8px 16px #0069c026;transition:all .3s ease;margin-bottom:20px;overflow:hidden;border-left:4px solid var(--accent-color)}.vessel-card:hover{transform:translateY(-5px);box-shadow:0 12px 20px #0069c033}.vessel-icon{display:inline-flex;align-items:center;justify-content:center;width:50px;height:50px;background-color:#e3f2fd;border-radius:10px;color:var(--accent-color);font-size:24px;margin-right:15px}.black{color:#000!important}.action-icon{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:20px;color:var(--accent-color);font-size:16px;margin-right:15px;margin-top:20px;margin-bottom:10px}.delete{background-color:var(--danger)}.edit{background-color:var(--success)}.vessel-status{display:inline-block;padding:5px 12px;border-radius:20px;font-size:12px;font-weight:600}.status-active{background-color:#e8f5e9;color:#2e7d32}.status-maintenance{background-color:#fff8e1;color:#f57f17}.status-inactive{background-color:#f5f5f5;color:#757575}.page-header{margin-bottom:30px;border-bottom:1px solid #e0e0e0;padding-bottom:15px}.progress-container{margin-bottom:20px}.progress-bar{background-color:#e9ecef;border-radius:4px;height:10px;margin-top:8px}.progress-fill{background-color:#00a8e8;height:100%;border-radius:4px;transition:width .3s ease}.checklist{list-style-type:none;padding:0}.checklist-item{display:flex;align-items:center;padding:10px 0;border-bottom:1px solid #eee;cursor:pointer}.checkbox{margin-right:15px;width:20px;height:20px;border:2px solid #00a8e8;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.checkbox.checked{background-color:#00a8e8;color:#fff}.task-text{flex-grow:1}.task-text.completed{text-decoration:line-through;color:#6c757d}.status{margin-top:20px;font-weight:700;text-align:center}.reset-button{background-color:#005792;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer;margin-top:20px;font-weight:700}.btn-outline-custom{color:#005792;border:2px solid #005792;background-color:transparent;padding:8px 16px;border-radius:4px;font-weight:500;cursor:pointer;transition:background-color .3s,color .3s}.btn-outline-custom:hover{background-color:#005792;color:#fff}.reset-button:hover{background-color:#003d5b}header{background-color:var(--maitprimary);color:#fff;padding:1rem;text-align:center;border-radius:5px 5px 0 0}nav{background-color:var(--maitsecondary);padding:10px;display:flex;justify-content:center}nav button{background-color:var(--maitsecondary);color:#fff;border:none;padding:10px 20px;margin:0 5px;cursor:pointer;font-weight:700;border-radius:3px;transition:background-color .3s}nav button:hover,nav button.active{background-color:var(--maitprimary)}.content{background-color:#fff;padding:20px;border-radius:0 0 5px 5px;box-shadow:0 2px 10px #0000001a}h2{color:var(--dark);margin-bottom:20px;border-bottom:2px solid var(--light);padding-bottom:10px}.form-section{display:none;animation:fadeIn .5s}.form-section.active{display:block}.form-row{margin-bottom:15px}.form-group{margin-bottom:20px}label{display:block;margin-bottom:5px;font-weight:700;color:var(--dark)}input,select,textarea{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;font-size:16px}.input-group{display:flex;gap:10px}.input-group>div{flex:1}textarea{height:120px;resize:vertical}.btn{padding:10px 20px;border:none;border-radius:4px;cursor:pointer;font-size:16px;font-weight:700;transition:background-color .3s}.btn-primary{background-color:var(--maitprimary);color:#fff}.btn-primary:hover{background-color:var(--dark)}.btn-success{background-color:var(--success);color:#fff}.btn-success:hover{background-color:#219653}.action-buttons{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}.status-badge{display:inline-block;padding:5px 10px;border-radius:15px;font-size:14px;font-weight:700;color:#fff}.status-pending{background-color:var(--warning)}.status-progress{background-color:var(--accent)}.status-completed{background-color:var(--success)}.attachment-area{border:2px dashed #ddd;padding:20px;text-align:center;border-radius:5px;margin-bottom:20px}.file-input{display:none}.file-label{display:inline-block;padding:10px 20px;background-color:var(--accent);color:#fff;border-radius:4px;cursor:pointer;transition:background-color .3s}.file-label:hover{background-color:var(--maitsecondary)}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.form-section h3{margin-top:30px;margin-bottom:15px;color:var(--maitsecondary)}.checkbox-group{display:flex;flex-wrap:wrap;gap:15px;margin-top:10px}.checkbox-item{display:flex;align-items:center;gap:5px}.checkbox-item input{width:auto}.status-badge{padding:.3em .6em;border-radius:4px;color:#fff;font-weight:700;font-size:.85rem}.status-action{padding:.3em .6em;border-radius:4px;color:#fff;font-weight:700;font-size:.85rem;background-color:var(--maitprimary)}.status-badge.overdue{background-color:red}.task-table-wrapper{font-family:Inter,sans-serif;padding:1rem}.table-controls{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;flex-wrap:wrap;gap:1rem}.filters{display:flex;gap:.5rem;flex-wrap:wrap}.filters button,.filters input{padding:.5rem 1rem;border-radius:6px;border:1px solid #ccc;background-color:#f5f5f5;font-weight:500;cursor:pointer}.filters button.active{background-color:#002f6c;color:#fff}.filters input{border:1px solid #bbb}.filter-badge{background-color:#eee;color:#333}.table-controls>div:last-child button{padding:.5rem 1rem;border:1px solid var(--maitprimary);border-radius:6px;background-color:#fff;color:var(--maitprimary);font-weight:600;cursor:pointer;transition:background .2s}.table-controls>div:last-child button:last-child{background-color:var(--maitprimary);color:#fff}.task-table{width:100%;border-collapse:collapse;box-shadow:0 0 0 1px #ccc}.task-table thead{background-color:var(--maitprimary);color:#fff}.task-table th,.task-table td{padding:.75rem;text-align:left;border-bottom:1px solid #eee;white-space:pre-line}.task-table tbody tr:hover{background-color:#f9f9f9}.status-badge{padding:.3em .6em;border-radius:6px;font-weight:700;font-size:.85rem;color:#fff;display:inline-block;text-align:center;min-width:90px}.status-badge.complete{background-color:#4dffd0}.status-badge.soon{background-color:orange}.status-badge.completed{background-color:#4caf50}.delete-btn{background:none;border:none;color:#dc3545;cursor:pointer;padding:6px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s ease;opacity:1;margin-left:8px;flex-shrink:0;transform:scale(1.1)}.checklist-item:hover .delete-btn{opacity:1}.delete-btn:hover{background-color:#dc3545;color:#fff;transform:scale(1.1)}.delete-btn:active{transform:scale(.95)}.print-only-container{text-align:center}.initial-print-btn{background:linear-gradient(135deg,#0066cc,#004499);color:#fff;border:none;padding:20px 40px;font-size:1.3em;border-radius:12px;cursor:pointer;transition:all .3s ease;box-shadow:0 6px 20px #0066cc4d;display:flex;align-items:center;gap:15px;margin:0 auto}.initial-print-btn:hover{background:linear-gradient(135deg,#004499,#003366);transform:translateY(-3px);box-shadow:0 8px 25px #06c6}.initial-print-btn:active{transform:translateY(0)}.company-branding{margin-bottom:30px}.company-logo{font-size:3em;font-weight:700;color:#06c;margin-bottom:10px}.company-tagline{font-size:1.1em;color:#666}.report-container{display:none;max-width:900px;margin:0 auto;background:white;padding:30px;border-radius:10px;box-shadow:0 4px 15px #0000001a}.header{text-align:center;border-bottom:3px solid #0066cc;padding-bottom:20px;margin-bottom:30px}.report-logo{font-size:2.5em;font-weight:700;color:#06c;margin-bottom:10px}.report-title{font-size:1.8em;color:#333;margin:10px 0}.report-info{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:20px;margin-bottom:30px}.info-box{background:#f8f9fa;padding:15px;border-radius:8px;border-left:4px solid #0066cc}.info-box ul li{margin-left:15px}.info-label{font-weight:700;color:#06c;margin-bottom:5px}.section{margin-bottom:30px}.section-title{font-size:1.3em;font-weight:700;color:#06c;border-bottom:2px solid #e9ecef;padding-bottom:10px;margin-bottom:15px}.task-item{background:#f8f9fa;margin:15px 0;padding:20px;border-radius:8px;border-left:4px solid #28a745;box-shadow:0 2px 5px #0000001a}.task-item.pending{border-left-color:#ffc107}.task-item.overdue{border-left-color:#dc3545}.task-item.in-progress{border-left-color:#17a2b8}.task-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:15px;flex-wrap:wrap;gap:10px}.task-title{font-size:1.2em;font-weight:700;color:#333}.task-component{font-size:.9em;color:#666;margin-top:5px}.status-badge{display:inline-block;padding:6px 12px;border-radius:20px;font-size:.8em;font-weight:700;text-transform:uppercase}.status-completed{background:#d4edda;color:#155724}.status-pending{background:#fff3cd;color:#856404}.status-overdue{background:#f8d7da;color:#721c24}.status-in-progress{background:#d1ecf1;color:#0c5460}.task-details{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:15px;margin:15px 0}.detail-item{display:flex;flex-direction:column}.detail-label{font-weight:700;font-size:.85em;color:#06c;margin-bottom:3px}.detail-value{font-size:.95em;color:#333}.checklist-progress{margin-top:15px}.progress-bar{width:100%;height:20px;background:#e9ecef;border-radius:10px;overflow:hidden;margin:10px 0}.progress-fill{height:100%;background:linear-gradient(90deg,#28a745,#20c997);transition:width .3s ease}.checklist-items{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;margin-top:10px}.checklist-item{display:flex;align-items:center;padding:8px;background:white;border-radius:5px;font-size:.9em}.checklist-icon{margin-right:8px;font-size:1.1em}.summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:15px;margin:20px 0}.summary-card{background:white;padding:20px;border-radius:8px;text-align:center;border:2px solid #e9ecef}.summary-number{font-size:2em;font-weight:700;color:#06c}.summary-label{font-size:.9em;color:#666;margin-top:5px}.signature-section{margin-top:40px;display:grid;grid-template-columns:1fr 1fr;gap:40px}.signature-box{padding-top:10px;text-align:center}.maintenance-type{display:inline-block;padding:4px 8px;border-radius:12px;font-size:.75em;font-weight:700;text-transform:uppercase;margin-left:10px}.type-corrective{background:#fff3cd;color:#856404}.type-preventive{background:#d4edda;color:#155724}.type-predictive{background:#d1ecf1;color:#0c5460}@media print{body{background:white;padding:0;display:block}.print-only-container{display:none!important}.report-container{display:block!important;box-shadow:none;padding:0;margin:0;max-width:none}}.header{background:linear-gradient(135deg,var(--dashprimary-color),var(--dashsecondary-color));color:#fff;padding:2rem 0;margin-bottom:2rem;border-radius:12px;box-shadow:0 10px 30px #3499404d}.header h1{font-size:2.5rem;font-weight:700;margin-bottom:.5rem;text-align:center}.header p{text-align:center;opacity:.9;font-size:1.1rem}.controls{display:flex;gap:1rem;margin-bottom:2rem;flex-wrap:wrap;align-items:center}.search-box{flex:1;min-width:250px;position:relative}.search-box input{width:100%;padding:12px 16px;border:2px solid #e0e0e0;border-radius:8px;font-size:1rem;transition:all .3s ease}.search-box input:focus{outline:none;border-color:var(--dashsecondary-color);box-shadow:0 0 0 3px #3499401a}.filter-select{padding:12px 16px;border:2px solid #e0e0e0;border-radius:8px;font-size:1rem;background:white;cursor:pointer;transition:all .3s ease}.filter-select:focus{outline:none;border-color:var(--dashsecondary-color);box-shadow:0 0 0 3px #3499401a}.btn{padding:12px 24px;border:none;border-radius:8px;font-size:1rem;font-weight:600;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:8px}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-dark);transform:translateY(-1px);box-shadow:0 4px 12px #3499404d}.btn-secondary{background:var(--secondary);color:var(--dark)}.btn-secondary:hover{background:#e6a200;transform:translateY(-1px);box-shadow:0 4px 12px #f4b4004d}.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1.5rem;margin-bottom:2rem}.stat-card{background:white;padding:1.5rem;border-radius:12px;box-shadow:0 4px 20px #0000000d;transition:transform .3s ease}.stat-card:hover{transform:translateY(-2px)}.stat-card h3{color:var(--gray);font-size:.9rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-bottom:.5rem}.stat-card .value{font-size:2rem;font-weight:700;color:var(--dashsecondary-color)}.logs-container{background:white;border-radius:12px;box-shadow:0 4px 20px #0000000d;overflow:hidden}.logs-header{background:var(--light);padding:1.5rem;border-bottom:1px solid #e0e0e0}.logs-header h2{color:var(--dark);font-size:1.3rem;font-weight:600}.logs-table{width:100%;border-collapse:collapse}.logs-table th,.logs-table td{padding:1rem;text-align:left;border-bottom:1px solid #f0f0f0}.logs-table th{background:var(--light);font-weight:600;color:var(--dark);font-size:.9rem;text-transform:uppercase;letter-spacing:.5px}.logs-table tr:hover{background:#f8f9fa}.activity-badge{padding:4px 12px;border-radius:20px;font-size:.8rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px}.badge-login{background:var(--success);color:#fff}.badge-logout{background:var(--gray);color:#fff}.badge-create{background:var(--dashprimary-color);color:#fff}.badge-update{background:var(--warning);color:#fff}.badge-delete{background:var(--danger);color:#fff}.badge-danger{color:var(--danger)}.badge-view{background:var(--maitsecondary);color:#fff}.pagination{display:flex;justify-content:center;align-items:center;gap:.5rem;padding:1.5rem;background:var(--light)}.pagination button{padding:8px 12px;border:1px solid #e0e0e0;background:white;border-radius:6px;cursor:pointer;transition:all .3s ease}.pagination button:hover,.pagination button.active{background:var(--primary);color:#fff;border-color:var(--primary)}.pagination button:disabled{opacity:.5;cursor:not-allowed}.no-logs{text-align:center;padding:3rem;color:var(--gray)}.no-logs h3{font-size:1.5rem;margin-bottom:1rem}.loading{text-align:center;padding:3rem;color:var(--gray)}.spinner{border:3px solid #f3f3f3;border-top:3px solid var(--primary);border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite;margin:0 auto 1rem}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (max-width: 768px){.controls{flex-direction:column;align-items:stretch}.search-box{min-width:100%}.stats-grid{grid-template-columns:1fr}.logs-table{font-size:.9rem}.logs-table th,.logs-table td{padding:.5rem}}h1,h2{color:#005792}.crew-section{margin-bottom:30px}.crew-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:20px;margin-bottom:30px}.crew-card{background-color:#f8f9fa;border-radius:6px;padding:15px;box-shadow:0 1px 5px #00000014;border-left:4px solid #00a8e8;position:relative}.crew-card.unavailable{border-left-color:#dc3545;opacity:.8}.crew-name{font-weight:700;font-size:1.1em;margin-bottom:5px;color:#005792}.crew-role{color:#6c757d;font-size:.9em;margin-bottom:10px}.crew-certifications,.crew-availability{font-size:.85em;margin:5px 0}.certification-tag{display:inline-block;background-color:#e6f7ff;color:#005792;border-radius:4px;padding:2px 8px;margin-right:5px;margin-bottom:5px;font-size:.85em}.status-badge{position:absolute;top:15px;right:15px;font-size:.75em;padding:3px 8px;border-radius:12px;font-weight:700}.status-available{background-color:#d4edda;color:#155724}.status-unavailable{background-color:#f8d7da;color:#721c24}.status-onduty{background-color:#cce5ff;color:#004085}.action-buttons{display:flex;justify-content:space-between;margin-top:15px}.btn{padding:6px 12px;border-radius:4px;border:none;cursor:pointer;font-size:.9em;transition:background-color .2s}.btn-primary{background-color:#005792;color:#fff}.btn-primary:hover{background-color:#004675}.btn-secondary{background-color:#e9ecef;color:#495057}.btn-secondary:hover{background-color:#dde2e6}.search-filter{display:flex;margin-bottom:20px;gap:10px}.search-filter input,.search-filter select{padding:8px 12px;border:1px solid #ced4da;border-radius:4px}.search-filter input{flex-grow:1}.search-filter select{width:30%}.add-crew-form{background-color:#f8f9fa;padding:20px;border-radius:6px;margin-top:30px}.form-row{display:flex;flex-wrap:wrap;gap:15px;margin-bottom:15px}.form-group{flex:1;min-width:200px}.form-group label{display:block;margin-bottom:5px;font-weight:700;color:#495057}.text-danger{color:red;font-weight:bolder}.text-warning{color:orange;font-weight:bolder}.text-success{color:green;font-weight:bolder}.icon{font-size:20px}.form-group input,.form-group select,.form-group textarea{width:100%;padding:8px;border:1px solid #ced4da;border-radius:4px}.form-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}.no-results{text-align:center;padding:20px;color:#6c757d}.section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.vcard{border-radius:6px;padding:5px}#content.active{margin-left:var(--sidebar-width);width:calc(100% - var(--sidebar-width))}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "oceanhelm",
3
+ "version": "0.0.1",
4
+ "description": "Oceanhelm's highly customizable library",
5
+ "private": false,
6
+ "type": "module",
7
+ "main": "dist/oceanhelm.umd.js",
8
+ "module": "dist/oceanhelm.es.js",
9
+ "types": "dist/types/index.d.ts",
10
+ "engines": {
11
+ "node": "^20.19.0 || >=22.12.0"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "src",
16
+ "README.md",
17
+ "LICENSE"
18
+ ],
19
+ "exports": {
20
+ ".": {
21
+ "import": "./dist/oceanhelm.es.js",
22
+ "require": "./dist/oceanhelm.umd.js",
23
+ "types": "./dist/types/index.d.ts"
24
+ },
25
+ "./dist/style.css": "./dist/style.css",
26
+ "./package.json": "./package.json"
27
+ },
28
+ "scripts": {
29
+ "dev": "vite",
30
+ "build": "vite build",
31
+ "build:lib": "vite build --mode library",
32
+ "preview": "vite preview",
33
+ "prepublishOnly": "npm run build:lib",
34
+ "test": "echo \"No tests specified\" && exit 0"
35
+ },
36
+ "keywords": [
37
+ "oceanhelm"
38
+ ],
39
+ "author": {
40
+ "name": "Ukpai Ugochi"
41
+ },
42
+ "peerDependencies": {
43
+ "vue": "^3.5.0"
44
+ },
45
+ "dependencies": {},
46
+ "devDependencies": {
47
+ "@vitejs/plugin-vue": "^4.2.3",
48
+ "vite": "^4.3.9",
49
+ "vue": "^3.5.18"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public",
53
+ "registry": "https://registry.npmjs.org/"
54
+ }
55
+ }
package/src/App.vue ADDED
@@ -0,0 +1,10 @@
1
+ <script>
2
+ import { RouterView } from 'vue-router'
3
+ </script>
4
+
5
+ <template>
6
+ <RouterView />
7
+ </template>
8
+
9
+ <style>
10
+ </style>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>
File without changes