@@ -35,17 +35,17 @@ define([
3535super . _init ( ) ;
3636/** Write codes executed before rendering */
3737this . config . dataview = false ;
38- this . config . sizeLevel = 1 ;
38+ this . config . sizeLevel = 2 ;
3939this . config . checkModules = [ 'pd' ] ;
4040
4141this . fileExtensions = {
42- 'csv' :'csv' ,
43- 'excel' :'xlsx' ,
44- 'json' :'json' ,
45- 'pickle' :'' ,
46- 'sas' :'' , // xport or sas7bdat
47- 'spss' :'' ,
48- 'parquet' :'parquet'
42+ 'csv' :[ 'csv' , 'tsv' ] ,
43+ 'excel' :[ 'xlsx' , 'xls' ] ,
44+ 'json' :[ 'json' ] ,
45+ 'pickle' :[ ] ,
46+ 'sas' :[ ] , // xport or sas7bdat
47+ 'spss' :[ ] ,
48+ 'parquet' :[ 'parquet' ]
4949}
5050
5151this . package = {
@@ -69,7 +69,8 @@ define([
6969}
7070
7171this . state = {
72- fileExtension :'csv' ,
72+ fileType :'csv' ,
73+ fileExtension :[ 'csv' ] ,
7374selectedFile :'' ,
7475selectedPath :'' ,
7576vp_fileioType :'Read' ,
@@ -188,6 +189,11 @@ define([
188189}
189190}
190191
192+ _unbindEvent ( ) {
193+ super . _unbindEvent ( ) ;
194+ $ ( document ) . off ( 'change' , this . wrapSelector ( '#fileReadAs' ) ) ;
195+ }
196+
191197_bindEvent ( ) {
192198super . _bindEvent ( ) ;
193199/** Implement binding events */
@@ -198,6 +204,19 @@ define([
198204$ ( that . wrapSelector ( '.vp-fileio-box' ) ) . hide ( ) ;
199205$ ( that . wrapSelector ( '#vp_file' + pageType ) ) . show ( ) ;
200206
207+ if ( pageType === 'Read' && that . fileState [ pageType ] . selectedType === 'spss' ) {
208+ // show install button
209+ that . showInstallButton ( ) ;
210+ // show install note below File type selection
211+ $ ( `<tr class="vp-spss-note"><td colspan="2">
212+ <label class="vp-orange-text vp-italic">NOTE: </label>
213+ <label class="vp-gray-text vp-italic">pyreadstat package is required to read spss file.</label>
214+ </td></tr>` ) . insertAfter ( $ ( that . wrapSelector ( '#fileType' ) ) . closest ( 'tr' ) ) ;
215+ } else {
216+ that . hideInstallButton ( ) ;
217+ $ ( that . wrapSelector ( '.vp-spss-note' ) ) . remove ( ) ;
218+ }
219+
201220
202221//set fileExtensions
203222that . fileResultState = {
@@ -210,26 +229,24 @@ define([
210229let isChecked = $ ( this ) . prop ( 'checked' ) ;
211230var fileioType = that . state . vp_fileioType ;
212231var prefix = '#vp_file' + fileioType + ' ' ;
213- var selectedFileFormat = that . fileState [ fileioType ] . selectedType ;
232+ var selectedType = that . fileState [ fileioType ] [ ' selectedType' ] ;
214233var fileioTypePrefix = fileioType . toLowerCase ( ) ;
215234if ( fileioTypePrefix == 'write' ) {
216235fileioTypePrefix = "to" ;
217236}
237+ let fileId = that . fileState [ fileioType ] . fileTypeId [ selectedType ] ;
218238
219- if ( isChecked ) { // pyArrow
220- that . fileState [ fileioType ] . fileTypeId [ that . state . fileExtension ] = "pa_" + fileioTypePrefix + selectedFileFormat [ 0 ] . toUpperCase ( ) + selectedFileFormat . slice ( 1 ) ;
239+ if ( isChecked ) { // pyArrow
240+ fileId = "pa_" + fileioTypePrefix + selectedType [ 0 ] . toUpperCase ( ) + selectedType . slice ( 1 ) ;
241+ // that.fileState[fileioType].fileTypeId[that.state.fileExtension] = "pa_" + fileioTypePrefix + selectedFileFormat[0].toUpperCase() + selectedFileFormat.slice(1);
221242$ ( that . wrapSelector ( prefix + '#vp_optionBox' ) ) . closest ( '.vp-accordian-container' ) . hide ( ) ;
222- }
223- else { // pandas
224- that . fileState [ fileioType ] . fileTypeId [ that . state . fileExtension ] = "pd_" + fileioTypePrefix + selectedFileFormat [ 0 ] . toUpperCase ( ) + selectedFileFormat . slice ( 1 ) ;
225- if ( that . state . fileExtension != 'parquet' ) { // parquet has no options area
243+ } else { // pandas
244+ // that.fileState[fileioType].fileTypeId[that.state.fileExtension] = "pd_" + fileioTypePrefix + selectedFileFormat[0].toUpperCase() + selectedFileFormat.slice(1);
245+ if ( that . state . fileType != 'parquet' ) { // parquet has no options area
226246$ ( that . wrapSelector ( prefix + '#vp_optionBox' ) ) . closest ( '.vp-accordian-container' ) . show ( ) ;
227247}
228248}
229249
230- var fileTypeObj = that . fileState [ fileioType ] [ 'fileTypeId' ] ;
231- var selectedType = that . fileState [ fileioType ] [ 'selectedType' ] ;
232- let fileId = fileTypeObj [ selectedType ] ;
233250let pdLib = pandasLibrary . PANDAS_FUNCTION ;
234251let thisPkg = JSON . parse ( JSON . stringify ( pdLib [ fileId ] ) ) ;
235252
@@ -246,31 +263,14 @@ define([
246263if ( fileioTypePrefix == 'write' ) {
247264fileioTypePrefix = "to" ;
248265}
249- var selectedFileFormat = that . fileState [ pageType ] . selectedType ;
250266// select file type
251267$ ( this . wrapSelector ( prefix + '#fileType' ) ) . change ( function ( ) {
252- var value = $ ( this ) . val ( ) ;
253- that . fileState [ pageType ] . selectedType = value ;
254-
255- // Whenever change the file type, change to default pandas
256- that . fileState [ pageType ] . fileTypeId [ that . state . fileExtension ] = "pd_" + fileioTypePrefix + selectedFileFormat [ 0 ] . toUpperCase ( ) + selectedFileFormat . slice ( 1 ) ;
257-
268+ var fileType = $ ( this ) . val ( ) ;
269+ that . fileState [ pageType ] . selectedType = fileType ;
258270
259271// reload
260272that . renderPage ( pageType ) ;
261273that . _bindEventByType ( pageType ) ;
262-
263- if ( value === 'spss' ) {
264- // show install button
265- that . showInstallButton ( ) ;
266- // show install note below File type selection
267- $ ( `<tr><td colspan="2">
268- <label class="vp-orange-text vp-italic">NOTE: </label>
269- <label class="vp-gray-text vp-italic">pyreadstat package is required to read spss file.</label>
270- </td></tr>` ) . insertAfter ( $ ( that . wrapSelector ( '#fileType' ) ) . closest ( 'tr' ) ) ;
271- } else {
272- that . hideInstallButton ( ) ;
273- }
274274} ) ;
275275
276276// open file navigation
@@ -282,8 +282,8 @@ define([
282282}
283283
284284let extensionList = [ ] ;
285- if ( that . state . fileExtension !== '' ) {
286- extensionList = [ that . state . fileExtension ] ;
285+ if ( that . state . fileExtension && that . state . fileExtension . length > 0 ) {
286+ extensionList = that . state . fileExtension ;
287287}
288288
289289let fileNavi = new FileNavigation ( {
@@ -417,8 +417,7 @@ define([
417417$ ( '<tr>' ) . append ( $ ( `<td><label for="fileType" class="vp-bold vp-orange-text">File Type</label></td>` ) )
418418. append ( $ ( '<td><select id="fileType" class="vp-select"></select> <label><input id="fileReadAs" type="checkbox"/><span>Use PyArrow</span></label></td>' ) )
419419) ;
420- }
421- else {
420+ } else {
422421$ ( this . wrapSelector ( prefix + '#vp_inputOutputBox table tbody' ) ) . prepend (
423422$ ( '<tr>' ) . append ( $ ( `<td><label for="fileType" class="vp-bold vp-orange-text">File Type</label></td>` ) )
424423. append ( $ ( '<td><select id="fileType" class="vp-select"></select> </td>' ) )
@@ -433,7 +432,6 @@ define([
433432) ;
434433} ) ;
435434
436-
437435// prepend user option
438436let hasAllocateTo = $ ( this . wrapSelector ( prefix + '#o0' ) ) . length > 0 ;
439437if ( hasAllocateTo ) {
@@ -476,6 +474,18 @@ define([
476474, 'vp-file-browser-button' )
477475) ;
478476}
477+
478+ if ( pageType === 'Read' && selectedType === 'spss' ) {
479+ // show install button
480+ this . showInstallButton ( ) ;
481+ // show install note below File type selection
482+ $ ( `<tr class="vp-spss-note"><td colspan="2">
483+ <label class="vp-orange-text vp-italic">NOTE: </label>
484+ <label class="vp-gray-text vp-italic">pyreadstat package is required to read spss file.</label>
485+ </td></tr>` ) . insertAfter ( $ ( this . wrapSelector ( '#fileType' ) ) . closest ( 'tr' ) ) ;
486+ } else {
487+ this . hideInstallButton ( ) ;
488+ }
479489
480490// encoding suggest input
481491$ ( this . wrapSelector ( '#encoding' ) ) . replaceWith ( function ( ) {
@@ -488,6 +498,18 @@ define([
488498suggestInput . setPlaceholder ( 'encoding option' ) ;
489499return suggestInput . toTagString ( ) ;
490500} ) ;
501+
502+ // seperator suggest input
503+ $ ( this . wrapSelector ( '#sep' ) ) . replaceWith ( function ( ) {
504+ // seperator list :
505+ var sepList = [ ',' , '|' , '\\t' , '\\n' , ':' , ';' , '-' , '_' , '&' , '/' , '\\' ] ;
506+ var suggestInput = new SuggestInput ( ) ;
507+ suggestInput . setComponentID ( 'sep' ) ;
508+ suggestInput . addClass ( 'vp-input vp-state' ) ;
509+ suggestInput . setSuggestList ( function ( ) { return sepList ; } ) ;
510+ suggestInput . setPlaceholder ( 'Input seperator' ) ;
511+ return suggestInput . toTagString ( ) ;
512+ } ) ;
491513}
492514
493515render ( ) {