mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	CLOUDSTACK-10129: UX improvements and event timeline
- Fixes timezone issue where dates show up as nvalid in UI - Introduces new event timeline listing/filtering of events - Several UI improvements to add columns in list views - Bulk operations support in instance list view to shutdown and destroy multiple-selected VMs (limitation: after operation, redundant entries may show up in the list view, refreshing VM list view fixes that) - Align table thead/tbody to avoid splitting of tables Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
		
							parent
							
								
									d0005d8353
								
							
						
					
					
						commit
						0102e8593d
					
				| @ -205,6 +205,7 @@ public class ApiConstants { | ||||
|     public static final String OUTOFBANDMANAGEMENT_POWERSTATE = "outofbandmanagementpowerstate"; | ||||
|     public static final String OUTOFBANDMANAGEMENT_ENABLED = "outofbandmanagementenabled"; | ||||
|     public static final String PARAMS = "params"; | ||||
|     public static final String PARENT_ID = "parentid"; | ||||
|     public static final String PARENT_DOMAIN_ID = "parentdomainid"; | ||||
|     public static final String PASSWORD = "password"; | ||||
|     public static final String SHOULD_UPDATE_PASSWORD = "update_passwd_on_host"; | ||||
| @ -274,6 +275,7 @@ public class ApiConstants { | ||||
|     public static final String SNAPSHOT_QUIESCEVM = "quiescevm"; | ||||
|     public static final String SOURCE_ZONE_ID = "sourcezoneid"; | ||||
|     public static final String START_DATE = "startdate"; | ||||
|     public static final String START_ID = "startid"; | ||||
|     public static final String START_IP = "startip"; | ||||
|     public static final String START_IPV6 = "startipv6"; | ||||
|     public static final String START_PORT = "startport"; | ||||
|  | ||||
| @ -65,6 +65,9 @@ public class ListEventsCmd extends BaseListProjectAndAccountResourcesCmd { | ||||
|     @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "the event type (see event types)") | ||||
|     private String type; | ||||
| 
 | ||||
|     @Parameter(name = ApiConstants.START_ID, type = CommandType.UUID, entityType = EventResponse.class, description = "the parent/start ID of the event, when provided this will list all the events with the start/parent ID including the parent event") | ||||
|     private Long startId; | ||||
| 
 | ||||
|     ///////////////////////////////////////////////////// | ||||
|     /////////////////// Accessors /////////////////////// | ||||
|     ///////////////////////////////////////////////////// | ||||
| @ -97,6 +100,10 @@ public class ListEventsCmd extends BaseListProjectAndAccountResourcesCmd { | ||||
|         return type; | ||||
|     } | ||||
| 
 | ||||
|     public Long getStartId() { | ||||
|         return startId; | ||||
|     } | ||||
| 
 | ||||
|     ///////////////////////////////////////////////////// | ||||
|     /////////////// API Implementation/////////////////// | ||||
|     ///////////////////////////////////////////////////// | ||||
|  | ||||
| @ -78,7 +78,7 @@ public class EventResponse extends BaseResponse implements ControlledViewEntityR | ||||
|     @Param(description = "the state of the event") | ||||
|     private Event.State state; | ||||
| 
 | ||||
|     @SerializedName("parentid") | ||||
|     @SerializedName(ApiConstants.PARENT_ID) | ||||
|     @Param(description = "whether the event is parented") | ||||
|     private String parentId; | ||||
| 
 | ||||
|  | ||||
| @ -33,6 +33,7 @@ import org.apache.cloudstack.api.InternalIdentity; | ||||
| 
 | ||||
| import com.cloud.utils.db.Encrypt; | ||||
| import com.cloud.utils.db.GenericDao; | ||||
| import com.google.common.base.Strings; | ||||
| 
 | ||||
| @Entity | ||||
| @Table(name = "user") | ||||
| @ -257,6 +258,9 @@ public class UserAccountVO implements UserAccount, InternalIdentity { | ||||
| 
 | ||||
|     @Override | ||||
|     public String getTimezone() { | ||||
|         if (Strings.isNullOrEmpty(timezone)) { | ||||
|             return "UTC"; | ||||
|         } | ||||
|         return timezone; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -34,6 +34,7 @@ import org.apache.cloudstack.api.InternalIdentity; | ||||
| import com.cloud.user.Account.State; | ||||
| import com.cloud.utils.db.Encrypt; | ||||
| import com.cloud.utils.db.GenericDao; | ||||
| import com.google.common.base.Strings; | ||||
| 
 | ||||
| /** | ||||
|  * A bean representing a user | ||||
| @ -233,6 +234,9 @@ public class UserVO implements User, Identity, InternalIdentity { | ||||
| 
 | ||||
|     @Override | ||||
|     public String getTimezone() { | ||||
|         if (Strings.isNullOrEmpty(timezone)) { | ||||
|             return "UTC"; | ||||
|         } | ||||
|         return timezone; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -520,6 +520,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q | ||||
|         String keyword = cmd.getKeyword(); | ||||
|         Integer entryTime = cmd.getEntryTime(); | ||||
|         Integer duration = cmd.getDuration(); | ||||
|         Long startId = cmd.getStartId(); | ||||
| 
 | ||||
|         Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean, ListProjectResourcesCriteria>( | ||||
|                 cmd.getDomainId(), cmd.isRecursive(), null); | ||||
| @ -542,7 +543,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q | ||||
|         sb.and("createDateG", sb.entity().getCreateDate(), SearchCriteria.Op.GTEQ); | ||||
|         sb.and("createDateL", sb.entity().getCreateDate(), SearchCriteria.Op.LTEQ); | ||||
|         sb.and("state", sb.entity().getState(), SearchCriteria.Op.NEQ); | ||||
|         sb.and("startId", sb.entity().getStartId(), SearchCriteria.Op.EQ); | ||||
|         sb.or("startId", sb.entity().getStartId(), SearchCriteria.Op.EQ); | ||||
|         sb.and("createDate", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); | ||||
|         sb.and("displayEvent", sb.entity().getDisplay(), SearchCriteria.Op.EQ); | ||||
|         sb.and("archived", sb.entity().getArchived(), SearchCriteria.Op.EQ); | ||||
| @ -561,6 +562,13 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q | ||||
|             sc.setParameters("id", id); | ||||
|         } | ||||
| 
 | ||||
|         if (startId != null) { | ||||
|             sc.setParameters("startId", startId); | ||||
|             if (id == null) { | ||||
|                 sc.setParameters("id", startId); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (keyword != null) { | ||||
|             SearchCriteria<EventJoinVO> ssc = _eventJoinDao.createSearchCriteria(); | ||||
|             ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); | ||||
|  | ||||
| @ -96,7 +96,7 @@ a:hover { | ||||
| 
 | ||||
| /*Table*/ | ||||
| table { | ||||
|   width: 940px; | ||||
|   width: 955px; | ||||
|   max-width: 977px; | ||||
|   margin: 15px 15px 12px 12px; | ||||
|   font-size: 13px; | ||||
| @ -1307,7 +1307,6 @@ div.panel div.list-view { | ||||
| 
 | ||||
| div.panel div.list-view div.data-table table { | ||||
|   width: 955px; | ||||
|   margin-top: 44px; | ||||
| } | ||||
| 
 | ||||
| .detail-view div.list-view div.data-table table { | ||||
|  | ||||
| @ -558,6 +558,7 @@ var dictionary = {"ICMP.code":"ICMP Code", | ||||
| "label.console.proxy.vm":"Console Proxy VM", | ||||
| "label.continue":"Continue", | ||||
| "label.continue.basic.install":"Continue with basic installation", | ||||
| "label.control.ip":"Control IP", | ||||
| "label.copying.iso":"Copying ISO", | ||||
| "label.corrections.saved":"Corrections saved", | ||||
| "label.counter":"Counter", | ||||
| @ -751,6 +752,7 @@ var dictionary = {"ICMP.code":"ICMP Code", | ||||
| "label.event":"Event", | ||||
| "label.event.archived":"Event Archived", | ||||
| "label.event.deleted":"Event Deleted", | ||||
| "label.event.timeline":"Event Timeline", | ||||
| "label.every":"Every", | ||||
| "label.example":"Example", | ||||
| "label.expunge":"Expunge", | ||||
| @ -995,6 +997,7 @@ var dictionary = {"ICMP.code":"ICMP Code", | ||||
| "label.manage":"Manage", | ||||
| "label.manage.resources":"Manage Resources", | ||||
| "label.managed":"Managed", | ||||
| "label.managed.state":"Managed State", | ||||
| "label.management":"Management", | ||||
| "label.management.ips":"Management IP Addresses", | ||||
| "label.management.server":"Management Server", | ||||
|  | ||||
| @ -46,12 +46,12 @@ | ||||
|                             label: 'label.type', | ||||
|                             truncate: true | ||||
|                         }, | ||||
|                         domain: { | ||||
|                             label: 'label.domain' | ||||
|                         }, | ||||
|                         account: { | ||||
|                             label: 'label.account' | ||||
|                         }, | ||||
|                         domain: { | ||||
|                             label: 'label.domain' | ||||
|                         }, | ||||
|                         created: { | ||||
|                             label: 'label.date', | ||||
|                             converter: cloudStack.converters.toLocalDate | ||||
| @ -338,6 +338,14 @@ | ||||
|                         var data = {}; | ||||
|                         listViewDataProvider(args, data); | ||||
| 
 | ||||
|                         if ("events" in args.context) { | ||||
|                             var startId = args.context.events[0].parentid; | ||||
|                             if (!startId) { | ||||
|                                 startId = args.context.events[0].id; | ||||
|                             } | ||||
|                             data.startid = startId; | ||||
|                         } | ||||
| 
 | ||||
|                         $.ajax({ | ||||
|                             url: createURL('listEvents'), | ||||
|                             data: data, | ||||
| @ -357,8 +365,12 @@ | ||||
|                     }, | ||||
|                     detailView: { | ||||
|                         name: 'label.details', | ||||
|                         actions: { | ||||
|                         viewAll: { | ||||
|                             path: 'events', | ||||
|                             label: 'label.event.timeline', | ||||
|                         }, | ||||
| 
 | ||||
|                         actions: { | ||||
|                             // Remove single event
 | ||||
|                             remove: { | ||||
|                                 label: 'label.delete', | ||||
|  | ||||
| @ -17,6 +17,153 @@ | ||||
| (function($, cloudStack) { | ||||
|     var vmMigrationHostObjs, ostypeObjs; | ||||
| 
 | ||||
|     var vmStopAction = function(args) { | ||||
|         var action = { | ||||
|             messages: { | ||||
|                 confirm: function(args) { | ||||
|                     return 'message.action.stop.instance'; | ||||
|                 }, | ||||
|                 notification: function(args) { | ||||
|                     return 'label.action.stop.instance'; | ||||
|                 } | ||||
|             }, | ||||
|             label: 'label.action.stop.instance', | ||||
|             compactLabel: 'label.stop', | ||||
|             addRow: 'false', | ||||
|             createForm: { | ||||
|                 title: 'notification.stop.instance', | ||||
|                 desc: 'message.action.stop.instance', | ||||
|                 fields: { | ||||
|                     forced: { | ||||
|                         label: 'force.stop', | ||||
|                         isBoolean: true, | ||||
|                         isChecked: false | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             action: function(args) { | ||||
|                 var instances = args.context.instances; | ||||
|                 $(instances).map(function(index, instance) { | ||||
|                     var data = { | ||||
|                         id: instance.id, | ||||
|                         forced: (args.data.forced == "on") | ||||
|                     }; | ||||
|                     $.ajax({ | ||||
|                         url: createURL("stopVirtualMachine"), | ||||
|                         data: data, | ||||
|                         dataType: "json", | ||||
|                         success: function(json) { | ||||
|                             var jid = json.stopvirtualmachineresponse.jobid; | ||||
|                             args.response.success({ | ||||
|                                 _custom: { | ||||
|                                     jobId: jid, | ||||
|                                     getUpdatedItem: function(json) { | ||||
|                                         return $.extend(json.queryasyncjobresultresponse.jobresult.virtualmachine, { hostid: null }); | ||||
|                                     }, | ||||
|                                     getActionFilter: function() { | ||||
|                                         return vmActionfilter; | ||||
|                                     } | ||||
|                                 } | ||||
|                             }); | ||||
|                         }, | ||||
|                         error: function(json) { | ||||
|                             args.response.error(parseXMLHttpResponse(json)); | ||||
|                         } | ||||
|                     }); | ||||
|                 }); | ||||
|             }, | ||||
|             notification: { | ||||
|                 poll: pollAsyncJobResult | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
| 
 | ||||
|         if (args && args.listView) { | ||||
|             $.extend(action, { | ||||
|                 isHeader: true, | ||||
|                 isMultiSelectAction: true | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|         return action; | ||||
|     }; | ||||
| 
 | ||||
|     var vmDestroyAction = function(args) { | ||||
|         var action = { | ||||
|             messages: { | ||||
|                 notification: function(args) { | ||||
|                     return 'label.action.destroy.instance'; | ||||
|                 } | ||||
|             }, | ||||
|             label: 'label.action.destroy.instance', | ||||
|             compactLabel: 'label.destroy', | ||||
|             addRow: 'false', | ||||
|             createForm: { | ||||
|                 title: 'label.action.destroy.instance', | ||||
|                 desc: 'label.action.destroy.instance', | ||||
|                 isWarning: true, | ||||
|                 preFilter: function(args) { | ||||
|                     if (! g_allowUserExpungeRecoverVm) { | ||||
|                         args.$form.find('.form-item[rel=expunge]').hide(); | ||||
|                     } | ||||
|                 }, | ||||
|                 fields: { | ||||
|                     expunge: { | ||||
|                         label: 'label.expunge', | ||||
|                         isBoolean: true, | ||||
|                         isChecked: false | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             action: function(args) { | ||||
|                 var instances = args.context.instances; | ||||
|                 $(instances).map(function(index, instance) { | ||||
|                     var data = { | ||||
|                         id: instance.id | ||||
|                     }; | ||||
|                     if (args.data.expunge == 'on') { | ||||
|                         $.extend(data, { | ||||
|                             expunge: true | ||||
|                         }); | ||||
|                     } | ||||
|                     $.ajax({ | ||||
|                         url: createURL('destroyVirtualMachine'), | ||||
|                         data: data, | ||||
|                         success: function(json) { | ||||
|                             var jid = json.destroyvirtualmachineresponse.jobid; | ||||
|                             args.response.success({ | ||||
|                                 _custom: { | ||||
|                                     jobId: jid, | ||||
|                                     getUpdatedItem: function(json) { | ||||
|                                         if ('virtualmachine' in json.queryasyncjobresultresponse.jobresult) //destroy without expunge
 | ||||
|                                             return json.queryasyncjobresultresponse.jobresult.virtualmachine; | ||||
|                                         else //destroy with expunge
 | ||||
|                                             return { 'toRemove': true }; | ||||
|                                     }, | ||||
|                                     getActionFilter: function() { | ||||
|                                         return vmActionfilter; | ||||
|                                     } | ||||
|                                 } | ||||
|                             }); | ||||
|                         } | ||||
|                     }); | ||||
|                 }); | ||||
|             }, | ||||
|             notification: { | ||||
|                 poll: pollAsyncJobResult | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         if (args && args.listView) { | ||||
|             $.extend(action, { | ||||
|                 isHeader: true, | ||||
|                 isMultiSelectAction: true | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|         return action; | ||||
|     }; | ||||
| 
 | ||||
|     var vmSnapshotAction = function(args) { | ||||
|         var action = { | ||||
|             messages: { | ||||
| @ -162,6 +309,7 @@ | ||||
|                 var hiddenFields = []; | ||||
|                 if (!isAdmin()) { | ||||
|                     hiddenFields.push('instancename'); | ||||
|                     hiddenFields.push('account'); | ||||
|                 } | ||||
|                 return hiddenFields; | ||||
|             }, | ||||
| @ -180,16 +328,26 @@ | ||||
|                 ipaddress: { | ||||
|                     label: 'label.ip.address' | ||||
|                 }, | ||||
|                 account: { | ||||
|                     label: 'label.account' | ||||
|                 }, | ||||
|                 zonename: { | ||||
|                     label: 'label.zone.name' | ||||
|                 }, | ||||
|                 state: { | ||||
|                     label: 'label.state', | ||||
|                     label: 'label.metrics.state', | ||||
|                     converter: function (str) { | ||||
|                         // For localization
 | ||||
|                         return str; | ||||
|                     }, | ||||
|                     indicator: { | ||||
|                         'Running': 'on', | ||||
|                         'Stopped': 'off', | ||||
|                         'Error': 'off', | ||||
|                         'Destroyed': 'off', | ||||
|                         'Error': 'off' | ||||
|                         'Expunging': 'off', | ||||
|                         'Stopping': 'warning', | ||||
|                         'Shutdowned': 'warning' | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
| @ -304,6 +462,8 @@ | ||||
|                         poll: pollAsyncJobResult | ||||
|                     } | ||||
|                 }, | ||||
|                 stop: vmStopAction({ listView: true}), | ||||
|                 destroy: vmDestroyAction({ listView: true }), | ||||
|                 snapshot: vmSnapshotAction({ listView: true }), | ||||
|                 viewMetrics: { | ||||
|                     label: 'label.metrics', | ||||
| @ -683,55 +843,7 @@ | ||||
|                             poll: pollAsyncJobResult | ||||
|                         } | ||||
|                     }, | ||||
|                     stop: { | ||||
|                         label: 'label.action.stop.instance', | ||||
|                         compactLabel: 'label.stop', | ||||
|                         createForm: { | ||||
|                             title: 'notification.stop.instance', | ||||
|                             desc: 'message.action.stop.instance', | ||||
|                             fields: { | ||||
|                                 forced: { | ||||
|                                     label: 'force.stop', | ||||
|                                     isBoolean: true, | ||||
|                                     isChecked: false | ||||
|                                 } | ||||
|                             } | ||||
|                         }, | ||||
|                         action: function(args) { | ||||
|                             var array1 = []; | ||||
|                             array1.push("&forced=" + (args.data.forced == "on")); | ||||
|                             $.ajax({ | ||||
|                                 url: createURL("stopVirtualMachine&id=" + args.context.instances[0].id + array1.join("")), | ||||
|                                 dataType: "json", | ||||
|                                 async: true, | ||||
|                                 success: function(json) { | ||||
|                                     var jid = json.stopvirtualmachineresponse.jobid; | ||||
|                                     args.response.success({ | ||||
|                                         _custom: { | ||||
|                                             jobId: jid, | ||||
|                                             getUpdatedItem: function(json) { | ||||
|                                                 return $.extend(json.queryasyncjobresultresponse.jobresult.virtualmachine, { hostid: null }); | ||||
|                                             }, | ||||
|                                             getActionFilter: function() { | ||||
|                                                 return vmActionfilter; | ||||
|                                             } | ||||
|                                         } | ||||
|                                     }); | ||||
|                                 } | ||||
|                             }); | ||||
|                         }, | ||||
|                         messages: { | ||||
|                             confirm: function(args) { | ||||
|                                 return 'message.action.stop.instance'; | ||||
|                             }, | ||||
|                             notification: function(args) { | ||||
|                                 return 'label.action.stop.instance'; | ||||
|                             } | ||||
|                         }, | ||||
|                         notification: { | ||||
|                             poll: pollAsyncJobResult | ||||
|                         } | ||||
|                     }, | ||||
|                     stop: vmStopAction(), | ||||
|                     restart: { | ||||
|                         label: 'label.action.reboot.instance', | ||||
|                         compactLabel: 'label.reboot', | ||||
| @ -775,66 +887,7 @@ | ||||
|                         } | ||||
|                     }, | ||||
|                     snapshot: vmSnapshotAction(), | ||||
|                     destroy: { | ||||
|                         label: 'label.action.destroy.instance', | ||||
|                         compactLabel: 'label.destroy', | ||||
|                         createForm: { | ||||
|                             title: 'label.action.destroy.instance', | ||||
|                             desc: 'label.action.destroy.instance', | ||||
|                             isWarning: true, | ||||
|                             preFilter: function(args) { | ||||
|                                 if (! g_allowUserExpungeRecoverVm) { | ||||
|                                     args.$form.find('.form-item[rel=expunge]').hide(); | ||||
|                                 } | ||||
|                             }, | ||||
|                             fields: { | ||||
|                                 expunge: { | ||||
|                                     label: 'label.expunge', | ||||
|                                     isBoolean: true, | ||||
|                                     isChecked: false | ||||
|                                 } | ||||
|                             } | ||||
|                         }, | ||||
|                         messages: { | ||||
|                             notification: function(args) { | ||||
|                                 return 'label.action.destroy.instance'; | ||||
|                             } | ||||
|                         }, | ||||
|                         action: function(args) { | ||||
|                             var data = { | ||||
|                                 id: args.context.instances[0].id | ||||
|                             }; | ||||
|                             if (args.data.expunge == 'on') { | ||||
|                                 $.extend(data, { | ||||
|                                     expunge: true | ||||
|                                 }); | ||||
|                             } | ||||
|                             $.ajax({ | ||||
|                                 url: createURL('destroyVirtualMachine'), | ||||
|                                 data: data, | ||||
|                                 success: function(json) { | ||||
|                                     var jid = json.destroyvirtualmachineresponse.jobid; | ||||
|                                     args.response.success({ | ||||
|                                         _custom: { | ||||
|                                             jobId: jid, | ||||
|                                             getUpdatedItem: function(json) { | ||||
|                                                 if ('virtualmachine' in json.queryasyncjobresultresponse.jobresult) //destroy without expunge
 | ||||
|                                                     return json.queryasyncjobresultresponse.jobresult.virtualmachine; | ||||
|                                                 else //destroy with expunge
 | ||||
|                                                     return { 'toRemove': true }; | ||||
|                                             }, | ||||
|                                             getActionFilter: function() { | ||||
|                                                 return vmActionfilter; | ||||
|                                             } | ||||
|                                         } | ||||
|                                     }); | ||||
|                                 } | ||||
|                             }); | ||||
|                         }, | ||||
|                         notification: { | ||||
|                             poll: pollAsyncJobResult | ||||
|                         } | ||||
|                     }, | ||||
|                     destroy: vmDestroyAction(), | ||||
|                     expunge: { | ||||
|                         label: 'label.action.expunge.instance', | ||||
|                         compactLabel: 'label.expunge', | ||||
|  | ||||
| @ -293,8 +293,6 @@ | ||||
|                         'Disconnected': 'off', | ||||
|                         'Removed': 'off', | ||||
|                         'Error': 'off', | ||||
|                         'Connecting': 'transition', | ||||
|                         'Rebalancing': 'transition', | ||||
|                         'Alert': 'warning' | ||||
|                     }, | ||||
|                     compact: true | ||||
| @ -448,9 +446,7 @@ | ||||
|                         'Error': 'off', | ||||
|                         'Destroyed': 'off', | ||||
|                         'Expunging': 'off', | ||||
|                         'Stopping': 'transition', | ||||
|                         'Starting': 'transition', | ||||
|                         'Migrating': 'transition', | ||||
|                         'Stopping': 'warning', | ||||
|                         'Shutdowned': 'warning' | ||||
|                     }, | ||||
|                     compact: true | ||||
| @ -560,13 +556,12 @@ | ||||
|                         return str; | ||||
|                     }, | ||||
|                     indicator: { | ||||
|                         'Allocated': 'transition', | ||||
|                         'Creating': 'transition', | ||||
|                         'Allocated': 'on', | ||||
|                         'Ready': 'on', | ||||
|                         'Destroy': 'off', | ||||
|                         'Expunging': 'off', | ||||
|                         'Migrating': 'warning', | ||||
|                         'UploadOp': 'transition', | ||||
|                         'UploadOp': 'warning', | ||||
|                         'Snapshotting': 'warning', | ||||
|                     }, | ||||
|                     compact: true | ||||
| @ -651,7 +646,7 @@ | ||||
|                                 'Down': 'off', | ||||
|                                 'Removed': 'off', | ||||
|                                 'ErrorInMaintenance': 'off', | ||||
|                                 'PrepareForMaintenance': 'transition', | ||||
|                                 'PrepareForMaintenance': 'warning', | ||||
|                                 'CancelMaintenance': 'warning', | ||||
|                                 'Maintenance': 'warning', | ||||
|                             }, | ||||
|  | ||||
| @ -808,13 +808,16 @@ | ||||
| 
 | ||||
|                     }, | ||||
|                     id: 'networks', | ||||
|                     preFilter: function(args) { | ||||
|                         if (isAdmin() || isDomainAdmin()) { | ||||
|                             return [] | ||||
|                         } | ||||
|                         return ['account'] | ||||
|                     }, | ||||
|                     fields: { | ||||
|                         name: { | ||||
|                             label: 'label.name' | ||||
|                         }, | ||||
|                         account: { | ||||
|                             label: 'label.account' | ||||
|                         }, | ||||
|                         type: { | ||||
|                             label: 'label.type' | ||||
|                         }, | ||||
| @ -823,6 +826,27 @@ | ||||
|                         }, | ||||
|                         ip6cidr: { | ||||
|                             label: 'label.ipv6.CIDR' | ||||
|                         }, | ||||
|                         account: { | ||||
|                             label: 'label.account' | ||||
|                         }, | ||||
|                         zonename: { | ||||
|                             label: 'label.zone' | ||||
|                         }, | ||||
|                         state: { | ||||
|                             converter: function(str) { | ||||
|                                 // For localization
 | ||||
|                                 return str; | ||||
|                             }, | ||||
|                             label: 'label.state', | ||||
|                             indicator: { | ||||
|                                 'Allocated': 'on', | ||||
|                                 'Released': 'off', | ||||
|                                 'Destroy': 'off', | ||||
|                                 'Shutdown': 'off', | ||||
|                                 'Setup': 'warning', | ||||
|                                 'Implemented': 'on' | ||||
|                             } | ||||
|                         } | ||||
|                     }, | ||||
| 
 | ||||
| @ -1635,11 +1659,14 @@ | ||||
|                                                     networkid: args.context.networks[0].id | ||||
|                                                 }, | ||||
|                                                 dataType: 'json', | ||||
|                                                 async: true, | ||||
|                                                 async: false, | ||||
|                                                 success: function(json) { | ||||
|                                                     var response = json.listegressfirewallrulesresponse.firewallrule ? | ||||
|                                                         json.listegressfirewallrulesresponse.firewallrule : []; | ||||
| 
 | ||||
|                                                     if (response.length > 0) { | ||||
|                                                         isConfigRulesMsgShown = true; | ||||
|                                                     } | ||||
|                                                     args.response.success({ | ||||
|                                                         data: $.map(response, function(rule) { | ||||
|                                                             if (rule.protocol == 'all') { | ||||
| @ -1899,6 +1926,12 @@ | ||||
|                 listView: { | ||||
|                     id: 'ipAddresses', | ||||
|                     label: 'label.ips', | ||||
|                     preFilter: function(args) { | ||||
|                         if (isAdmin()) { | ||||
|                             return ['account'] | ||||
|                         } | ||||
|                         return [] | ||||
|                     }, | ||||
|                     fields: { | ||||
|                         ipaddress: { | ||||
|                             label: 'label.ips', | ||||
| @ -1910,12 +1943,18 @@ | ||||
|                                 return text; | ||||
|                             } | ||||
|                         }, | ||||
|                         zonename: { | ||||
|                             label: 'label.zone' | ||||
|                         associatednetworkname: { | ||||
|                             label: 'label.network' | ||||
|                         }, | ||||
|                         virtualmachinedisplayname: { | ||||
|                             label: 'label.vm.name' | ||||
|                         }, | ||||
|                         account: { | ||||
|                             label: 'label.account' | ||||
|                         }, | ||||
|                         zonename: { | ||||
|                             label: 'label.zone' | ||||
|                         }, | ||||
|                         state: { | ||||
|                             converter: function(str) { | ||||
|                                 // For localization
 | ||||
|  | ||||
| @ -1285,7 +1285,7 @@ cloudStack.converters = { | ||||
|             var disconnected = new Date(); | ||||
|             disconnected.setISO8601(UtcDate); | ||||
| 
 | ||||
|             if (g_timezoneoffset != null) { | ||||
|             if (g_timezoneoffset != null && g_timezoneoffset != "null") { | ||||
|                 localDate = disconnected.getTimePlusTimezoneOffset(g_timezoneoffset); | ||||
|             } else { | ||||
|                 var browserDate = new Date(); | ||||
|  | ||||
| @ -36,8 +36,10 @@ | ||||
|                     label: 'label.volumes', | ||||
|                     preFilter: function(args) { | ||||
|                         var hiddenFields = []; | ||||
|                         if (isAdmin() != true) | ||||
|                         if (isAdmin() != true) { | ||||
|                             hiddenFields.push('hypervisor'); | ||||
|                             hiddenFields.push('account'); | ||||
|                         } | ||||
|                         return hiddenFields; | ||||
|                     }, | ||||
|                     fields: { | ||||
| @ -47,11 +49,33 @@ | ||||
|                         type: { | ||||
|                             label: 'label.type' | ||||
|                         }, | ||||
|                         vmdisplayname: { | ||||
|                             label: 'label.vm.display.name' | ||||
|                         }, | ||||
|                         hypervisor: { | ||||
|                             label: 'label.hypervisor' | ||||
|                         }, | ||||
|                         vmdisplayname: { | ||||
|                             label: 'label.vm.display.name' | ||||
|                         account: { | ||||
|                             label: 'label.account' | ||||
|                         }, | ||||
|                         zonename: { | ||||
|                             label: 'label.zone' | ||||
|                         }, | ||||
|                         state: { | ||||
|                             label: 'label.metrics.state', | ||||
|                             converter: function (str) { | ||||
|                                 // For localization
 | ||||
|                                 return str; | ||||
|                             }, | ||||
|                             indicator: { | ||||
|                                 'Allocated': 'on', | ||||
|                                 'Ready': 'on', | ||||
|                                 'Destroy': 'off', | ||||
|                                 'Expunging': 'off', | ||||
|                                 'Migrating': 'warning', | ||||
|                                 'UploadOp': 'warning', | ||||
|                                 'Snapshotting': 'warning', | ||||
|                             } | ||||
|                         } | ||||
|                     }, | ||||
| 
 | ||||
|  | ||||
| @ -39,7 +39,7 @@ | ||||
|             router.guestnetworkname = router.vpcname; | ||||
|         } | ||||
| 
 | ||||
|         if ("isredundantrouter" in router && router.isredundantrouter) { | ||||
|         if (router.isredundantrouter) { | ||||
|             router.guestnetworkname = router.guestnetworkname + " (" + router.redundantstate + ")"; | ||||
|         } | ||||
| 
 | ||||
| @ -2180,6 +2180,12 @@ | ||||
|                         }, | ||||
|                         isolationmethods: { | ||||
|                             label: 'label.isolation.method' | ||||
|                         }, | ||||
|                         vlan: { | ||||
|                             label: 'label.vlan' | ||||
|                         }, | ||||
|                         broadcastdomainrange: { | ||||
|                             label: 'label.broadcast.domain.range' | ||||
|                         } | ||||
|                     }, | ||||
| 
 | ||||
| @ -9205,6 +9211,14 @@ | ||||
|                                         data: data, | ||||
|                                         success: function (json) { | ||||
|                                             var systemvmObjs = json.listsystemvmsresponse.systemvm; | ||||
|                                             $(systemvmObjs).each(function(idx, item) { | ||||
|                                                 var controlIp = item.linklocalip; | ||||
|                                                 if (item.hypervisor == "VMware") { | ||||
|                                                     var controlIp = item.privateip; | ||||
|                                                 } | ||||
|                                                 item.controlip = controlIp; | ||||
|                                             }); | ||||
| 
 | ||||
|                                             if (systemvmObjs != undefined) { | ||||
|                                                 $.ajax({ | ||||
|                                                     url: createURL('listHosts'), | ||||
| @ -9585,16 +9599,19 @@ | ||||
|                                     label: 'label.name' | ||||
|                                 }, | ||||
|                                 publicip: { | ||||
|                                     label: 'label.public.ip' | ||||
|                                     label: 'label.ip' | ||||
|                                 }, | ||||
|                                 account: { | ||||
|                                     label: 'label.account' | ||||
|                                 routerType: { | ||||
|                                     label: 'label.type' | ||||
|                                 }, | ||||
|                                 guestnetworkname: { | ||||
|                                     label: 'label.network' | ||||
|                                 }, | ||||
|                                 routerType: { | ||||
|                                     label: 'label.type' | ||||
|                                 account: { | ||||
|                                     label: 'label.account' | ||||
|                                 }, | ||||
|                                 hostname: { | ||||
|                                     label: 'label.host' | ||||
|                                 }, | ||||
|                                 state: { | ||||
|                                     converter: function (str) { | ||||
| @ -10976,6 +10993,12 @@ | ||||
|                                 return args; | ||||
|                             } | ||||
|                         }, | ||||
|                         controlip: { | ||||
|                             label: 'label.control.ip' | ||||
|                         }, | ||||
|                         hostname: { | ||||
|                             label: 'label.host' | ||||
|                         }, | ||||
|                         zonename: { | ||||
|                             label: 'label.zone' | ||||
|                         }, | ||||
| @ -13293,12 +13316,19 @@ | ||||
|                         netmask: { | ||||
|                             label: 'label.netmask' | ||||
|                         }, | ||||
|                         zonename: { | ||||
|                             label: 'label.zone' | ||||
|                         }, | ||||
|                         allocationstate: { | ||||
|                             converter: function (str) { | ||||
|                                 // For localization
 | ||||
|                                 return str; | ||||
|                             }, | ||||
|                             label: 'label.allocation.state' | ||||
|                             label: 'label.allocation.state', | ||||
|                             indicator: { | ||||
|                                 'Enabled': 'on', | ||||
|                                 'Disabled': 'off' | ||||
|                             } | ||||
|                         } | ||||
|                     }, | ||||
| 
 | ||||
| @ -13934,23 +13964,27 @@ | ||||
|                         name: { | ||||
|                             label: 'label.name' | ||||
|                         }, | ||||
|                         podname: { | ||||
|                             label: 'label.pod' | ||||
|                         }, | ||||
|                         hypervisortype: { | ||||
|                             label: 'label.hypervisor' | ||||
|                         }, | ||||
|                         //allocationstate: { label: 'label.allocation.state' },
 | ||||
|                         //managedstate: { label: 'Managed State' },
 | ||||
|                         zonename: { | ||||
|                             label: 'label.zone' | ||||
|                         }, | ||||
|                         podname: { | ||||
|                             label: 'label.pod' | ||||
|                         }, | ||||
|                         managedstate: { | ||||
|                             label: 'label.managed.state' | ||||
|                         }, | ||||
|                         allocationstate: { | ||||
|                             converter: function (str) { | ||||
|                                 // For localization
 | ||||
|                                 return str; | ||||
|                             }, | ||||
|                             label: 'label.state', | ||||
|                             label: 'label.allocation.state', | ||||
|                             indicator: { | ||||
|                                 'Enabled': 'on', | ||||
|                                 'Destroyed': 'off' | ||||
|                                 'Disabled': 'off' | ||||
|                             } | ||||
|                         } | ||||
|                     }, | ||||
| @ -15487,15 +15521,26 @@ | ||||
|                         name: { | ||||
|                             label: 'label.name' | ||||
|                         }, | ||||
|                         ipaddress: { | ||||
|                             label: 'label.ip.address' | ||||
|                         }, | ||||
|                         hypervisor: { | ||||
|                             label: 'label.hypervisor' | ||||
|                         }, | ||||
|                         zonename: { | ||||
|                             label: 'label.zone' | ||||
|                         }, | ||||
|                         podname: { | ||||
|                             label: 'label.pod' | ||||
|                         }, | ||||
|                         clustername: { | ||||
|                             label: 'label.cluster' | ||||
|                         }, | ||||
|                         resourcestate: { | ||||
|                             label: 'label.resource.state', | ||||
|                             indicator: { | ||||
|                                 'Enabled': 'on', | ||||
|                                 'Disabled': 'off', | ||||
|                                 'Maintenance': 'warning' | ||||
|                             } | ||||
|                         }, | ||||
|                         state: { | ||||
|                             label: 'label.state', | ||||
|                             indicator: { | ||||
| @ -17497,12 +17542,34 @@ | ||||
|                             label: 'label.path', | ||||
|                             truncate: true | ||||
|                         }, | ||||
|                         type: { | ||||
|                             label: 'label.type' | ||||
|                         }, | ||||
|                         scope: { | ||||
|                             label: 'label.scope' | ||||
|                         }, | ||||
|                         clustername: { | ||||
|                             label: 'label.cluster', | ||||
|                             truncate: true | ||||
|                         }, | ||||
|                         scope: { | ||||
|                             label: 'label.scope' | ||||
|                         zonename: { | ||||
|                             label: 'label.zone' | ||||
|                         }, | ||||
|                         state: { | ||||
|                             label: 'label.state', | ||||
|                             converter: function (str) { | ||||
|                                 // For localization
 | ||||
|                                 return str; | ||||
|                             }, | ||||
|                             indicator: { | ||||
|                                 'Up': 'on', | ||||
|                                 'Down': 'off', | ||||
|                                 'Removed': 'off', | ||||
|                                 'ErrorInMaintenance': 'off', | ||||
|                                 'PrepareForMaintenance': 'warning', | ||||
|                                 'CancelMaintenance': 'warning', | ||||
|                                 'Maintenance': 'warning', | ||||
|                             } | ||||
|                         } | ||||
|                     }, | ||||
| 
 | ||||
| @ -19492,8 +19559,17 @@ | ||||
|                                 name: { | ||||
|                                     label: 'label.name' | ||||
|                                 }, | ||||
|                                 url: { | ||||
|                                     label: 'label.url' | ||||
|                                 }, | ||||
|                                 protocol: { | ||||
|                                     label: 'label.protocol' | ||||
|                                 }, | ||||
|                                 scope: { | ||||
|                                     label: 'label.scope' | ||||
|                                 }, | ||||
|                                 zonename: { | ||||
|                                     label: 'label.zone' | ||||
|                                 } | ||||
|                             }, | ||||
| 
 | ||||
|  | ||||
| @ -55,12 +55,24 @@ | ||||
|                             label: 'label.community' | ||||
|                         } | ||||
|                     }, | ||||
|                     preFilter: function() { | ||||
|                         if (isAdmin()||isDomainAdmin()) { | ||||
|                             return [] | ||||
|                         } | ||||
|                         return ['account'] | ||||
|                     }, | ||||
|                     fields: { | ||||
|                         name: { | ||||
|                             label: 'label.name' | ||||
|                         }, | ||||
|                         hypervisor: { | ||||
|                             label: 'label.hypervisor' | ||||
|                         }, | ||||
|                         ostypename: { | ||||
|                             label: 'label.os.type' | ||||
|                         }, | ||||
|                         account: { | ||||
|                             label: 'label.account' | ||||
|                         } | ||||
|                     }, | ||||
| 
 | ||||
| @ -2038,9 +2050,21 @@ | ||||
|                             label: 'label.community' | ||||
|                         } | ||||
|                     }, | ||||
|                     preFilter: function() { | ||||
|                         if (isAdmin()||isDomainAdmin()) { | ||||
|                             return [] | ||||
|                         } | ||||
|                         return ['account'] | ||||
|                     }, | ||||
|                     fields: { | ||||
|                         name: { | ||||
|                             label: 'label.name' | ||||
|                         }, | ||||
|                         ostypename: { | ||||
|                             label: 'label.os.type' | ||||
|                         }, | ||||
|                         account: { | ||||
|                             label: 'label.account' | ||||
|                         } | ||||
|                     }, | ||||
| 
 | ||||
| @ -2347,7 +2371,10 @@ | ||||
|                                             id: item.id, | ||||
|                                             name: item.name, | ||||
|                                             description: item.description, | ||||
|                                             ostypename: item.ostypename, | ||||
|                                             ostypeid: item.ostypeid, | ||||
|                                             account: item.account, | ||||
|                                             domain: item.domain, | ||||
|                                             zones: item.zonename, | ||||
|                                             zoneids: [item.zoneid] | ||||
|                                         }; | ||||
|  | ||||
| @ -78,19 +78,12 @@ | ||||
|             return true; | ||||
|         }; | ||||
| 
 | ||||
|         var splitTable = function() { | ||||
|         var reattachTable = function() { | ||||
|             var $mainContainer = $('<div>') | ||||
|                 .addClass('data-table') | ||||
|                 .appendTo($table.parent()) | ||||
|                 .append( | ||||
|                     $table.detach() | ||||
|                 .append($table.detach() | ||||
|             ); | ||||
|             $table = $mainContainer; | ||||
|             var $theadContainer = $('<div>').addClass('fixed-header').prependTo($table); | ||||
|             var $theadTable = $('<table>').appendTo($theadContainer).attr('nowrap', 'nowrap'); | ||||
|             var $thead = $table.find('thead').detach().appendTo($theadTable); | ||||
| 
 | ||||
|             return $thead; | ||||
|         }; | ||||
| 
 | ||||
|         /** | ||||
| @ -289,7 +282,7 @@ | ||||
|         var init = function() { | ||||
|             var noSelect = options && options.noSelect == true ? true : false; | ||||
|             if (!$table.closest('div.data-table').size() && !$table.hasClass('no-split')) { | ||||
|                 splitTable(); | ||||
|                 reattachTable(); | ||||
|                 $table.find('tbody').closest('table').addClass('body'); | ||||
|             } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user