axsh/wakame-vdc

View on GitHub
frontend/dcmgr_gui/public/javascripts/dcmgr_gui/volume_panel.js

Summary

Maintainability
F
1 wk
Test Coverage
DcmgrGUI.prototype.volumePanel = function(){
  var total = 0;
  var maxrow = 10;
  var page = 1;
  var list_request = { 
    "url" : DcmgrGUI.Util.getPagePath('/volumes/list/',page),
    "data" : DcmgrGUI.Util.getPagenateData(page,maxrow)
  };
    
  DcmgrGUI.List.prototype.getEmptyData = function(){
    return [{
      "uuid":'',
      "size":'',
      "backup_object_id":'',
      "created_at":'',
      "state":''
    }]
  }
  
  DcmgrGUI.Detail.prototype.getEmptyData = function(){
    return {
      "uuid" : "-",
      "size" : "-",
      "backup_object_id" : "-",
      "created_at" : "-",
      "updated_at" : "-",
      "state" : ""
    }
  }

  var c_pagenate = new DcmgrGUI.Pagenate({
    row:maxrow,
    total:total
  });
  
  var c_list = new DcmgrGUI.List({
    element_id:'#display_volumes',
    template_id:'#volumesListTemplate',
    maxrow:maxrow,
    page:page
  });
  
  var attach_button_name = $.i18n.prop('attach_button');
  var detach_button_name = $.i18n.prop('detach_button');
  var close_button_name = $.i18n.prop('close_button');
  var create_button_name = $.i18n.prop('create_button');
  var delete_button_name = $.i18n.prop('delete_button');
  var update_button_name = $.i18n.prop('update_button');
  
  c_list.setDetailTemplate({
    template_id:'#volumesDetailTemplate',
    detail_path:'/volumes/show/'
  });
  
  c_list.element.bind('dcmgrGUI.contentChange',function(event,params){
    var volume = params.data.volume;
    c_pagenate.changeTotal(volume.total);
    c_list.setData(volume.results);
    c_list.multiCheckList(c_list.detail_template);
    c_list.element.find(".edit_volume").each(function(key,value){
      $(this).button({ disabled: false });
      var uuid = $(value).attr('id').replace(/edit_(vol-[a-z0-9]+)/,'$1');
      if( uuid ){
        $(this).bind('click',function(){
          bt_edit_volume.open({"ids":[uuid]});
        });
      } else {
        $(this).button({ disabled: true });
      }
    });

    var edit_volume_buttons = {};
    edit_volume_buttons[close_button_name] = function() { $(this).dialog("close"); };
    edit_volume_buttons[update_button_name] = function(event) {
      var volume_id = $(this).find('#volume_id').val();
      var display_name = $(this).find('#volume_display_name').val();
      var data = 'display_name=' + encodeURIComponent(display_name);

      var request = new DcmgrGUI.Request;
      request.put({
        "url": '/volumes/'+ volume_id +'.json',
        "data": data,
        success: function(json, status){
          bt_refresh.element.trigger('dcmgrGUI.refresh');
        }
      });
      $(this).dialog("close");
    }

    bt_edit_volume = new DcmgrGUI.Dialog({
      target:'.edit_volume',
      width:500,
      height:200,
      title:$.i18n.prop('edit_volume_header'),
      path:'/edit_volume',
      button: edit_volume_buttons,
      callback: function(){
        var params = { 'button': bt_edit_volume, 'element_id': 1 };
        $(this).find('#volume_display_name').bind('paste', params, DcmgrGUI.Util.availableTextField);
        $(this).find('#volume_display_name').bind('cut', params, DcmgrGUI.Util.availableTextField);
        $(this).find('#volume_display_name').bind('keyup', params, DcmgrGUI.Util.availableTextField);
      }
    });
  });
  
  c_list.filter.add(function(data){
    var results = data.volume.results;
    var size = results.length;
    for(var i = 0; i < size; i++) {
      results[i].result.created_at = DcmgrGUI.date.parseISO8601(results[i].result.created_at);
      results[i].result.created_at = DcmgrGUI.date.setTimezone(results[i].result.created_at, dcmgrGUI.getConfig('time_zone'));
      results[i].result.created_at = DcmgrGUI.date.getI18n(results[i].result.created_at);
    }
    return data;
  });

  var bt_refresh  = new DcmgrGUI.Refresh();
  
  var create_volume_buttons = {};
  create_volume_buttons[close_button_name] = function() { $(this).dialog("close"); };
  create_volume_buttons[create_button_name] = function() {
    var display_name = $(this).find('#display_name').val();
    var volume_size = $(this).find('#volume_size').val();
    var unit = $(this).find('#unit').find('option:selected').val();
    if(!volume_size){
     $('#volume_size').focus();
     return false;
    }
    var data = "size="+volume_size+"&unit="+unit+"&display_name="+encodeURIComponent(display_name);

    var request = new DcmgrGUI.Request;
    request.post({
      "url": '/volumes',
      "data": data,
      success: function(json,status){
        bt_refresh.element.trigger('dcmgrGUI.refresh');
      }
    });
    $(this).dialog("close");
  }

  var bt_create_volume = new DcmgrGUI.Dialog({
    target:'.create_volume',
    width:400,
    height:200,
    title:$.i18n.prop('create_volume_header'),
    path:'/create_volume',
    callback: function(){
      var self = this;
      var loading_image = DcmgrGUI.Util.getLoadingImage('boxes');
      $(this).find('#select_storage_node').empty().html(loading_image);
      
      var request = new DcmgrGUI.Request;
      var is_ready = {
        'display_name': false,
        'volume_size': false
      }

      var ready = function(data) {
        if(data['display_name'] == true &&
           data['volume_size'] == true) {
          bt_create_volume.disabledButton(1, false);
        } else {
          bt_create_volume.disabledButton(1, true);
        }
      }

      var display_name_params = {'name': 'display_name', 'is_ready': is_ready, 'ready': ready};
      $(this).find('#display_name').bind('keyup', display_name_params, DcmgrGUI.Util.checkTextField);
      $(this).find('#display_name').bind('paste', display_name_params, DcmgrGUI.Util.checkTextField);
      $(this).find('#display_name').bind('cut', display_name_params, DcmgrGUI.Util.checkTextField);

      var volume_size_params = {'name': 'volume_size', 'is_ready': is_ready, 'ready': ready};
      $(this).find('#volume_size').bind('keyup', volume_size_params, DcmgrGUI.Util.checkTextField);
      $(this).find('#volume_size').bind('paste', volume_size_params, DcmgrGUI.Util.checkTextField);
      $(this).find('#volume_size').bind('cut', volume_size_params, DcmgrGUI.Util.checkTextField);

      request.get({
        "url": '/storage_nodes/show_storage_nodes.json',
        success: function(json,status){
          var select_html = '<select id="storage_node" name="storage_node"></select>';
          $(self).find('#select_storage_node').empty().html(select_html);
          var results = json.storage_node.results;
          var size = results.length;
          var select_storage_node = $(self).find('#storage_node');
          for (var i=0; i < size ; i++) {
            var uuid = results[i].result.uuid;
            var html = '<option value="'+ uuid +'">'+uuid+'</option>';
            select_storage_node.append(html);
          }

          var params = { 'button': bt_create_volume, 'element_id': 1 };
        }
      });
    },
    button: create_volume_buttons
  });
  
  var delete_volume_buttons = {};
  delete_volume_buttons[close_button_name] = function() { $(this).dialog("close"); };
  delete_volume_buttons[delete_button_name] = function() { 
    var delete_volumes = $(this).find('#volumes').find('td.volume_id');
    var ids = []
    $.each(delete_volumes,function(){
     ids.push($(this).text())
    })

    var data = $.param({ids:ids});
    
    var request = new DcmgrGUI.Request;
    request.del({
      "url": '/volumes',
      "data": data,
      success: function(json,status){
        bt_delete_volume.disableDialogButton();
        bt_refresh.element.trigger('dcmgrGUI.refresh');
      }
    });
    
    $(this).dialog("close");
  }
  
  var bt_delete_volume = new DcmgrGUI.Dialog({
    target:'.delete_volume',
    width:400,
    height:250,
    title:$.i18n.prop('delete_volume_header'),
    path:'/delete_volume',
    button: delete_volume_buttons
  });
  
  var create_backup_buttons = {};
  create_backup_buttons[close_button_name] = function() { $(this).dialog("close"); }; 
  create_backup_buttons[create_button_name] = function() {
    var display_name = $(this).find('#backup_display_name').val();
    var volume_backups = $(this).find('#backups').find('td.volume_id');
    var destination = $(this).find('#destination').val();
    var ids = []
    $.each(volume_backups,function(){
     ids.push($(this).text())
    })

    var data = $.param({ids:ids, destination:destination, display_name:display_name});
    var request = new DcmgrGUI.Request;
    request.put({
      "url": '/volumes/backup',
      "data": data,
      success: function(json,status){
        bt_refresh.element.trigger('dcmgrGUI.refresh');
      }
    });
    
    $(this).dialog("close");
  }
  
  var bt_create_backup = new DcmgrGUI.Dialog({
    target:'.create_backup',
    width:400,
    height:250,
    title:$.i18n.prop('create_backup_header'),
    path:'/create_backup',
    button: create_backup_buttons,
    callback: function() {
      var self = this;
      var params = { 'button': bt_create_backup, 'element_id': 1 };
      $(self).find("#backup_display_name").bind('paste', params, DcmgrGUI.Util.availableTextField)
      $(self).find("#backup_display_name").bind('cut', params, DcmgrGUI.Util.availableTextField)
      $(self).find("#backup_display_name").bind('keyup', params, DcmgrGUI.Util.availableTextField)
    }
  });
  
  attach_volume_buttons = {};
  attach_volume_buttons[close_button_name] = function() { $(this).dialog("close"); };
  attach_volume_buttons[attach_button_name] = function() {
    var attach_volumes = $(this).find('#volumes').find('td.volume_id');
    var volume_ids = []
    $.each(attach_volumes,function(){
     volume_ids.push($(this).text())
    })  

    var instance_id = $(this).find('#instance_id').val();
    var data = $.param({'instance_id': instance_id, volume_ids: volume_ids})
    var request = new DcmgrGUI.Request;

    request.put({
      "url": '/volumes/attach',
      "data": data,
      success: function(json,status){
        bt_refresh.element.trigger('dcmgrGUI.refresh');
      }
    });
    
    $(this).dialog("close");
  }
  
  var bt_attach_volume = new DcmgrGUI.Dialog({
    target:'.attach_volume',
    width:400,
    height:200,
    title:$.i18n.prop('attach_volume_header'),
    path:'/attach_volume',
    callback: function() {
      var params = { 'button': bt_attach_volume, 'element_id': 1 };
      $(this).find('#instance_id').bind('paste', params, DcmgrGUI.Util.availableTextField);
      $(this).find('#instance_id').bind('keyup', params, DcmgrGUI.Util.availableTextField);
    },
    button: attach_volume_buttons
  });
  
  detach_volume_buttons = {}
  detach_volume_buttons[close_button_name] = function() { $(this).dialog("close"); };
  detach_volume_buttons[detach_button_name] = function() { 
    var detach_volumes = $(this).find('#volumes').find('td.volume_id');
    var ids = []
    $.each(detach_volumes,function(){
     ids.push($(this).text())
    })

    var data = $.param({ids:ids});
    
    var request = new DcmgrGUI.Request;
    request.put({
      "url": '/volumes/detach',
      "data": data,
      success: function(json,status){
        bt_refresh.element.trigger('dcmgrGUI.refresh');
      }
    });
    
    $(this).dialog("close");
  }
  
  var bt_detach_volume = new DcmgrGUI.Dialog({
    target:'.detach_volume',
    width:400,
    height:200,
    title:$.i18n.prop('detach_volume_header'),
    path:'/detach_volume',
    button: detach_volume_buttons
  });
  
  bt_create_volume.target.bind('click',function(){
    bt_create_volume.open();
    bt_create_volume.disabledButton(1, true);
  });
  
  bt_delete_volume.target.bind('click',function(){
    if(!bt_delete_volume.is_disabled()) {
      bt_delete_volume.open(c_list.getCheckedInstanceIds());
    }
  });

  bt_create_backup.target.bind('click',function(){
    if(!bt_create_backup.is_disabled()) { 
      bt_create_backup.open(c_list.getCheckedInstanceIds());
      bt_create_backup.disabledButton(1, true);
    }
  });

  bt_refresh.element.bind('dcmgrGUI.refresh',function(){
    c_list.page = c_pagenate.current_page;
    list_request.url = DcmgrGUI.Util.getPagePath('/volumes/list/',c_list.page);
    list_request.data = DcmgrGUI.Util.getPagenateData(c_pagenate.start,c_pagenate.row);
    c_list.element.trigger('dcmgrGUI.updateList',{request:list_request})
    
    //update detail
    $.each(c_list.checked_list,function(check_id,obj){
      $($('#detail').find('#'+check_id)).remove();
      c_list.checked_list[check_id].c_detail.update({
        url:DcmgrGUI.Util.getPagePath('/volumes/show/',check_id)
      },true);
    });
  });
  
  c_pagenate.element.bind('dcmgrGUI.updatePagenate',function(){
    c_list.clearCheckedList();
    $('#detail').html('');
    bt_refresh.element.trigger('dcmgrGUI.refresh');
  });

  var selectmenu = $('#volume_action').selectmenu({
    width: 150,
    menuWidth: 150,
    handleWidth: 26,
    style:'dropdown',
    select: function(event){
      var select_action = $(this).val()
      if (select_action == "attach_volume") {
        var is_attached = false;
        var flag = true;
        $.each(c_list.getCheckedInstanceIds(), function(key, uuid){
          var row_id = '#row-'+uuid;
          var state = $(row_id).find('.state').text();
          if(state == 'available' && state != 'attached') {
            is_attached = true;
          } else {
            flag = false;
          }
        });

        if(is_attached == true && flag == true) {
          bt_attach_volume.open(c_list.getCheckedInstanceIds());
          bt_attach_volume.disabledButton(1, true);
        }
      }else if(select_action == "detach_volume") {
        var is_detached = false;
        var flag = true;
        $.each(c_list.getCheckedInstanceIds(), function(key, uuid){
          var row_id = '#row-'+uuid;
          var state = $(row_id).find('.state').text();
          if(state == 'attached') {
            is_detached = true;
          } else {
            flag = false;
          }
        });
        
        if(is_detached == true && flag == true) {
          bt_detach_volume.open(c_list.getCheckedInstanceIds());
        }
      }
    }
  });
 
  selectmenu.data('selectmenu').disableButton();
  $(bt_create_volume.target).button({ disabled: false });
  $(bt_delete_volume.target).button({ disabled: true });
  $(bt_create_backup.target).button({ disabled: true });
  $(bt_refresh.target).button({ disabled: false });
  
  var actions = {};
  actions.changeButtonState = function() {
    var ids = c_list.currentMultiChecked()['ids'];
    var is_available = false;
    var is_attached = false;
    var is_deleting = false;
    var flag = true;

    $.each(ids, function(key, uuid){
      var row_id = '#row-'+uuid;
      var state = $(row_id).find('.state').text();
      if(state == 'available') {
        is_available = true;
      } else if(state == 'attached') {
        is_attached = true;
      } else if(state == 'deleting') {
        is_deleting = true;
      } else{
        flag = false;
      }
    });

    if (flag == true){

      if(is_available == true && is_attached == true) {
        bt_delete_volume.enableDialogButton();
        bt_create_backup.enableDialogButton();
        selectmenu.data('selectmenu').disableButton();
      }
 
      if(is_available == false && is_attached == true) {
        bt_delete_volume.disableDialogButton();
        bt_create_backup.disableDialogButton();
        selectmenu.data('selectmenu').enableButton();
      }
      
      if(is_available == true && is_attached == false) {
        bt_delete_volume.enableDialogButton();
        bt_create_backup.enableDialogButton();
        selectmenu.data('selectmenu').enableButton();
      }
      
      if (is_available == false && is_attached == false) {
        bt_delete_volume.disableDialogButton();
        bt_create_backup.disableDialogButton();
        selectmenu.data('selectmenu').disableButton();
      }

      if (is_deleting == true) {
        bt_delete_volume.enableDialogButton();
      }

    } else{
      bt_delete_volume.disableDialogButton();
      bt_create_backup.disableDialogButton();
      selectmenu.data('selectmenu').disableButton();
    }
  }
  
  dcmgrGUI.notification.subscribe('checked_box', actions, 'changeButtonState');
  dcmgrGUI.notification.subscribe('unchecked_box', actions, 'changeButtonState');
  dcmgrGUI.notification.subscribe('change_pagenate', bt_delete_volume, 'disableDialogButton');
  dcmgrGUI.notification.subscribe('change_pagenate', bt_create_backup, 'disableDialogButton');
  dcmgrGUI.notification.subscribe('change_pagenate', selectmenu.data('selectmenu'), 'disableButton');
  
  //list
  c_list.setData(null);
  c_list.update(list_request,true);  
}