From de8f39fa95b7b11842f71ae01d8dab78cbccc8cb Mon Sep 17 00:00:00 2001 From: Taka Date: Sat, 26 Sep 2020 01:50:39 +0000 Subject: [PATCH] Allow files to be uploaded to the ASL Scenario Archive. --- vasl_templates/main_window.py | 8 + vasl_templates/webapp/__init__.py | 3 + vasl_templates/webapp/downloads.py | 23 +- vasl_templates/webapp/main.py | 5 + vasl_templates/webapp/scenarios.py | 255 +++++++++- .../webapp/static/css/scenario-card.css | 12 +- .../static/css/scenario-downloads-dialog.css | 20 + .../static/css/scenario-search-dialog.css | 2 + .../static/css/scenario-upload-dialog.css | 56 +++ .../static/imageZoom/jquery.imageZoom.css | 48 -- .../static/imageZoom/jquery.imageZoom.min.js | 1 - .../static/imageZoom/jquery.imageZoom.png | Bin 1755 -> 0 bytes .../webapp/static/images/download.png | Bin 0 -> 2558 bytes .../webapp/static/images/screenshot.png | Bin 0 -> 2499 bytes .../webapp/static/images/upload.png | Bin 0 -> 2584 bytes .../static/images/vassal-screenshot-hint.png | Bin 0 -> 43672 bytes vasl_templates/webapp/static/lfa-upload.js | 4 +- .../lightgallery/css/lightgallery.min.css | 1 + .../webapp/static/lightgallery/fonts/lg.svg | 51 ++ .../webapp/static/lightgallery/fonts/lg.ttf | Bin 0 -> 4432 bytes .../webapp/static/lightgallery/fonts/lg.woff | Bin 0 -> 4508 bytes .../static/lightgallery/img/loading.gif | Bin 0 -> 4178 bytes .../static/lightgallery/js/lg-rotate.min.js | 4 + .../lightgallery/js/lg-thumbnail.min.js | 4 + .../static/lightgallery/js/lg-zoom.min.js | 4 + .../lightgallery/js/lightgallery.min.js | 4 + vasl_templates/webapp/static/roar.js | 6 +- .../webapp/static/scenario-upload.js | 454 ++++++++++++++++++ vasl_templates/webapp/static/scenarios.js | 314 +++++++++--- vasl_templates/webapp/static/snippets.js | 9 +- vasl_templates/webapp/static/sortable.js | 1 + vasl_templates/webapp/static/utils.js | 54 ++- vasl_templates/webapp/static/vassal.js | 9 +- vasl_templates/webapp/static/vo.js | 1 + vasl_templates/webapp/templates/index.html | 16 +- .../webapp/templates/scenario-card.html | 9 +- .../templates/scenario-downloads-dialog.html | 5 + .../templates/scenario-search-dialog.html | 6 +- .../templates/scenario-upload-dialog.html | 66 +++ .../asa-responses/incorrect-token.json | 6 + .../fixtures/asa-responses/missing-token.json | 6 + .../asa-responses/missing-user-name.json | 6 + .../asa-responses/no-files-uploaded.json | 6 + .../tests/fixtures/asa-responses/ok.json | 6 + .../tests/fixtures/asl-scenario-archive.json | 23 +- vasl_templates/webapp/tests/remote.py | 25 + .../webapp/tests/test_scenario_search.py | 194 +++++++- vasl_templates/webapp/utils.py | 27 +- vasl_templates/webapp/vassal.py | 12 +- vasl_templates/webapp/webdriver.py | 10 +- vassal-shim/release/vassal-shim.jar | Bin 31225 -> 34619 bytes .../src/vassal_shim/AppImageSaver.java | 56 +++ vassal-shim/src/vassal_shim/Main.java | 12 + vassal-shim/src/vassal_shim/VassalShim.java | 102 +++- 54 files changed, 1763 insertions(+), 183 deletions(-) create mode 100644 vasl_templates/webapp/static/css/scenario-downloads-dialog.css create mode 100644 vasl_templates/webapp/static/css/scenario-upload-dialog.css delete mode 100644 vasl_templates/webapp/static/imageZoom/jquery.imageZoom.css delete mode 100644 vasl_templates/webapp/static/imageZoom/jquery.imageZoom.min.js delete mode 100644 vasl_templates/webapp/static/imageZoom/jquery.imageZoom.png create mode 100644 vasl_templates/webapp/static/images/download.png create mode 100644 vasl_templates/webapp/static/images/screenshot.png create mode 100644 vasl_templates/webapp/static/images/upload.png create mode 100644 vasl_templates/webapp/static/images/vassal-screenshot-hint.png create mode 100644 vasl_templates/webapp/static/lightgallery/css/lightgallery.min.css create mode 100644 vasl_templates/webapp/static/lightgallery/fonts/lg.svg create mode 100644 vasl_templates/webapp/static/lightgallery/fonts/lg.ttf create mode 100644 vasl_templates/webapp/static/lightgallery/fonts/lg.woff create mode 100644 vasl_templates/webapp/static/lightgallery/img/loading.gif create mode 100644 vasl_templates/webapp/static/lightgallery/js/lg-rotate.min.js create mode 100644 vasl_templates/webapp/static/lightgallery/js/lg-thumbnail.min.js create mode 100644 vasl_templates/webapp/static/lightgallery/js/lg-zoom.min.js create mode 100644 vasl_templates/webapp/static/lightgallery/js/lightgallery.min.js create mode 100644 vasl_templates/webapp/static/scenario-upload.js create mode 100644 vasl_templates/webapp/templates/scenario-downloads-dialog.html create mode 100644 vasl_templates/webapp/templates/scenario-upload-dialog.html create mode 100644 vasl_templates/webapp/tests/fixtures/asa-responses/incorrect-token.json create mode 100644 vasl_templates/webapp/tests/fixtures/asa-responses/missing-token.json create mode 100644 vasl_templates/webapp/tests/fixtures/asa-responses/missing-user-name.json create mode 100644 vasl_templates/webapp/tests/fixtures/asa-responses/no-files-uploaded.json create mode 100644 vasl_templates/webapp/tests/fixtures/asa-responses/ok.json create mode 100644 vassal-shim/src/vassal_shim/AppImageSaver.java diff --git a/vasl_templates/main_window.py b/vasl_templates/main_window.py index ab121f0..ec50cdb 100644 --- a/vasl_templates/main_window.py +++ b/vasl_templates/main_window.py @@ -334,3 +334,11 @@ class MainWindow( QWidget ): def on_snippet_image( self, img_data ): """Called when a snippet image has been generated.""" self._web_channel_handler.on_snippet_image( img_data ) + + @pyqtSlot( str, str, result=bool ) + @catch_exceptions( caption="SLOT EXCEPTION", retval=False ) + def save_downloaded_vsav( self, fname, data ): + """Called when a VASL scenario has been downloaded.""" + data = base64.b64decode( data ) + # NOTE: We handle this the same as saving an updated VSAV. + return self._web_channel_handler.save_updated_vsav( fname, data ) diff --git a/vasl_templates/webapp/__init__.py b/vasl_templates/webapp/__init__.py index e41a39f..23dc664 100644 --- a/vasl_templates/webapp/__init__.py +++ b/vasl_templates/webapp/__init__.py @@ -83,6 +83,9 @@ app = Flask( __name__ ) app.config[ "ASA_SCENARIO_URL" ] = "https://aslscenarioarchive.com/scenario.php?id={ID}" app.config[ "ASA_PUBLICATION_URL" ] = "https://aslscenarioarchive.com/viewPub.php?id={ID}" app.config[ "ASA_PUBLISHER_URL" ] = "https://aslscenarioarchive.com/viewPublisher.php?id={ID}" +app.config[ "ASA_GET_SCENARIO_URL" ] = "https://aslscenarioarchive.com/rest/scenario/list/{ID}" +app.config[ "ASA_MAX_VASL_SETUP_SIZE" ] = 200 # nb: KB +app.config[ "ASA_MAX_SCREENSHOT_SIZE" ] = 200 # nb: KB # load the application configuration config_dir = os.path.join( BASE_DIR, "config" ) diff --git a/vasl_templates/webapp/downloads.py b/vasl_templates/webapp/downloads.py index 473981b..0e7a4ce 100644 --- a/vasl_templates/webapp/downloads.py +++ b/vasl_templates/webapp/downloads.py @@ -46,14 +46,14 @@ class DownloadedFile: _registry.add( self ) # check if we have a cached copy of the file - self._cache_fname = os.path.join( tempfile.gettempdir(), "vasl-templates."+fname ) - if os.path.isfile( self._cache_fname ): + self.cache_fname = os.path.join( tempfile.gettempdir(), "vasl-templates."+fname ) + if os.path.isfile( self.cache_fname ): # yup - load it - _logger.info( "Using cached %s file: %s", key, self._cache_fname ) - self._set_data( self._cache_fname ) + _logger.info( "Using cached %s file: %s", key, self.cache_fname ) + self._set_data( self.cache_fname ) else: # nope - start with an empty data set - _logger.debug( "No cached %s file: %s", key, self._cache_fname ) + _logger.debug( "No cached %s file: %s", key, self.cache_fname ) def _set_data( self, data ): """Install a new data set.""" @@ -114,9 +114,9 @@ class DownloadedFile: _logger.info( "Download of the %s file has been disabled.", df.key ) continue ttl *= 60*60 - if os.path.isfile( df._cache_fname ): + if os.path.isfile( df.cache_fname ): # yup - check how long ago it was downloaded - mtime = os.path.getmtime( df._cache_fname ) + mtime = os.path.getmtime( df.cache_fname ) age = int( time.time() - mtime ) _logger.debug( "Checking the cached %s file: age=%s, ttl=%s (mtime=%s)", df.key, @@ -130,7 +130,10 @@ class DownloadedFile: # download the file _logger.info( "Downloading the %s file: %s", df.key, url ) try: - fp = urllib.request.urlopen( url ) + req = urllib.request.Request( url, + headers = { "Accept-Encoding": "gzip, deflate" } + ) + fp = urllib.request.urlopen( req ) data = fp.read().decode( "utf-8" ) except Exception as ex: #pylint: disable=broad-except msg = str( getattr(ex,"reason",None) or ex ) @@ -150,6 +153,6 @@ class DownloadedFile: # is performance-critical and we can probably live it. # save a cached copy of the data - _logger.debug( "Saving a cached copy of the %s file: %s", df.key, df._cache_fname ) - with open( df._cache_fname, "w", encoding="utf-8" ) as fp: + _logger.debug( "Saving a cached copy of the %s file: %s", df.key, df.cache_fname ) + with open( df.cache_fname, "w", encoding="utf-8" ) as fp: fp.write( data ) diff --git a/vasl_templates/webapp/main.py b/vasl_templates/webapp/main.py index 8ce22bf..17ba581 100644 --- a/vasl_templates/webapp/main.py +++ b/vasl_templates/webapp/main.py @@ -68,6 +68,7 @@ _APP_CONFIG_DEFAULTS = { # Bodhgaya, India (APR/19) # but VASSAL is already so slow to load images, and doing everything twice would make it that much worse :-/ "ONLINE_COUNTER_IMAGES_URL_TEMPLATE": "https://raw.githubusercontent.com/vasl-developers/vasl/develop/dist/images/{{PATH}}", #pylint: disable=line-too-long "ONLINE_EXTN_COUNTER_IMAGES_URL_TEMPLATE": "http://vasl-templates.org/services/counter/{{EXTN_ID}}/{{PATH}}", + "ASA_UPLOAD_URL": "https://aslscenarioarchive.com/rest/update/{ID}?user={USER}&token={TOKEN}", } @app.route( "/app-config" ) @@ -95,6 +96,10 @@ def get_app_config(): for key in ["APP_NAME","APP_VERSION","APP_DESCRIPTION","APP_HOME_URL"]: vals[ key ] = getattr( vasl_templates.webapp.config.constants, key ) + # include the ASL Scenario Archive config + for key in ["ASA_MAX_VASL_SETUP_SIZE","ASA_MAX_SCREENSHOT_SIZE"]: + vals[ key ] = app.config[ key ] + # include the dice hotness config vals[ "LFA_DICE_HOTNESS_WEIGHTS" ] = get_json_val( "LFA_DICE_HOTNESS_WEIGHTS", DEFAULT_LFA_DICE_HOTNESS_WEIGHTS diff --git a/vasl_templates/webapp/scenarios.py b/vasl_templates/webapp/scenarios.py index 4140278..32ca3a9 100644 --- a/vasl_templates/webapp/scenarios.py +++ b/vasl_templates/webapp/scenarios.py @@ -3,13 +3,24 @@ # NOTE: Disable "DownloadedFile has no 'index' member" warnings. #pylint: disable=no-member +import os +import json +import urllib.request +import base64 import re +import time +import math +import logging from flask import request, render_template, jsonify, abort +from PIL import Image, ImageOps from vasl_templates.webapp import app from vasl_templates.webapp.downloads import DownloadedFile -from vasl_templates.webapp.utils import get_month_name, make_formatted_day_of_month, friendly_fractions, parse_int +from vasl_templates.webapp.vassal import VassalShim +from vasl_templates.webapp.utils import TempFile, \ + get_month_name, make_formatted_day_of_month, friendly_fractions, parse_int, \ + trim_image, get_image_data, remove_alpha_from_image # --------------------------------------------------------------------- @@ -97,7 +108,7 @@ def get_scenario_index(): with _asa_scenarios: if _asa_scenarios.index is None: return _make_not_available_response( - "The scenario index is not available.", _asa_scenarios.error_msg + "Please wait, the scenario index is still downloading.", _asa_scenarios.error_msg ) return jsonify( [ make_entry( scenario ) @@ -110,13 +121,13 @@ def get_roar_scenario_index(): with _roar_scenarios: if _roar_scenarios.index is None: return _make_not_available_response( - "The ROAR scenarios are not available.", _roar_scenarios.error_msg + "Please wait, the ROAR scenarios are still downloading.", _roar_scenarios.error_msg ) return jsonify( _roar_scenarios.index ) def _make_not_available_response( msg, msg2 ): """Generate a "not available" response.""" - resp = { "error": msg } + resp = { "warning": msg } if msg2: resp[ "message" ] = msg2 return jsonify( resp ) @@ -124,7 +135,7 @@ def _make_not_available_response( msg, msg2 ): # --------------------------------------------------------------------- @app.route( "/scenario/" ) -def get_scenario( scenario_id ): +def get_scenario( scenario_id ): #pylint: disable=too-many-locals """Return a scenario.""" # get the parameters @@ -145,6 +156,43 @@ def get_scenario( scenario_id ): score = 100 * nWins / nGames return int( score + 0.5 ) + # get any files available for download + downloads = {} + keys = { "vt_setup": "vaslTemplates", "vasl_setup": "vaslTemplateSetups", "screenshot": "templateImages" } + for key in keys: + for entry in scenario.get( keys[key], [] ): + fname = os.path.basename( entry.get( "url", "" ) ) + pos = fname.find( "|" ) + if pos < 0: + continue + fkey = fname[:pos] + if fkey not in downloads: + downloads[ fkey ] = { + "user": entry.get( "user" ), + "timestamp": entry.get( "created" ), + } + downloads[ fkey ][ key ] = entry.get( "url" ) + downloads = sorted( downloads.values(), key=lambda u: u["timestamp"], reverse=True ) + if downloads: + args[ "downloads" ] = [ + d for d in downloads + if "vt_setup" in d or "vasl_setup" in d + ] + + # get the map previews + map_images = [] + for fgroup in downloads: + if "screenshot" in fgroup: + map_images.append( fgroup ) + for map_image in scenario.get( "mapImages", [] ): + map_images.append( { + "screenshot": map_image.get( "url" ), + "user": map_image.get( "user" ), + "timestamp": map_image.get( "created" ), + } ) + if map_images: + args[ "map_images" ] = map_images + # get the ASL Scenario Archive playings playings = scenario.get( "playings", [ {} ] )[ 0 ] nGames = parse_int( playings.get( "totalGames" ), 0 ) @@ -282,7 +330,6 @@ def get_scenario_card( scenario_id ): #pylint: disable=too-many-branches args[ "DEFENDER_NAME" ] = scenario.get( "defender" ) args[ "ATTACKER_NAME" ] = scenario.get( "attacker" ) args[ "BOARDS" ] = ", ".join( str(m) for m in scenario.get("maps",[]) ) - args[ "MAP_IMAGES" ] = scenario.get( "mapImages" ) overlays = ", ".join( str(o) for o in scenario.get("overlays",[]) ) if overlays.upper() == "NONE": overlays = None @@ -368,6 +415,197 @@ def _make_scenario_name( scenario ): # --------------------------------------------------------------------- +@app.route( "/prepare-asa-upload", methods=["POST"] ) +def prepare_asa_upload(): #pylint: disable=too-many-locals + """Prepare files for upload to the ASL Scenario Archive.""" + + # parse the request + vsav_data = request.json[ "vsav_data" ] + vsav_filename = request.json[ "filename" ] + + # initialize + start_time = time.time() + logger = logging.getLogger( "prepare_asa_upload" ) + + try: + + # get the VSAV data (we do this inside the try block so that the user gets shown + # a proper error dialog if there's a problem decoding the base64 data) + vsav_data = base64.b64decode( vsav_data ) + logger.info( "Preparing VSAV (#bytes=%d): %s", len(vsav_data), vsav_filename ) + + with TempFile() as input_file: + + # save the VSAV data in a temp file + input_file.write( vsav_data ) + input_file.close( delete=False ) + fname = app.config.get( "PREPARE_ASA_UPLOAD_INPUT" ) # nb: for diagnosing problems + if fname: + logger.debug( "Saving a copy of the VSAV data: %s", fname ) + with open( fname, "wb" ) as fp: + fp.write( vsav_data ) + + # prepare the files to be uploaded + with TempFile() as stripped_vsav_file, TempFile() as screenshot_file: + + # run the VASSAL shim to prepare the VSAV file + stripped_vsav_file.close( delete=False ) + screenshot_file.close( delete=False ) + vassal_shim = VassalShim() + vassal_shim.prepare_asa_upload( + input_file.name, stripped_vsav_file.name, screenshot_file.name + ) + + # read the stripped VSAV data + with open( stripped_vsav_file.name, "rb" ) as fp: + stripped_vsav = fp.read() + stripped_vsav_file.save_copy( + app.config.get( "PREPARE_ASA_UPLOAD_STRIPPED_VSAV" ), + logger, "stripped VSAV" + ) + + # read the screenshot image + screenshot_file.save_copy( + app.config.get( "PREPARE_ASA_UPLOAD_SCREENSHOT" ), + logger, "generated screenshot" + ) + if os.path.getsize( screenshot_file.name ) == 0: + # NOTE: The VASSAL shim sometimes crashes while trying to generate a screenshot :-( + screenshot_data = None + else: + # NOTE: These screenshots are used as map preview images on the ASL Scenario Archive + # web site (and by us, as well), so we want to optimize them for size. + # NOTE: I tried changing the PNG from 24-bit RGB to using a palette: + # img.convert( "P", palette=Image.ADAPTIVE/WEB ) + # but since PNG is a lossless format, the benefits are minimal. Also, weird things happen + # if we do this before shrinking the image, which makes calculating the ratio tricky. + # clean up the original screenshot + img = trim_image( screenshot_file.name ) + img = remove_alpha_from_image( img ) + # get the image data + def save_image( img ): #pylint: disable=missing-docstring + quality = parse_int( app.config.get( "ASA_SCREENSHOT_QUALITY" ), 50 ) + return get_image_data( img, format="JPEG", quality=quality, optimize=True, subsampling=0 ) + screenshot_data = save_image( img ) + # resize it to (roughly) the maximum allowed size + max_size = parse_int( app.config.get( "ASA_MAX_SCREENSHOT_SIZE" ), 200 ) * 1024 + if len(screenshot_data) > max_size: + ratio = math.sqrt( float(max_size) / len(screenshot_data) ) + img = img.resize( ( int(img.width * ratio), int(img.height * ratio) ), Image.ANTIALIAS ) + # add a border + border_size = parse_int( app.config.get( "ASA_SCREENSHOT_BORDER_SIZE" ), 5 ) + img = ImageOps.expand( img, border_size, (255,255,255,255) ) + # get the final image data + screenshot_data = save_image( img ) + + except Exception as ex: #pylint: disable=broad-except + + return VassalShim.translate_vassal_shim_exception( ex, logger ) + + # return the results + logger.info( "Prepared the VSAV file OK: elapsed=%.3fs", time.time()-start_time ) + results = { + "filename": vsav_filename, + "stripped_vsav": base64.b64encode( stripped_vsav ).decode( "utf-8" ), + } + if screenshot_data: + results[ "screenshot" ] = base64.b64encode( screenshot_data ).decode( "utf-8" ) + return jsonify( results ) + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +@app.route( "/on-successful-asa-upload/" ) +def on_successful_asa_upload( scenario_id ): + """Update the local scenario index after a successful upload.""" + + # download the specified scenario + url = app.config["ASA_GET_SCENARIO_URL"].replace( "{ID}", scenario_id ) + try: + fp = urllib.request.urlopen( url ) + new_scenario = json.loads( fp.read().decode( "utf-8" ) ) + except Exception as ex: #pylint: disable=broad-except + msg = str( getattr(ex,"reason",None) or ex ) + return jsonify( { "status": "error", "message": msg } ) + + # update the local index + if os.path.isfile( _asa_scenarios.cache_fname ) and not app.config.get( "DISABLE_LOCAL_ASA_INDEX_UPDATES" ): + # NOTE: Since the downloaded index file contains a *list* of scenarios, we append the new scenario info + # to the end of that list, and then the next time the program starts and reads the list into a dict, + # the most-recent version is the one that will ultimately be used. This lets us identify these temporary changes + # that have been made to the cached index file (which will be overwritten when we download a fresh copy). + # This is not particularly efficient, but it won't happen too often. + with open( _asa_scenarios.cache_fname, "r" ) as fp: + data = json.load( fp ) + data["scenarios"].append( new_scenario ) + with open( _asa_scenarios.cache_fname, "w" ) as fp: + json.dump( data, fp ) + + # update the in-memory scenario index + with _asa_scenarios: + _asa_scenarios.index[ scenario_id ] = new_scenario + + return jsonify( { "status": "ok" } ) + +# --------------------------------------------------------------------- + +_last_asa_upload = None + +@app.route( "/test-asa-upload/", methods=["POST"] ) +def test_asa_upload( scenario_id ): + """A test endpoint that can be used to simulate ASL Scenario Archive uploads.""" + + def save_file( key, asa_upload, convert=None ): + """Save a file that has been uploaded to us.""" + f = request.files.get( key ) + if not f: + print( "- {}: not present.".format( key ) ) + return + data = f.read() + asa_upload[ key ] = convert(data) if convert else data + print( "- {}: {} ({}) ; #bytes={}".format( key, f.filename, f.content_type, len(data) ) ) + fname = app.config.get( "SAVE_ASA_UPLOAD_" + key.upper() ) + if fname: + with open( fname, "wb" ) as fp: + fp.write( data ) + print( " - Saved to:", fname ) + + def make_response( fname ): + """Generate a response.""" + dname = os.path.join( os.path.dirname(__file__), "tests/fixtures/asa-responses/" ) + fname = os.path.join( dname, "{}.json".format( fname ) ) + resp = json.load( open( fname, "r" ) ) + return jsonify( resp ) + + # simulate a slow response + delay = parse_int( app.config.get( "ASA_UPLOAD_DELAY" ), 0 ) + if delay > 0: + time.sleep( delay ) + + # parse the request + user_name = request.args.get( "user" ) + if not user_name: + return make_response( "missing-user-name" ) + api_token = request.args.get( "token" ) + if not api_token: + return make_response( "missing-token" ) + if api_token == "incorrect-token": + return make_response( "incorrect-token" ) + + # process the request + print( "ASA upload: id={} ; user=\"{}\" ; token=\"{}\"".format( scenario_id, user_name,api_token ) ) + asa_upload = {} + save_file( "vasl_setup", asa_upload ) + save_file( "vt_setup", asa_upload, lambda v: json.loads(v) ) #pylint: disable=unnecessary-lambda + save_file( "screenshot", asa_upload ) + if asa_upload: + asa_upload.update( { "user": user_name, "token": api_token } ) + global _last_asa_upload + _last_asa_upload = asa_upload + + return make_response( "ok" ) + +# --------------------------------------------------------------------- + @app.route( "/scenario/nat-report" ) def scenario_nat_report(): """Generate the scenario nationalities report (for testing porpoises).""" @@ -402,4 +640,7 @@ def _split_date_parts( val ): return None if mo.group(1) == "1901": return None # nb: 1901-01-01 seems to be used as a "invalid date" marker - return [ int(mo.group(3)), int(mo.group(2)), int(mo.group(1)) ] + parts = [ int(mo.group(3)), int(mo.group(2)), int(mo.group(1)) ] + if parts == [ 0, 0, 0, ]: + return None # nb: 0000-00-00 also seems to be used as an "invalid date" marker + return parts diff --git a/vasl_templates/webapp/static/css/scenario-card.css b/vasl_templates/webapp/static/css/scenario-card.css index 695ee1a..fad02b1 100644 --- a/vasl_templates/webapp/static/css/scenario-card.css +++ b/vasl_templates/webapp/static/css/scenario-card.css @@ -68,20 +68,18 @@ .scenario-card .balance-graph .progressbar .score { position: absolute ; font-size: 70% ; font-style: italic ; color: #666 ; left: 35% ; } /* scenario card - misc */ -.scenario-card a.map-preview img { height: 0.75em ; margin-left: 0.25em ; } -.scenario-card a.map-preview:focus { outline: 0 ; } +.scenario-card .boards img.map-previews { height: 0.75em ; margin-left: 0.5em ; cursor: pointer ; } +.scenario-card .boards .map-preview-count { font-size: 80% ; font-style: italic ; color: #888 ; } .scenario-card .errata ul { margin-top: 0 ; } .scenario-card .errata .source { font-size: 90% ; font-style: italic ; color: #666 ; } /* scenario info dialog */ .ui-dialog.scenario-info { border-radius: 10px ; } .ui-dialog.scenario-info .ui-dialog-titlebar { display: none ; } -.ui-dialog.scenario-info .credit { float: left ; margin-right: 0.5em ; display: flex ; align-items: center ; } -.ui-dialog.scenario-info .credit img { height: 1.4em ; margin-right: 0.5em ; opacity: 0.7 ; } -.ui-dialog.scenario-info .credit .caption { font-size: 70% ; line-height: 1em ; margin-top: -4px ; } -.ui-dialog.scenario-info .credit a { text-decoration: none ; font-style: italic ; color: #666 ; } -.ui-dialog.scenario-info .credit a:focus { outline: 0 ; } #scenario-info-dialog .scenario-card { height: 100% ; overflow-y: hidden ; } #scenario-info-dialog .connect-roar { display: inline-block ; margin-top: 0.25em ; font-size: 80% ; color: #444 ; cursor: pointer ; } #scenario-info-dialog .connect-roar img { height: 0.75em ; Xmargin-right: 0.25em ; opacity: 0.7 ; } #scenario-info-dialog .disconnect-roar img { height: 0.5em ; margin-left: 0.5em ; cursor: pointer ; } + +/* lightgallery */ +.lg-backdrop.in { opacity: 0.85 ; } diff --git a/vasl_templates/webapp/static/css/scenario-downloads-dialog.css b/vasl_templates/webapp/static/css/scenario-downloads-dialog.css new file mode 100644 index 0000000..21c917c --- /dev/null +++ b/vasl_templates/webapp/static/css/scenario-downloads-dialog.css @@ -0,0 +1,20 @@ +.ui-dialog.scenario-downloads { border-radius: 5px ; } +.ui-dialog.scenario-downloads .ui-dialog-titlebar { background: none ; border: none ; cursor: auto ; } +.ui-dialog.scenario-downloads .ui-dialog-titlebar-close { display: none; } +#scenario-downloads-dialog { padding-top: 0 !important ; } + +#scenario-downloads-dialog .fgroups { margin: 0 ; } +#scenario-downloads-dialog .fgroup { + border: 1px solid #ccc ; border-radius: 5px ; + margin-bottom: 0.5em ; + padding: 0.5em ; + display: flex ; + list-style-type: none ; +} +#scenario-downloads-dialog .fgroup:last-of-type { margin-bottom: 0 ; } +#scenario-downloads-dialog .fgroup .screenshot { width: 5em ; max-height: 4em ; margin-right: 1em ; text-align: center ; } +#scenario-downloads-dialog .fgroup .screenshot img { max-width: 100% ; max-height: 4em ; } +#scenario-downloads-dialog .fgroup .user { font-style: italic ; } +#scenario-downloads-dialog .fgroup .timestamp { font-size: 80% ; font-style: italic ; color: #888 ; } +#scenario-downloads-dialog .fgroup button { float: left ; margin: 0.5em 0.5em 0 0 ; padding: 2px 5px ; display: flex ; align-items: center ; font-size: 80% ; } +#scenario-downloads-dialog .fgroup button img { height: 1em ; margin-right: 0.5em ; } diff --git a/vasl_templates/webapp/static/css/scenario-search-dialog.css b/vasl_templates/webapp/static/css/scenario-search-dialog.css index dac7853..877c5f1 100644 --- a/vasl_templates/webapp/static/css/scenario-search-dialog.css +++ b/vasl_templates/webapp/static/css/scenario-search-dialog.css @@ -55,6 +55,8 @@ #scenario-search .import-control .buttons button { float: right ; margin-left: 0.5em ; padding: 0.1em 0.5em ; } #scenario-search .import-control .buttons button.import { height: 2em ; display: flex ; align-items: center ; } #scenario-search .import-control .buttons button.import img { height: 1em ; margin-right: 0.5em ; } +#scenario-search .import-control .buttons button.downloads { height: 2em ; display: flex ; align-items: center ; } +#scenario-search .import-control .buttons button.downloads img { height: 1em ; margin-right: 0.5em ; } #scenario-search .import-control .buttons button.ok { background: #ddd ; } #scenario-search .import-control .buttons button.ok:hover { background: #ccc ; } #scenario-search .import-control .warnings { margin-bottom: 0.5em ; padding: 0.25em 0 0 10px ; font-size: 90% ; } diff --git a/vasl_templates/webapp/static/css/scenario-upload-dialog.css b/vasl_templates/webapp/static/css/scenario-upload-dialog.css new file mode 100644 index 0000000..8141a0d --- /dev/null +++ b/vasl_templates/webapp/static/css/scenario-upload-dialog.css @@ -0,0 +1,56 @@ +.ui-dialog.scenario-upload .ui-dialog-titlebar { background: #e0e0a0 ; } +#scenario-upload-dialog { display: flex ; flex-direction: column ; padding: 1em !important ; overflow-y: hidden ; } + +#scenario-upload-dialog label { display: inline-block ; width: 5.75em ; font-weight: bold ; } +#scenario-upload-dialog .row { margin-bottom: 2px ; } +#scenario-upload-dialog .hint { font-style: italic ; color: #888 ; } +#scenario-upload-dialog .row .hint { margin-left: 0.5em ; font-size: 80% ; font-style: italic ; color: #666 ; } +#scenario-upload-dialog .row .hint a { color: #666 ; } + +#scenario-upload-dialog .scenario-id { font-size: 80% ; font-style: italic ; color: #666 ; } +#scenario-upload-dialog .asa-id { font-size: 70% ; font-style: italic ; color: #666 ; } +#scenario-upload-dialog .auth { margin: 0.25em 0 1em 0 ; } +#scenario-upload-dialog .disclaimer { margin-top: 1em ; font-size: 80% ; font-style: italic ; color: #444 ; } + +#scenario-upload-dialog img.remove { height: 12px ; position: absolute ; top: 5px ; right: 5px ; z-index: 5 ; cursor: pointer ; } + +#scenario-upload-dialog .grid { flex: 1 ; display: flex ; } +#scenario-upload-dialog .grid .left { flex: 4 ; margin-right: 1em ; } +#scenario-upload-dialog .grid .right { flex: 6 ; } + +#scenario-upload-dialog .vsav-container { + position: relative ; + padding: 1em ; + border: 1px solid #888 ; border-radius: 5px ; + background: #f8f8f8 ; +} +#scenario-upload-dialog .vsav-container .hint { display: flex ; } +#scenario-upload-dialog .vsav-container .hint img { + margin-right: 0.5em ; height: 2em ; opacity: 0.7 ; +} +#scenario-upload-dialog .vsav-container .file-info { display: flex ; } +#scenario-upload-dialog .vsav-container .file-info img { + margin-right: 0.5em ; height: 2em ; opacity: 0.8 ; +} +#scenario-upload-dialog .vsav-container .file-info .name { font-size: 80% ; font-family: monospace ; color: #444 ; } + +#scenario-upload-dialog .screenshot-container { + display: flex ; flex-direction: column ; justify-content: center ; + height: 100% ; + border: 1px solid #888 ; border-radius: 5px ; + background: #f8f8f8 ; + position: relative ; +} +#scenario-upload-dialog .screenshot-container .hint { display: flex ; justify-content: center ; align-items: center ; } +#scenario-upload-dialog .screenshot-container .hint img { + float: left ; margin-right: 0.5em ; height: 2.5em ; opacity: 0.6 ; +} +#scenario-upload-dialog .screenshot-container .preview { + display: flex ; flex-direction: column ; align-items: center ; justify-content: center ; + height: calc( 100% - 10px ) ; + margin: 5px ; +} +#scenario-upload-dialog .screenshot-container .preview img { + object-fit: scale-down ; max-width: 100% ; max-height: 100% ; + border: 1px dotted #aaa ; +} diff --git a/vasl_templates/webapp/static/imageZoom/jquery.imageZoom.css b/vasl_templates/webapp/static/imageZoom/jquery.imageZoom.css deleted file mode 100644 index a730146..0000000 --- a/vasl_templates/webapp/static/imageZoom/jquery.imageZoom.css +++ /dev/null @@ -1,48 +0,0 @@ -div.jquery-image-zoom { - line-height: 0; - font-size: 0; - - z-index: 1000; - - border: 5px solid #fff; - background: #eee; /* TM 25jan15: Added this to make it easier to see images with transparent backgrounds. */ - margin: -5px; - - -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); -} - - div.jquery-image-zoom a { - background: url(/static/imageZoom/jquery.imageZoom.png) no-repeat; - - display: block; - width: 25px; - height: 25px; - - position: absolute; - left: -17px; - top: -17px; - /* IE-users are prolly used to close-link in right-hand corner */ - *left: auto; - *right: -17px; - - text-decoration: none; - text-indent: -100000px; - outline: 0; - - z-index: 11; - } - - div.jquery-image-zoom a:hover { - background-position: left -25px; - } - - div.jquery-image-zoom img, - div.jquery-image-zoom embed, - div.jquery-image-zoom object, - div.jquery-image-zoom div { - width: 100%; - height: 100%; - margin: 0; - } diff --git a/vasl_templates/webapp/static/imageZoom/jquery.imageZoom.min.js b/vasl_templates/webapp/static/imageZoom/jquery.imageZoom.min.js deleted file mode 100644 index ccd572f..0000000 --- a/vasl_templates/webapp/static/imageZoom/jquery.imageZoom.min.js +++ /dev/null @@ -1 +0,0 @@ -jQuery.fn.imageZoom=function(c,b){var a=c.extend({speed:200,dontFadeIn:1,hideClicked:1,imageMargin:30,className:"jquery-image-zoom",loading:"Loading..."},b);a.doubleSpeed=a.speed/4;c(document).keydown(function(d){if(d.keyCode==27){c("div.jquery-image-zoom a").click()}});return this.click(function(k){var h=c(k.target);var g=h.is("a")?h:h.parents("a");g=(g&&g.is("a")&&g.attr("href").search(/(.*)\.(jpg|jpeg|gif|png|bmp|tif|tiff)$/gi)!=-1)?g:false;var i=(g&&g.find("img").length)?g.find("img"):false;c("div.jquery-image-zoom a").click();if(g){g.oldText=g.text();g.setLoadingImg=function(){if(i){i.css({opacity:"0.5"})}else{g.text(a.loading)}};g.setNotLoadingImg=function(){if(i){i.css({opacity:"1"})}else{g.text(g.oldText)}};var d=g.attr("href");if(c("div."+a.className+' img[src="'+d+'"]').length){return false}var j=function(l){g.setNotLoadingImg();var u=i?i:g;var q=i?a.hideClicked:0;var p=u.offset();var n={width:u.outerWidth(),height:u.outerHeight(),left:p.left,top:p.top};var o=c('
').css("position","absolute").appendTo(document.body);var m={width:l.width,height:l.height};var s={width:c(window).width(),height:c(window).height()};if(m.width>(s.width-a.imageMargin*2)){var r=s.width-a.imageMargin*2;m.height=(r/m.width)*m.height;m.width=r}if(m.height>(s.height-a.imageMargin*2)){var t=s.height-a.imageMargin*2;m.width=(t/m.height)*m.width;m.height=t}m.left=(s.width-m.width)/2+c(window).scrollLeft();m.top=(s.height-m.height)/2+c(window).scrollTop();var e=c('Close').appendTo(o).hide();if(q){g.css("visibility","hidden")}o.addClass(a.className).css(n).animate(m,a.speed,function(){e.fadeIn(a.doubleSpeed)});var v=function(){e.fadeOut(a.doubleSpeed,function(){o.animate(n,a.speed,function(){g.css("visibility","visible");o.remove()})});return false};o.click(v);e.click(v)};var f=new Image();f.src=d;if(f.complete){j(f)}else{g.setLoadingImg();f.onload=function(){j(f)}}return false}})}; \ No newline at end of file diff --git a/vasl_templates/webapp/static/imageZoom/jquery.imageZoom.png b/vasl_templates/webapp/static/imageZoom/jquery.imageZoom.png deleted file mode 100644 index 2f5a3811d5399eb5c56dfa6779387db04bcebb82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1755 zcmV<11|<23P)P001%w1^@s6se*8p00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU&ZAnByRCwCV zSba!UXBdC3_g*!d@wJ?EbDywC4_ zzMp$7LI_&QvREtud2B%lvGn)%uU@`a%HbHEN zDG2)jDqmp6#>U2=gnLp(Muxb5|Gor*FUw3pTrStU%m9BF8rbc2v2EKnQCL_gY&M%D ztJNy6YuBz7m6equIy%|_Dl03KARH`;HkuX|ytv2=`}XZKHf`Oy)rh2%Cr=tc>FMcW ze0*F!Z)$2X_z@_gx3^b59~&Fnt$^S~BENt(l2PB3nwlz*6ADmfW+n?To}E5@S~1(< z!-sW~eWrjQEcfz@GiS~y8~D_$*@FiU459Fwao^tFF3sn;XVa!l@*NJ>t7AyJfpHCA z5x!pjYG`Pn^73+e`0z<$BlG2z^Cmw(-z!>m8Sv-x3W&eD#6Z`tUnfM4^6uKTYw{gJ zUU?2pp9l^KiBLe0eB*qLiHY$7+PHBeH8(dCB91g(c|CC803APm+>1XkF;QNjxl=L8 z;Nai}wj)P|r+rac1WJnHgW}?1#YgOD&pqrzE&I`Af&wom!-Qhb zo;?OoYip|l!okA}72rLuWSpL!KD98ySZGyMl{k9zsDO>-cizI3o0}_6oH!xYty^dC z^8wKUBna9=f)@xs1cQqi{1ruC#8slZyIVI^z0U&4{ezjf2C=CY1AyT0%nzGS5KbAK z;tOVGwT~P*60j1piF$f^^d>gSl{{cS;Zv}>y2D3DM@3Cdjo7|@yGTn*6S1+eGOJ5U zN~F{E1?{hx0{CjboQH^xLcR3+TWDBL4jO;+g2mso!b1c!$wi6SfdL{L5f&R78oCOJ zHVol?xLz0<8fwhS%5p8b$N%Fa(Ul;WmbyadKUe{WyL4FOTcXv=h;pHGVklAE9FYTa zkK-GnpoTlkW#7WBKN1~+(AUC=Hkk3C$WOY7ewrkDe+N;|qCoy2N-ab-^^@LlAh%W~1*y%v~1+pf}O9c7k}K zn;~l5Li8$b-9ABnCrU=?yabVvEmkYl0AMZ%$FfEr&Cg3v^u;eRycThP^NKF^0ZdfO z0OxS>4}t{Xbs79`+wGG78KT$W%Tm)2{({@0jgLup(GWl=RTdW%-%tBJM>YrpBio?v{bRM(1QX=ZSVJntVl+z>zeK z`*sf}qZ$+1th_&X@Sq$V06=YRZN|`X_wHSTpPg_HzSI&hU(uwUXfLB5LyKMNaF-ey zDmA%8qz-rZki(sGK^=RV;ZBzUP5!;%ZdTt*qz-o|_Hwv;)&yv=!`&*abs!s^icgwR zo7j#V8A~1RI67HYC(&7@3hyNP^&%{=Mu?Y^_-CDFSM+pRxpJlA1J(pxk?`}HAe1(5 z-mGZyvSvPLazTG)Eyo8)AY0RrMC(@oP&dyFMEiIKkVi1h8)Ya7`L%h1W zn(#YO^78>JkgR;f2_$4A(X>*#Pq?HBCd0TK=2S9EH*_s)k+U+Jx?cBkBg8>Un3#7Cs(Z@JN6L0zioA$%LVF3Wx zM77W$2M2>U#zs*f7xomdeu8RjLuAw;<@WM-7qn@CR^1?%*0d5JcnyTU0?O7x8a}-` zh7!Mvs4u9_$bB8ndndFw#Fg2fCWxY2Fi{J9@RsRc9{zf~4%UGI0&%_rfZ4EZEbdo9 x(l7+~ahTpDYJ|$Jry3-JUFrXqx$AEM1^`j@eVA4tGV=fc002ovPDHLkV1f;jL%{$5 diff --git a/vasl_templates/webapp/static/images/download.png b/vasl_templates/webapp/static/images/download.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7ea54a31604be5cc0e79038cc97ba22df0b1b0 GIT binary patch literal 2558 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 N002ovPDHLkV1oU|nvMVf literal 0 HcmV?d00001 diff --git a/vasl_templates/webapp/static/images/upload.png b/vasl_templates/webapp/static/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..54b4cab2805601d36de0ba8da0389e68082b0d39 GIT binary patch literal 2584 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:last-child{margin-bottom:0}.lg-outer .lg-dropdown>li:hover .lg-icon,.lg-outer .lg-dropdown>li:hover a{color:#333}.lg-outer .lg-dropdown a{color:#333;display:block;white-space:pre;padding:4px 12px;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px}.lg-outer .lg-dropdown a:hover{background-color:rgba(0,0,0,.07)}.lg-outer .lg-dropdown .lg-dropdown-text{display:inline-block;line-height:1;margin-top:-3px;vertical-align:middle}.lg-outer .lg-dropdown .lg-icon{color:#333;display:inline-block;float:none;font-size:20px;height:auto;line-height:1;margin-right:8px;padding:0;vertical-align:middle;width:auto}.lg-outer,.lg-outer .lg,.lg-outer .lg-inner{height:100%;width:100%}.lg-outer #lg-share{position:relative}.lg-outer #lg-share:after{content:"\e80d"}.lg-outer #lg-share-facebook .lg-icon{color:#3b5998}.lg-outer #lg-share-facebook .lg-icon:after{content:"\e904"}.lg-outer #lg-share-twitter .lg-icon{color:#00aced}.lg-outer #lg-share-twitter .lg-icon:after{content:"\e907"}.lg-outer #lg-share-googleplus .lg-icon{color:#dd4b39}.lg-outer #lg-share-googleplus .lg-icon:after{content:"\e905"}.lg-outer #lg-share-pinterest .lg-icon{color:#cb2027}.lg-outer #lg-share-pinterest .lg-icon:after{content:"\e906"}.lg-outer .lg-img-rotate{position:absolute;padding:0 5px;left:0;right:0;top:0;bottom:0;-webkit-transition:-webkit-transform .3s cubic-bezier(.32,0,.67,0) 0s;-moz-transition:-moz-transform .3s cubic-bezier(.32,0,.67,0) 0s;-o-transition:-o-transform .3s cubic-bezier(.32,0,.67,0) 0s;transition:transform .3s cubic-bezier(.32,0,.67,0) 0s}.lg-rotate-left:after{content:"\e900"}.lg-rotate-right:after{content:"\e901"}.lg-icon.lg-flip-hor,.lg-icon.lg-flip-ver{font-size:26px}.lg-flip-ver:after{content:"\e903"}.lg-flip-hor:after{content:"\e902"}.lg-group:after{content:"";display:table;clear:both}.lg-outer{position:fixed;top:0;left:0;z-index:1050;text-align:left;opacity:0;outline:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.lg-outer.lg-visible{opacity:1}.lg-outer.lg-css3 .lg-item.lg-current,.lg-outer.lg-css3 .lg-item.lg-next-slide,.lg-outer.lg-css3 .lg-item.lg-prev-slide{-webkit-transition-duration:inherit!important;transition-duration:inherit!important;-webkit-transition-timing-function:inherit!important;transition-timing-function:inherit!important}.lg-outer.lg-css3.lg-dragging .lg-item.lg-current,.lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide,.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide{-webkit-transition-duration:0s!important;transition-duration:0s!important;opacity:1}.lg-outer.lg-grab img.lg-object{cursor:-webkit-grab;cursor:-moz-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer.lg-grabbing img.lg-object{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg{position:relative;overflow:hidden;margin-left:auto;margin-right:auto;max-width:100%;max-height:100%}.lg-outer .lg-inner{position:absolute;left:0;top:0;white-space:nowrap}.lg-outer .lg-item{background:url(../img/loading.gif) center center no-repeat;display:none!important}.lg-outer.lg-css .lg-current,.lg-outer.lg-css3 .lg-current,.lg-outer.lg-css3 .lg-next-slide,.lg-outer.lg-css3 .lg-prev-slide{display:inline-block!important}.lg-outer .lg-img-wrap,.lg-outer .lg-item{display:inline-block;text-align:center;position:absolute;width:100%;height:100%}.lg-outer .lg-img-wrap:before,.lg-outer .lg-item:before{content:"";display:inline-block;height:50%;width:1px;margin-right:-1px}.lg-outer .lg-img-wrap{position:absolute;padding:0 5px;left:0;right:0;top:0;bottom:0}.lg-outer .lg-item.lg-complete{background-image:none}.lg-outer .lg-item.lg-current{z-index:1060}.lg-outer .lg-image{display:inline-block;vertical-align:middle;max-width:100%;max-height:100%;width:auto!important;height:auto!important}.lg-outer.lg-show-after-load .lg-item .lg-object,.lg-outer.lg-show-after-load .lg-item .lg-video-play{opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-object,.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-video-play{opacity:1}.lg-outer .lg-empty-html,.lg-outer.lg-hide-download #lg-download{display:none}.lg-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1040;background-color:#000;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-backdrop.in{opacity:1}.lg-css3.lg-no-trans .lg-current,.lg-css3.lg-no-trans .lg-next-slide,.lg-css3.lg-no-trans .lg-prev-slide{-webkit-transition:none 0s ease 0s!important;-moz-transition:none 0s ease 0s!important;-o-transition:none 0s ease 0s!important;transition:none 0s ease 0s!important}.lg-css3.lg-use-css3 .lg-item,.lg-css3.lg-use-left .lg-item{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.lg-css3.lg-fade .lg-item{opacity:0}.lg-css3.lg-fade .lg-item.lg-current{opacity:1}.lg-css3.lg-fade .lg-item.lg-current,.lg-css3.lg-fade .lg-item.lg-next-slide,.lg-css3.lg-fade .lg-item.lg-prev-slide{-webkit-transition:opacity .1s ease 0s;-moz-transition:opacity .1s ease 0s;-o-transition:opacity .1s ease 0s;transition:opacity .1s ease 0s}.lg-css3.lg-slide.lg-use-css3 .lg-item{opacity:0}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-moz-transition:-moz-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s}.lg-css3.lg-slide.lg-use-left .lg-item{opacity:0;position:absolute;left:0}.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{left:-100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide{left:100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current{left:0;opacity:1}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current,.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{-webkit-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-moz-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s} \ No newline at end of file diff --git a/vasl_templates/webapp/static/lightgallery/fonts/lg.svg b/vasl_templates/webapp/static/lightgallery/fonts/lg.svg new file mode 100644 index 0000000..6fffe1b --- /dev/null +++ b/vasl_templates/webapp/static/lightgallery/fonts/lg.svg @@ -0,0 +1,51 @@ + + + + + + +{ + "fontFamily": "lg", + "majorVersion": 1, + "minorVersion": 0, + "fontURL": "https://github.com/sachinchoolur/lightGallery", + "copyright": "sachin", + "license": "MLT", + "licenseURL": "http://opensource.org/licenses/MIT", + "description": "Font generated by IcoMoon.", + "version": "Version 1.0", + "fontId": "lg", + "psName": "lg", + "subFamily": "Regular", + "fullName": "lg" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vasl_templates/webapp/static/lightgallery/fonts/lg.ttf b/vasl_templates/webapp/static/lightgallery/fonts/lg.ttf new file mode 100644 index 0000000000000000000000000000000000000000..213afec149c3c88e37964274e65b42918bc9ac1c GIT binary patch literal 4432 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
X}UWz08V_@o{j+otpay;*D-dGqNeK?82 zSFiTSQS#Yy(sZh>b1?x_Iy(PWMH{Xk&4b<6p#R2H>n8GFv%E#oV`YvN?= zi_Obrz;S0auSuLkk*;)Eea!7-D#HgoG~1%;`pTlr$kwA!SYv5Hb@s^k`eOGwCzk~a z44pOVeyM09!0A4!9JF%*RvIcs?0x)!z;|x15(61ONWg9>jWbY25)o6#90_S zBkzEJL8RDZAq4FO;<9}JBqP(rhmMv(Xt-=w0?w;n2+Q-Z6JZz1SQXy*rYdhb#A}!T z6jm<9(+ASK13}iUG1jK@cW-*Ls1F`enRoB@hW$MGfZ0Ddlw3JJcD3*I<=4UYBq&Kt zdx6n~Ga+iBn-)^siIr{;g+XqZQ3(60A^lh*h0mcm_&wr77U#cT_l<5Df>f?+4i9vL z+H$SSIIb6^k{*fy-@`Bc+~D^sK#prh?9&+!^R)o0Dnm#Dn#%l)L$ew;bK@$f)1YzT z+tcPYU#s;ihbknaK_3TLkDl1k{!x-r`d;9_C<`NZMtg|=+Y#TCty4@sQ&cI=!%D)= z9g)}MM`aQ>a(H^>oacx1S*Z@_zKbOhJ7cLsvpk8eL5ybc84 zmawSM^R1<-C>oW@M4Qk3n1B$!P-z@{|3$f@OCci~ElxA}5VEL`UcY6JhC;zeQ^I6O zZC>Pl&5mL`RG|d`rv2lD<&){98$3NqC1+G=nF+gtx>wTy@W#^Yr%uefE>$4HyrTKY z76s%`4(T6s>vp_k<;yp-3GM8@CAfWp<4n6{@DEGk|KBf7+fm!Ebh4 z9~)86xSCIKdQPWWo!iT(AM3`W%;sLBk^3>M=j(KZR z4$o>R27`PC%ZWGxgJPQa2o@)t*EZ;LMMRMRZl@3{^JAI4Rw|VF<~>aL=ZoPVFtYAk zN2naA?`#;M>vhY7@?NQKLvl$pp+#m=Y4+A~k%(^e+;GXHDi2sU4OBge4Kso;(wa23 z=aEuEvV|SqSaFX4iB&*s?4)oNK}LMKcv%5SKuho48->H#2L7ClkPwYn`8wp;D}&T( zzOQcq@F&0fH>M~Z)cXq7NoQeO1BJ9DT)a9oskWcVLi9T-Qx?|Ioll@~ttfy;FNL8Sm}6CV{U%4WtvMXoBArxt^}(4HL?*dKs8~ zAXmyu(qDL>>lr|hu|2A4SzL8v$2W_nen4qQ%sI|NVJbug?bx|e37DQJ#-fXZ!a_-;JeW;taBCZunjBFR`G}lFa*K7F(I){-27070Ix>pF{Sn~Z3BZ(m@Q~E&SIDL@U9UV&o|?gi zZ;gy6;}icj7~20a5QLc3QEGVWmee*C#F*(|pUwa>(y6>YXtX{Q-K58J1o#S7_BT6& z4nGTs=xWn_z{_<3ZA){<9aRBUsa@Gr-fzsXnVZMYJGw_P8jBxOHD|vAutqo}pvZ2; z!VuRbn0j;tXuH_IbJSJ~=q38?+M9e>;BUXb6!~9=*@?_aJFRx!CNL={0=#T(^v5l# zMpcZ{c>>@Q!$8LMF*`TF`MHy_*RtwEL0FQ6RIt7a1!U}C0dUd?Gi zM$X1StY`6#kv}nv=O_i`-co(z5@!t{3BBQHb+2PyoW-{|P8+I@GIuz_y7aZ^0&g^J z1J>6cAe6LatWY?g`uJ>xo; literal 0 HcmV?d00001 diff --git a/vasl_templates/webapp/static/lightgallery/js/lg-rotate.min.js b/vasl_templates/webapp/static/lightgallery/js/lg-rotate.min.js new file mode 100644 index 0000000..6138b2b --- /dev/null +++ b/vasl_templates/webapp/static/lightgallery/js/lg-rotate.min.js @@ -0,0 +1,4 @@ +/*! lg-rotate - v1.2.0 - 2020-09-19 +* http://sachinchoolur.github.io/lightGallery +* Copyright (c) 2020 Sachin N; Licensed GPLv3 */ +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(){"use strict";var b={rotate:!0,rotateLeft:!0,rotateRight:!0,flipHorizontal:!0,flipVertical:!0},c=function(c){return this.core=a(c).data("lightGallery"),this.core.s=a.extend({},b,this.core.s),this.core.s.rotate&&this.core.doCss()&&this.init(),this};c.prototype.buildTemplates=function(){var a="";this.core.s.flipVertical&&(a+=''),this.core.s.flipHorizontal&&(a+=''),this.core.s.rotateLeft&&(a+=''),this.core.s.rotateRight&&(a+=''),this.core.$outer.find(".lg-toolbar").append(a)},c.prototype.init=function(){var a=this;this.buildTemplates(),this.rotateValuesList={},this.core.$el.on("onAferAppendSlide.lg.tm.rotate",function(b,c){a.core.$slide.eq(c).find(".lg-img-wrap").wrap('
')}),this.core.$outer.find(".lg-rotate-left").on("click.lg",this.rotateLeft.bind(this)),this.core.$outer.find(".lg-rotate-right").on("click.lg",this.rotateRight.bind(this)),this.core.$outer.find(".lg-flip-hor").on("click.lg",this.flipHorizontal.bind(this)),this.core.$outer.find(".lg-flip-ver").on("click.lg",this.flipVertical.bind(this)),this.core.$el.on("onBeforeSlide.lg.tm.rotate",function(b,c,d){a.rotateValuesList[d]||(a.rotateValuesList[d]={rotate:0,flipHorizontal:1,flipVertical:1})})},c.prototype.applyStyles=function(){this.core.$slide.eq(this.core.index).find(".lg-img-rotate").css("transform","rotate("+this.rotateValuesList[this.core.index].rotate+"deg) scale3d("+this.rotateValuesList[this.core.index].flipVertical+", "+this.rotateValuesList[this.core.index].flipHorizontal+", 1)")},c.prototype.rotateLeft=function(){this.rotateValuesList[this.core.index].rotate-=90,this.applyStyles()},c.prototype.rotateRight=function(){this.rotateValuesList[this.core.index].rotate+=90,this.applyStyles()},c.prototype.flipHorizontal=function(){this.rotateValuesList[this.core.index].flipVertical*=-1,this.applyStyles()},c.prototype.flipVertical=function(){this.rotateValuesList[this.core.index].flipHorizontal*=-1,this.applyStyles()},c.prototype.destroy=function(){this.core.$el.off(".lg.tm.rotate"),this.rotateValuesList={}},a.fn.lightGallery.modules.rotate=c}()}); \ No newline at end of file diff --git a/vasl_templates/webapp/static/lightgallery/js/lg-thumbnail.min.js b/vasl_templates/webapp/static/lightgallery/js/lg-thumbnail.min.js new file mode 100644 index 0000000..657349b --- /dev/null +++ b/vasl_templates/webapp/static/lightgallery/js/lg-thumbnail.min.js @@ -0,0 +1,4 @@ +/*! lg-thumbnail - v1.2.1 - 2020-06-13 +* http://sachinchoolur.github.io/lightGallery +* Copyright (c) 2020 Sachin N; Licensed GPLv3 */ +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(){"use strict";var b={thumbnail:!0,animateThumb:!0,currentPagerPosition:"middle",thumbWidth:100,thumbHeight:"80px",thumbContHeight:100,thumbMargin:5,exThumbImage:!1,showThumbByDefault:!0,toogleThumb:!0,pullCaptionUp:!0,enableThumbDrag:!0,enableThumbSwipe:!0,swipeThreshold:50,loadYoutubeThumbnail:!0,youtubeThumbSize:1,loadVimeoThumbnail:!0,vimeoThumbSize:"thumbnail_small",loadDailymotionThumbnail:!0},c=function(c){return this.core=a(c).data("lightGallery"),this.core.s=a.extend({},b,this.core.s),this.$el=a(c),this.$thumbOuter=null,this.thumbOuterWidth=0,this.thumbTotalWidth=this.core.$items.length*(this.core.s.thumbWidth+this.core.s.thumbMargin),this.thumbIndex=this.core.index,this.core.s.animateThumb&&(this.core.s.thumbHeight="100%"),this.left=0,this.init(),this};c.prototype.init=function(){var a=this;this.core.s.thumbnail&&this.core.$items.length>1&&(this.core.s.showThumbByDefault&&setTimeout(function(){a.core.$outer.addClass("lg-thumb-open")},700),this.core.s.pullCaptionUp&&this.core.$outer.addClass("lg-pull-caption-up"),this.build(),this.core.s.animateThumb&&this.core.doCss()?(this.core.s.enableThumbDrag&&this.enableThumbDrag(),this.core.s.enableThumbSwipe&&this.enableThumbSwipe(),this.thumbClickable=!1):this.thumbClickable=!0,this.toogle(),this.thumbkeyPress())},c.prototype.build=function(){function b(a,b,c){var g,h=d.core.isVideo(a,c)||{},i="";h.youtube||h.vimeo||h.dailymotion?h.youtube?g=d.core.s.loadYoutubeThumbnail?"//img.youtube.com/vi/"+h.youtube[1]+"/"+d.core.s.youtubeThumbSize+".jpg":b:h.vimeo?d.core.s.loadVimeoThumbnail?(g="//i.vimeocdn.com/video/error_"+f+".jpg",i=h.vimeo[1]):g=b:h.dailymotion&&(g=d.core.s.loadDailymotionThumbnail?"//www.dailymotion.com/thumbnail/video/"+h.dailymotion[1]:b):g=b,e+='
',i=""}var c,d=this,e="",f="",g='
';switch(this.core.s.vimeoThumbSize){case"thumbnail_large":f="640";break;case"thumbnail_medium":f="200x150";break;case"thumbnail_small":f="100x75"}if(d.core.$outer.addClass("lg-has-thumb"),d.core.$outer.find(".lg").append(g),d.$thumbOuter=d.core.$outer.find(".lg-thumb-outer"),d.thumbOuterWidth=d.$thumbOuter.width(),d.core.s.animateThumb&&d.core.$outer.find(".lg-thumb").css({width:d.thumbTotalWidth+"px",position:"relative"}),this.core.s.animateThumb&&d.$thumbOuter.css("height",d.core.s.thumbContHeight+"px"),d.core.s.dynamic)for(var h=0;hthis.thumbTotalWidth-this.thumbOuterWidth&&(this.left=this.thumbTotalWidth-this.thumbOuterWidth),this.left<0&&(this.left=0),this.core.lGalleryOn?(b.hasClass("on")||this.core.$outer.find(".lg-thumb").css("transition-duration",this.core.s.speed+"ms"),this.core.doCss()||b.animate({left:-this.left+"px"},this.core.s.speed)):this.core.doCss()||b.css("left",-this.left+"px"),this.setTranslate(this.left)}},c.prototype.enableThumbDrag=function(){var b=this,c=0,d=0,e=!1,f=!1,g=0;b.$thumbOuter.addClass("lg-grab"),b.core.$outer.find(".lg-thumb").on("mousedown.lg.thumb",function(a){b.thumbTotalWidth>b.thumbOuterWidth&&(a.preventDefault(),c=a.pageX,e=!0,b.core.$outer.scrollLeft+=1,b.core.$outer.scrollLeft-=1,b.thumbClickable=!1,b.$thumbOuter.removeClass("lg-grab").addClass("lg-grabbing"))}),a(window).on("mousemove.lg.thumb",function(a){e&&(g=b.left,f=!0,d=a.pageX,b.$thumbOuter.addClass("lg-dragging"),g-=d-c,g>b.thumbTotalWidth-b.thumbOuterWidth&&(g=b.thumbTotalWidth-b.thumbOuterWidth),g<0&&(g=0),b.setTranslate(g))}),a(window).on("mouseup.lg.thumb",function(){f?(f=!1,b.$thumbOuter.removeClass("lg-dragging"),b.left=g,Math.abs(d-c)a.thumbOuterWidth&&(c.preventDefault(),b=c.originalEvent.targetTouches[0].pageX,a.thumbClickable=!1)}),a.core.$outer.find(".lg-thumb").on("touchmove.lg",function(f){a.thumbTotalWidth>a.thumbOuterWidth&&(f.preventDefault(),c=f.originalEvent.targetTouches[0].pageX,d=!0,a.$thumbOuter.addClass("lg-dragging"),e=a.left,e-=c-b,e>a.thumbTotalWidth-a.thumbOuterWidth&&(e=a.thumbTotalWidth-a.thumbOuterWidth),e<0&&(e=0),a.setTranslate(e))}),a.core.$outer.find(".lg-thumb").on("touchend.lg",function(){a.thumbTotalWidth>a.thumbOuterWidth&&d?(d=!1,a.$thumbOuter.removeClass("lg-dragging"),Math.abs(c-b)'),a.core.$outer.find(".lg-toogle-thumb").on("click.lg",function(){a.core.$outer.toggleClass("lg-thumb-open")}))},c.prototype.thumbkeyPress=function(){var b=this;a(window).on("keydown.lg.thumb",function(a){38===a.keyCode?(a.preventDefault(),b.core.$outer.addClass("lg-thumb-open")):40===a.keyCode&&(a.preventDefault(),b.core.$outer.removeClass("lg-thumb-open"))})},c.prototype.destroy=function(){this.core.s.thumbnail&&this.core.$items.length>1&&(a(window).off("resize.lg.thumb orientationchange.lg.thumb keydown.lg.thumb"),this.$thumbOuter.remove(),this.core.$outer.removeClass("lg-has-thumb"))},a.fn.lightGallery.modules.Thumbnail=c}()}); \ No newline at end of file diff --git a/vasl_templates/webapp/static/lightgallery/js/lg-zoom.min.js b/vasl_templates/webapp/static/lightgallery/js/lg-zoom.min.js new file mode 100644 index 0000000..57ff4a0 --- /dev/null +++ b/vasl_templates/webapp/static/lightgallery/js/lg-zoom.min.js @@ -0,0 +1,4 @@ +/*! lg-zoom - v1.2.1 - 2020-06-13 +* http://sachinchoolur.github.io/lightGallery +* Copyright (c) 2020 Sachin N; Licensed GPLv3 */ +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(){"use strict";var b=function(){var a=!1,b=navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);return b&&parseInt(b[2],10)<54&&(a=!0),a},c={scale:1,zoom:!0,actualSize:!0,enableZoomAfter:300,useLeftForZoom:b()},d=function(b){return this.core=a(b).data("lightGallery"),this.core.s=a.extend({},c,this.core.s),this.core.s.zoom&&this.core.doCss()&&(this.init(),this.zoomabletimeout=!1,this.pageX=a(window).width()/2,this.pageY=a(window).height()/2+a(window).scrollTop()),this};d.prototype.init=function(){var b=this,c='';b.core.s.actualSize&&(c+=''),b.core.s.useLeftForZoom?b.core.$outer.addClass("lg-use-left-for-zoom"):b.core.$outer.addClass("lg-use-transition-for-zoom"),this.core.$outer.find(".lg-toolbar").append(c),b.core.$el.on("onSlideItemLoad.lg.tm.zoom",function(c,d,e){var f=b.core.s.enableZoomAfter+e;a("body").hasClass("lg-from-hash")&&e?f=0:a("body").removeClass("lg-from-hash"),b.zoomabletimeout=setTimeout(function(){b.core.$slide.eq(d).addClass("lg-zoomable")},f+30)});var d=1,e=function(c){var d,e,f=b.core.$outer.find(".lg-current .lg-image"),g=(a(window).width()-f.prop("offsetWidth"))/2,h=(a(window).height()-f.prop("offsetHeight"))/2+a(window).scrollTop();d=b.pageX-g,e=b.pageY-h;var i=(c-1)*d,j=(c-1)*e;f.css("transform","scale3d("+c+", "+c+", 1)").attr("data-scale",c),b.core.s.useLeftForZoom?f.parent().css({left:-i+"px",top:-j+"px"}).attr("data-x",i).attr("data-y",j):f.parent().css("transform","translate3d(-"+i+"px, -"+j+"px, 0)").attr("data-x",i).attr("data-y",j)},f=function(){d>1?b.core.$outer.addClass("lg-zoomed"):b.resetZoom(),d<1&&(d=1),e(d)},g=function(c,e,g,h){var i,j=e.prop("offsetWidth");i=b.core.s.dynamic?b.core.s.dynamicEl[g].width||e[0].naturalWidth||j:b.core.$items.eq(g).attr("data-width")||e[0].naturalWidth||j;var k;b.core.$outer.hasClass("lg-zoomed")?d=1:i>j&&(k=i/j,d=k||2),h?(b.pageX=a(window).width()/2,b.pageY=a(window).height()/2+a(window).scrollTop()):(b.pageX=c.pageX||c.originalEvent.targetTouches[0].pageX,b.pageY=c.pageY||c.originalEvent.targetTouches[0].pageY),f(),setTimeout(function(){b.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")},10)},h=!1;b.core.$el.on("onAferAppendSlide.lg.tm.zoom",function(a,c){var d=b.core.$slide.eq(c).find(".lg-image");d.on("dblclick",function(a){g(a,d,c)}),d.on("touchstart",function(a){h?(clearTimeout(h),h=null,g(a,d,c)):h=setTimeout(function(){h=null},300),a.preventDefault()})}),a(window).on("resize.lg.zoom scroll.lg.zoom orientationchange.lg.zoom",function(){b.pageX=a(window).width()/2,b.pageY=a(window).height()/2+a(window).scrollTop(),e(d)}),a("#lg-zoom-out").on("click.lg",function(){b.core.$outer.find(".lg-current .lg-image").length&&(d-=b.core.s.scale,f())}),a("#lg-zoom-in").on("click.lg",function(){b.core.$outer.find(".lg-current .lg-image").length&&(d+=b.core.s.scale,f())}),a("#lg-actual-size").on("click.lg",function(a){g(a,b.core.$slide.eq(b.core.index).find(".lg-image"),b.core.index,!0)}),b.core.$el.on("onBeforeSlide.lg.tm",function(){d=1,b.resetZoom()}),b.zoomDrag(),b.zoomSwipe()},d.prototype.resetZoom=function(){this.core.$outer.removeClass("lg-zoomed"),this.core.$slide.find(".lg-img-wrap").removeAttr("style data-x data-y"),this.core.$slide.find(".lg-image").removeAttr("style data-scale"),this.pageX=a(window).width()/2,this.pageY=a(window).height()/2+a(window).scrollTop()},d.prototype.zoomSwipe=function(){var a=this,b={},c={},d=!1,e=!1,f=!1;a.core.$slide.on("touchstart.lg",function(c){if(a.core.$outer.hasClass("lg-zoomed")){var d=a.core.$slide.eq(a.core.index).find(".lg-object");f=d.prop("offsetHeight")*d.attr("data-scale")>a.core.$outer.find(".lg").height(),e=d.prop("offsetWidth")*d.attr("data-scale")>a.core.$outer.find(".lg").width(),(e||f)&&(c.preventDefault(),b={x:c.originalEvent.targetTouches[0].pageX,y:c.originalEvent.targetTouches[0].pageY})}}),a.core.$slide.on("touchmove.lg",function(g){if(a.core.$outer.hasClass("lg-zoomed")){var h,i,j=a.core.$slide.eq(a.core.index).find(".lg-img-wrap");g.preventDefault(),d=!0,c={x:g.originalEvent.targetTouches[0].pageX,y:g.originalEvent.targetTouches[0].pageY},a.core.$outer.addClass("lg-zoom-dragging"),i=f?-Math.abs(j.attr("data-y"))+(c.y-b.y):-Math.abs(j.attr("data-y")),h=e?-Math.abs(j.attr("data-x"))+(c.x-b.x):-Math.abs(j.attr("data-x")),(Math.abs(c.x-b.x)>15||Math.abs(c.y-b.y)>15)&&(a.core.s.useLeftForZoom?j.css({left:h+"px",top:i+"px"}):j.css("transform","translate3d("+h+"px, "+i+"px, 0)"))}}),a.core.$slide.on("touchend.lg",function(){a.core.$outer.hasClass("lg-zoomed")&&d&&(d=!1,a.core.$outer.removeClass("lg-zoom-dragging"),a.touchendZoom(b,c,e,f))})},d.prototype.zoomDrag=function(){var b=this,c={},d={},e=!1,f=!1,g=!1,h=!1;b.core.$slide.on("mousedown.lg.zoom",function(d){var f=b.core.$slide.eq(b.core.index).find(".lg-object");h=f.prop("offsetHeight")*f.attr("data-scale")>b.core.$outer.find(".lg").height(),g=f.prop("offsetWidth")*f.attr("data-scale")>b.core.$outer.find(".lg").width(),b.core.$outer.hasClass("lg-zoomed")&&a(d.target).hasClass("lg-object")&&(g||h)&&(d.preventDefault(),c={x:d.pageX,y:d.pageY},e=!0,b.core.$outer.scrollLeft+=1,b.core.$outer.scrollLeft-=1,b.core.$outer.removeClass("lg-grab").addClass("lg-grabbing"))}),a(window).on("mousemove.lg.zoom",function(a){if(e){var i,j,k=b.core.$slide.eq(b.core.index).find(".lg-img-wrap");f=!0,d={x:a.pageX,y:a.pageY},b.core.$outer.addClass("lg-zoom-dragging"),j=h?-Math.abs(k.attr("data-y"))+(d.y-c.y):-Math.abs(k.attr("data-y")),i=g?-Math.abs(k.attr("data-x"))+(d.x-c.x):-Math.abs(k.attr("data-x")),b.core.s.useLeftForZoom?k.css({left:i+"px",top:j+"px"}):k.css("transform","translate3d("+i+"px, "+j+"px, 0)")}}),a(window).on("mouseup.lg.zoom",function(a){e&&(e=!1,b.core.$outer.removeClass("lg-zoom-dragging"),!f||c.x===d.x&&c.y===d.y||(d={x:a.pageX,y:a.pageY},b.touchendZoom(c,d,g,h)),f=!1),b.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")})},d.prototype.touchendZoom=function(a,b,c,d){var e=this,f=e.core.$slide.eq(e.core.index).find(".lg-img-wrap"),g=e.core.$slide.eq(e.core.index).find(".lg-object"),h=-Math.abs(f.attr("data-x"))+(b.x-a.x),i=-Math.abs(f.attr("data-y"))+(b.y-a.y),j=(e.core.$outer.find(".lg").height()-g.prop("offsetHeight"))/2,k=Math.abs(g.prop("offsetHeight")*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").height()+j),l=(e.core.$outer.find(".lg").width()-g.prop("offsetWidth"))/2,m=Math.abs(g.prop("offsetWidth")*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").width()+l);(Math.abs(b.x-a.x)>15||Math.abs(b.y-a.y)>15)&&(d&&(i<=-k?i=-k:i>=-j&&(i=-j)),c&&(h<=-m?h=-m:h>=-l&&(h=-l)),d?f.attr("data-y",Math.abs(i)):i=-Math.abs(f.attr("data-y")),c?f.attr("data-x",Math.abs(h)):h=-Math.abs(f.attr("data-x")),e.core.s.useLeftForZoom?f.css({left:h+"px",top:i+"px"}):f.css("transform","translate3d("+h+"px, "+i+"px, 0)"))},d.prototype.destroy=function(){var b=this;b.core.$el.off(".lg.zoom"),a(window).off(".lg.zoom"),b.core.$slide.off(".lg.zoom"),b.core.$el.off(".lg.tm.zoom"),b.resetZoom(),clearTimeout(b.zoomabletimeout),b.zoomabletimeout=!1},a.fn.lightGallery.modules.zoom=d}()}); \ No newline at end of file diff --git a/vasl_templates/webapp/static/lightgallery/js/lightgallery.min.js b/vasl_templates/webapp/static/lightgallery/js/lightgallery.min.js new file mode 100644 index 0000000..d3fa786 --- /dev/null +++ b/vasl_templates/webapp/static/lightgallery/js/lightgallery.min.js @@ -0,0 +1,4 @@ +/*! lightgallery - v1.8.3 - 2020-09-19 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2020 Sachin N; Licensed GPLv3 */ +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(){"use strict";function b(b,d){if(this.el=b,this.$el=a(b),this.s=a.extend({},c,d),this.s.dynamic&&"undefined"!==this.s.dynamicEl&&this.s.dynamicEl.constructor===Array&&!this.s.dynamicEl.length)throw"When using dynamic mode, you must also define dynamicEl as an Array.";return this.modules={},this.lGalleryOn=!1,this.lgBusy=!1,this.hideBartimeout=!1,this.isTouch="ontouchstart"in document.documentElement,this.s.slideEndAnimatoin&&(this.s.hideControlOnEnd=!1),this.s.dynamic?this.$items=this.s.dynamicEl:"this"===this.s.selector?this.$items=this.$el:""!==this.s.selector?this.s.selectWithin?this.$items=a(this.s.selectWithin).find(this.s.selector):this.$items=this.$el.find(a(this.s.selector)):this.$items=this.$el.children(),this.$slide="",this.$outer="",this.init(),this}var c={mode:"lg-slide",cssEasing:"ease",easing:"linear",speed:600,height:"100%",width:"100%",addClass:"",startClass:"lg-start-zoom",backdropDuration:150,hideBarsDelay:6e3,useLeft:!1,ariaLabelledby:"",ariaDescribedby:"",closable:!0,loop:!0,escKey:!0,keyPress:!0,controls:!0,slideEndAnimatoin:!0,hideControlOnEnd:!1,mousewheel:!0,getCaptionFromTitleOrAlt:!0,appendSubHtmlTo:".lg-sub-html",subHtmlSelectorRelative:!1,preload:1,showAfterLoad:!0,selector:"",selectWithin:"",nextHtml:"",prevHtml:"",index:!1,iframeMaxWidth:"100%",download:!0,counter:!0,appendCounterTo:".lg-toolbar",swipeThreshold:50,enableSwipe:!0,enableDrag:!0,dynamic:!1,dynamicEl:[],galleryId:1};b.prototype.init=function(){var b=this;b.s.preload>b.$items.length&&(b.s.preload=b.$items.length);var c=window.location.hash;c.indexOf("lg="+this.s.galleryId)>0&&(b.index=parseInt(c.split("&slide=")[1],10),a("body").addClass("lg-from-hash"),a("body").hasClass("lg-on")||(setTimeout(function(){b.build(b.index)}),a("body").addClass("lg-on"))),b.s.dynamic?(b.$el.trigger("onBeforeOpen.lg"),b.index=b.s.index||0,a("body").hasClass("lg-on")||setTimeout(function(){b.build(b.index),a("body").addClass("lg-on")})):b.$items.on("click.lgcustom",function(c){try{c.preventDefault(),c.preventDefault()}catch(a){c.returnValue=!1}b.$el.trigger("onBeforeOpen.lg"),b.index=b.s.index||b.$items.index(this),a("body").hasClass("lg-on")||(b.build(b.index),a("body").addClass("lg-on"))})},b.prototype.build=function(b){var c=this;c.structure(),a.each(a.fn.lightGallery.modules,function(b){c.modules[b]=new a.fn.lightGallery.modules[b](c.el)}),c.slide(b,!1,!1,!1),c.s.keyPress&&c.keyPress(),c.$items.length>1?(c.arrow(),setTimeout(function(){c.enableDrag(),c.enableSwipe()},50),c.s.mousewheel&&c.mousewheel()):c.$slide.on("click.lg",function(){c.$el.trigger("onSlideClick.lg")}),c.counter(),c.closeGallery(),c.$el.trigger("onAfterOpen.lg"),c.$outer.on("mousemove.lg click.lg touchstart.lg",function(){c.$outer.removeClass("lg-hide-items"),clearTimeout(c.hideBartimeout),c.hideBartimeout=setTimeout(function(){c.$outer.addClass("lg-hide-items")},c.s.hideBarsDelay)}),c.$outer.trigger("mousemove.lg")},b.prototype.structure=function(){var b,c="",d="",e=0,f="",g=this;for(a("body").append('
'),a(".lg-backdrop").css("transition-duration",this.s.backdropDuration+"ms"),e=0;e';if(this.s.controls&&this.$items.length>1&&(d='
"),".lg-sub-html"===this.s.appendSubHtmlTo&&(f='
'),b='",a("body").append(b),this.$outer=a(".lg-outer"),this.$outer.focus(),this.$slide=this.$outer.find(".lg-item"),this.s.useLeft?(this.$outer.addClass("lg-use-left"),this.s.mode="lg-slide"):this.$outer.addClass("lg-use-css3"),g.setTop(),a(window).on("resize.lg orientationchange.lg",function(){setTimeout(function(){g.setTop()},100)}),this.$slide.eq(this.index).addClass("lg-current"),this.doCss()?this.$outer.addClass("lg-css3"):(this.$outer.addClass("lg-css"),this.s.speed=0),this.$outer.addClass(this.s.mode),this.s.enableDrag&&this.$items.length>1&&this.$outer.addClass("lg-grab"),this.s.showAfterLoad&&this.$outer.addClass("lg-show-after-load"),this.doCss()){var h=this.$outer.find(".lg-inner");h.css("transition-timing-function",this.s.cssEasing),h.css("transition-duration",this.s.speed+"ms")}setTimeout(function(){a(".lg-backdrop").addClass("in")}),setTimeout(function(){g.$outer.addClass("lg-visible")},this.s.backdropDuration),this.s.download&&this.$outer.find(".lg-toolbar").append('
'),this.prevScrollTop=a(window).scrollTop()},b.prototype.setTop=function(){if("100%"!==this.s.height){var b=a(window).height(),c=(b-parseInt(this.s.height,10))/2,d=this.$outer.find(".lg");b>=parseInt(this.s.height,10)?d.css("top",c+"px"):d.css("top","0px")}},b.prototype.doCss=function(){return!!function(){var a=["transition","MozTransition","WebkitTransition","OTransition","msTransition","KhtmlTransition"],b=document.documentElement,c=0;for(c=0;c'+(parseInt(this.index,10)+1)+' / '+this.$items.length+"")},b.prototype.addHtml=function(b){var c,d,e=null;if(this.s.dynamic?this.s.dynamicEl[b].subHtmlUrl?c=this.s.dynamicEl[b].subHtmlUrl:e=this.s.dynamicEl[b].subHtml:(d=this.$items.eq(b),d.attr("data-sub-html-url")?c=d.attr("data-sub-html-url"):(e=d.attr("data-sub-html"),this.s.getCaptionFromTitleOrAlt&&!e&&(e=d.attr("title")||d.find("img").first().attr("alt")))),!c)if(void 0!==e&&null!==e){var f=e.substring(0,1);"."!==f&&"#"!==f||(e=this.s.subHtmlSelectorRelative&&!this.s.dynamic?d.find(e).html():a(e).html())}else e="";".lg-sub-html"===this.s.appendSubHtmlTo?c?this.$outer.find(this.s.appendSubHtmlTo).load(c):this.$outer.find(this.s.appendSubHtmlTo).html(e):c?this.$slide.eq(b).load(c):this.$slide.eq(b).append(e),void 0!==e&&null!==e&&(""===e?this.$outer.find(this.s.appendSubHtmlTo).addClass("lg-empty-html"):this.$outer.find(this.s.appendSubHtmlTo).removeClass("lg-empty-html")),this.$el.trigger("onAfterAppendSubHtml.lg",[b])},b.prototype.preload=function(a){var b=1,c=1;for(b=1;b<=this.s.preload&&!(b>=this.$items.length-a);b++)this.loadContent(a+b,!1,0);for(c=1;c<=this.s.preload&&!(a-c<0);c++)this.loadContent(a-c,!1,0)},b.prototype.loadContent=function(b,c,d){var e,f,g,h,i,j,k,l=this,m=!1,n=function(b){for(var c=[],d=[],e=0;eh){f=d[i];break}};if(l.s.dynamic){if(l.s.dynamicEl[b].poster&&(m=!0,g=l.s.dynamicEl[b].poster),j=l.s.dynamicEl[b].html,f=l.s.dynamicEl[b].src,k=l.s.dynamicEl[b].alt,l.s.dynamicEl[b].responsive){n(l.s.dynamicEl[b].responsive.split(","))}h=l.s.dynamicEl[b].srcset,i=l.s.dynamicEl[b].sizes}else{var o=l.$items.eq(b);if(o.attr("data-poster")&&(m=!0,g=o.attr("data-poster")),j=o.attr("data-html"),f=o.attr("href")||o.attr("data-src"),k=o.attr("title")||o.find("img").first().attr("alt"),o.attr("data-responsive")){n(o.attr("data-responsive").split(","))}h=o.attr("data-srcset"),i=o.attr("data-sizes")}var p=!1;l.s.dynamic?l.s.dynamicEl[b].iframe&&(p=!0):"true"===l.$items.eq(b).attr("data-iframe")&&(p=!0);var q=l.isVideo(f,b);if(!l.$slide.eq(b).hasClass("lg-loaded")){if(p)l.$slide.eq(b).prepend('
');else if(m){var r="";r=q&&q.youtube?"lg-has-youtube":q&&q.vimeo?"lg-has-vimeo":"lg-has-html5",l.$slide.eq(b).prepend('
')}else q?(l.$slide.eq(b).prepend('
'),l.$el.trigger("hasVideo.lg",[b,f,j])):(k=k?'alt="'+k+'"':"",l.$slide.eq(b).prepend('
'));if(l.$el.trigger("onAferAppendSlide.lg",[b]),e=l.$slide.eq(b).find(".lg-object"),i&&e.attr("sizes",i),h){e.attr("srcset",h);try{picturefill({elements:[e[0]]})}catch(a){console.warn("lightGallery :- If you want srcset to be supported for older browser please include picturefil version 2 javascript library in your document.")}}".lg-sub-html"!==this.s.appendSubHtmlTo&&l.addHtml(b),l.$slide.eq(b).addClass("lg-loaded")}l.$slide.eq(b).find(".lg-object").on("load.lg error.lg",function(){var c=0;d&&!a("body").hasClass("lg-from-hash")&&(c=d),setTimeout(function(){l.$slide.eq(b).addClass("lg-complete"),l.$el.trigger("onSlideItemLoad.lg",[b,d||0])},c)}),q&&q.html5&&!m&&l.$slide.eq(b).addClass("lg-complete"),!0===c&&(l.$slide.eq(b).hasClass("lg-complete")?l.preload(b):l.$slide.eq(b).find(".lg-object").on("load.lg error.lg",function(){l.preload(b)}))},b.prototype.slide=function(b,c,d,e){var f=this.$outer.find(".lg-current").index(),g=this;if(!g.lGalleryOn||f!==b){var h=this.$slide.length,i=g.lGalleryOn?this.s.speed:0;if(!g.lgBusy){if(this.s.download){var j;j=g.s.dynamic?!1!==g.s.dynamicEl[b].downloadUrl&&(g.s.dynamicEl[b].downloadUrl||g.s.dynamicEl[b].src):"false"!==g.$items.eq(b).attr("data-download-url")&&(g.$items.eq(b).attr("data-download-url")||g.$items.eq(b).attr("href")||g.$items.eq(b).attr("data-src")),j?(a("#lg-download").attr("href",j),g.$outer.removeClass("lg-hide-download")):g.$outer.addClass("lg-hide-download")}if(this.$el.trigger("onBeforeSlide.lg",[f,b,c,d]),g.lgBusy=!0,clearTimeout(g.hideBartimeout),".lg-sub-html"===this.s.appendSubHtmlTo&&setTimeout(function(){g.addHtml(b)},i),this.arrowDisable(b),e||(bf&&(e="next")),c){this.$slide.removeClass("lg-prev-slide lg-current lg-next-slide");var k,l;h>2?(k=b-1,l=b+1,0===b&&f===h-1?(l=0,k=h-1):b===h-1&&0===f&&(l=0,k=h-1)):(k=0,l=1),"prev"===e?g.$slide.eq(l).addClass("lg-next-slide"):g.$slide.eq(k).addClass("lg-prev-slide"),g.$slide.eq(b).addClass("lg-current")}else g.$outer.addClass("lg-no-trans"),this.$slide.removeClass("lg-prev-slide lg-next-slide"),"prev"===e?(this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(f).addClass("lg-next-slide")):(this.$slide.eq(b).addClass("lg-next-slide"),this.$slide.eq(f).addClass("lg-prev-slide")),setTimeout(function(){g.$slide.removeClass("lg-current"),g.$slide.eq(b).addClass("lg-current"),g.$outer.removeClass("lg-no-trans")},50);g.lGalleryOn?(setTimeout(function(){g.loadContent(b,!0,0)},this.s.speed+50),setTimeout(function(){g.lgBusy=!1,g.$el.trigger("onAfterSlide.lg",[f,b,c,d])},this.s.speed)):(g.loadContent(b,!0,g.s.backdropDuration),g.lgBusy=!1,g.$el.trigger("onAfterSlide.lg",[f,b,c,d])),g.lGalleryOn=!0,this.s.counter&&a("#lg-counter-current").text(b+1)}g.index=b}},b.prototype.goToNextSlide=function(a){var b=this,c=b.s.loop;a&&b.$slide.length<3&&(c=!1),b.lgBusy||(b.index+10?(b.index--,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1,"prev")):c?(b.index=b.$items.length-1,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1,"prev")):b.s.slideEndAnimatoin&&!a&&(b.$outer.addClass("lg-left-end"),setTimeout(function(){b.$outer.removeClass("lg-left-end")},400)))},b.prototype.keyPress=function(){var b=this;this.$items.length>1&&a(window).on("keyup.lg",function(a){b.$items.length>1&&(37===a.keyCode&&(a.preventDefault(),b.goToPrevSlide()),39===a.keyCode&&(a.preventDefault(),b.goToNextSlide()))}),a(window).on("keydown.lg",function(a){!0===b.s.escKey&&27===a.keyCode&&(a.preventDefault(),b.$outer.hasClass("lg-thumb-open")?b.$outer.removeClass("lg-thumb-open"):b.destroy())})},b.prototype.arrow=function(){var a=this;this.$outer.find(".lg-prev").on("click.lg",function(){a.goToPrevSlide()}),this.$outer.find(".lg-next").on("click.lg",function(){a.goToNextSlide()})},b.prototype.arrowDisable=function(a){!this.s.loop&&this.s.hideControlOnEnd&&(a+10?this.$outer.find(".lg-prev").removeAttr("disabled").removeClass("disabled"):this.$outer.find(".lg-prev").attr("disabled","disabled").addClass("disabled"))},b.prototype.setTranslate=function(a,b,c){this.s.useLeft?a.css("left",b):a.css({transform:"translate3d("+b+"px, "+c+"px, 0px)"})},b.prototype.touchMove=function(b,c){var d=c-b;Math.abs(d)>15&&(this.$outer.addClass("lg-dragging"),this.setTranslate(this.$slide.eq(this.index),d,0),this.setTranslate(a(".lg-prev-slide"),-this.$slide.eq(this.index).width()+d,0),this.setTranslate(a(".lg-next-slide"),this.$slide.eq(this.index).width()+d,0))},b.prototype.touchEnd=function(a){var b=this;"lg-slide"!==b.s.mode&&b.$outer.addClass("lg-slide"),this.$slide.not(".lg-current, .lg-prev-slide, .lg-next-slide").css("opacity","0"),setTimeout(function(){b.$outer.removeClass("lg-dragging"),a<0&&Math.abs(a)>b.s.swipeThreshold?b.goToNextSlide(!0):a>0&&Math.abs(a)>b.s.swipeThreshold?b.goToPrevSlide(!0):Math.abs(a)<5&&b.$el.trigger("onSlideClick.lg"),b.$slide.removeAttr("style")}),setTimeout(function(){b.$outer.hasClass("lg-dragging")||"lg-slide"===b.s.mode||b.$outer.removeClass("lg-slide")},b.s.speed+100)},b.prototype.enableSwipe=function(){var a=this,b=0,c=0,d=!1;a.s.enableSwipe&&a.doCss()&&(a.$slide.on("touchstart.lg",function(c){a.$outer.hasClass("lg-zoomed")||a.lgBusy||(c.preventDefault(),a.manageSwipeClass(),b=c.originalEvent.targetTouches[0].pageX)}),a.$slide.on("touchmove.lg",function(e){a.$outer.hasClass("lg-zoomed")||(e.preventDefault(),c=e.originalEvent.targetTouches[0].pageX,a.touchMove(b,c),d=!0)}),a.$slide.on("touchend.lg",function(){a.$outer.hasClass("lg-zoomed")||(d?(d=!1,a.touchEnd(c-b)):a.$el.trigger("onSlideClick.lg"))}))},b.prototype.enableDrag=function(){var b=this,c=0,d=0,e=!1,f=!1;b.s.enableDrag&&b.doCss()&&(b.$slide.on("mousedown.lg",function(d){b.$outer.hasClass("lg-zoomed")||b.lgBusy||a(d.target).text().trim()||(d.preventDefault(),b.manageSwipeClass(),c=d.pageX,e=!0,b.$outer.scrollLeft+=1,b.$outer.scrollLeft-=1,b.$outer.removeClass("lg-grab").addClass("lg-grabbing"),b.$el.trigger("onDragstart.lg"))}),a(window).on("mousemove.lg",function(a){e&&(f=!0,d=a.pageX,b.touchMove(c,d),b.$el.trigger("onDragmove.lg"))}),a(window).on("mouseup.lg",function(g){f?(f=!1,b.touchEnd(d-c),b.$el.trigger("onDragend.lg")):(a(g.target).hasClass("lg-object")||a(g.target).hasClass("lg-video-play"))&&b.$el.trigger("onSlideClick.lg"),e&&(e=!1,b.$outer.removeClass("lg-grabbing").addClass("lg-grab"))}))},b.prototype.manageSwipeClass=function(){var a=this.index+1,b=this.index-1;this.s.loop&&this.$slide.length>2&&(0===this.index?b=this.$slide.length-1:this.index===this.$slide.length-1&&(a=0)),this.$slide.removeClass("lg-next-slide lg-prev-slide"),b>-1&&this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(a).addClass("lg-next-slide")},b.prototype.mousewheel=function(){var a=this;a.$outer.on("mousewheel.lg",function(b){b.deltaY&&(b.deltaY>0?a.goToPrevSlide():a.goToNextSlide(),b.preventDefault())})},b.prototype.closeGallery=function(){var b=this,c=!1;this.$outer.find(".lg-close").on("click.lg",function(){b.destroy()}),b.s.closable&&(b.$outer.on("mousedown.lg",function(b){c=!!(a(b.target).is(".lg-outer")||a(b.target).is(".lg-item ")||a(b.target).is(".lg-img-wrap"))}),b.$outer.on("mousemove.lg",function(){c=!1}),b.$outer.on("mouseup.lg",function(d){(a(d.target).is(".lg-outer")||a(d.target).is(".lg-item ")||a(d.target).is(".lg-img-wrap")&&c)&&(b.$outer.hasClass("lg-dragging")||b.destroy())}))},b.prototype.destroy=function(b){var c=this;b||(c.$el.trigger("onBeforeClose.lg"),a(window).scrollTop(c.prevScrollTop)),b&&(c.s.dynamic||this.$items.off("click.lg click.lgcustom"),a.removeData(c.el,"lightGallery")),this.$el.off(".lg.tm"),a.each(a.fn.lightGallery.modules,function(a){c.modules[a]&&c.modules[a].destroy()}),this.lGalleryOn=!1,clearTimeout(c.hideBartimeout),this.hideBartimeout=!1,a(window).off(".lg"),a("body").removeClass("lg-on lg-from-hash"),c.$outer&&c.$outer.removeClass("lg-visible"),a(".lg-backdrop").removeClass("in"),setTimeout(function(){c.$outer&&c.$outer.remove(),a(".lg-backdrop").remove(),b||c.$el.trigger("onCloseAfter.lg"),c.$el.focus()},c.s.backdropDuration+50)},a.fn.lightGallery=function(c){return this.each(function(){if(a.data(this,"lightGallery"))try{a(this).data("lightGallery").init()}catch(a){console.error("lightGallery has not initiated properly")}else a.data(this,"lightGallery",new b(this,c))})},a.fn.lightGallery.modules={}}()}); \ No newline at end of file diff --git a/vasl_templates/webapp/static/roar.js b/vasl_templates/webapp/static/roar.js index e2e7c58..bab3b46 100644 --- a/vasl_templates/webapp/static/roar.js +++ b/vasl_templates/webapp/static/roar.js @@ -174,11 +174,11 @@ function getRoarScenarioIndex( onReady ) // nope - download it $.getJSON( gGetRoarScenarioIndexUrl, function( resp ) { - if ( resp.error ) { - var msg = resp.error ; + if ( resp.warning ) { + var msg = resp.warning ; if ( resp.message ) msg += "
" + escapeHTML(resp.message) + "
" ; - showErrorMsg( msg ) ; + showWarningMsg( msg ) ; return ; } _roarScenarioIndex = resp ; diff --git a/vasl_templates/webapp/static/scenario-upload.js b/vasl_templates/webapp/static/scenario-upload.js new file mode 100644 index 0000000..d46ca01 --- /dev/null +++ b/vasl_templates/webapp/static/scenario-upload.js @@ -0,0 +1,454 @@ +/* jshint esnext: true */ + +( function() { // nb: put the entire file into its own local namespace, global stuff gets added to window. + +var gVsavData, gScreenshotData ; +var $gDialog, $gVsavContainer, $gScreenshotContainer ; + +// -------------------------------------------------------------------- + +window.uploadScenario = function() { + + // initialize + var asaScenarioId = $( "input[name='ASA_ID']" ).val() ; + + function onAddVsavFile() { + if ( ! canAddVsavFile() ) + return ; + if ( getUrlParam( "vsav_persistence" ) ) { + // FOR TESTING PORPOISES! We can't control a file upload from Selenium (since + // the browser will use native controls), so we get the data from a