File size: 4,917 Bytes
fe69607
 
 
2a1a0bb
 
9c64c2a
 
fe69607
2a1a0bb
9c64c2a
2a1a0bb
 
fe69607
 
2a1a0bb
d974879
 
beba5c6
7f663ee
4bda1b3
d974879
 
2a1a0bb
 
 
 
 
 
beba5c6
2a1a0bb
fe69607
2a1a0bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe69607
2a1a0bb
fe69607
 
9c64c2a
 
fe69607
9c64c2a
fe69607
 
 
 
 
 
 
 
 
 
 
 
2a1a0bb
 
 
 
 
 
 
 
 
 
beba5c6
fe69607
 
 
 
 
 
 
 
 
 
 
 
 
9c64c2a
2a1a0bb
 
fe69607
ba922c7
 
 
fe69607
ba922c7
fe69607
 
ba922c7
 
fe69607
ba922c7
fe69607
 
 
 
 
 
ba922c7
 
27cfdc8
fe69607
 
 
9c64c2a
 
fe69607
 
 
 
 
 
 
 
 
6c15d60
fe69607
 
 
 
 
9c64c2a
 
 
 
 
e5eb1a5
87d5c73
fe69607
e5eb1a5
fe69607
bfdafe7
fe69607
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
143
144
145
146
147
148
from dotenv import load_dotenv
load_dotenv()

import streamlit as st
import pandas as pd
from sqlalchemy import create_engine, MetaData, Table, delete
from sqlalchemy.orm import sessionmaker
from utils.filter import filter_dataframe
import os
import time

# Dados de login
USERNAME = os.getenv('username')
PASSWORD = os.getenv('password')

# Configurações da página
st.set_page_config(
    page_title="Banco de Dados - GeoCosmos",
    page_icon="⛰️",
    layout="wide"
)

# Função para autenticação do usuário
def authenticate_user(username: str, password: str) -> bool:
    return username == USERNAME and password == PASSWORD

# Tela de login
def login_screen():
    st.subheader('⛰️ Banco de Dados - GeoCosmos')


    with st.form(key='login_form'):
        username = st.text_input("Nome de usuário")
        password = st.text_input("Senha", type='password')
        
        # Botão para submeter o formulário
        submit_button = st.form_submit_button('Entrar')

        if submit_button:
            if authenticate_user(username, password):
                st.session_state['logged_in'] = True
                st.rerun()
            else:
                st.error('Nome de usuário ou senha inválidos')

# Função para ler dados da tabela SQL a partir de um arquivo
def load_data() -> pd.DataFrame:
    connection_url = os.getenv("DATABASE_URL")
    engine = create_engine(connection_url)
    df = pd.read_sql_table(table_name=os.getenv("TABLE_NAME"), con=engine)
    return df, engine  # Removido o retorno da sessão

# Função para deletar linhas selecionadas
def delete_selected_rows(selected_ids, engine, table):
    meta = MetaData()
    table = Table(table, meta, autoload_with=engine, schema="public")
    
    Session = sessionmaker(bind=engine)
    session = Session()
    
    try:
        with session.begin():
            for id_value in selected_ids:
                stmt = delete(table).where(table.c.id == id_value)
                session.execute(stmt)
    finally:
        session.close()  # Garante o fechamento da sessão


# Verificar o estado de login
if 'logged_in' not in st.session_state:
    st.session_state['logged_in'] = False

# Se o usuário não está logado, exibe a tela de login
if not st.session_state['logged_in']:
    login_screen()
else:
    st.header('⛰️ Banco de Dados - GeoCosmos')
                    
    placeholder = st.empty()

    with st.spinner("Carregando dados..."):
        # Carrega os dados apenas uma vez
        if 'df' not in st.session_state:
            df, engine = load_data()
            st.session_state.df = df
            st.session_state.engine = engine
        else:
            df = st.session_state.df
            engine = st.session_state.engine
            
    # Aplica o filtro ao dataframe
    filtered_df = filter_dataframe(df)


    all_columns = filtered_df.columns.tolist()
    selected_columns = st.multiselect(
        'Escolha as colunas para exibir:',
        options=[col for col in all_columns if col not in ['id', 'Seleção']],
        placeholder="Selecione uma ou mais colunas",
        default=[],
        key="column_selector"
    )


    if selected_columns:
        displayed_columns = selected_columns + ['id']
        if 'Nome do documento' not in displayed_columns:
            displayed_columns.insert(1, 'Nome do documento')
        # Remove duplicatas e garante a ordem
        displayed_columns = list(dict.fromkeys(displayed_columns))
        displayed_df = filtered_df[displayed_columns]
    else:
        displayed_df = filtered_df

    if st.button("🔄", type="tertiary"):
        del st.session_state["df"]
        st.rerun()


    # Exibe o editor com ordem fixa e key estável
    selected_df = st.dataframe(
        displayed_df,
        column_order=[col for col in displayed_df.columns if col != 'Seleção'],
        hide_index=False,
        key="stable_data_editor",
        on_select="rerun",
        selection_mode="multi-row"
    )

    selected_rows = selected_df['selection']['rows']
    selected_ids = displayed_df.iloc[selected_rows]["id"].tolist()
    
    # Pega os nomes dos documentos selecionados
    selected_docs = displayed_df.iloc[selected_rows]["Nome do documento"].tolist()
    if selected_ids:
        with st.popover("APAGAR"):
            st.warning("Você está prestes a apagar dados. Esta ação não pode ser desfeita.")
            confirmation = st.text_input("Digite 'APAGAR' e pressione ENTER para confirmar a deleção:")
            if confirmation == "APAGAR":
                if st.button("CONFIRMAR"):
                    with st.spinner('Deletando arquivos...'):
                        delete_selected_rows(selected_ids, engine, os.getenv("TABLE_NAME"))
                    st.success(f'Os seguintes documentos foram apagados: {selected_docs}')
                    del st.session_state["df"]
                    st.rerun()