File size: 3,309 Bytes
8772ab2
97187b7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8772ab2
889fd04
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
import streamlit as st
import pandas as pd
import json
from datetime import datetime

st.set_page_config(page_title="SharePoint File Explorer", layout="wide")
st.title("πŸ“ SharePoint File Explorer")

# File uploader
uploaded_file = st.file_uploader("Upload a SharePoint JSON file", type="json")

if uploaded_file is not None:
    try:
        raw_data = json.load(uploaded_file)
        if "value" not in raw_data:
            st.error("The uploaded JSON does not contain a 'value' key.")
            st.stop()

        data = raw_data["value"]
        df = pd.json_normalize(data)

        # Check required columns
        required_columns = ["{Name}", "{Link}", "{IsFolder}", "Modified", "{FilenameWithExtension}"]
        missing_columns = [col for col in required_columns if col not in df.columns]
        if missing_columns:
            st.error(f"Missing expected columns in JSON: {missing_columns}")
            st.stop()

        # Rename columns for display
        df_filtered = df[required_columns].copy()
        df_filtered.columns = ["Name", "Link", "IsFolder", "Modified", "FilenameWithExtension"]
        df_filtered["Modified"] = pd.to_datetime(df_filtered["Modified"])

        # Classify file types
        def classify_file_type(filename):
            if not isinstance(filename, str):
                return "Other"
            ext = filename.lower().split('.')[-1]
            if ext in ['doc', 'docx']:
                return "Word"
            elif ext in ['ppt', 'pptx']:
                return "PowerPoint"
            elif ext in ['xls', 'xlsx']:
                return "Excel"
            elif ext == 'pdf':
                return "PDF"
            else:
                return "Other"

        df_filtered["FileType"] = df_filtered["FilenameWithExtension"].apply(classify_file_type)

        # Filters
        with st.sidebar:
            st.header("πŸ” Filters")
            name_filter = st.text_input("Search by name")
            type_filter = st.selectbox("Show:", ["All", "Files only", "Folders only"])
            filetype_filter = st.multiselect("File type", options=sorted(df_filtered["FileType"].unique()))
            date_range = st.date_input("Modified date range", [])

        # Apply filters
        if name_filter:
            df_filtered = df_filtered[df_filtered["Name"].str.contains(name_filter, case=False, na=False)]

        if type_filter == "Files only":
            df_filtered = df_filtered[df_filtered["IsFolder"] == False]
        elif type_filter == "Folders only":
            df_filtered = df_filtered[df_filtered["IsFolder"] == True]

        if filetype_filter:
            df_filtered = df_filtered[df_filtered["FileType"].isin(filetype_filter)]

        if isinstance(date_range, list) and len(date_range) == 2:
            start_date, end_date = pd.to_datetime(date_range)
            df_filtered = df_filtered[(df_filtered["Modified"] >= start_date) & (df_filtered["Modified"] <= end_date)]

        # Display results
        st.markdown(f"### πŸ“„ {len(df_filtered)} items found")
        st.dataframe(df_filtered[["Name", "FileType", "IsFolder", "Modified", "Link"]].reset_index(drop=True))

    except Exception as e:
        st.error(f"Error processing file: {e}")
else:
    st.info("Please upload a SharePoint JSON file to begin.")