Update app.py
Browse files
app.py
CHANGED
|
@@ -109,7 +109,9 @@ def get_kofi_button_base64():
|
|
| 109 |
return images
|
| 110 |
|
| 111 |
# Initialize the Dash app
|
| 112 |
-
app = dash.Dash(__name__
|
|
|
|
|
|
|
| 113 |
server = app.server
|
| 114 |
|
| 115 |
# Custom CSS
|
|
@@ -227,6 +229,7 @@ app.index_string = '''
|
|
| 227 |
/* Border Classes */
|
| 228 |
.border-left {
|
| 229 |
border-left: 2px solid var(--grid-border) !important;
|
|
|
|
| 230 |
}
|
| 231 |
.border-right {
|
| 232 |
border-right: 2px solid var(--grid-border) !important;
|
|
@@ -328,7 +331,6 @@ app.index_string = '''
|
|
| 328 |
.split-header-top, .split-header-bottom {
|
| 329 |
white-space: nowrap;
|
| 330 |
}
|
| 331 |
-
|
| 332 |
.ag-theme-alpine .new-emoji-cell.ag-cell {
|
| 333 |
font-size: 18px !important;
|
| 334 |
display: flex !important;
|
|
@@ -499,7 +501,7 @@ columnDefs = [
|
|
| 499 |
"filterOptions": ['equals', 'notEqual', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'inRange']
|
| 500 |
},
|
| 501 |
"headerClass": "ag-left-aligned-header wrap-text",
|
| 502 |
-
"cellClass": "ag-left-aligned-cell",
|
| 503 |
"wrapHeaderText": True,
|
| 504 |
"autoHeaderHeight": True,
|
| 505 |
"suppressSizeToFit": True,
|
|
@@ -686,23 +688,8 @@ dashGridOptions = {
|
|
| 686 |
"suppressMultiSort": True,
|
| 687 |
"rowBuffer": 10,
|
| 688 |
"maxBlocksInCache": 2,
|
| 689 |
-
"
|
| 690 |
-
"
|
| 691 |
-
function(params) {
|
| 692 |
-
console.log('Grid ready');
|
| 693 |
-
window.gridApi = params.api;
|
| 694 |
-
}
|
| 695 |
-
"""
|
| 696 |
-
},
|
| 697 |
-
"onRowDataChanged": {
|
| 698 |
-
"function": """
|
| 699 |
-
function(params) {
|
| 700 |
-
console.log('Row data changed event');
|
| 701 |
-
console.log('Current pinned rows:', params.api.getGridOption('pinnedTopRowData'));
|
| 702 |
-
console.log('Current main rows:', []);
|
| 703 |
-
params.api.forEachNode(node => console.log(node.data.Model_Display));
|
| 704 |
-
}
|
| 705 |
-
"""
|
| 706 |
},
|
| 707 |
"theme": "ag-theme-alpine-dark" if "prefers-color-scheme: dark" else "ag-theme-alpine",
|
| 708 |
"columnState": {
|
|
@@ -718,11 +705,6 @@ dashGridOptions = {
|
|
| 718 |
|
| 719 |
# Define the layout
|
| 720 |
app.layout = html.Div([
|
| 721 |
-
dcc.Store(id='pinned-rows-store', data=[]),
|
| 722 |
-
dcc.Store(id='pinned-ids-store', data=[]),
|
| 723 |
-
dcc.Store(id='pinned-models-store', data=[]),
|
| 724 |
-
dcc.Store(id='filter-change-trigger', data=0),
|
| 725 |
-
|
| 726 |
# Header
|
| 727 |
html.Div([
|
| 728 |
html.Div([
|
|
@@ -926,10 +908,6 @@ app.layout = html.Div([
|
|
| 926 |
], style={'marginTop': '30px', 'marginBottom': '50px', 'maxWidth': '1200px', 'margin': '30px auto 80px'})
|
| 927 |
], style={'maxWidth': '100%', 'margin': '0 auto'})
|
| 928 |
|
| 929 |
-
def debug_callback(value):
|
| 930 |
-
print("Model filter value:", value)
|
| 931 |
-
return value
|
| 932 |
-
|
| 933 |
@app.callback(
|
| 934 |
[Output('leaderboard-grid', 'rowData'),
|
| 935 |
Output('model-type-filter', 'value'),
|
|
@@ -1016,66 +994,6 @@ def update_columns(additional_columns):
|
|
| 1016 |
|
| 1017 |
return current_columns
|
| 1018 |
|
| 1019 |
-
@app.callback(
|
| 1020 |
-
Output('ideology-descriptions', 'children'),
|
| 1021 |
-
[Input('leaderboard-grid', 'rowData')]
|
| 1022 |
-
)
|
| 1023 |
-
def update_ideology_descriptions(row_data):
|
| 1024 |
-
if not row_data:
|
| 1025 |
-
return []
|
| 1026 |
-
|
| 1027 |
-
# Load ideology descriptions
|
| 1028 |
-
ideology_descriptions = load_ideology_descriptions()
|
| 1029 |
-
|
| 1030 |
-
# Get unique ideologies from current grid data
|
| 1031 |
-
unique_ideologies = sorted(set(row['Ideology Name'] for row in row_data if row.get('Ideology Name')))
|
| 1032 |
-
|
| 1033 |
-
# Create markdown content
|
| 1034 |
-
markdown_content = []
|
| 1035 |
-
for ideology in unique_ideologies:
|
| 1036 |
-
if ideology in ideology_descriptions:
|
| 1037 |
-
markdown_content.append(f"**{ideology}**: {ideology_descriptions[ideology]}")
|
| 1038 |
-
|
| 1039 |
-
return dcc.Markdown("\n\n".join(markdown_content), className='markdown-content')
|
| 1040 |
|
| 1041 |
if __name__ == '__main__':
|
| 1042 |
-
app.run_server(host='0.0.0.0', port=8050)
|
| 1043 |
-
app.clientside_callback(
|
| 1044 |
-
"""
|
| 1045 |
-
function(n_clicks, current_data) {
|
| 1046 |
-
if (!n_clicks) return current_data;
|
| 1047 |
-
const pinnedRows = current_data.filter(row => row.pinned);
|
| 1048 |
-
const unpinnedRows = current_data.filter(row => !row.pinned);
|
| 1049 |
-
return [...pinnedRows, ...unpinnedRows];
|
| 1050 |
-
}
|
| 1051 |
-
""",
|
| 1052 |
-
Output('leaderboard-grid', 'rowData'),
|
| 1053 |
-
Input('leaderboard-grid', 'cellRendererData'),
|
| 1054 |
-
State('leaderboard-grid', 'rowData')
|
| 1055 |
-
)
|
| 1056 |
-
app.clientside_callback(
|
| 1057 |
-
"""
|
| 1058 |
-
function(n_clicks) {
|
| 1059 |
-
if (!window.gridApi) return;
|
| 1060 |
-
|
| 1061 |
-
console.log('Filter changed');
|
| 1062 |
-
const pinnedRows = window.gridApi.getGridOption('pinnedTopRowData') || [];
|
| 1063 |
-
console.log('Current pinned rows:', pinnedRows.map(r => r.Model_Display));
|
| 1064 |
-
|
| 1065 |
-
if (pinnedRows.length > 0) {
|
| 1066 |
-
const pinnedIds = new Set(pinnedRows.map(row => row.Model_Display));
|
| 1067 |
-
const currentRows = [];
|
| 1068 |
-
window.gridApi.forEachNode(node => {
|
| 1069 |
-
if (!pinnedIds.has(node.data.Model_Display)) {
|
| 1070 |
-
currentRows.push(node.data);
|
| 1071 |
-
}
|
| 1072 |
-
});
|
| 1073 |
-
console.log('Filtering out pinned rows');
|
| 1074 |
-
window.gridApi.setGridOption('rowData', currentRows);
|
| 1075 |
-
}
|
| 1076 |
-
return window.dash_clientside.no_update;
|
| 1077 |
-
}
|
| 1078 |
-
""",
|
| 1079 |
-
Output('leaderboard-grid', 'rowData'),
|
| 1080 |
-
Input('model-type-filter', 'value')
|
| 1081 |
-
)
|
|
|
|
| 109 |
return images
|
| 110 |
|
| 111 |
# Initialize the Dash app
|
| 112 |
+
app = dash.Dash(__name__, external_stylesheets=[
|
| 113 |
+
"https://use.fontawesome.com/releases/v5.15.4/css/all.css"
|
| 114 |
+
])
|
| 115 |
server = app.server
|
| 116 |
|
| 117 |
# Custom CSS
|
|
|
|
| 229 |
/* Border Classes */
|
| 230 |
.border-left {
|
| 231 |
border-left: 2px solid var(--grid-border) !important;
|
| 232 |
+
margin-left: -2px !important;
|
| 233 |
}
|
| 234 |
.border-right {
|
| 235 |
border-right: 2px solid var(--grid-border) !important;
|
|
|
|
| 331 |
.split-header-top, .split-header-bottom {
|
| 332 |
white-space: nowrap;
|
| 333 |
}
|
|
|
|
| 334 |
.ag-theme-alpine .new-emoji-cell.ag-cell {
|
| 335 |
font-size: 18px !important;
|
| 336 |
display: flex !important;
|
|
|
|
| 501 |
"filterOptions": ['equals', 'notEqual', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'inRange']
|
| 502 |
},
|
| 503 |
"headerClass": "ag-left-aligned-header wrap-text",
|
| 504 |
+
"cellClass": ["ag-left-aligned-cell", "border-left"],
|
| 505 |
"wrapHeaderText": True,
|
| 506 |
"autoHeaderHeight": True,
|
| 507 |
"suppressSizeToFit": True,
|
|
|
|
| 688 |
"suppressMultiSort": True,
|
| 689 |
"rowBuffer": 10,
|
| 690 |
"maxBlocksInCache": 2,
|
| 691 |
+
"icons": {
|
| 692 |
+
"menu": '<i class="fas fa-search" style="color: var(--text-color)"></i>'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 693 |
},
|
| 694 |
"theme": "ag-theme-alpine-dark" if "prefers-color-scheme: dark" else "ag-theme-alpine",
|
| 695 |
"columnState": {
|
|
|
|
| 705 |
|
| 706 |
# Define the layout
|
| 707 |
app.layout = html.Div([
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 708 |
# Header
|
| 709 |
html.Div([
|
| 710 |
html.Div([
|
|
|
|
| 908 |
], style={'marginTop': '30px', 'marginBottom': '50px', 'maxWidth': '1200px', 'margin': '30px auto 80px'})
|
| 909 |
], style={'maxWidth': '100%', 'margin': '0 auto'})
|
| 910 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 911 |
@app.callback(
|
| 912 |
[Output('leaderboard-grid', 'rowData'),
|
| 913 |
Output('model-type-filter', 'value'),
|
|
|
|
| 994 |
|
| 995 |
return current_columns
|
| 996 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 997 |
|
| 998 |
if __name__ == '__main__':
|
| 999 |
+
app.run_server(host='0.0.0.0', port=8050)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|