2022-11-07 03:55:07 +01:00
"use strict" ; if ( 'serviceWorker' in navigator ) { console . log ( "Registering service worker" ) ; navigator . serviceWorker . register ( '/sw.js' ) }
class CsvxmlValidator { fieldList ; toValidate ; errors ; constructor ( fieldList , csvRaw ) { this . errors = { parsing : [ ] , mandatoryTags : [ ] , duplicateInvNos : [ ] , dependentColumns : [ ] , controlledLists : [ ] , mainImageResource : [ ] , } ; this . fieldList = Object . freeze ( fieldList ) ; const lines = csvRaw . trim ( ) . replace ( "\r\n" , "\n" ) . split ( "\n" ) ; let separator ; let delimiter ; if ( csvRaw . substr ( 0 , 1 ) === '"' ) { separator = '";"' ; delimiter = '"' } else { separator = ';' ; delimiter = '' }
2022-11-07 02:55:54 +01:00
let headersFields = lines . shift ( ) ; let headers ; if ( delimiter === "" ) headers = headersFields . split ( separator ) ; else headers = headersFields . substr ( 1 , headersFields . length - 2 ) . split ( separator ) ; let expectedFieldCount = headers . length ; let toValidate = [ ] ; let lineCounter = 1 ; for ( let line of lines ) { if ( delimiter !== '' ) { line = line . substr ( 1 , line . length - 2 ) }
if ( line . length <= headers . length ) continue ; let lineContents = { } ; let fields = line . split ( separator ) ; if ( fields . length !== headers . length ) { this . errors . parsing . push ( "Number of columns in line " + lineCounter + " does not match number of headers" ) }
for ( let i = 0 , max = fields . length ; i < max ; i ++ ) { if ( headers [ i ] === undefined || headers [ i ] === null ) { this . errors . parsing . push ( "ERROR parsing line " + lineCounter + "; column " + i ) ; continue }
lineContents [ headers [ i ] ] = fields [ i ] }
if ( Object . values ( lineContents ) . join ( "" ) . length === 0 ) continue ; toValidate . push ( lineContents ) ; lineCounter ++ }
this . toValidate = toValidate ; if ( toValidate . length === 0 ) { alert ( "Error: No lines of content identified" ) }
this . validate ( ) }
validate ( ) { this . validateMandatoryTagsPresent ( ) ; this . checkDuplicateInvNos ( ) ; this . checkDependentColumns ( ) ; this . checkControlledLists ( ) }
validateMandatoryTagsPresent ( ) { let mandatoryFields = [ ] ; for ( let fieldName in this . fieldList ) { if ( this . fieldList [ fieldName ] . required === ! 0 ) { mandatoryFields . push ( fieldName ) } }
console . log ( this . toValidate ) ; let lineCounter = 1 ; for ( let line of this . toValidate ) { for ( let mandatoryField of mandatoryFields ) { if ( line [ mandatoryField ] === undefined || line [ mandatoryField ] === null || line [ mandatoryField ] === '' ) { this . errors . mandatoryTags . push ( "Missing or empty mandatory tag " + mandatoryField + " on line " + lineCounter ) } }
lineCounter ++ } }
checkDuplicateInvNos ( ) { let invNoEncountered = [ ] ; let lineCounter = 1 ; for ( let line of this . toValidate ) { if ( invNoEncountered . includes ( line . inventory _number ) ) { this . errors . duplicateInvNos . push ( "Duplicate inventory number " + line . inventory _number + " on line " + lineCounter ) }
invNoEncountered . push ( line . inventory _number ) ; lineCounter ++ } }
checkDependentColumns ( ) { const headers = Object . keys ( this . toValidate [ 0 ] ) ; for ( let header of headers ) { if ( this . fieldList [ header ] === undefined || this . fieldList [ header ] . dependsOn === undefined || this . fieldList [ header ] . dependsOn === null ) continue ; let dependencies = this . fieldList [ header ] . dependsOn ; for ( let dep of dependencies ) { if ( headers . includes ( dep ) === ! 1 ) { this . errors . dependentColumns . push ( "Dependency issue at column " + header + ": Corresponding column " + dep + " is missing" ) } } } }
checkControlledLists ( ) { let lineCounter = 1 ; for ( let line of this . toValidate ) { for ( let fieldName in line ) { if ( this . fieldList [ fieldName ] === undefined ) { console . log ( "Undefined but requested field " + fieldName ) ; continue }
let allowedValues = this . fieldList [ fieldName ] . allowedValues ; if ( allowedValues === undefined || allowedValues === null ) continue ; if ( Object . values ( allowedValues ) . length === 0 || Object . values ( allowedValues ) . includes ( line [ fieldName ] ) ) { continue }
this . errors . controlledLists . push ( "Disallowed value used for column " + fieldName + " at line " + lineCounter + " (Allowed values are: " + Object . values ( allowedValues ) . join ( ", " ) + ")" ) }
lineCounter ++ } }
checkMainImageResource ( ) { }
isValid ( ) { for ( let errorClass in this . errors ) { if ( this . errors [ errorClass ] . length !== 0 ) return ! 1 }
return ! 0 }
generateXml ( ) { let output = [ ] ; let xmlDoc = document . implementation . createDocument ( null , "record" ) ; for ( let line of this . toValidate ) { let root = xmlDoc . createElement ( "record" ) ; for ( let fieldName in line ) { const elem = xmlDoc . createElement ( fieldName ) ; elem . textContent = line [ fieldName ] ; root . appendChild ( elem ) }
output . push ( root ) }
return output } }
class CsvxmlTooltip { static getDirection ( e , elem ) { if ( window . innerHeight < e . clientY + elem . clientHeight ) { elem . style . top = "" ; elem . style . bottom = ( window . innerHeight - e . clientY ) + "px" } else { elem . style . bottom = "" ; elem . style . top = ( e . clientY + 4 ) + "px" }
if ( window . innerWidth < e . clientX + elem . clientWidth ) { elem . style . left = "" ; elem . style . right = ( window . innerWidth - e . clientX ) + "px" } else { elem . style . right = "" ; elem . style . left = ( e . clientX + 3 ) + "px" } }
static positionMobile ( newMain ) { if ( window . matchMedia && window . matchMedia ( '(max-width:75em)' ) . matches ) { newMain . style . left = "" ; newMain . style . right = "" ; newMain . style . top = "" ; newMain . style . bottom = "" ; if ( newMain . classList . contains ( "atBottom" ) === ! 1 ) { newMain . classList . add ( "atBottom" ) } } }
static triggerMouseMove ( e ) { const newMain = document . getElementById ( "newToolTipMain" ) ; if ( newMain === undefined || newMain === null ) return ; CsvxmlTooltip . getDirection ( e , newMain ) ; CsvxmlTooltip . positionMobile ( newMain ) }
static triggerMouseOut ( e ) { const newMain = document . getElementById ( "newToolTipMain" ) ; if ( newMain !== undefined && newMain !== null ) { newMain . classList . remove ( "visible" ) ; document . body . removeChild ( newMain ) }
e . target . removeEventListener ( 'mouseout' , CsvxmlTooltip . triggerMouseOut ) }
static bindTooltipToElement ( elem , tooltipTitle , tooltipContent ) { elem . addEventListener ( 'mouseover' , function ( e ) { let newMain = document . getElementById ( "newToolTipMain" ) ; if ( newMain !== null ) return ; newMain = document . createElement ( "div" ) ; newMain . classList . add ( "newToolTip" ) ; newMain . id = "newToolTipMain" ; newMain . setAttribute ( "data-title" , tooltipTitle ) ; newMain . appendChild ( tooltipContent ) ; document . body . appendChild ( newMain ) ; newMain . classList . add ( "visible" ) ; CsvxmlTooltip . getDirection ( e , newMain ) ; CsvxmlTooltip . positionMobile ( newMain ) ; newMain . addEventListener ( "mouseout" , function ( e ) { const newMain = document . getElementById ( "newToolTipMain" ) ; if ( newMain !== undefined && newMain !== null ) { newMain . classList . remove ( "visible" ) ; document . body . removeChild ( newMain ) } } ) ; elem . addEventListener ( "mouseout" , CsvxmlTooltip . triggerMouseOut ) } , { passive : ! 0 } ) ; elem . addEventListener ( "mousemove" , CsvxmlTooltip . triggerMouseMove , { passive : ! 0 } ) } }
class CsvxmlDialogue { static closeDialogue ( e ) { if ( e !== undefined ) { e . preventDefault ( ) ; e . stopPropagation ( ) }
let dialogueArea = document . getElementById ( "dialogueArea" ) ; if ( dialogueArea !== null && dialogueArea !== ! 1 ) { while ( dialogueArea . firstChild ) { dialogueArea . removeChild ( dialogueArea . firstChild ) }
dialogueArea . parentElement . removeChild ( dialogueArea ) ; document . removeEventListener ( 'keydown' , CsvxmlDialogue . closeDialogueByEscape , ! 1 ) } }
static closeDialogueByEscape ( e ) { if ( e . keyCode === 27 ) { CsvxmlDialogue . closeDialogue ( e ) } }
static drawDialogue ( contents ) { let dialogueArea = document . createElement ( "div" ) ; dialogueArea . id = "dialogueArea" ; let dialogue = document . createElement ( "div" ) ; dialogue . id = "dialogue" ; dialogue . appendChild ( contents ) ; dialogueArea . appendChild ( dialogue ) ; document . body . appendChild ( dialogueArea ) ; document . addEventListener ( 'keydown' , CsvxmlDialogue . closeDialogueByEscape ) ; return dialogue } }
class CsvxmlPage { fieldList ; fieldListFlat ; tls ; domUploaderWrapper ; domMainWrapper ; selectedFields ; csvBySelectionButton ; unsetSelectionButton ; constructor ( fieldList , tls ) { this . fieldList = Object . freeze ( fieldList ) ; let list = { } ; for ( let sectionName in fieldList ) { list = Object . assign ( list , fieldList [ sectionName ] ) }
this . fieldListFlat = Object . freeze ( list ) ; this . tls = Object . freeze ( tls ) ; let domUploaderWrapper = document . createElement ( "div" ) ; domUploaderWrapper . id = "uploader" ; domUploaderWrapper . classList . add ( "uploader" ) ; this . domUploaderWrapper = domUploaderWrapper ; let domMainWrapper = document . createElement ( "main" ) ; this . domMainWrapper = domMainWrapper ; this . selectedFields = [ ] }
generateCsv ( selectedFields = [ ] ) { let line1 = [ ] ; let line2 = [ ] ; let line3 = [ ] ; for ( let fieldName in this . fieldListFlat ) { console . log ( fieldName ) ; console . log ( selectedFields ) ; if ( selectedFields . length !== 0 && selectedFields . includes ( fieldName ) === ! 1 ) continue ; const field = this . fieldListFlat [ fieldName ] ; line1 . push ( fieldName ) ; line2 . push ( field . name _human _readable ) ; if ( field . allowedValues !== undefined ) { let values = [ ] ; for ( let key in field . allowedValues ) values . push ( field . allowedValues [ key ] ) ; line3 . push ( values . join ( "," ) ) } else line3 . push ( "" ) ; }
const csvLine1 = '"' + line1 . join ( '";"' ) + '"' ; const csvLine2 = '"' + line2 . join ( '";"' ) + '"' ; const csvLine3 = '"' + line3 . join ( '";"' ) + '"' ; const toStore = csvLine1 + "\n" + csvLine2 + "\n" + csvLine3 ; const triggerLink = document . createElement ( 'a' ) ; triggerLink . setAttribute ( 'href' , 'data:text/plain;charset=utf-8,' + encodeURIComponent ( toStore ) ) ; triggerLink . setAttribute ( 'download' , "csvxml_museum-digital_template.csv" ) ; triggerLink . style . display = 'none' ; document . body . appendChild ( triggerLink ) ; triggerLink . click ( ) ; document . body . removeChild ( triggerLink ) }
zipUploadToXml ( validator ) { function runZipping ( ) { let zip = new JSZip ( ) ; let xmlFiles = validator . generateXml ( ) ; const serializer = new XMLSerializer ( ) ; let lineCounter = 0 ; for ( let xml of xmlFiles ) { zip . file ( lineCounter + ".xml" , serializer . serializeToString ( xml ) ) ; lineCounter ++ }
zip . generateAsync ( { type : "blob" } ) . then ( function ( content ) { const triggerLink = document . createElement ( 'a' ) ; triggerLink . href = window . URL . createObjectURL ( content ) ; triggerLink . setAttribute ( 'download' , "csvxml.zip" ) ; triggerLink . style . display = 'none' ; document . body . appendChild ( triggerLink ) ; triggerLink . click ( ) ; document . body . removeChild ( triggerLink ) } ) }
if ( typeof JSZip === "undefined" ) { const loadScript = document . createElement ( "script" ) ; loadScript . setAttribute ( "src" , "assets/js/jszip/dist/jszip.min.js" ) ; loadScript . addEventListener ( 'load' , function ( ) { runZipping ( ) } , { passive : ! 0 , once : ! 0 } ) ; document . body . appendChild ( loadScript ) } else { runZipping ( ) } }
listValidationErrors ( validator ) { const dialogueContent = document . createElement ( "div" ) ; const headline = document . createElement ( "h3" ) ; headline . textContent = this . tls . validation _errors ; const cancelB = document . createElement ( "a" ) ; cancelB . classList . add ( "icons" ) ; cancelB . classList . add ( "iconsClose" ) ; cancelB . classList . add ( "dialogueCloseX" ) ; cancelB . id = "dialogueClose" ; cancelB . textContent = "X" ; cancelB . title = "Close" ; cancelB . href = "#" + location . href ; cancelB . addEventListener ( 'click' , CsvxmlDialogue . closeDialogue ) ; headline . appendChild ( cancelB ) ; dialogueContent . appendChild ( headline ) ; const domErrorsSection = document . createElement ( "div" ) ; for ( let errorType in validator . errors ) { if ( validator . errors [ errorType ] . length === 0 ) continue ; const ulHl = document . createElement ( "h4" ) ; ulHl . textContent = this . tls [ 'errors_' + errorType ] + " (" + validator . errors [ errorType ] . length + ")" ; ulHl . style . cursor = "pointer" ; domErrorsSection . appendChild ( ulHl ) ; const ul = document . createElement ( "ul" ) ; for ( let error of validator . errors [ errorType ] ) { const li = document . createElement ( "li" ) ; li . textContent = error ; ul . appendChild ( li ) }
ulHl . addEventListener ( 'click' , function ( ) { ul . classList . toggle ( "minimized" ) } ) ; domErrorsSection . appendChild ( ul ) }
dialogueContent . appendChild ( domErrorsSection ) ; const domDlSection = document . createElement ( "div" ) ; const domDlA = document . createElement ( "span" ) ; domDlA . textContent = this . tls . download ; domDlA . classList . add ( "buttonLike" ) ; let app = this ; domDlA . addEventListener ( 'click' , function ( ) { app . zipUploadToXml ( validator ) } ) ; domDlSection . appendChild ( domDlA ) ; dialogueContent . appendChild ( domDlSection ) ; dialogue = CsvxmlDialogue . drawDialogue ( dialogueContent ) }
uploadFileForValidation ( file ) { const reader = new FileReader ( ) ; reader . readAsText ( file ) ; let app = this ; reader . onload = function ( ) { console . log ( "Read file" ) ; let validator = new CsvxmlValidator ( app . fieldListFlat , reader . result ) ; if ( validator . isValid ( ) === ! 0 ) { alert ( "Document is valid. Press ok to download." ) ; app . zipUploadToXml ( validator ) } else { app . listValidationErrors ( validator ) } } ; reader . onerror = function ( ) { alert ( reader . error ) } }
renderHeader ( ) { const header = document . createElement ( "header" ) ; const h1 = document . createElement ( "h1" ) ; const img = document . createElement ( "img" ) ; img . width = "70" ; img . height = "70" ; img . src = "assets/img/mdlogo-csvxml.svg" ; img . alt = "" ; h1 . appendChild ( img ) ; const h1Span = document . createElement ( "span" ) ; h1Span . textContent = "museum-digital:csvxml" ; h1 . appendChild ( h1Span ) ; header . appendChild ( h1 ) ; document . body . appendChild ( header ) }
2022-11-07 03:55:07 +01:00
renderUploader ( ) { let app = this ; ( async function ( ) { const form = document . createElement ( "form" ) ; const label = document . createElement ( "label" ) ; label . textContent = app . tls . select _csv _file _for _upload ; label . setAttribute ( "for" , "fileToUpload" ) ; form . appendChild ( label ) ; const input = document . createElement ( "input" ) ; input . type = "file" ; input . id = "fileToUpload" ; input . setAttribute ( "tabindex" , "1" ) ; input . accept = ".csv" ; input . required = "required" ; input . addEventListener ( 'change' , async function ( ) { app . uploadFileForValidation ( input . files [ 0 ] ) } ) ; form . appendChild ( input ) ; app . domUploaderWrapper . appendChild ( form ) } ) ( ) ; document . body . appendChild ( this . domUploaderWrapper ) }
2022-11-07 02:55:54 +01:00
doForFieldList ( callback ) { let fieldLists = document . getElementsByClassName ( "fieldList" ) ; for ( let i = 0 , max = fieldLists . length ; i < max ; i ++ ) { let fields = fieldLists [ i ] . getElementsByTagName ( "li" ) ; for ( let j = 0 , maxj = fields . length ; j < maxj ; j ++ ) { callback ( fields [ j ] ) } } }
toggleListFieldSelectionState ( field ) { let app = this ; let newValue = field . getAttribute ( "data-alt" ) ; field . setAttribute ( "data-alt" , field . textContent ) ; field . textContent = newValue ; field . classList . toggle ( "humanTLToggled" ) ; if ( field . classList . contains ( "humanTLToggled" ) === ! 1 ) return ; let dependencies = this . fieldListFlat [ field . id ] . dependsOn ; if ( dependencies !== undefined && dependencies !== null ) { let linkedFields = this . fieldListFlat [ field . id ] . dependsOn ; for ( let i = 0 , max = linkedFields . length ; i < max ; i ++ ) { let linkedField = document . getElementById ( linkedFields [ i ] ) ; if ( linkedField . classList . contains ( "humanTLToggled" ) === ! 0 ) continue ; this . toggleListFieldSelectionState ( linkedField ) } } }
checkCSVBySelectionAccessibility ( ) { let selected = document . getElementsByClassName ( "humanTLToggled" ) ; if ( selected . length === 0 ) { this . csvBySelectionButton . classList . add ( "invisible" ) ; this . unsetSelectionButton . classList . add ( "invisible" ) } else { this . csvBySelectionButton . classList . remove ( "invisible" ) ; this . unsetSelectionButton . classList . remove ( "invisible" ) } }
2022-11-07 03:55:07 +01:00
getOptionsSection ( ) { function genButton ( id , text , link = "" ) { const output = document . createElement ( "span" ) ; output . id = id ; output . setAttribute ( "tabindex" , "1" ) ; output . textContent = text ; output . classList . add ( "buttonLike" ) ; if ( link !== "" ) output . href = link ; return output }
const options = document . createElement ( "div" ) ; options . classList . add ( "options" ) ; const app = this ; const dlAllButton = genButton ( "dlAll" , this . tls . download _csv _all ) ; dlAllButton . cursor = "pointer" ; dlAllButton . addEventListener ( 'click' , function ( e ) { e . preventDefault ( ) ; app . generateCsv ( ) } ) ; options . appendChild ( dlAllButton ) ; this . csvBySelectionButton = genButton ( "csvBySelection" , this . tls . download _csv _by _selection ) ; this . csvBySelectionButton . classList . add ( "invisible" ) ; options . appendChild ( this . csvBySelectionButton ) ; const optionSelectRequired = genButton ( "selectRequired" , this . tls . select _required _fields ) ; options . appendChild ( optionSelectRequired ) ; const optionSelectAll = genButton ( "selectAll" , this . tls . select _all _fields ) ; options . appendChild ( optionSelectAll ) ; this . unsetSelectionButton = genButton ( "unsetSelection" , this . tls . unset _selection ) ; this . unsetSelectionButton . classList . add ( "invisible" ) ; options . appendChild ( this . unsetSelectionButton ) ; this . csvBySelectionButton . addEventListener ( 'click' , function ( e ) { e . preventDefault ( ) ; let selected = document . getElementsByClassName ( "humanTLToggled" ) ; let selectedFields = [ ] ; for ( let i = 0 , max = selected . length ; i < max ; i ++ ) { selectedFields += selected [ i ] . getAttribute ( "data-value" ) }
app . generateCsv ( selectedFields ) } ) ; optionSelectRequired . addEventListener ( 'click' , function ( e ) { e . preventDefault ( ) ; app . doForFieldList ( function ( field ) { if ( field . classList . contains ( "requiredField" ) === ! 1 ) return ; if ( field . classList . contains ( "humanTLToggled" ) === ! 0 ) return ; app . toggleListFieldSelectionState ( field ) ; app . checkCSVBySelectionAccessibility ( ) } ) } ) ; optionSelectAll . addEventListener ( 'click' , function ( e ) { e . preventDefault ( ) ; app . doForFieldList ( function ( field ) { if ( field . classList . contains ( "humanTLToggled" ) === ! 0 ) return ; app . toggleListFieldSelectionState ( field ) ; app . checkCSVBySelectionAccessibility ( ) } ) } ) ; this . unsetSelectionButton . addEventListener ( 'click' , function ( e ) { e . preventDefault ( ) ; app . doForFieldList ( function ( field ) { if ( field . classList . contains ( "humanTLToggled" ) === ! 1 ) return ; app . toggleListFieldSelectionState ( field ) ; app . checkCSVBySelectionAccessibility ( ) } ) } ) ; return options }
2022-11-07 02:55:54 +01:00
renderMain ( ) { const domH2 = document . createElement ( "h2" ) ; domH2 . textContent = this . tls . currently _approved _tags ; this . domMainWrapper . appendChild ( domH2 ) ; this . domMainWrapper . appendChild ( this . getOptionsSection ( ) ) ; for ( let sectionName in this . fieldList ) { const domDiv = document . createElement ( "div" ) ; const domH3 = document . createElement ( "h3" ) ; domH3 . textContent = sectionName ; domDiv . appendChild ( domH3 ) ; const domUl = document . createElement ( "ul" ) ; domUl . classList . add ( "fieldList" ) ; const sectionFields = this . fieldList [ sectionName ] ; for ( let fieldName in sectionFields ) { const field = sectionFields [ fieldName ] ; const domLi = document . createElement ( "li" ) ; domLi . textContent = fieldName ; domLi . id = fieldName ; domLi . setAttribute ( "data-alt" , field . name _human _readable )
domLi . setAttribute ( "data-value" , fieldName )
if ( field . required === ! 0 ) domLi . classList . add ( "requiredField" ) ; domUl . appendChild ( domLi ) ; const tooltipContent = document . createElement ( "div" ) ; const explicaP = document . createElement ( "p" ) ; explicaP . textContent = field . explica ; tooltipContent . appendChild ( explicaP ) ; if ( field . remarks !== undefined && field . remarks !== '' ) { const remarkHl = document . createElement ( "h4" ) ; remarkHl . textContent = this . tls . remarks ; tooltipContent . appendChild ( remarkHl )
const remarkCont = document . createElement ( "p" ) ; remarkCont = field . remarks ; tooltipContent . appendChild ( remarkCont ) }
if ( field . allowedValues !== undefined && Object . values ( field . allowedValues ) . length !== 0 ) { const allowedHl = document . createElement ( "h4" ) ; allowedHl . textContent = this . tls . allowed _values ; tooltipContent . appendChild ( allowedHl ) ; const allowedList = document . createElement ( "p" ) ; allowedList . textContent = Object . values ( field . allowedValues ) . join ( ', ' ) ; tooltipContent . appendChild ( allowedList ) }
CsvxmlTooltip . bindTooltipToElement ( domLi , field . name _human _readable , tooltipContent ) }
domDiv . appendChild ( domUl ) ; this . domMainWrapper . appendChild ( domDiv ) }
document . body . appendChild ( this . domMainWrapper ) ; let app = this ; this . doForFieldList ( function ( field ) { field . addEventListener ( 'click' , function ( e ) { app . toggleListFieldSelectionState ( field ) ; app . checkCSVBySelectionAccessibility ( ) } ) } ) } } ( async function ( ) { function getLang ( ) { const allowedLangs = document . documentElement . getAttribute ( "data-allowed-langs" ) . split ( ',' ) ; if ( navigator . language === undefined ) return 'en' ; const browserLang = navigator . language . toLowerCase ( ) . substr ( 0 , 2 ) ; console . log ( browserLang ) ; if ( allowedLangs . includes ( browserLang ) ) return browserLang ; else return 'en' }
2022-11-07 03:55:07 +01:00
const lang = getLang ( ) ; document . documentElement . setAttribute ( "lang" , lang ) ; document . body . classList . add ( "loading" ) ; let loaded = 0 ; let fieldList ; let tls ; function loadPage ( ) { document . body . classList . remove ( "loading" ) ; const page = new CsvxmlPage ( fieldList , tls ) ; page . renderHeader ( ) ; page . renderUploader ( ) ; page . renderMain ( ) }
2022-11-07 02:55:54 +01:00
window . fetch ( '/json/fields.' + lang + '.json' , { method : 'GET' , cache : 'no-cache' , credentials : 'same-origin' , } ) . then ( function ( response ) { return response . json ( ) } ) . then ( function ( elements ) { fieldList = elements ; loaded ++ ; if ( loaded === 2 ) loadPage ( ) ; } ) ; window . fetch ( '/json/tls.' + lang + '.json' , { method : 'GET' , cache : 'no-cache' , credentials : 'same-origin' , } ) . then ( function ( response ) { return response . json ( ) } ) . then ( function ( elements ) { tls = elements ; loaded ++ ; if ( loaded === 2 ) loadPage ( ) ; } ) } ) ( )