UNPKG

mountainlab

Version:
694 lines (621 loc) 18.7 kB
exports.AltMLSOverviewWindow=AltMLSOverviewWindow; exports.AdvancedConfigurationWidget=AdvancedConfigurationWidget; var JSQWidget=require('../mlscore/jsqcore/jsqwidget.js').JSQWidget; var MLTableWidget=require('./mltablewidget.js').MLTableWidget; var ProcessingServerWidget=require('./processingserverwidget.js').ProcessingServerWidget; var FileUploader=require('../mlscore/jsutils/fileuploader.js').FileUploader; var mlutils=require('../mlscore/mlutils.js'); var jsutils=require('../mlscore/jsutils/jsutils.js'); require('./altmlsoverviewwindow.css'); function AltMLSOverviewWindow(O) { O=O||this; var html=require('./altmlsoverviewwindow.html'); JSQWidget(O,$(html).find(".AltMLSOverviewWindow").clone()); this.setMLSManager=function(manager) {setMLSManager(manager);}; this.setDocStorClient=function(DSC) {m_study_list_widget.setDocStorClient(DSC);}; this.refresh=function() {refresh_study_list_widget();}; this.setLoginInfo=function(info) {m_study_list_widget.setLoginInfo(info);}; var m_study_list_widget=new StudyListWidget(); var m_processing_server_widget=new ProcessingServerWidget(); var m_advanced_configuration_widget=new AdvancedConfigurationWidget(); var m_mls_manager=null; O.div().find('.bd-toc-item').addClass('active'); O.div().find('.bd-toc-item ul > li > a').click(function() { //O.div().find('.bd-toc-item').removeClass('active'); O.div().find('.bd-toc-item ul > li > a').parent().removeClass('active bd-sidenav-active'); $(this).parent().addClass('active bd-sidenav-active'); $(this).parent().parent().parent().addClass('active'); update_visible_content(); }); O.div().find('.bd-toc-link').click(function() { //O.div().find('.bd-toc-link').parent().removeClass('active'); $(this).parent().addClass('active'); O.div().find('.bd-toc-item ul > li > a').parent().removeClass('active bd-sidenav-active'); $(this).parent().find('ul > li').first().addClass('active bd-sidenav-active'); update_visible_content(); }); O.div().find('#study_list').append(m_study_list_widget.div()); O.div().find('#processing_server').append(m_processing_server_widget.div()); O.div().find('#advanced_configuration').append(m_advanced_configuration_widget.div()); O.div().find('.action_sign_in').click(sign_in); O.div().find('.action_sign_out').click(sign_out); function setMLSManager(manager) { m_mls_manager=manager; m_processing_server_widget.setMLSManager(manager); m_advanced_configuration_widget.setMLSManager(manager); } function current_content_id() { var active_item=O.div().find('.bd-toc-item ul > li.active').first(); var content_id=active_item.attr('data-content-id'); return content_id; } function current_study_list_mode() { var active_item=O.div().find('.bd-toc-item ul > li.active').first(); var study_list_mode=active_item.attr('data-study-list-mode'); return study_list_mode; } function update_visible_content() { var content_id=current_content_id(); O.div().find('#content .tab-pane').removeClass('show active'); O.div().find('#content .tab-pane#'+content_id).addClass('show active'); //todo: only do the following line when necessary refresh_study_list_widget(); } JSQ.connect(m_study_list_widget,'open_study',O,'open_study'); JSQ.connect(m_study_list_widget,'open_workspace',O,'open_workspace'); function refresh_study_list_widget() { var study_list_mode=current_study_list_mode(); if (study_list_mode) { m_study_list_widget.setMode(study_list_mode); } } function sign_in() { O.emit('log_in'); } function sign_out() { mlutils.mlinfo('Not yet implemented','Sign out - not yet implemented'); } } function StudyListWidget(O) { O=O||this; var html=require('./altmlsoverviewwindow.html'); JSQWidget(O,$(html).find('.StudyListWidget').clone()); this.setDocStorClient=function(DSC) {m_docstor_client=DSC;}; this.clear=function() {clear();}; this.setMode=function(mode) {setMode(mode);}; this.setLoginInfo=function(info) {m_login_info=JSQ.clone(info); refresh();}; var m_docstor_client=null; var m_studies=[]; var m_table=new MLTableWidget(); m_table.setSelectionMode('multiple'); var m_login_info={}; var m_mode=''; m_table.setParent(O); /* var m_menu_bar=new MLMenuBar(); var menu=m_menu_bar.addMenu('...'); var menu_item_add_label=menu.addItem('Add label...',add_label); var menu_item_remove_label=menu.addItem('Remove label...',remove_label); menu.addDivider(); var menu_item_share_with=menu.addItem('Share with...',share_with); var menu_item_unshare_with=menu.addItem('Unshare with...',unshare_with); menu.addDivider(); var menu_item_delete=menu.addItem('Delete selected studies...',delete_selected_studies); //m_menu_bar.setParent(O); */ O.div().find('#add_label').click(add_label); O.div().find('#remove_label').click(remove_label); O.div().find('#share_with').click(share_with); O.div().find('#unshare_with').click(unshare_with); O.div().find('#delete_selected_studies').click(delete_selected_studies); update_menus(); O.div().find('#create_new_study').click(create_new_study); O.div().find('#upload_study').click(upload_study); O.div().find('#create_new_workspace').click(create_new_workspace); O.div().find('#upload_workspace').click(upload_workspace); O.div().append(m_table.div()); JSQ.connect(m_table,'selected_rows_changed',O,update_menus); JSQ.connect(O,'sizeChanged',O,update_layout); function update_layout() { var W=O.width(); var H=O.height(); var H1=80; var Hmenu=60; xmarg=20; //m_menu_bar.setGeometry(xmarg,H1,W-xmarg*2,Hmenu) //m_table.setGeometry(xmarg,H1+Hmenu,W-xmarg*2,H-H1-Hmenu); } function clear() { m_studies=[]; set_alert(null); refresh(); } function set_heading(heading) { O.div().find('#heading').html(heading); } function set_alert(alert_type,message) { var elmt=O.div().find('#alert'); elmt.empty(); if (alert_type) { elmt.append(` <div class="alert alert-${alert_type}"> ${message} </div> `); } } function get_selected_document_ids_list() { var rows=m_table.selectedRows(); var ret=[]; for (var i=0; i<rows.length; i++) { ret.push(rows[i].study.document_id); } return ret; } function remove_label() { add_label2(true); } function add_label() { add_label2(false); } function add_label2(do_remove) { var DC=m_docstor_client; var ids=get_selected_document_ids_list(); if (ids.length==0) { alert('No studies selected.'); return; } var str='Add label:'; if (do_remove) str='Remove label:'; var label0=prompt(str); if (!label0) return; foreach_async(ids,function(id,cb) { DC.getDocument(id,{include_content:false},function(err,doc0) { if (err) { refresh(); set_alert('warning',err); return; } var attr0=doc0.attributes||{}; var labels0=attr0.labels||{}; var new_labels0={}; var already_contains=false; for (var label1 in labels0) { if (label1==label0) { already_contains=true; if (!do_remove) new_labels0[label1]=1; } else { new_labels0[label1]=1; } } labels0=new_labels0; if (already_contains) { if (!do_remove) { cb(); return; } } if (!do_remove) { labels0[label0]=1; } attr0.labels=labels0; m_docstor_client.setDocument(doc0._id,{attributes:attr0},function(err) { if (err) { refresh(); set_alert('warning',err); } else cb(); }); }); },function() { refresh(); }); } function share_with() { share_with2(false); } function unshare_with() { share_with2(true); } function share_with2(do_unshare) { var DC=m_docstor_client; var ids=get_selected_document_ids_list(); if (ids.length==0) { alert('No studies selected.'); return; } var str='Share with user:'; if (do_unshare) str='Unshare with user:'; var user_id0=prompt(str); if (!user_id0) return; foreach_async(ids,function(id,cb) { DC.getDocument(id,{include_content:false},function(err,doc0) { if (err) { refresh(); set_alert('warning',err); return; } var per0=doc0.permissions||{}; var users0=per0.users||[]; var new_users0=[]; var already_sharing=false; for (var i in users0) { if (users0[i].id==user_id0) { already_sharing=true; if (!do_unshare) new_users0.push(users0[i]); } else { new_users0.push(users0[i]); } } users0=new_users0; if (already_sharing) { if (!do_unshare) { cb(); return; } } if (!do_unshare) { users0.push({id:user_id0,read:true,write:true}); } per0.users=users0; m_docstor_client.setDocument(doc0._id,{permissions:per0},function(err) { if (err) { refresh(); set_alert('warning',err); } else cb(); }); }); },function() { refresh(); }); } function foreach_async(list,func,callback) { var index=0; do_next(); function do_next() { if (index>=list.length) { callback(null); return; } func(list[index],function() { index++; do_next(); }); } } function delete_selected_studies() { var rows=m_table.selectedRows(); if (rows.length==0) { alert('No studies selected'); return; } if (!confirm('Delete these '+rows.length+' studies?')) return; var ids=[]; for (var i=0; i<rows.length; i++) { ids.push(rows[i].study.document_id); } m_docstor_client.removeDocuments(ids,function(err) { if (err) { set_alert('warning','Error removing documents: '+err); refresh();upload_study return; } refresh(); }); } function upload_workspace() { upload_study('workspace'); } function try_parse_json(txt) { try { return JSON.parse(txt); } catch(err) { return null; } } function upload_study(mode) { mode=mode||'study'; var ext='.mls'; if (mode=='workspace') ext='.mlw'; var UP=new FileUploader(); UP.uploadTextFile({},function(tmp) { if (!tmp.success) { set_alert('warning',tmp.error); return; } var obj=try_parse_json(tmp.text); if (!obj) { set_alert('warning','Error parsing json'); return; } var fname=tmp.file_name; if (!jsutils.ends_with(fname,ext)) fname+=ext; var opts={ owner:m_login_info.user_id, content:JSON.stringify(obj), attributes:{title:fname} } m_docstor_client.createDocument(opts,function(err) { if (err) { set_alert('warning',err); return; } //O.emit('open_study',{study:{owner:opts.owner,title:opts.attributes.title}}); refresh(); }); }); } function create_new_workspace() { create_new_study('workspace'); } function create_new_study(mode) { mode=mode||'study'; var ext='.mls'; if (mode=='workspace') ext='.mlw'; mlutils.mlprompt('Create new '+mode,'Enter title of new '+mode+':','untitled'+ext,function(title0) { if (!jsutils.ends_with(title0,ext)) { title0+=ext; } if ((m_mode=='my_studies')||(m_mode=='my_workspaces')) { var opts={ owner:m_login_info.user_id, content:'{}', attributes:{title:title0} } m_docstor_client.createDocument(opts,function(err) { if (err) { set_alert('warning',err); return; } //O.emit('open_study',{study:{owner:opts.owner,title:opts.attributes.title}}); refresh(); }); } else { alert('Not yet implemented.'); } }); } function setMode(mode) { if (m_mode==mode) return; m_mode=mode; refresh(); } function refresh() { var mode=m_mode; set_heading(''); if (mode=='public_studies') set_alert('info','Loading public studies...'); else if (mode=='my_studies') set_alert('info','Loading studies...'); else if (mode=='studies_shared_with_me') set_alert('info','Loading studies...'); else if (mode=='public_workspaces') set_alert('info','Loading public workspaces...'); else if (mode=='my_workspaces') set_alert('info','Loading workspaces...'); else if (mode=='workspaces_shared_with_me') set_alert('info','Loading workspaces...'); O.div().find('#create_new_study').css({visibility:'hidden'}); O.div().find('#upload_study').css({visibility:'hidden'}); O.div().find('#create_new_workspace').css({visibility:'hidden'}); O.div().find('#upload_workspace').css({visibility:'hidden'}); if ((mode=='my_studies')||(mode=='on_this_browser')) { O.div().find('#create_new_study').css({visibility:''}); O.div().find('#upload_study').css({visibility:''}); } else if (mode=='my_workspaces') { O.div().find('#create_new_workspace').css({visibility:''}); O.div().find('#upload_workspace').css({visibility:''}); } else { } m_studies=[]; update_table(); var client=m_docstor_client; var obj={}; if (mode=='') { update_table(); return; } else if (mode=='public_studies') { obj={ shared_with:'[public]', filter:'*.mls label:public' }; } else if (mode=='my_studies') { obj={ owned_by:m_login_info.user_id, filter:'*.mls' }; } else if (mode=='studies_shared_with_me') { obj={ shared_with:m_login_info.user_id, filter:'*.mls' }; } else if (mode=='public_workspaces') { obj={ shared_with:'[public]', filter:'*.mlw label:public' }; } else if (mode=='my_workspaces') { obj={ owned_by:m_login_info.user_id, filter:'*.mlw' }; } else if (mode=='workspaces_shared_with_me') { obj={ shared_with:m_login_info.user_id, filter:'*.mlw' }; } else { set_alert('Unexpected mode: '+mode); return; } client.findDocuments(obj,function(err,docs) { if (mode!=m_mode) return; if (err) { set_alert('warning','Error loading documents from cloud: '+err); return; } var docs0=[]; for (var i in docs) { var doc0=docs[i]; var shared_with=[]; var users=(doc0.permissions||{}).users||[]; var labels=Object.keys((doc0.attributes||{}).labels||{}); for (var i=0; i<users.length; i++) { shared_with.push(users[i].id); } var study0={ owner:(doc0.permissions||{}).owner||'', title:(doc0.attributes||{}).title||'', document_id:doc0._id, shared_with:shared_with, labels:labels }; m_studies.push(study0); } if (mode=='public_studies') set_heading('Public studies'); else if (mode=='my_studies') set_heading('My studies'); else if (mode=='studies_shared_with_me') set_heading('Studies shared with me'); else if (mode=='public_workspaces') set_heading('Public workspaces'); else if (mode=='my_workspaces') set_heading('My workspaces'); else if (mode=='workspaces_shared_with_me') set_heading('Workspaces shared with me'); set_alert(null); update_table(); }); } function update_table() { m_table.clearRows(); m_table.setColumnCount(4); m_table.headerRow().cell(0).html('Study'); m_table.headerRow().cell(1).html('Owner'); m_table.headerRow().cell(2).html('Shared with'); m_table.headerRow().cell(3).html('Labels'); for (var i=0; i<m_studies.length; i++) { var study0=m_studies[i]; var row=create_study_row(study0) m_table.addRow(row); } update_menus(); } function update_menus() { var list=[ 'add_label','remove_label', 'share_with','unshare_with', 'delete_selected_studies' ]; for (var i in list) { O.div().find('#'+list[i]).addClass('disabled'); O.div().find('#'+list[i]).removeAttr('href'); } if (m_mode=='my_studies') { if (m_table.selectedRows().length>0) { for (var i in list) { O.div().find('#'+list[i]).removeClass('disabled'); O.div().find('#'+list[i]).attr('href','#'); } } } } function create_study_row(study0) { var row=m_table.createRow(); row.study=study0; var elmt=$('<a href=#>'+(study0.title||'[untitled]')+'</a>'); elmt.click(function() { if (jsutils.ends_with(study0.title,'.mls')) open_study(study0); else if (jsutils.ends_with(study0.title,'.mlw')) open_workspace(study0); else console.error('Unexpected file name extension: '+study0.title); }); row.cell(0).append(elmt); row.cell(1).html(study0.owner); var share_elmt=$('<span><span class="edit_button octicon octicon-pencil"></span> <span id=users></span></span>'); share_elmt.find('#users').html(study0.shared_with.join(', ')); share_elmt.find('.edit_button').click(function() { edit_sharing(study0); }); if (m_mode=='my_studies') { //keep it } else { share_elmt.find('.edit_button').remove(); } row.cell(2).append(share_elmt); var labels_elmt=$('<span></span>'); labels_elmt.html(study0.labels.join(', ')); row.cell(3).append(labels_elmt); return row; } function edit_sharing(study0) { alert('not implemented'); } function open_study(study0) { O.emit('open_study',{study:study0}); } function open_workspace(workspace0) { O.emit('open_workspace',{workspace:workspace0}); } update_layout(); refresh(); } function AdvancedConfigurationWidget(O) { O=O||this; var html=require('./altmlsoverviewwindow.html'); JSQWidget(O,$(html).find('.AdvancedConfigurationWidget').clone()); this.setMLSManager=function(manager) {setMLSManager(manager);}; this.refresh=function() {refresh();}; O.div().find('#update_configuration').click(update_configuration); O.div().find('#generate_kbucket_upload_token').click(generate_kbucket_upload_token); function refresh() { var config=m_mls_manager.mlsConfig(); for (var key in config) { var elmt=O.div().find('#'+key); if (elmt.length==1) elmt.val(config[key]); } } function setMLSManager(manager) { m_mls_manager=manager; manager.onConfigChanged(refresh); refresh(); } function update_configuration() { var config=m_mls_manager.mlsConfig(); for (var key in config) { var elmt=O.div().find('#'+key); if (elmt.length==1) config[key]=elmt.val(); } m_mls_manager.setMLSConfig(config); refresh(); mlutils.mlinfo('Configuration saved.','Configuration saved. You should now reload the page.',function() { }); } function generate_kbucket_upload_token() { mlutils.mlinfo('Not yet implemented.','Not yet implemented'); } }