@ -1,3 +1,4 @@
/ / T O D O A d d s u b m i t b u t t o n t o l i n k w i t h f i l e u p l o a d
< template >
< form >
< input type = "file" id = "uploadInput" accept = ".xlsx" @change ="upload($event)" >
@ -7,6 +8,8 @@
< script >
import { read , utils } from "xlsx" ;
import { store } from '../store.js'
import { HeaderAssociator } from '../helpers.js'
function find _header _row ( worksheet ) {
/ / R e t u r n s t h e z e r o - i n d e x r o w n u m b e r o f t h e h e a d e r s
@ -35,12 +38,13 @@ export default {
uploadedFiles : [ ] ,
uploadError : null ,
currentStatus : null ,
uploadFieldName : 'uploadfile'
uploadFieldName : 'uploadfile' ,
store
}
} ,
methods : {
async upload ( event ) {
var file = await event . target . files [ 0 ] . arrayBuffer ( ) ;
var workbook = read ( file ) ;
var worksheets = workbook . SheetNames ;
@ -49,28 +53,28 @@ export default {
var headerIndex = find _header _row ( worksheet ) ;
/ / T O D O : A d d h a n d l i n g f o r f a i l e d u p l o a d s a n d c h e c k i n g o t h e r s h e e t s
/ / F I X M E : A d d h a n d l i n g f o r f a i l e d u p l o a d s a n d c h e c k i n g o t h e r s h e e t s
if ( headerIndex === null ) {
console . log ( "Failed to find valid header row" ) ;
console . error ( "Failed to find valid header row" ) ;
return ;
}
/ / T O D O : T h i s s h o u l d h a p p e n o n p a g e l o a d a n d b e s t o r e d a s a p p d a t a
/ / L o a d h e a d e r / v a l u e c o n f i g
var configRequestOptions = {
method : 'GET' ,
redirect : 'follow' ,
} ;
var resp = await fetch ( "http://192.168.0.171:5252/api/template" , configRequestOptions ) ;
var dataStandardList = await resp . json ( ) ;
console . log ( dataStandardList ) ;
console . info ( dataStandardList ) ;
/ / H e r e w e c o m p i l e a l l o f t h e h e a d e r s i n t o o n e s t r i n g
/ / T h i s w i l l l e t u s e a s i l y s e a r c h f o r e a c h h e a d e r u s i n g r e g e x
/ / T h e c o l w i l l b e n o t e d a t t h e e n d o f t h e h e a d e r s o t h a t w e c a n
/ / c h e c k t h e v a l u e
var headers = "" ;
var combinedHeadersString = "" ;
console . group ( "Document columns" ) ;
for ( let col = 0 ; col < 200 ; col ++ ) {
let cellAddress = utils . encode _cell ( { c : col , r : headerIndex } ) ;
@ -78,45 +82,64 @@ export default {
if ( cellObj === undefined ) { break }
/ / A v a l u e o f 4 0 k t y p i c a l l i n d i c a t e s a d a t e ( c a s h f l o w s )
else if ( cellObj . v > 40000 ) { break }
/ / A d d [ c o l # ] t o h e l p f i n d v a l u e i n t h e s a m e c o l u m n
headers = headers + worksheet [ cellAddress ] . v + '[' + col + ']' ;
/ / A d d t h e h e a d e r t o t h e c o m b i n e d h e a d e r s s t r i n g
combinedHeadersString += cellObj . v ;
let headerAssociator = new HeaderAssociator ( cellObj . v , cellAddress ) ;
console . info ( ` Document column: ${ headerAssociator } ` )
store . documentHeaders . push ( headerAssociator ) ;
}
console . groupEnd ( ) ;
var missing = new Array ( ) ;
var invalidData = new Array ( ) ;
var colIndexReg = RegExp ( "\\[\\d{1,3}\\]" ) ;
for ( let i in dataStandardList ) {
let headerRegex = dataStandardList [ i ] ;
/ / C h e c k e a c h t e m p l a t e r e g e x a g a i n s t t h e c o m b i n e d h e a d e r s s t r i n g
for ( const headerTemplate of dataStandardList ) {
console . group ( ` Header regex: ${ headerTemplate [ "Header" ] } ` ) ;
/ / ' i ' o p t i o n m e a n s i g n o r e c a s e
/ / A D d i n g [ \ d { 1 , 3 } ] a l l o w s u s t o f i n d t h e c o l u m n t h e m a t c h c a m e f r o m
let searchRegex = RegExp ( headerRegex [ "HeaderRegex" ] + "\\[\\d{1,3}\\]" , "i" ) ;
let found = searchRegex . exec ( headers ) ;
if ( found === null ) { missing . push ( headerRegex ) ; continue }
/ / N o w w e n e e d t o c h e c k t h e v a l u e b e l o w
let isNullable = headerRegex [ "Nullable" ] ;
/ / G e t t h e v a l u e i n t h e s p a c e
let firstMatch = found [ 0 ] ;
let colInd = firstMatch . match ( colIndexReg ) [ 0 ] ;
colInd = parseInt ( colInd . replace ( '[' , '' ) . replace ( ']' , '' ) ) ;
/ / N o w w e c a n g e t t h e v a l u e o f t h e c e l l b e l o w t h e h e a d e r
let valueCellAddress = utils . encode _cell ( { c : colInd , r : headerIndex + 1 } ) ;
let valueObj = worksheet [ valueCellAddress ] ;
/ / T e s t i f t h e r e i s a n y t h i n g h e r e , i f n o t t h i s i s a i n v a l d
if ( valueObj === undefined ) {
if ( isNullable ) { continue }
invalidData . push ( headerRegex ) ; continue
let headerRegex = RegExp ( headerTemplate [ "HeaderRegex" ] , "i" ) ;
let headerName = headerTemplate [ "Header" ] ;
let searchResults = headerRegex . exec ( combinedHeadersString ) ;
if ( searchResults === null ) {
console . info ( ` Header not found: ${ headerName } ` ) ;
store . missingHeaders . push ( headerName ) ;
console . groupEnd ( )
continue ;
}
/ / T e s t t h e v a l u e a g a i n s t r e g e x
searchRegex = RegExp ( headerRegex [ "ValueRegex" ] , 'i' ) ;
let validData = searchRegex . test ( valueObj . v ) ;
if ( ! validData ) { invalidData . push ( headerRegex ) }
let docHeader = searchResults [ 0 ] ;
console . log ( ` Match: ${ docHeader } ` ) ;
/ / N o w w e n e e d t o c h e c k t h e v a l u e b e l o w t h e h e a d e r
let isNullable = headerTemplate [ "Nullable" ] ;
/ / F i n d t h e a s s o c i a t e d h e a d e r
for ( let headerAssociator of store . documentHeaders ) {
if ( headerAssociator . isSet ( ) ) { console . groupEnd ( ) ; continue }
if ( headerAssociator . documentHeader === docHeader ) {
headerAssociator . swapTemplateHeader ( headerName ) ;
let headerAddress = utils . decode _cell ( headerAssociator . docHeaderAddress ) ;
/ / N o w w e c a n g e t t h e v a l u e o f t h e c e l l b e l o w t h e h e a d e r
let valueCellAddress = utils . encode _cell ( headerAddress . r + 1 ) ;
let valueObj = worksheet [ valueCellAddress ] ;
/ / C h e c k i f t h e c e l l i s n u l l , i f s o d o e s i t m a t t e r ?
if ( valueObj !== undefined ) {
/ / T e s t t h e v a l u e a g a i n s t r e g e x
let valueRegex = RegExp ( headerTemplate [ "ValueRegex" ] , 'i' ) ;
headerAssociator . isValidData = valueRegex . test ( valueObj . v ) ;
} else {
headerAssociator . isValidData = isNullable ;
}
console . info ( ` Found header: ${ headerAssociator } ` ) ;
console . groupEnd ( ) ;
break ;
}
}
console . groupEnd ( ) ;
}
console . log ( missing ) ;
console . log ( invalidData ) ;
console . info ( ` Missing headers ( ${ store . missingHeaders . length } ): ${ store . missingHeaders } ` ) ;
console . info ( ` Document headers ( ${ store . documentHeaders . length } ): ${ store . documentHeaders } ` ) ;
/ / l e t e x c e l D o c = n e w F o r m D a t a ( ) ;
/ / e x c e l D o c . a p p e n d ( " f i l e " , e v e n t . t a r g e t . f i l e s [ 0 ] ) ;