File size: 4,837 Bytes
8066de0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import { useState } from 'react';
import { 
  Bot, 
  Package, 
  Settings, 
  Play, 
  Pause,
  RotateCcw,
  CheckCircle,
  AlertCircle,
  Clock,
  MapPin,
  Wrench
} from 'lucide-react';
import { useAWPStore } from '../store/awpStore';
import { AIWorkPackageGenerator } from './AIWorkPackageGenerator';
import { ElementMetadata } from './ElementMetadata';

const tabs = [
  { id: 'metadata', label: 'Metadata', icon: Settings },
  { id: 'ai-wp', label: 'AI WP Generator', icon: Bot },
  { id: 'packages', label: 'Work Packages', icon: Package },
];

export function MetadataPanel() {
  const [activeTab, setActiveTab] = useState('metadata');
  const { selectedElement, workPackages } = useAWPStore();

  const renderTabContent = () => {
    switch (activeTab) {
      case 'metadata':
        return <ElementMetadata elementId={selectedElement} />;
      case 'ai-wp':
        return <AIWorkPackageGenerator />;
      case 'packages':
        return <WorkPackageList packages={workPackages} />;
      default:
        return null;
    }
  };

  return (
    <div className="h-full bg-industrial-800 flex flex-col">
      {/* Tab Navigation */}
      <div className="flex border-b border-industrial-600">
        {tabs.map((tab) => {
          const Icon = tab.icon;
          return (
            <button
              key={tab.id}
              onClick={() => setActiveTab(tab.id)}
              className={`flex-1 flex items-center justify-center gap-2 py-3 px-2 text-xs font-medium transition-colors ${
                activeTab === tab.id
                  ? 'text-accent-cyan border-b-2 border-accent-cyan bg-accent-cyan/10'
                  : 'text-industrial-400 hover:text-industrial-200 hover:bg-industrial-700'
              }`}
            >
              <Icon className="w-4 h-4" />
              <span className="hidden sm:inline">{tab.label}</span>
            </button>
          );
        })}
      </div>

      {/* Tab Content */}
      <div className="flex-1 overflow-auto">
        {renderTabContent()}
      </div>
    </div>
  );
}

function WorkPackageList({ packages }) {
  if (packages.length === 0) {
    return (
      <div className="h-full flex flex-col items-center justify-center p-6 text-center">
        <Package className="w-12 h-12 text-industrial-600 mb-3" />
        <h3 className="text-sm font-medium text-industrial-300 mb-1">No Work Packages</h3>
        <p className="text-xs text-industrial-500">
          Use the AI WP Generator to create installation work packages
        </p>
      </div>
    );
  }

  return (
    <div className="p-3 space-y-2">
      {packages.map((wp) => (
        <div 
          key={wp.id}
          className="p-3 bg-industrial-700 rounded-lg border border-industrial-600 hover:border-accent-cyan/50 transition-colors"
        >
          <div className="flex items-start justify-between mb-2">
            <div>
              <h4 className="text-sm font-medium text-white">{wp.name}</h4>
              <p className="text-xs text-industrial-400">{wp.id}</p>
            </div>
            <span className={`px-2 py-0.5 rounded text-xs ${
              wp.status === 'optimized' ? 'bg-status-installed/20 text-status-installed' :
              wp.status === 'pending' ? 'bg-status-ready/20 text-status-ready' :
              'bg-status-constrained/20 text-status-constrained'
            }`}>
              {wp.status}
            </span>
          </div>
          
          <div className="grid grid-cols-2 gap-2 text-xs">
            <div className="flex items-center gap-1.5 text-industrial-300">
              <Clock className="w-3 h-3" />
              <span>{wp.duration}h</span>
            </div>
            <div className="flex items-center gap-1.5 text-industrial-300">
              <MapPin className="w-3 h-3" />
              <span>{wp.location}</span>
            </div>
            <div className="flex items-center gap-1.5 text-industrial-300">
              <Wrench className="w-3 h-3" />
              <span>{wp.crew} crew</span>
            </div>
            <div className="flex items-center gap-1.5 text-industrial-300">
              <CheckCircle className="w-3 h-3" />
              <span>{wp.elements.length} elements</span>
            </div>
          </div>

          {wp.constraints.length > 0 && (
            <div className="mt-2 pt-2 border-t border-industrial-600">
              <p className="text-xs text-industrial-400 mb-1">Constraints:</p>
              <div className="flex flex-wrap gap-1">
                {wp.constraints.map((c, i) => (
                  <span key={i} className="px-1.5 py-0.5 bg-industrial-600 rounded text-xs text-industrial-300">
                    {c}
                  </span>
                ))}
              </div>
            </div>
          )}
        </div>
      ))}
    </div>
  );
}