first pass of versioning, working for files.html only for now
This commit is contained in:
26
files.py
26
files.py
@@ -270,23 +270,12 @@ class EntrySchema(ma.SQLAlchemyAutoSchema):
|
|||||||
def get_full_path(self, obj):
|
def get_full_path(self, obj):
|
||||||
return obj.FullPathOnFS()
|
return obj.FullPathOnFS()
|
||||||
|
|
||||||
# quick helper func to return the timestampe of a (jscript) file.
|
|
||||||
# we use this as a quick/hacky way of versioning the jscript file
|
|
||||||
def get_version(fname):
|
|
||||||
mtime = os.path.getmtime(fname)
|
|
||||||
return int(mtime) # Use timestamp as version
|
|
||||||
|
|
||||||
# global - this will be use more than once below, so do it once for efficiency
|
# global - this will be use more than once below, so do it once for efficiency
|
||||||
entries_schema = EntrySchema(many=True)
|
entries_schema = EntrySchema(many=True)
|
||||||
FOT_Schema = FaceOverrideTypeSchema(many=True)
|
FOT_Schema = FaceOverrideTypeSchema(many=True)
|
||||||
path_Schema = PathSchema(many=True)
|
path_Schema = PathSchema(many=True)
|
||||||
person_Schema = PersonSchema(many=True)
|
person_Schema = PersonSchema(many=True)
|
||||||
|
|
||||||
js_vers={}
|
|
||||||
js_vers['fs'] = get_version( url_for( 'internal', filename='js/files_support.js') )
|
|
||||||
js_vers['vs'] = get_version( url_for( 'internal', filename='js/view_support.js') )
|
|
||||||
js_vers['ft'] = get_version( url_for( 'internal', filename='js/files_transform.js') )
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# /get_entries_by_ids -> route where we supply list of entry ids (for next/prev
|
# /get_entries_by_ids -> route where we supply list of entry ids (for next/prev
|
||||||
# page of data we want to show). Returns json of all matching entries
|
# page of data we want to show). Returns json of all matching entries
|
||||||
@@ -482,6 +471,7 @@ def file_list_ip():
|
|||||||
def files_ip():
|
def files_ip():
|
||||||
OPT=States( request )
|
OPT=States( request )
|
||||||
query_data = GetQueryData( OPT )
|
query_data = GetQueryData( OPT )
|
||||||
|
js_vers = getVersions()
|
||||||
return render_template("files.html", page_title=f"View Files ({OPT.path_type} Path)", OPT=OPT, query_data=query_data, js_vers=js_vers )
|
return render_template("files.html", page_title=f"View Files ({OPT.path_type} Path)", OPT=OPT, query_data=query_data, js_vers=js_vers )
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
@@ -782,3 +772,17 @@ def get_existing_paths(dt):
|
|||||||
first_dir=0
|
first_dir=0
|
||||||
ret+= ' ]'
|
ret+= ' ]'
|
||||||
return make_response( ret )
|
return make_response( ret )
|
||||||
|
|
||||||
|
# quick helper func to return timestamps of jscript files
|
||||||
|
# we use this as a quick/hacky way of versioning them
|
||||||
|
def getVersions():
|
||||||
|
js_vers={}
|
||||||
|
js_vers['fs'] = int(os.path.getmtime( "."+url_for( 'internal', filename='js/files_support.js') ))
|
||||||
|
js_vers['vs'] = int(os.path.getmtime( "."+url_for( 'internal', filename='js/view_support.js') ))
|
||||||
|
js_vers['ft'] = int(os.path.getmtime( "."+url_for( 'internal', filename='js/files_transform.js') ))
|
||||||
|
js_vers['ic'] = int(os.path.getmtime( "."+url_for( 'internal', filename='icons.svg') ))
|
||||||
|
js_vers['r180'] = int(os.path.getmtime( "."+url_for( 'internal', filename='rot180.png') ))
|
||||||
|
js_vers['r270'] = int(os.path.getmtime( "."+url_for( 'internal', filename='rot270.png') ))
|
||||||
|
js_vers['r90'] = int(os.path.getmtime( "."+url_for( 'internal', filename='rot90.png') ))
|
||||||
|
js_vers['th'] = int(os.path.getmtime( "."+url_for( 'internal', filename='throbber.gif') ))
|
||||||
|
return js_vers
|
||||||
|
|||||||
@@ -26,13 +26,13 @@
|
|||||||
<div class="my-auto col col-auto">
|
<div class="my-auto col col-auto">
|
||||||
<span class="alert alert-primary py-2">
|
<span class="alert alert-primary py-2">
|
||||||
{% if "files_ip" in request.url %}
|
{% if "files_ip" in request.url %}
|
||||||
<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#import"/></svg>
|
<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#import"/></svg>
|
||||||
{% set tmp_path=OPT.cwd | replace( "static/Import", "" ) + "/" %}
|
{% set tmp_path=OPT.cwd | replace( "static/Import", "" ) + "/" %}
|
||||||
{% elif "files_sp" in request.url %}
|
{% elif "files_sp" in request.url %}
|
||||||
<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#db"/></svg>
|
<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#db"/></svg>
|
||||||
{% set tmp_path=OPT.cwd | replace( "static/Storage", "" ) + "/" %}
|
{% set tmp_path=OPT.cwd | replace( "static/Storage", "" ) + "/" %}
|
||||||
{% elif "files_rbp" in request.url %}
|
{% elif "files_rbp" in request.url %}
|
||||||
<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#trash"/></svg>
|
<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#trash"/></svg>
|
||||||
{% set tmp_path=OPT.cwd | replace( "static/Bin", "" ) + "/" %}
|
{% set tmp_path=OPT.cwd | replace( "static/Bin", "" ) + "/" %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{tmp_path}}</span>
|
{{tmp_path}}</span>
|
||||||
@@ -58,21 +58,21 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="col flex-grow-1 my-auto d-flex justify-content-center w-100">
|
<div class="col flex-grow-1 my-auto d-flex justify-content-center w-100">
|
||||||
<button aria-label="prev" id="prev" name="prev" class="prev sm-txt btn btn-outline-secondary disabled" onClick="prevPage(getPageFigures)" disabled>
|
<button aria-label="prev" id="prev" name="prev" class="prev sm-txt btn btn-outline-secondary disabled" onClick="prevPage(getPageFigures)" disabled>
|
||||||
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#prev"/></svg>
|
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#prev"/></svg>
|
||||||
</button>
|
</button>
|
||||||
<span class="how_many_text sm-txt my-auto"> {{OPT.how_many}} files </span>
|
<span class="how_many_text sm-txt my-auto"> {{OPT.how_many}} files </span>
|
||||||
<button aria-label="next" id="next" name="next" class="next sm-txt btn btn-outline-secondary" onClick="nextPage(getPageFigures)">
|
<button aria-label="next" id="next" name="next" class="next sm-txt btn btn-outline-secondary" onClick="nextPage(getPageFigures)">
|
||||||
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#next"/></svg>
|
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#next"/></svg>
|
||||||
</button>
|
</button>
|
||||||
<button aria-label="move" id="move" disabled name="move" class="sm-txt btn btn-outline-primary ms-4" onClick="MoveDBox(move_paths); return false;">
|
<button aria-label="move" id="move" disabled name="move" class="sm-txt btn btn-outline-primary ms-4" onClick="MoveDBox(move_paths); return false;">
|
||||||
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#folder_plus"/></svg>
|
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#folder_plus"/></svg>
|
||||||
</button>
|
</button>
|
||||||
{% if "files_rbp" in request.url %}
|
{% if "files_rbp" in request.url %}
|
||||||
<button aria-label="delete" id="del" disabled name="del" class="sm-txt btn btn-outline-success mx-1" onClick="DelDBox('Restore'); return false;">
|
<button aria-label="delete" id="del" disabled name="del" class="sm-txt btn btn-outline-success mx-1" onClick="DelDBox('Restore'); return false;">
|
||||||
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#trash-fill"/></svg>
|
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#trash-fill"/></svg>
|
||||||
{% else %}
|
{% else %}
|
||||||
<button aria-label="delete" id="del" disabled name="del" class="sm-txt btn btn-outline-danger mx-1" onClick="DelDBox('Delete'); return false;">
|
<button aria-label="delete" id="del" disabled name="del" class="sm-txt btn btn-outline-danger mx-1" onClick="DelDBox('Delete'); return false;">
|
||||||
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#trash-fill"/></svg>
|
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#trash-fill"/></svg>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</button>
|
</button>
|
||||||
<button style="visibility:hidden" class="btn btn-outline-secondary" aria-label="shift-key" id="shift-key" onclick="document.fake_shift=1-document.fake_shift; event.stopPropagation(); return false">shift</button>
|
<button style="visibility:hidden" class="btn btn-outline-secondary" aria-label="shift-key" id="shift-key" onclick="document.fake_shift=1-document.fake_shift; event.stopPropagation(); return false">shift</button>
|
||||||
@@ -104,11 +104,11 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col my-auto d-flex justify-content-center">
|
<div class="col my-auto d-flex justify-content-center">
|
||||||
<button aria-label="prev" id="prev" name="prev" class="prev sm-txt btn btn-outline-secondary disabled" onClick="prevPage(getPageFigures)" disabled>
|
<button aria-label="prev" id="prev" name="prev" class="prev sm-txt btn btn-outline-secondary disabled" onClick="prevPage(getPageFigures)" disabled>
|
||||||
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#prev"/></svg>
|
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#prev"/></svg>
|
||||||
</button>
|
</button>
|
||||||
<span class="how_many_text sm-txt my-auto"> {{OPT.how_many}} files </span>
|
<span class="how_many_text sm-txt my-auto"> {{OPT.how_many}} files </span>
|
||||||
<button aria-label="next" id="next" name="next" class="next sm-txt btn btn-outline-secondary" onClick="nextPage(getPageFigures)">
|
<button aria-label="next" id="next" name="next" class="next sm-txt btn btn-outline-secondary" onClick="nextPage(getPageFigures)">
|
||||||
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#next"/></svg>
|
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#next"/></svg>
|
||||||
</button>
|
</button>
|
||||||
</div class="col my-auto">
|
</div class="col my-auto">
|
||||||
</div class="row">
|
</div class="row">
|
||||||
@@ -129,12 +129,12 @@
|
|||||||
<button title="Show previous image" class="btn btn-outline-info px-2 flex-grow-1"
|
<button title="Show previous image" class="btn btn-outline-info px-2 flex-grow-1"
|
||||||
style="padding: 10%" id="la" onClick="prevImageInViewer()">
|
style="padding: 10%" id="la" onClick="prevImageInViewer()">
|
||||||
<svg width="16" height="16" fill="currentColor">
|
<svg width="16" height="16" fill="currentColor">
|
||||||
<use xlink:href="{{url_for('internal', filename='icons.svg')}}#prev"/></svg>
|
<use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#prev"/></svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<figure class="col col-auto border border-info rounded m-0 p-1" id="figure">
|
<figure class="col col-auto border border-info rounded m-0 p-1" id="figure">
|
||||||
<canvas id="canvas"></canvas>
|
<canvas id="canvas"></canvas>
|
||||||
<img id="throbber" src="{{url_for('internal', filename='throbber.gif')}}" style="display:none;">
|
<img id="throbber" src="{{url_for('internal', filename='throbber.gif')}}?v={{js_vers[th]}}" style="display:none;">
|
||||||
<script>
|
<script>
|
||||||
var im=new Image();
|
var im=new Image();
|
||||||
im.onload=DrawImg
|
im.onload=DrawImg
|
||||||
@@ -163,7 +163,7 @@
|
|||||||
<button title="Show next image" class="btn btn-outline-info px-2 flex-grow-1"
|
<button title="Show next image" class="btn btn-outline-info px-2 flex-grow-1"
|
||||||
style="padding: 10%" id="ra" onClick="nextImageInViewer()">
|
style="padding: 10%" id="ra" onClick="nextImageInViewer()">
|
||||||
<svg width="16" height="16" fill="currentColor">
|
<svg width="16" height="16" fill="currentColor">
|
||||||
<use xlink:href="{{url_for('internal', filename='icons.svg')}}#next"/></svg>
|
<use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#next"/></svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div class="row">
|
</div class="row">
|
||||||
@@ -171,7 +171,7 @@
|
|||||||
{# this whole div, just takes up the same space as the left button and is hidden for alignment only #}
|
{# this whole div, just takes up the same space as the left button and is hidden for alignment only #}
|
||||||
<div class="col-auto px-0">
|
<div class="col-auto px-0">
|
||||||
<button class="btn btn-outline-info px-2 invisible" disabled>
|
<button class="btn btn-outline-info px-2 invisible" disabled>
|
||||||
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#next"/></svg>
|
<svg width="16" height="16" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#next"/></svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<span class="col-auto my-auto">Show:</span>
|
<span class="col-auto my-auto">Show:</span>
|
||||||
@@ -194,34 +194,34 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col col-auto pt-1">
|
<div class="col col-auto pt-1">
|
||||||
<button class="btn btn-outline-info p-1" title="Rotate by 90 degrees" onClick="Transform(90)">
|
<button class="btn btn-outline-info p-1" title="Rotate by 90 degrees" onClick="Transform(90)">
|
||||||
<img src="{{url_for('internal', filename='rot90.png')}}" width="32" height="32" onMouseOver="this.src='{{url_for('internal', filename='rot90-invert.png')}}'"
|
<img src="{{url_for('internal', filename='rot90.png')}}?v={{js_vers['r90']}}" width="32" height="32" onMouseOver="this.src='{{url_for('internal', filename='rot90-invert.png')}}'"
|
||||||
onMouseOut="this.src='{{url_for('internal', filename='rot90.png')}}'" />
|
onMouseOut="this.src='{{url_for('internal', filename='rot90.png')}}?v={{js_vers['r90']}}'" />
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-outline-info p-1" title="Rotate by 180 degrees" onClick="Transform(180)">
|
<button class="btn btn-outline-info p-1" title="Rotate by 180 degrees" onClick="Transform(180)">
|
||||||
<img src="{{url_for('internal', filename='rot180.png')}}" width="32" height="32" onMouseOver="this.src='{{url_for('internal', filename='rot180-invert.png')}}'"
|
<img src="{{url_for('internal', filename='rot180.png')}}?v={{js_vers['r180']}}" width="32" height="32" onMouseOver="this.src='{{url_for('internal', filename='rot180-invert.png')}}'"
|
||||||
onMouseOut="this.src='{{url_for('internal', filename='rot180.png')}}'" />
|
onMouseOut="this.src='{{url_for('internal', filename='rot180.png')}}?v={{js_vers['r180']}}'" />
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-outline-info p-1" title="Rotate by 270 degrees" onClick="Transform(270)">
|
<button class="btn btn-outline-info p-1" title="Rotate by 270 degrees" onClick="Transform(270)">
|
||||||
<img src="{{url_for('internal', filename='rot270.png')}}" width="32" height="32" onMouseOver="this.src='{{url_for('internal', filename='rot270-invert.png')}}'"
|
<img src="{{url_for('internal', filename='rot270.png')}}?v={{js_vers['r270']}}" width="32" height="32" onMouseOver="this.src='{{url_for('internal', filename='rot270-invert.png')}}'"
|
||||||
onMouseOut="this.src='{{url_for('internal', filename='rot270.png')}}'" />
|
onMouseOut="this.src='{{url_for('internal', filename='rot270.png')}}?v={{js_vers['r270']}}'" />
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-outline-info p-1" title="Flip horizontally" onClick="Transform('fliph')">
|
<button class="btn btn-outline-info p-1" title="Flip horizontally" onClick="Transform('fliph')">
|
||||||
<svg width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#flip_h"/></svg>
|
<svg width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#flip_h"/></svg>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-outline-info p-1" title="Flip vertically" onClick="Transform('flipv')">
|
<button class="btn btn-outline-info p-1" title="Flip vertically" onClick="Transform('flipv')">
|
||||||
<svg width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#flip_v"/></svg>
|
<svg width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#flip_v"/></svg>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-outline-info p-1" title="View in Fullscreen mode (hotkey: F)" onClick="fullscreen=true; ViewImageOrVideo()">
|
<button class="btn btn-outline-info p-1" title="View in Fullscreen mode (hotkey: F)" onClick="fullscreen=true; ViewImageOrVideo()">
|
||||||
<svg width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#fullscreen"/></svg>
|
<svg width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#fullscreen"/></svg>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-outline-info p-1" title="Show logs relating to this filename (hotkey: l)" onClick="JoblogSearch()">
|
<button class="btn btn-outline-info p-1" title="Show logs relating to this filename (hotkey: l)" onClick="JoblogSearch()">
|
||||||
<svg width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#log"/></svg>
|
<svg width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#log"/></svg>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-outline-info p-1" title="View Original" onClick="window.location='/'+document.viewing.FullPathOnFS">
|
<button class="btn btn-outline-info p-1" title="View Original" onClick="window.location='/'+document.viewing.FullPathOnFS">
|
||||||
<svg width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#download"/></svg>
|
<svg width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#download"/></svg>
|
||||||
</button>
|
</button>
|
||||||
<button id="viewer_del" class="btn btn-outline-danger p-1" title="Delete (hotkey: Del)" onClick="DelDBox('Delete')">
|
<button id="viewer_del" class="btn btn-outline-danger p-1" title="Delete (hotkey: Del)" onClick="DelDBox('Delete')">
|
||||||
<svg id="viewer_bin" width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#trash"/></svg>
|
<svg id="viewer_bin" width="32" height="32" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#trash"/></svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div class="row">
|
</div class="row">
|
||||||
@@ -267,17 +267,17 @@
|
|||||||
s='<span class="alert alert-secondary py-2">'
|
s='<span class="alert alert-secondary py-2">'
|
||||||
if( fname.indexOf( "static/Import" ) == 0 )
|
if( fname.indexOf( "static/Import" ) == 0 )
|
||||||
{
|
{
|
||||||
s+='<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#import"/></svg>'
|
s+='<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#import"/></svg>'
|
||||||
tmp_path=fname.replace("statuc/Import","" )
|
tmp_path=fname.replace("statuc/Import","" )
|
||||||
}
|
}
|
||||||
if( fname.indexOf( "static/Storage" ) == 0 )
|
if( fname.indexOf( "static/Storage" ) == 0 )
|
||||||
{
|
{
|
||||||
s+='<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#db"/></svg>'
|
s+='<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#db"/></svg>'
|
||||||
tmp_path=fname.replace("static/Storage","" )
|
tmp_path=fname.replace("static/Storage","" )
|
||||||
}
|
}
|
||||||
if( fname.indexOf( "static/Bin" ) == 0 )
|
if( fname.indexOf( "static/Bin" ) == 0 )
|
||||||
{
|
{
|
||||||
s+='<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}#trash-fill"/></svg>'
|
s+='<svg width="20" height="20" fill="currentColor"><use xlink:href="{{url_for('internal', filename='icons.svg')}}?v={{js_vers['ic']}}#trash-fill"/></svg>'
|
||||||
tmp_path=fname.replace("static/Bin","" )
|
tmp_path=fname.replace("static/Bin","" )
|
||||||
}
|
}
|
||||||
s+=tmp_path+'</span>'
|
s+=tmp_path+'</span>'
|
||||||
|
|||||||
Reference in New Issue
Block a user