1
1
const bootstrap = require ( 'bootstrap' ) ;
2
2
const style = require ( './main.css' ) ;
3
3
4
+ // global variables
5
+ const app = {
6
+ images : {
7
+ imageRandomPlacement : true ,
8
+ hasImages : false ,
9
+ blobs : [ ] ,
10
+ loading : false
11
+ }
12
+ } ;
13
+
4
14
window . onload = ( ) => {
5
15
const form = document . getElementById ( 'input-form' ) ;
6
- form . addEventListener ( "submit" , get ) ;
16
+ const inputImages = document . getElementById ( 'formControlImages' ) ;
17
+ form . addEventListener ( 'submit' , get ) ;
18
+ inputImages . addEventListener ( 'change' , _uploadImages ) ;
7
19
}
8
20
9
- const get = ( e ) => {
21
+ const get = async ( e ) => {
10
22
e . preventDefault ( ) ;
11
23
let textArea = encodeURIComponent ( document . getElementById ( 'formControlTextarea' ) . value ) ;
12
24
const shouldDivide = document . getElementById ( 'lineDivisionCheck' ) . checked ;
13
25
const lang = encodeURIComponent ( document . getElementById ( 'formControlLang' ) . value ) ;
26
+ const images = document . getElementById ( 'formControlImages' ) . files ;
27
+ app . hasImages = images . files && images . files [ 0 ] ;
28
+ app . imageRandomPlacement = document . getElementById ( 'imagePlacementCheck' ) . checked ;
29
+
14
30
let handler = `text` ;
15
31
if ( ! shouldDivide ) {
16
32
const delimiter = encodeURIComponent ( document . getElementById ( 'formControlTextDelimiter' ) . value ) ;
17
33
handler = `lines/${ delimiter } ` ;
18
34
}
19
35
36
+ if ( ! app . hasImages ) {
37
+ if ( ! app . imageRandomPlacement ) {
38
+ // random placement
39
+ } else {
40
+ // defined placement -> server side
41
+ }
42
+ }
43
+
44
+
20
45
const url = `/${ handler } /${ lang } /${ textArea } ` ;
21
46
22
47
fetch ( url ) . then ( ( response ) => response . json ( ) ) . then ( ( result ) => {
@@ -28,10 +53,64 @@ const get = (e) => {
28
53
}
29
54
30
55
const handleErr = ( res = { success : false } ) => {
31
- document . getElementById ( 'err-message' ) . textContent = res . message ;
56
+ const container = document . getElementById ( 'err-message' ) ;
57
+ if ( container . innerHTML . length > 0 ) container . innerHTML = container . innerHTML + "<br>" ;
58
+ container . innerHTML = container . innerHTML + res . message ;
32
59
document . getElementById ( 'error-handle' ) . classList . replace ( 'd-none' , 'd-block' ) ;
33
60
}
34
61
62
+ const _uploadImages = async ( e ) => {
63
+ app . images . blobs = [ ] ;
64
+ app . images . loading = true ;
65
+ app . images . blobs = await _readImages ( e . target . files ) . catch ( ( err ) => {
66
+ console . error ( `not possible to load the image ${ err } ` ) ;
67
+ handleErr ( { message : `error on uploading image(s). ${ err } ` } ) ;
68
+ } )
69
+ app . images . loading = false ;
70
+ _displayImages ( app . images . blobs ) ;
71
+ }
72
+
73
+ const _displayImages = ( files ) => {
74
+ const imgContainer = document . getElementById ( 'input-images' ) ;
75
+ for ( let i = 0 ; i < files . length ; i ++ ) {
76
+ const img = new Image ( ) ;
77
+ img . src = files [ i ] ;
78
+ img . classList . add ( 'd-inline-block' ) ;
79
+ if ( i > 0 ) img . classList . add ( `mx-2` ) ;
80
+ img . style . height = `100px` ;
81
+ img . style . width = `auto` ;
82
+ imgContainer . appendChild ( img ) ;
83
+ }
84
+ imgContainer . classList . replace ( 'd-none' , 'd-block' ) ;
85
+ }
86
+
87
+ const _readImages = async ( files ) => {
88
+ const res = [ ] ;
89
+ let err = [ ] ;
90
+ const getBase64 = ( file ) => {
91
+ const reader = new FileReader ( )
92
+ return new Promise ( resolve => {
93
+ reader . onload = ( ev ) => {
94
+ resolve ( ev . target . result )
95
+ }
96
+ reader . readAsDataURL ( file ) ;
97
+ } ) ;
98
+ } ;
99
+ for ( let i = 0 ; i < files . length ; i ++ ) {
100
+ if ( files [ i ] . type . includes ( 'image' ) ) {
101
+ res . push ( getBase64 ( files [ i ] ) ) ;
102
+ } else {
103
+ err . push ( files [ i ] . name ) ;
104
+ }
105
+ }
106
+
107
+ if ( err . length > 0 ) {
108
+ handleErr ( { message : `error loading the following image(s): ${ err . flat ( ) } ` } ) ;
109
+ }
110
+
111
+ return await Promise . all ( res ) ;
112
+ }
113
+
35
114
const displayResults = ( res ) => {
36
115
if ( ! res . success ) { return handleErr ( res ) ; }
37
116
@@ -49,6 +128,6 @@ const displayResults = (res) => {
49
128
}
50
129
51
130
document . getElementById ( 'temp-res-lexicon-global' ) . innerHTML = `<b>global lexicon</b>: ${ res . lexicon . global [ 0 ] [ 0 ] } (${ res . lexicon . global [ 0 ] [ 1 ] } )`
52
-
53
131
document . getElementById ( 'temp-info' ) . classList . replace ( 'd-none' , 'd-block' ) ;
132
+ document . querySelector ( '#input-form fieldset' ) . disabled = true ;
54
133
}
0 commit comments