edit proj, vmcons, volrow (#650)

* edit proj, vmcons, volrow
viewEditProject
swarm and storage
stack section and edit proj
stack section
sortable th labels
schedrow, schema, sidekick info
pg header env, proj row, reg row
schema dupe

* yaml deletions

* typo
This commit is contained in:
lauren Vuchetich 2016-05-12 15:07:33 -07:00 committed by Vincent Fiduccia
parent 2e920c42c2
commit 8fc24f4ea8
19 changed files with 187 additions and 80 deletions

View File

@ -2,11 +2,11 @@
<thead>
{{#if model.length}}
<tr>
{{sortable-th sortable=this action="changeSort" name="name"}}
{{sortable-th sortable=this action="changeSort" name="name" label="generic.name"}}
{{sortable-th sortable=this action="changeSort" name="port" label="Port"}}
{{sortable-th sortable=this action="changeSort" name="targetPort" label="Container Port"}}
{{sortable-th sortable=this action="changeSort" name="nodepPort" label="Node Port"}}
{{sortable-th sortable=this action="changeSort" name="protocol"}}
{{sortable-th sortable=this action="changeSort" name="protocol" label="Protocol"}}
</tr>
{{/if}}
</thead>

View File

@ -56,7 +56,7 @@
</a>
<ul class="dropdown-menu dropdown-menu-right project-menu" role="menu">
{{#if k8s.namespaces.length}}
<li role="presentation" class="dropdown-header">Namespaces</li>
<li role="presentation" class="dropdown-header">{{t 'pageHeaderEnvironment.namespace'}}</li>
{{#each k8s.namespaces as |ns|}}
{{#unless ns.isSystem}}
<li class="{{if (eq ns k8s.namespace) 'active selected'}}">

View File

@ -5,7 +5,7 @@
{{#link-to "settings.projects.detail" model.id (query-params editing=false)}}{{model.displayName}}{{/link-to}}
</td>
<td data-title="Description:">
{{#if model.description}}{{model.description}}{{else}}<span class="text-muted">No description</span>{{/if}}
{{#if model.description}}{{model.description}}{{else}}<span class="text-muted">{{t 'projectRow.none'}}</span>{{/if}}
</td>
<td data-title="Orchestration:">
{{model.displayOrchestration}}

View File

@ -5,10 +5,10 @@
{{model.displayAddress}}
</td>
<td data-title="Email:">
{{#if model.credential.email}}{{model.credential.email}}{{else}}<i class="text-muted">None</i>{{/if}}
{{#if model.credential.email}}{{model.credential.email}}{{else}}<i class="text-muted">{{t 'generic.none'}}</i>{{/if}}
</td>
<td data-title="Username:">
{{#if model.credential.publicValue}}{{model.credential.publicValue}}{{else}}<i class="text-muted">None</i>{{/if}}
{{#if model.credential.publicValue}}{{model.credential.publicValue}}{{else}}<i class="text-muted">{{t 'generic.none'}}</i>{{/if}}
</td>
<td data-title="Created:">
{{date-calendar model.created}}

View File

@ -1,4 +1,4 @@
<td><div class="form-control-static input-sm">The host</div></td>
<td><div class="form-control-static input-sm">{{t 'schedulingRuleRow.theHost'}}</div></td>
<td>
{{new-select
classNames="form-control input-sm"
@ -6,7 +6,7 @@
value=suffix
}}
</td>
<td><div class="form-control-static text-center input-sm">have a</div></td>
<td><div class="form-control-static text-center input-sm">{{t 'schedulingRuleRow.haveA'}}</div></td>
<td>
{{new-select
classNames="form-control input-sm"
@ -16,7 +16,7 @@
</td>
<td>
{{#if (not (or (eq kind "service_name") (eq kind "container_name")))}}
<div class="form-control-static text-center input-sm">of</div>
<div class="form-control-static text-center input-sm">{{t 'schedulingRuleRow.of'}}</div>
{{/if}}
</td>
<td>

View File

@ -1,6 +1,6 @@
<label class="r-mr20 hand">
{{radio-button selection=value value=true}} True
{{radio-button selection=value value=true}} {{t 'schemaComponent.inputBoolean.y'}}
</label>
<label class="hand">
{{radio-button selection=value value=false}} False
</label>
{{radio-button selection=value value=false}} {{t 'schemaComponent.inputBoolean.n'}}
</label>

View File

@ -1,6 +1,6 @@
<select name="" class="form-control r-mb10" onChange={{action (mut value) value="target.value"}}>
<option value="">Choose an option...</option>
<option value="">{{t 'schema.inputEnum.option'}}</option>
{{#each field.options as |option|}}
<option value={{option}} selected={{eq option value}}>{{option}}</option>
{{/each}}
</select>
</select>

View File

@ -1,49 +1,49 @@
<div class="content-box col-sm-4 col-md-4">
<label class="text-muted">Info</label>
<label class="text-muted">{{t 'sidekickAddtlInfo.info'}}</label>
<div class="content">
<label class="text-muted">Image</label>
<label class="text-muted">{{t 'sidekickAddtlInfo.image'}}</label>
<div class="force-wrap">
{{sidekick.imageUuid}}
</div>
<label class="text-muted r-mt15">Entrypoint</label>
<label class="text-muted r-mt15">{{t 'sidekickAddtlInfo.entryPoint'}}</label>
<div class="force-wrap">
{{#if sidekick.launchConfig.entryPoint}}
{{sidekick.launchConfig.entryPoint}}
{{else}}
<span class="text-muted">None</span>
<span class="text-muted">{{t 'generic.none'}}</span>
{{/if}}
</div>
<label class="text-muted r-mt15">Command</label>
<label class="text-muted r-mt15">{{t 'sidekickAddtlInfo.command'}}</label>
<div class="force-wrap">
{{#if sidekick.launchConfig.command}}
{{sidekick.launchConfig.command}}
{{else}}
<span class="text-muted">None</span>
<span class="text-muted">{{t 'generic.none'}}</span>
{{/if}}
</div>
</div>
</div>
<div class="content-box col-sm-4 col-md-4">
<label class="text-muted">Containers ({{containers.length}})</label>
<label class="text-muted">{{t 'sidekickAddtlInfo.containers'}} ({{containers.length}})</label>
<div class="content">
<div class="container-dots clearfix">
{{#each containers as |instance|}}
{{container-dot model=instance}}
{{else}}
<span class="text-muted">No Containers</span>
<span class="text-muted">{{t 'sidekickAddtlInfo.noContainers'}}</span>
{{/each}}
</div>
</div>
</div>
<div class="content-box col-sm-4 col-md-4">
<label class="text-muted">Labels</label>
<label class="text-muted">{{t 'sidekickAddtlInfo.labels'}}</label>
<div class="content">
<ul class="list-unstyled">
{{#each labelArray as |label|}}
<li>{{label.key}}: {{label.value}}</li>
{{else}}
<li class="text-muted">No Labels</li>
<li class="text-muted">{{t 'sidekickAddtlInfo.noLabels'}}</li>
{{/each}}
</ul>
</div>
</div>
</div>

View File

@ -23,7 +23,7 @@
<div class="header-left">
<div class="btn-group r-ml10">
<button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Outputs <i class="icon icon-chevron-down"></i>
{{t 'stackSection.outputs'}} <i class="icon icon-chevron-down"></i>
</button>
<ul class="dropdown-menu dropdown-menu-right" role="dropdown">
{{#each outputs as |obj|}}
@ -40,28 +40,28 @@
<div class="header-right right-divider count">
<p>{{instanceCount}}</p>
<label>Container{{unless (eq instanceCount 1) 's'}}</label>
<label>{{t 'stackSection.container' numContainers=instanceCount}}</label>
</div>
<div class="header-right right-divider count">
<p>{{model.unremovedServices.length}}</p>
<label>Service{{unless (eq model.unremovedServices.length 1) 's'}}</label>
<label>{{t 'stackSection.service' numServices=instanceCount}}</label>
</div>
<div class="header-right right-divider stack-template">
{{upgrade-btn environmentResource=model}}
<div class="btn-group">
{{#link-to "service.new" (query-params environmentId=model.id) classNames="btn btn-default btn-sm"}}Add Service{{/link-to}}
{{#link-to "service.new" (query-params environmentId=model.id) classNames="btn btn-default btn-sm"}}{{t 'stackSection.add.service'}}{{/link-to}}
<button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="true">
<i class="icon icon-fw icon-chevron-down"></i>
<span class="sr-only">Toggle Dropdown</span>
<span class="sr-only">{{t 'stackSection.add.toggle'}}</span>
</button>
<ul class="dropdown-menu dropdown-menu-right" role="menu">
<li>{{#link-to "service.new-balancer" (query-params environmentId=model.id)}}Add Load Balancer{{/link-to}}</li>
<li>{{#link-to "service.new-alias" (query-params environmentId=model.id)}}Add Service Alias{{/link-to}}</li>
<li>{{#link-to "service.new-external" (query-params environmentId=model.id)}}Add External Service{{/link-to}}</li>
<li>{{#link-to "service.new-balancer" (query-params environmentId=model.id)}}{{t 'stackSection.add.loadBalancer'}}{{/link-to}}</li>
<li>{{#link-to "service.new-alias" (query-params environmentId=model.id)}}{{t 'stackSection.add.serviceAlias'}}{{/link-to}}</li>
<li>{{#link-to "service.new-external" (query-params environmentId=model.id)}}{{t 'stackSection.add.externalService'}}{{/link-to}}</li>
{{#if hasVm}}
<li>{{#link-to "service.new-virtualmachine" (query-params environmentId=model.id)}}Add Virtual Machine{{/link-to}}</li>
<li>{{#link-to "service.new-virtualmachine" (query-params environmentId=model.id)}}{{t 'stackSection.add.virtualMachine'}}{{/link-to}}</li>
{{/if}}
</ul>
</div>
@ -74,7 +74,7 @@
{{#if single}}
{{#if model.description}}
<div class="r-pt20 r-pr20 r-pb20 r-pl20">
<label>Description:&nbsp;</label>{{model.description}}
<label>{{t 'stackSection.add.description'}}:&nbsp;</label>{{model.description}}
</div>
{{/if}}
{{/if}}
@ -89,7 +89,7 @@
<td data-title="Service Name:"class="force-wrap">
{{#link-to "service" service.environmentId service.id}}{{service.displayName}}{{/link-to}}
{{#if service.hasSidekicks}}
+ {{service.secondaryLaunchConfigs.length}} Sidekick{{unless (eq service.secondaryLaunchConfigs.length 1) 's'}}
+ {{service.secondaryLaunchConfigs.length}} {{t 'stackSection.sidekick' numSidekicks=instanceCount}}
{{/if}}
<button type="button" class="btn-link" role="button" {{action 'addtlInfo' service target=controller}}>
<i class="icon icon-info addtl-info-trigger"/>
@ -103,7 +103,7 @@
</td>
<td data-title="Containers:">
{{#if service.hasContainers}}
{{default-str service.instances.length default="0"}} Container{{unless (eq service.instances.length 1) 's'}}
{{default-str service.instances.length default="0"}} {{t 'stackSection.container' numContainers=instanceCount}}
{{/if}}
</td>
<td data-title="Actions:" class="actions wide">
@ -114,7 +114,7 @@
</tbody>
</table>
{{else}}
<div class="text-muted text-center r-p10">No Services</div>
<div class="text-muted text-center r-p10">{{t 'viewEditProject.showEdit.none'}}</div>
{{/if}}
</div>
{{/liquid-if}}

View File

@ -14,7 +14,7 @@
{{#if outputs.length}}
<div class="btn-group r-ml10">
<button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Outputs <i class="icon icon-fw icon-chevron-down"></i>
{{t 'storagePoolSection.outputs'}} <i class="icon icon-fw icon-chevron-down"></i>
</button>
<ul class="dropdown-menu dropdown-menu-right">
{{#each outputs as |obj|}}
@ -28,7 +28,7 @@
<div class="header-right right-divider stack-actions" style="width: auto">
{{#unless single}}
{{#link-to "storagepools.new-volume" (query-params driverName=model.driverName) classNames="btn btn-primary btn-sm"}}Add Volume{{/link-to}}
{{#link-to "storagepools.new-volume" (query-params driverName=model.driverName) classNames="btn btn-primary btn-sm"}}{{t 'storagePoolSection.volumes.add'}}{{/link-to}}
{{/unless}}
</div>
</div>
@ -37,23 +37,23 @@
<div class="stack-body r-p10 row row-full-height">
<div class="subsection gutter col-xs-6 col-md-3 col-full-height">
<h6>Hosts</h6>
<h6>{{t 'storagePoolSection.hosts.header'}}</h6>
<div class="clearfix r-p10 hosts">
{{#each hostsByName as |host|}}
<div class="r-m10"><i class="icon {{host.stateIcon}} {{host.stateBackground}}"></i> {{#link-to "host" host.id}}{{host.displayName}}{{/link-to}}</div>
{{else}}
<div class="text-center text-muted">No hosts</div>
<div class="text-center text-muted">{{t 'storagePoolSection.hosts.none'}}</div>
{{/each}}
</div>
</div>
{{#if model.volumes.length}}
<div class="subsection gutter col-xs-6 col-md-9 col-full-height">
<h6>Volumes</h6>
<h6>{{t 'storagePoolSection.volumes.header'}}</h6>
<table class="grid fixed" style="margin-bottom: 0">
<thead>
<tr>
{{sortable-th sortable=this action="changeSort" name="state" width="125"}}
{{sortable-th sortable=this action="changeSort" name="name"}}
{{sortable-th sortable=this action="changeSort" name="state" width="125" label="generic.state"}}
{{sortable-th sortable=this action="changeSort" name="name" label="generic.name"}}
{{sortable-th sortable=this action="changeSort" name="activeMounts" label="Mounts (Container: Path)"}}
<th width="70">&nbsp;</th>
</tr>
@ -80,12 +80,12 @@
{{~/if~}}
: {{mount.path}}
{{#if (eq mount.permissions "ro")}}
<span class="text-muted">(read-only)</span>
<span class="text-muted">{{t 'storagePoolSection.readOnly'}}</span>
{{/if}}
</div>
{{/each}}
{{else}}
<span class="text-muted">None</span>
<span class="text-muted">{{t 'generic.none'}}</span>
{{/if}}
</td>
<td class="actions wide">
@ -97,6 +97,6 @@
</table>
</div>
{{else}}
<div class="text-muted text-center r-p10">No Volumes</div>
<div class="text-muted text-center r-p10">{{t 'storagePoolSection.volumes.none'}}</div>
{{/if}}
</div>

View File

@ -8,7 +8,7 @@
<div class="row">
<div class="badge pull-right"><i class="icon icon-container"></i> {{containerCount}}</div>
{{#if node.service.secondaryLaunchConfigs}}
<span class="label label-default label-sidekick pull-right">Sidekicks</span>
<span class="label label-default label-sidekick pull-right">{{t svgServiceContainer.sidekicks}}</span>
{{/if}}
</div>
<div class="row title">

View File

@ -2,9 +2,9 @@
<table class="grid fixed no-lines r-mb0">
<thead>
<tr>
<th width="120">State</th>
<th>Container Name</th>
<th>Image</th>
<th width="120">{{t 'swarm.containerSection.state'}}</th>
<th>{{t 'swarm.containerSection.name'}}</th>
<th>{{t 'swarm.containerSection.image'}}</th>
<th class="actions" width="85">&nbsp;</th>
</tr>
</thead>
@ -15,5 +15,5 @@
</tbody>
</table>
{{else}}
<span class="text-muted">No Containers</span>
<span class="text-muted">{{t 'swarm.containerSection.none'}}</span>
{{/if}}

View File

@ -10,7 +10,7 @@
{{#if model.unremovedServices.length}}
{{model.unremovedServices.length}}
{{else}}
<span class="text-muted">None</span>
<span class="text-muted">{{t 'generic.none'}}</span>
{{/if}}
</td>
<td class="actions">

View File

@ -13,7 +13,7 @@
{{#if model.instances.length}}
{{model.instances.length}}
{{else}}
<span class="text-muted">None</span>
<span class="text-muted">{{t 'generic.none'}}</span>
{{/if}}
</td>
<td class="actions" data-title="Actions:">

View File

@ -2,10 +2,10 @@
<table class="grid fixed no-lines r-mb0">
<thead>
<tr>
<th width="125">State</th>
<th>Service Name</th>
<th>Ports</th>
<th width="100">Containers</th>
<th width="125">{{t 'swarm.serviceSection.state'}}State</th>
<th>{{t 'swarm.serviceSection.name'}}</th>
<th>{{t 'swarm.serviceSection.ports'}}</th>
<th width="100">{{t 'swarm.serviceSection.containers'}}</th>
<th class="actions" width="85">&nbsp;</th>
</tr>
</thead>
@ -16,5 +16,5 @@
</tbody>
</table>
{{else}}
<span class="text-muted">No Services</span>
<span class="text-muted">{{t 'swarm.serviceSection.none'}}</span>
{{/if}}

View File

@ -2,13 +2,13 @@
{{#if showEdit}}
<h1>
{{#if editing}}
Edit Environment: {{originalProject.displayName}}
{{t 'viewEditProject.showEdit.edit'}} {{originalProject.displayName}}
{{else}}
Add Environment
{{t 'viewEditProject.showEdit.add'}}
{{/if}}
</h1>
{{else}}
<h1>{{#link-to "settings.projects"}}Environment:{{/link-to}}</h1>
<h1>{{#link-to "settings.projects"}}{{t 'viewEditProject.header'}}{{/link-to}}</h1>
{{#power-select options=model.all selected=project onchange=(action "changeProject") searchField="displayName" as |obj|}}
{{select-dot model=obj}}
{{/power-select}}
@ -24,7 +24,7 @@
{{#if showEdit}}
<section class="well">
<label>Container Orchestration</label>
<label>{{t 'viewEditProject.showEdit.orchestration'}}</label>
<div class="nav nav-boxes checked-active">
{{#each orchestrationChoices as |driver|}}
{{#if driver.disabled}}
@ -46,7 +46,7 @@
{{else}}
{{#if project.description}}
<section class="well r-mb0">
<label>Description</label>
<label>{{t 'viewEditProject.description'}}</label>
<p>{{project.description}}</p>
</section>
{{/if}}
@ -56,7 +56,7 @@
<div class="row form-group">
{{#if showEdit}}
<div class="col-sm-12 col-md-2 form-label">
<label class="form-control-static">Access Control</label>
<label class="form-control-static">{{t 'viewEditProject.showEdit.formControl'}}</label>
</div>
{{/if}}
@ -74,9 +74,9 @@
<table class="grid fixed" style="margin-bottom: 0;">
<thead>
<tr>
{{sortable-th sortable=this action="changeSort" name="name"}}
{{sortable-th sortable=this action="changeSort" name="type"}}
{{sortable-th sortable=this action="changeSort" name="role"}}
{{sortable-th sortable=this action="changeSort" name="name" label="generic.name"}}
{{sortable-th sortable=this action="changeSort" name="type" label="generic.type"}}
{{sortable-th sortable=this action="changeSort" name="role" label="generic.role"}}
{{#if showEdit}}<th width="40">&nbsp;</th>{{/if}}
</tr>
</thead>
@ -119,8 +119,7 @@
</table>
{{else}}
<p class="help-block text-center">
Access Control is not enabled.<br/>
Anybody with access to the API/UI acts as an admin and will be able to use any environment.
{{t 'viewEditProject.helpBlock'}}
</p>
{{/if}}
</div>

View File

@ -1,19 +1,19 @@
<h2><i class="icon icon-terminal"></i> Console: {{instance.displayName}}</h2>
<h2><i class="icon icon-terminal"></i> {{t 'vmConsole.header'}} {{instance.displayName}}</h2>
{{#if showProtip}}
<div class="text-muted r-mt5 r-mb10" style="font-size: 12px;">
ProTip: Hold the {{alternateLabel}} key when opening shell access to launch a new window.
{{t 'vmConsole.protip' alternateLabel=alternateLabel}}
</div>
{{/if}}
<div class="console-body clearfix">
<div id="noVNC_screen">
<canvas class="console-canvas" width="640" height="20">
Canvas not supported.
{{t 'vmConsole.canvas'}}
</canvas>
</div>
</div>
<div class="footer-actions">
<div class="console-status text-muted">{{status}}</div>
<button {{action "ctrlAltDelete"}} class="btn btn-default" disabled={{ctrlAltDeleteDisabled}}>Send Ctrl-Alt-Delete</button>
<button {{action "cancel"}} class="btn btn-primary">Close</button>
<button {{action "ctrlAltDelete"}} class="btn btn-default" disabled={{ctrlAltDeleteDisabled}}>{{t 'vmConsole.footerActions.buttonSend'}}</button>
<button {{action "cancel"}} class="btn btn-primary">{{t 'vmConsole.footerActions.buttonCancel'}}</button>
</div>

View File

@ -15,12 +15,12 @@
<div>
{{#link-to "container" mount.instanceId}}{{mount.instance.name}}{{/link-to}}:{{mount.path}}
{{#if (eq mount.permissions "ro")}}
<span class="text-muted">(read-only)</span>
<span class="text-muted">{{t 'volumeRow.activeMounts.readOnly'}}</span>
{{/if}}
</div>
{{/each}}
{{else}}
<span class="text-muted">None</span>
<span class="text-muted">{{t 'generic.none'}}</span>
{{/if}}
</td>

View File

@ -21,6 +21,7 @@ generic:
description: Description
default: Default
type: Type
role: Role
##############################
# Routes
@ -1429,11 +1430,11 @@ formTargets:
formUserLabels:
addAction: Add Label
key:
label: Key
label: Key
placeholder: e.g. foo
separator: "="
value:
label: Value
label: Value
placeholder: e.g. bar
protip: "ProTip: Paste one or more lines of key=value pairs into any key field for easy bulk entry."
@ -1542,6 +1543,12 @@ pageFooter:
windows: Windows
linux: Linux
pageHeaderEnvironment:
namespace: Namespace
projectRow:
none: No description
saveCancel:
saving: Saving...
saved: Saved!
@ -1549,6 +1556,83 @@ saveCancel:
create: Create
cancel: Cancel
schedulingRuleRow:
theHost: The host
haveA: have a
of: of
schemaComponent:
inputBoolean:
y: True
n: False
inputEnum:
option: Choose an option...
sidekickAddtlInfo:
info: Info
image: Image
entryPoint: Entrypoint
command: Command
containers: Containers
noContainers: No Containers
labels: Labels
noLabels: No Labels
stackSection:
outputs: Outputs
toggle: Toggle Dropdown
description: Description
none: No Services
container: |
{numContainers, plural,
=1 {Container}
other {Containers}
}
service: |
{numServices, plural,
=1 {Service}
other {Services}
}
sidekick: |
{numSidekicks, plural,
=1 {Sidekick}
other {Sidekicks}
}
add:
service: Add Service
loadBalancer: Add Load Balancer
serviceAlias: Add Service Alias
externalService: Add External Service
virtualMachine: Add Virtual
storagePoolSection:
outputs: Outputs
readOnly: "(read-only)"
subSection:
hosts:
header: Hosts
none: No Hosts
volumes:
header: Volumes
add: Add Volume
none: No Volumes
svgServiceContainer:
sidekicks: Sidekicks
swarm:
containerSection:
state: State
name: Container Name
image: Image
none: No Containers
serviceSection:
state: State
name: Service Name
ports: Ports
containers: Containers
none: No Services
viewEditDescription:
form:
name:
@ -1556,11 +1640,35 @@ viewEditDescription:
description:
placeholder: e.g. Environment for developer experimentation
viewEditProject:
showDdit:
edit: "Edit Environment:"
add: Add Environment
orchestration: Container Orchestration
formControl: Access Control
header: "Environment:"
description: Description
helpBlock: |
Access Control is not enabled.<br/>
Anybody with access to the API/UI acts as an admin and will be able to use any environment.
virtualMachineSettings:
header: Virtual Machine Support
subtext: |
Requires hosts that have the <a href="https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine" target="_blank">KVM</a> kernel module loaded.
vmConsole:
header: "console:"
protip: "ProTip: Hold the {alternateLabel} key when opening shell access to launch a new window."
canvas: Canvas not supported.
footeractions:
buttonsend: Send Ctrl-Alt-Delete
buttoncancel: Close
volumeRow:
activeMounts:
readOnly: "(read-only)"
##############################
# Mixins
##############################