vincentiusyoshuac commited on
Commit
fa5b897
Β·
verified Β·
1 Parent(s): 0c2193f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +116 -61
app.py CHANGED
@@ -1,5 +1,6 @@
1
  import streamlit as st
2
  import pandas as pd
 
3
  from datetime import datetime, timedelta
4
  import networkx as nx
5
  import plotly.graph_objs as go
@@ -19,7 +20,7 @@ class TaskDependencyManager:
19
  self.dependency_graph.add_node(task_name)
20
 
21
  # Tambahkan dependency predecessor
22
- predecessor = task_data['Predecessor']
23
  if predecessor and predecessor != '-':
24
  if predecessor not in self.dependency_graph.nodes():
25
  self.dependency_graph.add_node(predecessor)
@@ -27,7 +28,7 @@ class TaskDependencyManager:
27
  self.dependency_graph.add_edge(predecessor, task_name)
28
 
29
  # Tambahkan dependency successor
30
- successor = task_data['Successor']
31
  if successor and successor != '-':
32
  if successor not in self.dependency_graph.nodes():
33
  self.dependency_graph.add_node(successor)
@@ -131,88 +132,142 @@ class TaskDependencyManager:
131
 
132
  class StreamlitAdvancedProjectApp:
133
  def __init__(self):
 
134
  if 'tasks' not in st.session_state:
135
  st.session_state.tasks = pd.DataFrame(columns=[
136
  'Task Name', 'Start Date', 'End Date',
137
  'Duration', 'Complexity', 'Predecessor', 'Successor',
138
  'Progress', 'Cost'
139
  ])
 
 
140
  self.dependency_manager = TaskDependencyManager()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
 
142
  def run(self):
143
- st.set_page_config(page_title="Project Dependency Optimizer", page_icon="πŸš€")
 
144
  st.title("πŸš€ Advanced Project Dependency Optimizer")
145
 
146
- # Sidebar untuk input tugas
147
- st.sidebar.header("Input Tugas Terperinci")
 
 
 
 
 
 
 
148
 
149
- with st.sidebar.form("task_input"):
150
- task_name = st.text_input("Nama Tugas")
151
- start_date = st.date_input("Tanggal Mulai")
152
- duration = st.number_input("Durasi (Hari)", min_value=1, value=5)
153
- complexity = st.selectbox("Kompleksitas", ['Low', 'Medium', 'High'])
154
 
155
- # Pilih predecessor dan successor dari tugas yang sudah ada
156
- existing_tasks = [''] + list(st.session_state.tasks['Task Name'])
157
- predecessor = st.selectbox("Predecessor (Opsional)", existing_tasks, index=0)
158
- successor = st.selectbox("Successor (Opsional)", existing_tasks, index=0)
 
 
 
 
 
 
 
 
 
 
 
 
159
 
160
  submit = st.form_submit_button("Tambah Tugas")
161
 
162
  if submit and task_name:
163
- # Cek duplikasi nama tugas
164
  if task_name in st.session_state.tasks['Task Name'].values:
165
- st.sidebar.error("Tugas dengan nama ini sudah ada!")
166
  else:
167
- # Siapkan data tugas baru
168
- new_task = {
169
- 'Task Name': task_name,
170
- 'Start Date': start_date,
171
- 'End Date': start_date + timedelta(days=duration),
172
- 'Duration': duration,
173
- 'Complexity': complexity,
174
- 'Predecessor': predecessor if predecessor else '-',
175
- 'Successor': successor if successor else '-',
176
- 'Progress': 0,
177
- 'Cost': duration * 500
178
- }
179
- st.session_state.tasks = st.session_state.tasks.append(new_task, ignore_index=True)
180
- self.dependency_manager.add_task(new_task)
181
-
182
- # Tampilkan daftar tugas
 
183
  if not st.session_state.tasks.empty:
184
  st.subheader("Daftar Tugas")
185
- st.dataframe(st.session_state.tasks, use_container_width=True)
186
-
187
- # Analisis Dependency
188
- st.subheader("Analisis Hubungan Tugas")
189
- selected_task = st.selectbox(
190
- "Pilih Tugas untuk Melihat Dependency",
191
- st.session_state.tasks['Task Name']
 
192
  )
 
 
 
 
193
 
194
- if selected_task:
195
- dependencies = self.dependency_manager.get_task_dependencies(selected_task)
196
- col1, col2 = st.columns(2)
197
- with col1:
198
- st.write("Predecessor:")
199
- st.code(dependencies['predecessors'])
200
- with col2:
201
- st.write("Successor:")
202
- st.code(dependencies['successors'])
203
-
204
- # Visualisasi Graph Dependency
205
- st.subheader("Visualisasi Graph Dependency")
206
- try:
207
- dependency_graph_fig = self.dependency_manager.create_dependency_visualization()
208
- if dependency_graph_fig:
209
- st.plotly_chart(dependency_graph_fig, use_container_width=True)
210
- else:
211
- st.info("Belum ada dependency yang dibuat")
212
- except Exception as e:
213
- st.error(f"Gagal membuat visualisasi: {e}")
214
- else:
215
- st.info("Tambahkan tugas untuk memulai analisis dependency")
 
 
 
 
 
 
 
 
 
216
 
217
  def main():
218
  app = StreamlitAdvancedProjectApp()
 
1
  import streamlit as st
2
  import pandas as pd
3
+ import numpy as np
4
  from datetime import datetime, timedelta
5
  import networkx as nx
6
  import plotly.graph_objs as go
 
20
  self.dependency_graph.add_node(task_name)
21
 
22
  # Tambahkan dependency predecessor
23
+ predecessor = task_data.get('Predecessor', '-')
24
  if predecessor and predecessor != '-':
25
  if predecessor not in self.dependency_graph.nodes():
26
  self.dependency_graph.add_node(predecessor)
 
28
  self.dependency_graph.add_edge(predecessor, task_name)
29
 
30
  # Tambahkan dependency successor
31
+ successor = task_data.get('Successor', '-')
32
  if successor and successor != '-':
33
  if successor not in self.dependency_graph.nodes():
34
  self.dependency_graph.add_node(successor)
 
132
 
133
  class StreamlitAdvancedProjectApp:
134
  def __init__(self):
135
+ # Inisialisasi session state untuk task management
136
  if 'tasks' not in st.session_state:
137
  st.session_state.tasks = pd.DataFrame(columns=[
138
  'Task Name', 'Start Date', 'End Date',
139
  'Duration', 'Complexity', 'Predecessor', 'Successor',
140
  'Progress', 'Cost'
141
  ])
142
+
143
+ # Inisialisasi dependency manager
144
  self.dependency_manager = TaskDependencyManager()
145
+
146
+ # Load existing tasks from session state
147
+ for _, task in st.session_state.tasks.iterrows():
148
+ self.dependency_manager.add_task(task.to_dict())
149
+
150
+ def calculate_project_metrics(self):
151
+ """
152
+ Hitung metrik proyek secara keseluruhan
153
+ """
154
+ if st.session_state.tasks.empty:
155
+ return None
156
+
157
+ tasks = st.session_state.tasks
158
+ return {
159
+ 'Total Tasks': len(tasks),
160
+ 'Total Duration': tasks['Duration'].sum(),
161
+ 'Total Cost': tasks['Cost'].sum(),
162
+ 'Avg Complexity': tasks['Complexity'].map({'Low': 1, 'Medium': 2, 'High': 3}).mean(),
163
+ 'Avg Progress': tasks['Progress'].mean()
164
+ }
165
 
166
  def run(self):
167
+ # Konfigurasi halaman Streamlit
168
+ st.set_page_config(page_title="Project Dependency Optimizer", page_icon="πŸš€", layout="wide")
169
  st.title("πŸš€ Advanced Project Dependency Optimizer")
170
 
171
+ # Tab untuk berbagai fungsionalitas
172
+ tab1, tab2, tab3 = st.tabs(["Input Tugas", "Analisis Proyek", "Visualisasi Dependency"])
173
+
174
+ with tab1:
175
+ self._render_task_input_form()
176
+ self._render_task_list()
177
+
178
+ with tab2:
179
+ self._render_project_metrics()
180
 
181
+ with tab3:
182
+ self._render_dependency_visualization()
 
 
 
183
 
184
+ def _render_task_input_form(self):
185
+ st.subheader("Input Detail Tugas")
186
+
187
+ with st.form("task_input", clear_on_submit=True):
188
+ col1, col2 = st.columns(2)
189
+
190
+ with col1:
191
+ task_name = st.text_input("Nama Tugas")
192
+ start_date = st.date_input("Tanggal Mulai")
193
+ duration = st.number_input("Durasi (Hari)", min_value=1, value=5)
194
+
195
+ with col2:
196
+ complexity = st.selectbox("Kompleksitas", ['Low', 'Medium', 'High'])
197
+ existing_tasks = [''] + list(st.session_state.tasks['Task Name'])
198
+ predecessor = st.selectbox("Predecessor (Opsional)", existing_tasks, index=0)
199
+ successor = st.selectbox("Successor (Opsional)", existing_tasks, index=0)
200
 
201
  submit = st.form_submit_button("Tambah Tugas")
202
 
203
  if submit and task_name:
 
204
  if task_name in st.session_state.tasks['Task Name'].values:
205
+ st.error("Tugas dengan nama ini sudah ada!")
206
  else:
207
+ new_task = pd.DataFrame({
208
+ 'Task Name': [task_name],
209
+ 'Start Date': [start_date],
210
+ 'End Date': [start_date + timedelta(days=duration)],
211
+ 'Duration': [duration],
212
+ 'Complexity': [complexity],
213
+ 'Predecessor': [predecessor if predecessor else '-'],
214
+ 'Successor': [successor if successor else '-'],
215
+ 'Progress': [0],
216
+ 'Cost': [duration * 500]
217
+ })
218
+
219
+ st.session_state.tasks = pd.concat([st.session_state.tasks, new_task], ignore_index=True)
220
+ self.dependency_manager.add_task(new_task.iloc[0].to_dict())
221
+ st.success(f"Tugas {task_name} berhasil ditambahkan!")
222
+
223
+ def _render_task_list(self):
224
  if not st.session_state.tasks.empty:
225
  st.subheader("Daftar Tugas")
226
+ edited_tasks = st.data_editor(
227
+ st.session_state.tasks,
228
+ num_rows="dynamic",
229
+ column_config={
230
+ "Progress": st.column_config.ProgressColumn(
231
+ "Progress", format="%d%%", min_value=0, max_value=100
232
+ )
233
+ }
234
  )
235
+
236
+ if st.button("Perbarui Data Tugas"):
237
+ st.session_state.tasks = edited_tasks
238
+ st.experimental_rerun()
239
 
240
+ def _render_project_metrics(self):
241
+ st.subheader("Ringkasan Metrik Proyek")
242
+ metrics = self.calculate_project_metrics()
243
+
244
+ if metrics:
245
+ col1, col2, col3 = st.columns(3)
246
+
247
+ with col1:
248
+ st.metric("Total Tugas", metrics['Total Tasks'])
249
+ st.metric("Total Durasi (Hari)", metrics['Total Duration'])
250
+
251
+ with col2:
252
+ st.metric("Total Biaya", f"Rp {metrics['Total Cost']:,}")
253
+ st.metric("Rata-rata Kompleksitas",
254
+ {1: 'Low', 2: 'Medium', 3: 'High'}.get(round(metrics['Avg Complexity']), 'N/A')
255
+ )
256
+
257
+ with col3:
258
+ st.metric("Rata-rata Progress", f"{metrics['Avg Progress']:.2f}%")
259
+
260
+ def _render_dependency_visualization(self):
261
+ st.subheader("Visualisasi Graph Dependency")
262
+
263
+ try:
264
+ dependency_graph_fig = self.dependency_manager.create_dependency_visualization()
265
+ if dependency_graph_fig:
266
+ st.plotly_chart(dependency_graph_fig, use_container_width=True)
267
+ else:
268
+ st.info("Belum ada dependency yang dibuat")
269
+ except Exception as e:
270
+ st.error(f"Gagal membuat visualisasi: {e}")
271
 
272
  def main():
273
  app = StreamlitAdvancedProjectApp()