Build error fixes
This commit is contained in:
parent
a0124f24f6
commit
0b60478cbf
@ -5,12 +5,6 @@ import {
|
|||||||
LayoutDashboard,
|
LayoutDashboard,
|
||||||
Package,
|
Package,
|
||||||
Wrench,
|
Wrench,
|
||||||
Users,
|
|
||||||
BarChart3,
|
|
||||||
Building2,
|
|
||||||
Truck,
|
|
||||||
FileText,
|
|
||||||
MapPin,
|
|
||||||
Menu,
|
Menu,
|
||||||
X,
|
X,
|
||||||
Moon,
|
Moon,
|
||||||
@ -45,31 +39,31 @@ const Sidebar: React.FC<SidebarProps> = ({ userEmail }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Role-based visibility logic
|
// Role-based visibility logic
|
||||||
const isMaintenanceManagerKASH = userEmail === 'maintenancemanager-kash@gmail.com';
|
// const isMaintenanceManagerKASH = userEmail === 'maintenancemanager-kash@gmail.com';
|
||||||
const isMaintenanceManagerTH = userEmail === 'maintenancemanager-th@gmail.com';
|
// const isMaintenanceManagerTH = userEmail === 'maintenancemanager-th@gmail.com';
|
||||||
const isMaintenanceManagerDAJH = userEmail === 'maintenancemanager-dajh@gmail.com';
|
// const isMaintenanceManagerDAJH = userEmail === 'maintenancemanager-dajh@gmail.com';
|
||||||
const isFinanceManager = userEmail === 'financemanager@gmail.com';
|
const isFinanceManager = userEmail === 'financemanager@gmail.com';
|
||||||
const isEndUser = userEmail && (
|
const isEndUser = userEmail && (
|
||||||
userEmail.startsWith('enduser1-kash') ||
|
userEmail.startsWith('enduser1-kash') ||
|
||||||
userEmail.startsWith('enduser1-dajh') ||
|
userEmail.startsWith('enduser1-dajh') ||
|
||||||
userEmail.startsWith('enduser1-th')
|
userEmail.startsWith('enduser1-th')
|
||||||
);
|
);
|
||||||
const isTechnician = userEmail && (
|
// const isTechnician = userEmail && (
|
||||||
userEmail.startsWith('technician1-kash') ||
|
// userEmail.startsWith('technician1-kash') ||
|
||||||
userEmail.startsWith('technician1-dajh') ||
|
// userEmail.startsWith('technician1-dajh') ||
|
||||||
userEmail.startsWith('technician1-th')
|
// userEmail.startsWith('technician1-th')
|
||||||
);
|
// );
|
||||||
|
|
||||||
const showAsset = !isFinanceManager && !isEndUser;
|
const showAsset = !isFinanceManager && !isEndUser;
|
||||||
const showInventory = !isFinanceManager && !isEndUser;
|
// const showInventory = !isFinanceManager && !isEndUser;
|
||||||
const showPreventiveMaintenance = !isFinanceManager && !isEndUser;
|
const showPreventiveMaintenance = !isFinanceManager && !isEndUser;
|
||||||
const showGeneralWO = !isFinanceManager && !isEndUser;
|
const showGeneralWO = !isFinanceManager && !isEndUser;
|
||||||
const showAMTeam = !isFinanceManager && !isEndUser;
|
// const showAMTeam = !isFinanceManager && !isEndUser;
|
||||||
const showProjectDashboard = !isMaintenanceManagerKASH && !isMaintenanceManagerTH && !isMaintenanceManagerDAJH && !isFinanceManager && !isEndUser && !isTechnician;
|
// const showProjectDashboard = !isMaintenanceManagerKASH && !isMaintenanceManagerTH && !isMaintenanceManagerDAJH && !isFinanceManager && !isEndUser && !isTechnician;
|
||||||
const showSiteDashboards = !isFinanceManager && !isEndUser;
|
// const showSiteDashboards = !isFinanceManager && !isEndUser;
|
||||||
const showSupplierDashboard = !isFinanceManager && !isEndUser;
|
// const showSupplierDashboard = !isFinanceManager && !isEndUser;
|
||||||
const showSLA = !isFinanceManager && !isEndUser && !isTechnician;
|
// const showSLA = !isFinanceManager && !isEndUser && !isTechnician;
|
||||||
const showSiteInfo = !isFinanceManager && !isEndUser;
|
// const showSiteInfo = !isFinanceManager && !isEndUser;
|
||||||
|
|
||||||
const links: SidebarLink[] = [
|
const links: SidebarLink[] = [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -965,7 +965,7 @@ const handlePPMPlan = async () => {
|
|||||||
|
|
||||||
// Generate Status Summary HTML
|
// Generate Status Summary HTML
|
||||||
const statusSummaryHTML = Object.keys(statusCounts).length > 0
|
const statusSummaryHTML = Object.keys(statusCounts).length > 0
|
||||||
? Object.entries(statusCounts).map(([status, count], index) => {
|
? Object.entries(statusCounts).map(([status, count]) => {
|
||||||
const statusClass = status === 'Completed'
|
const statusClass = status === 'Completed'
|
||||||
? 'bg-green-100 text-green-800 border-green-200'
|
? 'bg-green-100 text-green-800 border-green-200'
|
||||||
: status === 'Planned'
|
: status === 'Planned'
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import React, { useState, useEffect, useRef } from 'react';
|
|||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { useAssets, useAssetMutations } from '../hooks/useAsset';
|
import { useAssets, useAssetMutations } from '../hooks/useAsset';
|
||||||
import { FaPlus, FaSearch, FaEdit, FaEye, FaTrash, FaCopy, FaEllipsisV, FaDownload, FaPrint, FaFileExport, FaTimes, FaFilter, FaChevronDown, FaChevronUp, FaSave,
|
import { FaPlus, FaSearch, FaEdit, FaEye, FaTrash, FaCopy, FaEllipsisV, FaDownload, FaPrint, FaFileExport, FaTimes, FaFilter, FaChevronDown, FaChevronUp, FaSave,
|
||||||
FaStar, FaLock } from 'react-icons/fa';
|
FaStar } from 'react-icons/fa';
|
||||||
import LinkField from '../components/LinkField';
|
import LinkField from '../components/LinkField';
|
||||||
import { useUserPermissions } from '../hooks/useUserPermissions';
|
import { useUserPermissions } from '../hooks/useUserPermissions';
|
||||||
|
|
||||||
@ -18,13 +18,13 @@ const AssetList: React.FC = () => {
|
|||||||
|
|
||||||
// ✅ NEW: Get user permissions for Asset doctype
|
// ✅ NEW: Get user permissions for Asset doctype
|
||||||
const {
|
const {
|
||||||
isAdmin,
|
// isAdmin,
|
||||||
permissionFilters,
|
permissionFilters,
|
||||||
restrictions,
|
// restrictions,
|
||||||
loading: permissionsLoading,
|
loading: permissionsLoading,
|
||||||
error: permissionsError,
|
error: permissionsError,
|
||||||
hasRestriction,
|
// hasRestriction,
|
||||||
getAllowedValues,
|
// getAllowedValues,
|
||||||
hasAnyRestrictions
|
hasAnyRestrictions
|
||||||
} = useUserPermissions('Asset');
|
} = useUserPermissions('Asset');
|
||||||
|
|
||||||
@ -211,11 +211,11 @@ const AssetList: React.FC = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Quick filters
|
// Quick filters
|
||||||
const applyQuickFilter = (type: 'active' | 'down' | 'recent') => {
|
// const applyQuickFilter = (type: 'active' | 'down' | 'recent') => {
|
||||||
handleClearFilters();
|
// handleClearFilters();
|
||||||
if (type === 'active') setFilterDeviceStatus('Up');
|
// if (type === 'active') setFilterDeviceStatus('Up');
|
||||||
else if (type === 'down') setFilterDeviceStatus('Down');
|
// else if (type === 'down') setFilterDeviceStatus('Down');
|
||||||
};
|
// };
|
||||||
|
|
||||||
// Cleanup timeouts on unmount
|
// Cleanup timeouts on unmount
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -331,71 +331,71 @@ const AssetList: React.FC = () => {
|
|||||||
filterAssetName || filterSerialNumber || searchTerm;
|
filterAssetName || filterSerialNumber || searchTerm;
|
||||||
|
|
||||||
// ✅ NEW: Helper component for restricted select fields
|
// ✅ NEW: Helper component for restricted select fields
|
||||||
const RestrictedSelect: React.FC<{
|
// const RestrictedSelect: React.FC<{
|
||||||
label: string;
|
// label: string;
|
||||||
permissionType: string;
|
// permissionType: string;
|
||||||
value: string;
|
// value: string;
|
||||||
onChange: (val: string) => void;
|
// onChange: (val: string) => void;
|
||||||
doctype: string;
|
// doctype: string;
|
||||||
placeholder?: string;
|
// placeholder?: string;
|
||||||
filters?: Record<string, any>;
|
// filters?: Record<string, any>;
|
||||||
}> = ({ label, permissionType, value, onChange, doctype, placeholder, filters: linkFilters }) => {
|
// }> = ({ label, permissionType, value, onChange, doctype, placeholder, filters: linkFilters }) => {
|
||||||
const isRestricted = hasRestriction(permissionType);
|
// const isRestricted = hasRestriction(permissionType);
|
||||||
const allowedValues = getAllowedValues(permissionType);
|
// const allowedValues = getAllowedValues(permissionType);
|
||||||
|
|
||||||
if (isRestricted && allowedValues.length > 0) {
|
// if (isRestricted && allowedValues.length > 0) {
|
||||||
return (
|
// return (
|
||||||
<div className="relative">
|
// <div className="relative">
|
||||||
<label className="block text-[10px] font-medium text-gray-700 dark:text-gray-300 mb-0.5 flex items-center gap-1">
|
// <label className="block text-[10px] font-medium text-gray-700 dark:text-gray-300 mb-0.5 flex items-center gap-1">
|
||||||
{label}
|
// {label}
|
||||||
<FaLock size={8} className="text-amber-500" title={`Restricted to ${allowedValues.length} value(s)`} />
|
// <FaLock size={8} className="text-amber-500" title={`Restricted to ${allowedValues.length} value(s)`} />
|
||||||
</label>
|
// </label>
|
||||||
<select
|
// <select
|
||||||
value={value}
|
// value={value}
|
||||||
onChange={(e) => onChange(e.target.value)}
|
// onChange={(e) => onChange(e.target.value)}
|
||||||
className="w-full px-2 py-1 text-xs border border-amber-300 dark:border-amber-600 rounded focus:outline-none focus:ring-2 focus:ring-amber-500 bg-amber-50 dark:bg-amber-900/20 text-gray-900 dark:text-white"
|
// className="w-full px-2 py-1 text-xs border border-amber-300 dark:border-amber-600 rounded focus:outline-none focus:ring-2 focus:ring-amber-500 bg-amber-50 dark:bg-amber-900/20 text-gray-900 dark:text-white"
|
||||||
>
|
// >
|
||||||
<option value="">All Allowed ({allowedValues.length})</option>
|
// <option value="">All Allowed ({allowedValues.length})</option>
|
||||||
{allowedValues.map(val => (
|
// {allowedValues.map(val => (
|
||||||
<option key={val} value={val}>{val}</option>
|
// <option key={val} value={val}>{val}</option>
|
||||||
))}
|
// ))}
|
||||||
</select>
|
// </select>
|
||||||
{value && (
|
// {value && (
|
||||||
<button
|
// <button
|
||||||
onClick={() => onChange('')}
|
// onClick={() => onChange('')}
|
||||||
className="absolute right-8 top-6 text-gray-400 hover:text-red-500 transition-colors"
|
// className="absolute right-8 top-6 text-gray-400 hover:text-red-500 transition-colors"
|
||||||
>
|
// >
|
||||||
<FaTimes size={10} />
|
// <FaTimes size={10} />
|
||||||
</button>
|
// </button>
|
||||||
)}
|
// )}
|
||||||
</div>
|
// </div>
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Not restricted - show normal LinkField
|
// // Not restricted - show normal LinkField
|
||||||
return (
|
// return (
|
||||||
<div className="relative">
|
// <div className="relative">
|
||||||
<LinkField
|
// <LinkField
|
||||||
label={label}
|
// label={label}
|
||||||
doctype={doctype}
|
// doctype={doctype}
|
||||||
value={value}
|
// value={value}
|
||||||
onChange={onChange}
|
// onChange={onChange}
|
||||||
placeholder={placeholder || `Select ${label}`}
|
// placeholder={placeholder || `Select ${label}`}
|
||||||
disabled={false}
|
// disabled={false}
|
||||||
compact={true}
|
// compact={true}
|
||||||
filters={linkFilters}
|
// filters={linkFilters}
|
||||||
/>
|
// />
|
||||||
{value && (
|
// {value && (
|
||||||
<button
|
// <button
|
||||||
onClick={() => onChange('')}
|
// onClick={() => onChange('')}
|
||||||
className="absolute right-2 top-6 text-gray-400 hover:text-red-500 transition-colors"
|
// className="absolute right-2 top-6 text-gray-400 hover:text-red-500 transition-colors"
|
||||||
>
|
// >
|
||||||
<FaTimes size={10} />
|
// <FaTimes size={10} />
|
||||||
</button>
|
// </button>
|
||||||
)}
|
// )}
|
||||||
</div>
|
// </div>
|
||||||
);
|
// );
|
||||||
};
|
// };
|
||||||
|
|
||||||
// ✅ NEW: Loading state for permissions
|
// ✅ NEW: Loading state for permissions
|
||||||
if (permissionsLoading) {
|
if (permissionsLoading) {
|
||||||
|
|||||||
@ -39,7 +39,7 @@ const ModernDashboard: React.FC = () => {
|
|||||||
const { data: assetWiseChart } = useDashboardChart('Maintenance - Asset wise Count');
|
const { data: assetWiseChart } = useDashboardChart('Maintenance - Asset wise Count');
|
||||||
const { data: assigneesChart } = useDashboardChart('Asset Maintenance Assignees Status Count');
|
const { data: assigneesChart } = useDashboardChart('Asset Maintenance Assignees Status Count');
|
||||||
const { data: frequencyChart } = useDashboardChart('Asset Maintenance Frequency Chart');
|
const { data: frequencyChart } = useDashboardChart('Asset Maintenance Frequency Chart');
|
||||||
const { data: ppmStatusChart } = useDashboardChart('PPM Status');
|
// const { data: ppmStatusChart } = useDashboardChart('PPM Status');
|
||||||
|
|
||||||
// Generate Up & Down Time Chart data from assets
|
// Generate Up & Down Time Chart data from assets
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -765,28 +765,28 @@ const CustomerSatisfactionCard: React.FC<{ data: any; title: string; description
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Metric Card Component (Bottom Row - Smaller & Compact)
|
// Metric Card Component (Bottom Row - Smaller & Compact)
|
||||||
const MetricCard: React.FC<{
|
// const MetricCard: React.FC<{
|
||||||
icon: React.ReactNode;
|
// icon: React.ReactNode;
|
||||||
label: string;
|
// label: string;
|
||||||
value: string;
|
// value: string;
|
||||||
iconColor?: string;
|
// iconColor?: string;
|
||||||
bgColor: string;
|
// bgColor: string;
|
||||||
textColor?: string;
|
// textColor?: string;
|
||||||
}> = ({ icon, label, value, iconColor = "text-white", bgColor, textColor = "text-gray-900 dark:text-white" }) => (
|
// }> = ({ icon, label, value, iconColor = "text-white", bgColor, textColor = "text-gray-900 dark:text-white" }) => (
|
||||||
<div className={`${bgColor} rounded-lg shadow hover:shadow-md transition-all p-5 border border-gray-200 dark:border-gray-700`}>
|
// <div className={`${bgColor} rounded-lg shadow hover:shadow-md transition-all p-5 border border-gray-200 dark:border-gray-700`}>
|
||||||
<div className="flex items-center justify-between mb-3">
|
// <div className="flex items-center justify-between mb-3">
|
||||||
<div className={`text-2xl ${iconColor}`}>
|
// <div className={`text-2xl ${iconColor}`}>
|
||||||
{icon}
|
// {icon}
|
||||||
</div>
|
// </div>
|
||||||
</div>
|
// </div>
|
||||||
<div>
|
// <div>
|
||||||
<div className={`text-[10px] font-medium uppercase tracking-wide mb-1 ${textColor.includes('white') ? 'text-white/80' : 'text-gray-600 dark:text-gray-400'}`}>
|
// <div className={`text-[10px] font-medium uppercase tracking-wide mb-1 ${textColor.includes('white') ? 'text-white/80' : 'text-gray-600 dark:text-gray-400'}`}>
|
||||||
{label}
|
// {label}
|
||||||
</div>
|
// </div>
|
||||||
<div className={`text-2xl font-semibold ${textColor}`}>{value}</div>
|
// <div className={`text-2xl font-semibold ${textColor}`}>{value}</div>
|
||||||
</div>
|
// </div>
|
||||||
</div>
|
// </div>
|
||||||
);
|
// );
|
||||||
|
|
||||||
// Mini Area Chart Component
|
// Mini Area Chart Component
|
||||||
const MiniAreaChart: React.FC = () => {
|
const MiniAreaChart: React.FC = () => {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { useParams, useNavigate, useSearchParams } from 'react-router-dom';
|
import { useParams, useNavigate, useSearchParams } from 'react-router-dom';
|
||||||
import { usePPMDetails, usePPMMutations } from '../hooks/usePPM';
|
import { usePPMDetails, usePPMMutations } from '../hooks/usePPM';
|
||||||
import { FaArrowLeft, FaSave, FaEdit, FaBuilding, FaTools, FaCalendarCheck, FaDollarSign } from 'react-icons/fa';
|
import { FaArrowLeft, FaSave, FaEdit, FaTools } from 'react-icons/fa';
|
||||||
import type { CreatePPMData } from '../services/ppmService';
|
import type { CreatePPMData } from '../services/ppmService';
|
||||||
|
|
||||||
const PPMDetail: React.FC = () => {
|
const PPMDetail: React.FC = () => {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import React, { useState, useEffect, useRef } from 'react';
|
import React, { useState, useEffect, useRef } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { usePPMs, usePPMMutations } from '../hooks/usePPM';
|
import { usePPMs, usePPMMutations } from '../hooks/usePPM';
|
||||||
import { FaPlus, FaSearch, FaEdit, FaEye, FaTrash, FaCopy, FaEllipsisV, FaFileExport, FaCalendarCheck, FaTools, FaBuilding } from 'react-icons/fa';
|
import { FaPlus, FaSearch, FaEdit, FaEye, FaTrash, FaCopy, FaEllipsisV, FaFileExport, FaCalendarCheck, FaBuilding } from 'react-icons/fa';
|
||||||
|
|
||||||
const PPMList: React.FC = () => {
|
const PPMList: React.FC = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user