208 lines
11 KiB
HTML
208 lines
11 KiB
HTML
{% if not InDBox %}
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<title>Photo Assistant</title>
|
|
<!-- Required meta tags -->
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
<meta name="description" content="Photo Assistant">
|
|
|
|
<!-- Bootstrap CSS -->
|
|
<link rel="stylesheet" href="{{ url_for( 'internal', filename='upstream/bootstrap-5.0.2-dist/css/bootstrap.min.css' ) }}">
|
|
<link rel="stylesheet" href="{{ url_for( 'internal', filename='upstream/jquery.contextMenu.css' ) }}">
|
|
|
|
<!-- code to get bootstrap to work -->
|
|
<script src="{{ url_for( 'internal', filename='upstream/jquery-3.6.0.min.js')}}"></script>
|
|
<script src="{{ url_for( 'internal', filename='upstream/bootstrap-5.0.2-dist/js/bootstrap.bundle.min.js')}}"></script>
|
|
<script src="{{ url_for( 'internal', filename='upstream/jquery.contextMenu.min.js')}}"></script>
|
|
<script src="{{ url_for( 'internal', filename='upstream/jquery.ui.position.min.js')}}"></script>
|
|
|
|
<link rel="shortcut icon" href="{{ url_for('internal', filename='favicon.ico') }}">
|
|
|
|
{% import "bootstrap/wtf.html" as wtf %}
|
|
<style>
|
|
.highlight { box-shadow: 0 0 7px 4px #5bc0de }
|
|
.sm-txt { font-size: 0.7rem }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<!-- Modal Dialog Box, jquery used to show / set content -->
|
|
<div id="dbox" class="modal fade" tabindex="-1" role="dialog">
|
|
<div class="modal-dialog mw-100 w-75">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 id="dbox-title" class="modal-title"></h5>
|
|
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
|
|
<span aria-hidden="true">×</span>
|
|
</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="container-fluid">
|
|
<div id="dbox-content" class="row">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<nav class="navbar navbar-expand-lg navbar-light bg-light justify-content-between py-1">
|
|
<div class="container-fluid">
|
|
{% if config.ENV == "production" %}
|
|
<a class="navbar-brand" href="/">Photo Assistant</a>
|
|
{% else %}
|
|
<a class="navbar-brand bg-secondary text-white px-2 py-0" style="border-radius:4px" href="/">PA (DEV)</a>
|
|
{% endif %}
|
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
|
|
<div class="navbar-nav col-12">
|
|
<div class="nav-item dropdown">
|
|
<a class="nav-item dropdown nav-link dropdown-toggle" href="#" id="FileMenu" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Files</a>
|
|
<div class="dropdown-menu" aria-labelledby="FileMenu">
|
|
<a class="dropdown-item" href="{{url_for('files_ip')}}">View Photos to Import</a>
|
|
<a class="dropdown-item" href="{{url_for('file_list_ip')}}">View Details of Photos to Import</a>
|
|
<a class="dropdown-item" href="{{url_for('files_sp')}}">View Stored Photos</a>
|
|
<a class="dropdown-item" href="{{url_for('files_rbp')}}">View Recycle Bin</a>
|
|
</div>
|
|
</div class="nav-item dropdown">
|
|
<div class="nav-item dropdown">
|
|
<a class="nav-item dropdown nav-link dropdown-toggle" href="#" id="PersonMenu" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Person</a>
|
|
<div class="dropdown-menu" aria-labelledby="PersonMenu">
|
|
<a class="dropdown-item" href="{{url_for('new_person')}}">Create Person</a>
|
|
<a class="dropdown-item" href="{{url_for('persons')}}">Show People</a>
|
|
<a class="dropdown-item" href="{{url_for('aistats')}}">View stats of matches</a>
|
|
<a class="dropdown-item" href="{{url_for('run_ai_on_import')}}">Match in import path(s) </a>
|
|
<a class="dropdown-item" href="{{url_for('run_ai_on_storage')}}">Match in storage path(s) </a>
|
|
<a class="dropdown-item" href="{{url_for('unmatched_faces')}}">Show unmatched</a>
|
|
</div>
|
|
</div class="nav-item dropdown">
|
|
<div class="nav-item dropdown">
|
|
<a class="nav-item dropdown nav-link dropdown-toggle" href="#" id="AdminMenu" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Admin</a>
|
|
<div class="dropdown-menu" aria-labelledby="AdminMenu">
|
|
<a class="dropdown-item" href="{{url_for('settings')}}">Edit Settings</a>
|
|
<a class="dropdown-item" href="{{url_for('scannow')}}">Scan now (for new files)</a>
|
|
{% if config.ENV != "production" %}
|
|
<a class="dropdown-item" href="{{url_for('forcescan')}}">Force Scan (delete data & rebuild)</a>
|
|
{% endif %}
|
|
<a class="dropdown-item" href="{{url_for('scan_sp')}}">Scan Storage Path</a>
|
|
<a class="dropdown-item" href="{{url_for('wakeup')}}">Force wake the job manager</a>
|
|
</div class="dropdow-menu">
|
|
</div class="nav-item dropdown">
|
|
<div class="d-flex nav-link flex-grow-1 justify-content-center p-0">
|
|
<a href="{{url_for('jobs')}}"}}<span class="navbar-text">Active Jobs:
|
|
{% set num_active_jobs = GetNumActiveJobs() %}
|
|
{% if num_active_jobs > 0 %}
|
|
<span class="badge bg-danger text-white"}}>{{num_active_jobs}}</span>
|
|
{% else %}
|
|
<span class="badge">0</span>
|
|
{% endif %}
|
|
</a>
|
|
</div class="nav-item">
|
|
|
|
<form class="d-flex col ms-5" method="POST" onSubmit="SetViewingOptionsForSearchForm()" action="/search">
|
|
<input type="hidden" id="search_noo" name="noo" value="">
|
|
<input type="hidden" id="search_grouping" name="grouping" value="">
|
|
<input type="hidden" id="search_how_many" name="how_many" value="">
|
|
<input type="hidden" id="search_offset" name="offset" value="">
|
|
<input type="hidden" id="search_size" name="size" value="">
|
|
<input type="hidden" id="search_folders" name="folders" value="">
|
|
<input type="hidden" id="search_cwd" name="cwd" value="">
|
|
<input class="form-control" type="search" placeholder="by file, date (YYYMMDD) or tag" aria-label="Search" name="search_term">
|
|
<button class="btn btn-outline-success" type="submit">Search</button>
|
|
</form>
|
|
<div class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#user"/></svg>
|
|
</a>
|
|
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdownMenuLink">
|
|
<div><a class="dropdown-item" href="{{url_for('prefs')}}">{{current_user|Username}}</a></div>
|
|
<div><a class="dropdown-item" href="{{url_for('logout')}}">Logout</a></div>
|
|
</div>
|
|
</div>
|
|
</div class="navbar-nav">
|
|
</div class="collapse navbar-collapse">
|
|
</div class="container-fluid">
|
|
</nav>
|
|
|
|
{% if GetMessage()|length %}
|
|
<div id="status" class="py-2 mx-1 alert alert-{{GetAlert()}}">
|
|
{{ GetMessage()|safe}}
|
|
{{ ClearStatus() }}
|
|
</div>
|
|
{% endif %}
|
|
{% if GetJM_Message() != None %}
|
|
{% set msg=GetJM_Message() %}
|
|
{% if request.endpoint != "fix_dups" and request.endpoint != "rm_dups" and request.endpoint != "stale_jobs" %}
|
|
<div class="py-2 mx-1 alert alert-{{msg.alert}}">
|
|
{% if msg.alert != "success" and msg.job.name != "checkdups" %}
|
|
<form id="_dismiss" action="{{url_for('clear_jm_msg', id=msg.id)}}" method="POST">
|
|
<button type="button" class="close btn border-secondary me-3" aria-label="Close" onClick="$('#_dismiss').submit()">
|
|
<span aria-hidden="true">×</span>
|
|
</button>
|
|
{% endif %}
|
|
{% if msg.job_id %}
|
|
<a href="{{url_for('joblog', id=msg.job_id)}}">Job #{{msg.job_id}}</a>:
|
|
{% endif %}
|
|
{{msg.message|safe}}
|
|
</form>
|
|
</div>
|
|
{# if a JM is a danger message, allow code to remove the status, it should be 'permanent' until addressed -- e.g. you have duplicates, fix them #}
|
|
{% if msg.alert != "danger" %}
|
|
{% set dont_print=ClearJM_Message(msg.id) %}
|
|
{% endif %}
|
|
{% endif %}
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{% block main_content %}
|
|
{% endblock main_content %}
|
|
|
|
{% if not InDBox %}
|
|
<script>
|
|
function SetViewingOptionsForSearchForm()
|
|
{
|
|
if( $('#noo').length )
|
|
$('#search_noo').val( $('#noo').val() )
|
|
else
|
|
$('#search_noo').val("Oldest")
|
|
|
|
if( $('#grouping').length )
|
|
$('#search_grouping').val( $('#grouping').val() )
|
|
else
|
|
$('#search_grouping').val("None")
|
|
|
|
if( $('#how_many').length )
|
|
$('#search_how_many').val( $('#how_many').val() )
|
|
else
|
|
$('#search_how_many').val("10")
|
|
|
|
if( $('#offset').length )
|
|
$('#search_offset').val( $('#offset').val() )
|
|
else
|
|
$('#search_offset').val(0)
|
|
|
|
if( $('#size').length )
|
|
$('#search_size').val( $('#size').val() )
|
|
else
|
|
$('#search_size').val(128)
|
|
|
|
if( $('#folders').length )
|
|
$('#search_folders').val( $('#folders').val() )
|
|
else
|
|
$('#search_folders').val('False')
|
|
|
|
if( $('#cwd').length )
|
|
$('#search_cwd').val( $('#cwd').val() )
|
|
else
|
|
$('#search_cwd').val('')
|
|
}
|
|
</script>
|
|
{%block script_content %}{% endblock script_content %}
|
|
</body>
|
|
</html>
|
|
{% endif %}
|