Merge pull request #1462 from vincent99/master

Move everything
This commit is contained in:
Vincent Fiduccia 2017-11-30 03:52:48 -07:00 committed by GitHub
commit 6a6916deff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
86 changed files with 320 additions and 501 deletions

View File

@ -28,10 +28,12 @@ const App = Application.extend({
'access',
'authn-store',
'authz-store',
'cluster-store',
'catalog',
'endpoint',
'github',
'intl',
'modal',
'router',
'resource-actions',
'scope',
@ -43,14 +45,13 @@ const App = Application.extend({
'user-theme',
],
externalRoutes: {
index: 'index',
failWhale: 'failWhale',
authenticated: 'authenticated',
'authenticated.clusters': 'authenticated.clusters',
'authenticated.clusters.cluster': 'authenticated.clusters.cluster',
'authenticated.clusters.project': 'authenticated.clusters.project',
'authenticated.prefs': 'authenticated.prefs',
'logout': 'logout'
index: 'index',
failWhale: 'failWhale',
authenticated: 'authenticated',
'authenticated.cluster': 'authenticated.cluster',
'authenticated.project': 'authenticated.project',
'authenticated.prefs': 'authenticated.prefs',
'logout': 'logout'
}
}
}

View File

@ -14,7 +14,7 @@ export default Route.extend({
let catalog = this.get('catalog');
let deps = [];
let cluster = this.modelFor('authenticated.clusters.cluster').clone();
let cluster = this.modelFor('authenticated.cluster').clone();
if ( cluster.systemStacks === null ) {
let def = JSON.parse(this.get(`settings.${C.SETTING.CLUSTER_TEMPLATE}`)) || {};
cluster.set('systemStacks', (def.systemStacks||[]).map((stack) => {

View File

@ -2,7 +2,7 @@ import { alias } from '@ember/object/computed';
import Controller, { inject as controller } from '@ember/controller';
export default Controller.extend({
clusterController: controller('authenticated.clusters.cluster'),
clusterController: controller('authenticated.cluster'),
cluster: alias('clusterController.model'),
queryParams : ['backTo', 'driver', 'hostId'],

View File

@ -7,7 +7,7 @@ export default Controller.extend({
actions: {
launch(model) {
this.transitionToRoute('authenticated.clusters.cluster.host-templates.launch', this.get('currentClusterId'), model.id);
this.transitionToRoute('authenticated.cluster.host-templates.launch', this.get('currentClusterId'), model.id);
},
},

View File

@ -14,7 +14,7 @@ export default Route.extend({
setupController(controller, model) {
this._super(controller, model);
let cluster = this.modelFor('authenticated.clusters.cluster');
let cluster = this.modelFor('authenticated.cluster');
controller.set('currentClusterId', cluster.get('id'));
},
@ -29,14 +29,14 @@ export default Route.extend({
});
if (!activeDrivers.get('length')) {
this.transitionTo('authenticated.clusters.cluster.host-new', this.get('scope.currentCluster.id'), {queryParams: {
this.transitionTo('authenticated.cluster.host-new', this.get('scope.currentCluster.id'), {queryParams: {
backTo: this.get('backTo'),
driver: 'custom'
}});
}
});
} else {
this.transitionTo('authenticated.clusters.cluster.host-new', this.get('scope.currentCluster.id'), {queryParams: {
this.transitionTo('authenticated.cluster.host-new', this.get('scope.currentCluster.id'), {queryParams: {
backTo: this.get('backTo')
}});
}

View File

@ -1,5 +1,5 @@
{{host-template-list
model=model
currentClusterId=currentClusterId
launch=(action (action 'launch'))
}}
launch=(action 'launch')
}}

View File

@ -16,7 +16,7 @@ export default Route.extend({
hostTemplateId: template.id
};
return this.get('clusterStore').find('cluster', null, {url: 'clusters', forceReload: true, removeMissing: true}).then((clusters) => {
let clusterToCreateOn = get(transistion, 'params')['authenticated.clusters.cluster']['cluster_id'];
let clusterToCreateOn = get(transistion, 'params')['authenticated.cluster']['cluster_id'];
return {
template: template,
config: config,

View File

@ -6,7 +6,7 @@
<div class="right-buttons">
{{#if scope.current.canAddHost}}
{{#link-to "authenticated.clusters.cluster.host-templates.index" scope.currentCluster.id classNames="btn btn-sm bg-primary"}}{{t 'hostsPage.index.addHost'}}{{/link-to}}
{{#link-to "authenticated.cluster.host-templates.index" scope.currentCluster.id classNames="btn btn-sm bg-primary"}}{{t 'hostsPage.index.addHost'}}{{/link-to}}
{{/if}}
</div>
</section>
@ -40,7 +40,7 @@
{{empty-table
resource="container"
showNew=scope.current.canAddHost
newRoute="authenticated.clusters.cluster.host-templates"
newRoute="authenticated.cluster.host-templates"
newTranslationKey="nav.hosts.addHost" ctx="clusterId"}}
{{/if}}
{{/if}}

View File

@ -6,7 +6,7 @@ import Controller, { inject as controller } from '@ember/controller';
export default Controller.extend({
scope: service(),
settings: service(),
clusterController: controller('authenticated.clusters.cluster'),
clusterController: controller('authenticated.cluster'),
cluster: alias('clusterController.model'),
loading: alias('cluster.isTransitioning'),

View File

@ -0,0 +1,24 @@
<section class="header clearfix">
<h1 class="pull-left">&quot;{{model.displayName}}&quot; Dashboard</h1>
<div class="right-buttons">
<button class="btn bg-primary icon-btn hide" {{action "dashboard"}}>
<span class="darken"><i class="icon icon-external-link"></i></span>
<span>{{t 'k8sPage.dashboard.button'}}</span>
</button>
<button class="btn bg-primary icon-btn ml-10" onClick={{action "kubectl" allowedKeys="meta"}}>
<span class="darken"><i class="icon icon-terminal"></i></span>
<span>{{t 'k8sPage.shell.button'}}</span>
</button>
<button class="btn bg-primary icon-btn ml-10" {{action "kubeconfig"}}>
<span class="darken"><i class="icon icon-download"></i></span>
<span>{{t 'k8sPage.configFile.button'}}</span>
</button>
</div>
</section>
<section class="text-center">
<img style="width: 90%;" src="{{app.baseAssets}}assets/images/legitimate-dashboard.png"/>
</section>

View File

@ -0,0 +1,10 @@
import { inject as service } from '@ember/service';
import Route from '@ember/routing/route';
export default Route.extend({
authzStore: service('authz-store'),
scope: service(),
model: function () {
return this.get('userStore').findAll('namespace', { filter: { clusterId: this.get('scope.currentCluster.id') } });
},
});

View File

@ -0,0 +1,13 @@
<section class="header clearfix">
<h1 class="pull-left">{{t 'namespacesPage.header'}}</h1>
<div class="vertical-middle"></div>
<div class="right-buttons">
{{#link-to "authenticated.cluster.projects.new" class="btn bg-primary btn-sm icon-btn"}}
<span class="darken">
<i class="icon icon-plus"></i>
</span>
<span>{{t 'namespacesPage.addNamespace'}}</span>
{{/link-to}}
</div>
</section>

View File

@ -3,7 +3,7 @@
<div class="vertical-middle"></div>
<div class="right-buttons">
{{#link-to "authenticated.clusters.cluster.projects.new" class="btn bg-primary btn-sm icon-btn"}}
{{#link-to "authenticated.cluster.projects.new" class="btn bg-primary btn-sm icon-btn"}}
<span class="darken">
<i class="icon icon-folder"></i>
</span>
@ -11,4 +11,4 @@
{{/link-to}}
</div>
</section>
{{project-table model=model.projects}}
{{project-table model=model.projects}}

View File

@ -1,7 +0,0 @@
import Route from '@ember/routing/route';
export default Route.extend({
redirect() {
this.transitionTo('authenticated.clusters.cluster.projects');
},
});

View File

@ -1,22 +0,0 @@
import EmberObject from '@ember/object';
import { hash } from 'rsvp';
import { inject as service } from '@ember/service';
import Route from '@ember/routing/route';
export default Route.extend({
clusterStore: service('cluster-store'),
k8s: service(),
model() {
return EmberObject.create({
stacks: [],
});
/*
return hash({
stacks: this.get('clusterStore').find('stack'),
}).then((hash) => {
return EmberObject.create(hash);
});
*/
},
});

View File

@ -1,55 +0,0 @@
{{#if projectController.showClusterWelcome}}
{{cluster-welcome}}
{{else}}
<section class="header clearfix">
<h1>{{t 'k8sPage.header'}}</h1>
</section>
<div class="row">
<div class="col span-4 text-center option option-primary">
<h2>{{t 'k8sPage.dashboard.title'}}</h2>
<div class="box" style="min-height: 250px;">
<p>{{t 'k8sPage.dashboard.detail' htmlSafe=true}}</p>
<div class="links" style="top: auto; bottom: 47px;">
<button class="btn bg-primary icon-btn" {{action "dashboard"}}>
<span class="darken"><i class="icon icon-external-link"></i></span>
<span>{{t 'k8sPage.dashboard.button'}}</span>
</button>
</div>
</div>
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/environment-dashboard.svg" class="mt-5" /></div>
</div>
<div class="col span-4 text-center option option-primary">
<h2>{{t 'k8sPage.shell.title'}}</h2>
<div class="box" style="min-height: 250px;">
<p>{{t 'k8sPage.shell.detail' htmlSafe=true}}</p>
<div class="links" style="top: auto; bottom: 47px;">
<button class="btn bg-primary icon-btn ml-10" onClick={{action "kubectl" allowedKeys="meta"}}>
<span class="darken"><i class="icon icon-terminal"></i></span>
<span>{{t 'k8sPage.shell.button'}}</span>
</button>
</div>
</div>
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/environment-shell.svg" class="mt-5" /></div>
</div>
<div class="col span-4 text-center option option-primary">
<h2>{{t 'k8sPage.configFile.title'}}</h2>
<div class="box" style="min-height: 250px;">
<p>{{t 'k8sPage.configFile.detail' htmlSafe=true}}</p>
<div class="links" style="top: auto; bottom: 47px;">
<button class="btn bg-primary icon-btn ml-10" {{action "kubeconfig"}}>
<span class="darken"><i class="icon icon-download"></i></span>
<span>{{t 'k8sPage.configFile.button'}}</span>
</button>
</div>
</div>
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/environment-config.svg" class="mt-5" /></div>
</div>
</div>
{{/if}}

View File

@ -3,7 +3,7 @@
<div class="vertical-middle"></div>
<div class="right-buttons">
{{#link-to "authenticated.clusters.cluster.projects.new" class="btn bg-primary btn-sm icon-btn"}}
{{#link-to "authenticated.cluster.projects.new" class="btn bg-primary btn-sm icon-btn"}}
<span class="darken">
<i class="icon icon-folder"></i>
</span>
@ -11,4 +11,4 @@
{{/link-to}}
</div>
</section>
{{project-table model=model.projects}}
{{project-table model=model.projects}}

View File

@ -13,9 +13,9 @@ export default Route.extend({
} else {
this.get('scope').setPageScope('cluster');
if (cluster) {
this.replaceWith('authenticated.clusters.cluster', cluster.get('id'));
this.replaceWith('authenticated.cluster', cluster.get('id'));
} else {
this.replaceWith('authenticated.clusters');
this.replaceWith('global-admin.clusters');
}
}
},

View File

@ -29,7 +29,7 @@
<h3>{{t 'helpPage.host.header'}}</h3>
<hr/>
<p>{{t 'helpPage.host.content' appName=settings.appName minVersion=settings.minDockerVersion}} <a href="{{docsLink}}/hosts/" target="_blank">{{t 'helpPage.host.contentLink'}}</a></p>
{{#link-to "authenticated.clusters.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'helpPage.host.addHostLink'}}{{/link-to}}
{{#link-to "authenticated.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'helpPage.host.addHostLink'}}{{/link-to}}
</div>
<div class="col span-4">

View File

@ -20,7 +20,7 @@
{{/if}}
{{#if scope.current.canAddHost}}
{{#link-to "authenticated.clusters.cluster.host-templates.index" scope.currentCluster.id classNames="btn btn-sm bg-primary"}}{{t 'hostsPage.index.addHost'}}{{/link-to}}
{{#link-to "authenticated.cluster.host-templates.index" scope.currentCluster.id classNames="btn btn-sm bg-primary"}}{{t 'hostsPage.index.addHost'}}{{/link-to}}
{{/if}}
</div>
</section>
@ -67,7 +67,7 @@
{{empty-table
resource="container"
showNew=scope.current.canAddHost
newRoute="authenticated.clusters.cluster.host-templates"
newRoute="authenticated.cluster.host-templates"
newTranslationKey="nav.hosts.addHost" ctx="clusterId"}}
{{/if}}
{{/if}}

View File

@ -65,41 +65,86 @@ const rootNav = [
},
// Cluster
{
scope: 'cluster',
id: 'cluster-k8s',
localizedLabel: 'nav.cluster.dashboard',
route: 'authenticated.cluster.index',
ctx: [getClusterId],
},
{
scope: 'cluster',
id: 'cluster-projects',
localizedLabel: 'nav.cluster.projects',
route: 'authenticated.clusters.cluster.projects.index',
route: 'authenticated.cluster.projects.index',
ctx: [getClusterId],
},
{
scope: 'cluster',
id: 'cluster-namespaces',
localizedLabel: 'nav.cluster.namespaces',
route: 'authenticated.cluster.namespaces.index',
ctx: [getClusterId],
},
{
scope: 'cluster',
id: 'cluster-hosts',
localizedLabel: 'nav.cluster.hosts',
route: 'authenticated.clusters.cluster.hosts',
ctx: [getClusterId],
},
{
scope: 'cluster',
id: 'cluster-k8s',
localizedLabel: 'nav.cluster.k8s',
route: 'authenticated.clusters.cluster.k8s',
route: 'authenticated.cluster.hosts',
ctx: [getClusterId],
},
{
scope: 'cluster',
id: 'cluster-networking',
localizedLabel: 'nav.cluster.networking',
route: 'authenticated.clusters.cluster.networking',
route: 'authenticated.cluster.networking',
ctx: [getClusterId],
},
{
scope: 'cluster',
id: 'cluster-storage',
localizedLabel: 'nav.cluster.storage',
route: 'authenticated.clusters.cluster.storage',
route: 'authenticated.cluster.storage',
ctx: [getClusterId],
},
// Global
{
scope: 'global',
id: 'global-clusters',
localizedLabel: 'nav.admin.clusters',
route: 'global-admin.clusters',
},
{
scope: 'global',
id: 'global-accounts',
localizedLabel: 'nav.admin.accounts',
route: 'global-admin.accounts',
},
{
scope: 'global',
id: 'global-machines',
localizedLabel: 'nav.admin.machines',
route: 'global-admin.machines',
},
{
scope: 'global',
id: 'global-roles',
localizedLabel: 'nav.admin.roles',
route: 'global-admin.roles',
},
{
scope: 'global',
id: 'global-podsecurity',
localizedLabel: 'nav.admin.podSecurityPolicies',
route: 'global-admin.policies',
},
{
scope: 'global',
id: 'global-advanced',
localizedLabel: 'nav.admin.settings.advanced',
route: 'global-admin.settings.advanced',
},
]
export function initialize(/*appInstance*/) {

View File

@ -3,6 +3,7 @@ import { equal } from '@ember/object/computed';
import { inject as service } from '@ember/service';
import Resource from 'ember-api-store/models/resource';
import PolledResource from 'ui/mixins/cattle-polled-resource';
import { hasMany } from 'ember-api-store/utils/denormalize';
var Cluster = Resource.extend(PolledResource, {
authzStore: service('authz-store'),
@ -10,11 +11,12 @@ var Cluster = Resource.extend(PolledResource, {
scope: service(),
router: service(),
type: 'cluster',
namespaces: hasMany('id', 'namespace', 'clusterId'),
projects: hasMany('id', 'project', 'clusterId'),
actions: {
edit() {
this.get('router').transitionTo('authenticated.clusters.cluster.edit', this.get('id'));
this.get('router').transitionTo('authenticated.cluster.edit', this.get('id'));
},
},

View File

@ -31,7 +31,7 @@ var Project = Resource.extend(PolledResource, {
actions: {
edit: function () {
this.get('router').transitionTo('authenticated.clusters.cluster.projects.edit', this.get('id'));
this.get('router').transitionTo('authenticated.cluster.projects.edit', this.get('id'));
},
activate: function () {

View File

@ -19,7 +19,7 @@ var Workload = Resource.extend(DisplayImage, StateCounts, EndpointPorts, {
router: service(),
namespace: reference('namespaceId'),
pods: hasMany('id', 'pod','workloadId'),
pods: hasMany('id', 'pod', 'workloadId'),
init() {
this._super(...arguments);

View File

@ -37,36 +37,33 @@ Router.map(function() {
this.route('prefs');
// Clusters
this.route('clusters', {path: '/clusters'}, function() {
// Per-Cluster
this.route('cluster', {path: '/c/:cluster_id'}, function() {
this.route('index', {path: '/'});
this.route('new', {path: '/add'}, function() {
this.route('rke');
this.route('edit');
this.route('import');
this.route('storage');
this.route('networking');
this.route('hosts');
this.route('host-new', {path: '/add-host'});
this.route('host-templates', {path: '/launch-host'}, function() {
this.route('index', {path: '/'});
this.route('launch', {path: '/:template_id'});
});
this.route('new-project', {path: '/add-project'});
this.route('project', {path: '/p/:project_id'});
this.route('cluster', {path: '/:cluster_id'}, function() {
this.route('edit');
this.route('projects', {path: '/projects'}, function() {
this.route('index', {path: '/'});
this.route('edit', {path: '/:project_id'});
this.route('new', {path: '/add'});
});
this.route('import');
this.route('k8s', {path: '/kubernetes'});
this.route('storage');
this.route('networking');
this.route('hosts');
this.route('host-new', {path: '/add-host'});
this.route('host-templates', {path: '/launch-host'}, function() {
this.route('index', {path: '/'});
this.route('launch', {path: '/:template_id'});
});
this.route('projects', {path: '/projects'}, function() {
this.route('index', {path: '/'});
this.route('edit', {path: '/:project_id'});
this.route('new', {path: '/add'});
});
this.route('namespaces', {path: '/namespaces'}, function() {
this.route('index', {path: '/'});
this.route('edit', {path: '/:namespace_id'});
this.route('new', {path: '/add'});
});
});

View File

@ -9,27 +9,29 @@
<div class="box-sm">
<p>{{t 'clustersPage.indexPage.cloud.desc'}}</p>
<div class="links" style="top: auto; bottom: 30px;">
{{#link-to "authenticated.clusters.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
{{#link-to "machines.templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
</div>
</div>
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/cluster-key.svg" class="mt-5" /></div>
</div>
<div class="col span-4 text-center option option-primary">
<h2>{{t 'clustersPage.indexPage.rke.header'}}</h2>
<div class="box-sm">
<p>{{t 'clustersPage.indexPage.rke.desc'}}</p>
<div class="links" style="top: auto; bottom: 30px;">
{{#link-to "authenticated.clusters.new.rke" class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
{{#link-to "clusters.new.rke" class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
</div>
</div>
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/environment-standard.svg" class="mt-5" /></div>
</div>
<div class="col span-4 text-center option option-disabled">
<h2>{{t 'clustersPage.indexPage.import.header'}}</h2>
<div class="box-sm">
<p>{{t 'clustersPage.indexPage.import.desc'}}</p>
<div class="links" style="top: auto; bottom: 30px;">
{{#link-to "authenticated.clusters.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
{{#link-to "machines.templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
</div>
</div>
<div class="bubble bg-body round p-10"><img src="{{app.baseAssets}}assets/images/environment-import.svg" class="mt-5" /></div>

File diff suppressed because one or more lines are too long

View File

@ -14,7 +14,7 @@ export default Ember.Route.extend({
auth: 'x509'
};
let config = clusterStore.createRecord(def);
let models = this.modelFor('authenticated.clusters.new');
let models = this.modelFor('clusters.new');
let cluster = get(models, 'cluster')
let hostTemplates = get(models, 'hostTemplates');
let machineDrivers = get(models, 'machineDrivers');

View File

@ -0,0 +1,33 @@
import EmberObject from '@ember/object';
import { inject as service } from '@ember/service';
import Route from '@ember/routing/route';
import C from 'ui/utils/constants';
import { hash/* , all */ } from 'rsvp';
export default Route.extend({
clusterStore: service('cluster-store'),
catalog: service(),
settings: service(),
model() {
let store = this.get('clusterStore');
let def = JSON.parse(this.get(`settings.${C.SETTING.CLUSTER_TEMPLATE}`)) || {};
def.type = 'cluster';
let cluster = store.createRecord(def);
return hash({
hosts: store.findAll('machine'), // this should eventually be all host with out cluster id
hostTemplates: store.findAll('machinetemplate'),
machineDrivers: store.findAll('machinedriver'),
}).then((hash) => {
return EmberObject.create({
cluster: cluster,
hosts: hash.hosts, // this should eventually be all host with out cluster id
hostTemplates: hash.hostTemplates,
machineDrivers: hash.machineDrivers,
});
});
},
});

File diff suppressed because one or more lines are too long

View File

@ -1,8 +0,0 @@
import EnvHeader from 'shared/components/page-header-environment/component';
import layout from './template';
import { inject as service } from '@ember/service';
export default EnvHeader.extend({
layout,
clusterStore: service('cluster-store'),
});

View File

@ -1,87 +0,0 @@
<a class="dropdown-toggle {{if twoLine 'two-line'}} text-white" aria-haspopup="true" aria-expanded="false" aria-label="{{t 'nav.environment.cluster'}}" data-toggle="environment">
{{#if (eq scope "project")}}
<div class="clip">
<i class="icon icon-cluster icon-fw"></i>
{{project.cluster.displayName}}
</div>
<div class="pl-15 clip text-muted">
<i class="{{project.icon}} project-icon icon-fw"></i>
{{project.displayName}}
</div>
{{else if (eq scope "cluster")}}
<div class="clip">
<i class="icon icon-cluster icon-fw"></i>
{{project.cluster.displayName}}
</div>
{{else if (eq scope "clusters")}}
<div class="clip">
{{t 'nav.environment.manage'}}
</div>
{{else if (eq scope "admin")}}
<div class="clip">
{{t 'nav.admin.tab'}}
</div>
{{else}}
<div class="clip">
<i class="icon icon-question icon-fw"></i>
{{scope}}
</div>
{{/if}}
<i class="icon icon-chevron-down chevron"></i>
<span class="sr-only">{{t 'nav.srToggleDropdown'}}</span>
</a>
<ul class="dropdown-menu cluster-menu" role="menu" data-dropdown-id="environment">
{{#if isAdmin}}
<li class="{{if (eq scope "admin") 'active selected'}}">
{{#link-to "index"}}
<i class="icon icon-globe icon-fw"></i>
{{t 'nav.admin.tab' appName=settings.appName}}
{{/link-to}}
</li>
{{/if}}
{{#if (and isOwner projects.current)}}
<li>{{#link-to-external "authenticated.clusters.project" projects.current.id class="clip"}}{{t 'nav.environment.edit' name=projects.current.displayName}}{{/link-to-external}}</li>
<li role="presentation" class="divider"></li>
{{/if}}
{{#if projectIsMissing}}
<li role="presentation" class="dropdown-header">{{t 'nav.environment.selected'}}</li>
<li class="{{if (and (eq scope "project") project.active) 'active selected'}}">
<a href="#" {{action "switchProject" project.id}} class="clip">
<i class="icon {{project.icon}}"></i>
&nbsp;
{{project.displayName}}
</a>
</li>
<li role="presentation" class="divider"></li>
{{/if}}
{{#each byCluster as |entry idx|}}
{{#if (gt idx 0)}}
<li role="presentation" class="divider"></li>
{{/if}}
<li class="header {{if entry.active (if (eq scope 'cluster') 'active selected') 'inactive'}}">
{{#link-to-external "authenticated.clusters.cluster" entry.cluster.id}}
<i class="icon icon-cluster icon-fw"></i>
&nbsp;
{{entry.cluster.displayName}}
{{/link-to-external}}
</li>
{{#each entry.projects as |p|}}
<li class="{{if (and (eq scope "project") p.active) 'active selected' (unless entry.active 'inactive')}} subitem text-muted">
<a href="#" {{action "switchProject" p.id}} class="clip project-link">
<i class="icon {{p.icon}} icon-fw"></i>
{{#if p.isDefault}}
<i class="icon icon-star-fill default-project nested"/>
{{/if}}
&nbsp;
{{p.displayName}}
</a>
</li>
{{/each}}
{{/each}}
</ul>

View File

@ -1,6 +0,0 @@
import PageHeader from 'shared/components/page-header/component';
import layout from './template';
export default PageHeader.extend({
layout,
});

View File

@ -1,129 +0,0 @@
<nav class="clearfix responsive-nav" role="navigation" id="js-responsive-nav">
<a class="nav-logo logo-{{app.mode}} btn bg-transparent"><span class="sr-only">{{settings.appName}}</span></a>
<ul class="nav-main nav-list no-inline-space">
{{page-header-environment
scope=scope
isOwner=isOwner
switchProject="switchProject"
switchNamespace="switchNamespace"}}
{{#each navTree as |item|}}
{{#if item.submenu.length}}
{{! Has a submenu }}
<li class="dropdown nav-item">
{{#if item.route}}
{{#link-to-as-attrs
item.route
models=item.ctx
qp=item.qp
moreCurrentWhen=item.moreCurrentWhen
activeParent=true
class="dropdown-toggle"
role="button"
aria-haspopup="true"
aria-expanded="false"
}}
{{maybe-t item.localizedLabel item.label}}
<span class="icon icon-chevron-down"/>
{{/link-to-as-attrs}}
{{else}}
<a class="dropdown-toggle" role="button" aria-haspopup="true" aria-expanded="false" aria-label={{maybe-t item.localizedLabel item.label}}>
{{maybe-t item.localizedLabel item.label}}
<span class="icon icon-chevron-down"/>
</a>
{{/if}}
<ul class="dropdown-menu" data-dropdown-id={{item.id}}>
{{#each item.submenu as |subitem|}}
{{#if subitem.route}}
<li>
{{#link-to-as-attrs
subitem.route
models=subitem.ctx
qp=subitem.qp
activeParent=true
moreCurrentWhen=subitem.moreCurrentWhen
submenuItem=true
}}
<i class="{{subitem.icon}}"/> {{maybe-t subitem.localizedLabel subitem.label}}
{{/link-to-as-attrs}}
</li>
{{else if subitem.divider}}
<li class="divider"></li>
{{else}}
{{! Just a label }}
<li class="dropdown-header">
<i class="{{subitem.icon}}"/> {{maybe-t subitem.localizedLabel subitem.label}}
</li>
{{/if}}
{{/each}}
</ul>
</li>
{{else if item.route}}
{{! No submenu }}
<li class="nav-item">
{{#link-to-as-attrs
item.route
models=item.ctx
qp=item.qp
activeParent=true
moreCurrentWhen=item.moreCurrentWhen
class="nav-link"
}}
{{maybe-t item.localizedLabel item.label}}
{{/link-to-as-attrs}}
</li>
{{else}}
{{! Just a label }}
<li class="dropdown-header">
{{maybe-t item.localizedLabel item.label}}
</li>
{{/if}}
{{/each}}
</ul>
<ul class="nav-user dropdown">
<li>
<a class="btn dropdown-toggle" role="button" aria-haspopup="true" aria-expanded="false" aria-label="{{t 'nav.user.label' username=session.user}}" data-toggle="header-user-menu">
{{#if accessEnabled}}
{{identity-avatar link=false identity=access.identity}}
{{else}}
<div class="gh-avatar">
<div class="gh-placeholder">
<i class="icon icon-user"></i>
</div>
</div>
{{/if}}
<span class="sr-only">{{t 'nav.srToggleDropdown'}}</span>
<i class="icon icon-chevron-down"></i>
</a>
<ul class="dropdown-menu dropdown-menu-right" data-dropdown-id="header-user-menu">
<li class="{{if (eq scope "clusters") 'active selected'}}">
{{#link-to-external "authenticated.clusters"}}{{t 'nav.environment.manage'}}{{/link-to-external}}
</li>
{{#if accessEnabled}}
<li role="presentation" class="user-auth">
{{identity-block avatar=false identity=access.identity}}
</li>
{{/if}}
{{#if isCaas}}
<li role="separator" class="divider"></li>
<li>{{#link-to-external "authenticated.clusters"}}{{t 'nav.environment.manage'}}{{/link-to-external}}</li>
{{/if}}
<li>{{#link-to-external "authenticated.prefs"}}{{t 'nav.userPreferences.link'}}{{/link-to-external}}</li>
{{#if accessEnabled}}
<li role="separator" class="divider"></li>
<li>{{#link-to-external "logout" class="user-logout"}}<i class="icon icon-logout"></i> {{t 'nav.user.logout'}}{{/link-to-external}}</li>
{{/if}}
</ul>
</li>
</ul>
</nav>

View File

@ -82,14 +82,14 @@ export default Controller.extend({
launchOnCluster(model) {
let authenticated = getOwner(this).lookup('route:authenticated');
if (this.get('scope.current.id') === model.get('defaultProject.id')) {
this.transitionToRoute('authenticated.clusters.cluster.host-templates', model.get('id'), {queryParams: {backTo: 'clusters'}});
this.transitionToRoute('authenticated.cluster.host-templates', model.get('id'), {queryParams: {backTo: 'clusters'}});
} else {
authenticated.send('switchProject', model.get("defaultProject.id"), 'authenticated.clusters.cluster.host-templates', [model.id, {queryParams: {backTo: 'clusters'}}]);
authenticated.send('switchProject', model.get("defaultProject.id"), 'authenticated.cluster.host-templates', [model.id, {queryParams: {backTo: 'clusters'}}]);
}
},
useKubernetes(model) {
let authenticated = getOwner(this).lookup('route:authenticated');
authenticated.send('switchProject', model.get("defaultProject.id"), 'authenticated.clusters.cluster.import', [model.id, {queryParams: {backTo: 'clusters'}}]);
authenticated.send('switchProject', model.get("defaultProject.id"), 'authenticated.cluster.import', [model.id, {queryParams: {backTo: 'clusters'}}]);
},
},
});

View File

@ -11,14 +11,16 @@ const Eng = Engine.extend({
dependencies: {
services: [
'access',
'router',
'authn-store',
'authz-store',
'resource-actions',
'catalog',
'cluster-store',
'endpoint',
'github',
'intl',
'modal',
'resource-actions',
'router',
'scope',
'session',
'settings',
@ -31,9 +33,8 @@ const Eng = Engine.extend({
'index',
'failWhale',
'authenticated',
'authenticated.clusters',
'authenticated.clusters.cluster',
'authenticated.clusters.project',
'authenticated.cluster',
'authenticated.project',
'authenticated.prefs',
'logout'
]

View File

@ -1,9 +1,15 @@
import EmberObject from '@ember/object';
import config from '../config/environment';
const copyKeys = ['baseAssets'];
export function initialize(application) {
// Inject the contents of ENV.APP in config/environment.js into all the things as an 'app' property
let app = EmberObject.extend(config.APP);
const data = EmberObject.create();
copyKeys.forEach((key) => {
data[key] = window.Ui[key]; // @TODO-2.0 blech
});
const app = EmberObject.extend(data);
application.register('config:app', app);
application.inject('controller','app', 'config:app');

View File

@ -6,6 +6,13 @@ export default buildRoutes(function() {
this.route('new', {path: '/add'});
});
this.route('clusters', {path: '/clusters'}, function() {
this.route('index', {path: '/'});
this.route('new', {path: '/add'}, function() {
this.route('rke');
});
});
this.route('roles', {path: '/roles'}, function() {
this.route('index', {path: '/'});
this.route('edit', {path: '/:role_id'});
@ -18,6 +25,11 @@ export default buildRoutes(function() {
this.route('new', {path: '/add'});
});
this.route('machines', {path: '/machines'}, function() {
this.route('index', {path: '/'});
this.route('templates');
});
this.route('audit-logs');
this.route('catalog');

View File

@ -7,16 +7,9 @@ export default Route.extend({
userStore: service('user-store'),
settings: service(),
scope: service(),
activate() {
if (this.get('scope.current')) {
this.get('scope').setPageScope('project');
} else if (this.get('scope.currentCluster')) {
this.get('scope').setPageScope('cluster');
}
},
redirect() {
this.transitionTo('accounts');
activate() {
this.get('scope').setPageScope('global');
},
beforeModel() {
@ -30,6 +23,7 @@ export default Route.extend({
model() {
let settings = this.get('settings');
// @TODO-2.0
return EmberObject.create({
host: '',
catalog: '',

View File

@ -1,13 +1,8 @@
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
import { inject as service } from "@ember/service";
export default Route.extend({
scope: service(),
activate() {
this._super();
this.get('scope').setPageScope('clusters');
},
clusterStore: service('cluster-store'),
model() {
var clusterStore = this.get('clusterStore');

View File

@ -2,6 +2,6 @@ import Route from '@ember/routing/route';
export default Route.extend({
redirect: function() {
this.transitionTo('accounts');
this.transitionTo('clusters');
}
});

View File

@ -1,15 +1 @@
<section>
<section class="header has-tabs clearfix p-0">
<ul class="tab-nav">
<li>{{#link-to "accounts"}}{{t 'nav.admin.accounts'}}{{/link-to}}</li>
<li>{{#link-to "roles.index" (query-params type="project")}}{{t 'nav.admin.projectRoles'}}{{/link-to}}</li>
<li>{{#link-to "roles.index" (query-params type="cluster")}}{{t 'nav.admin.clusterRoles'}}{{/link-to}}</li>
<li>{{#link-to "policies.index"}}{{t 'nav.admin.podSecurityPolicies'}}{{/link-to}}</li>
<li>{{#link-to "audit-logs"}}{{t 'nav.admin.audit'}}{{/link-to}}</li>
<li>{{#link-to "settings.auth"}}{{t 'nav.admin.settings.auth'}}{{/link-to}}</li>
<li>{{#link-to "settings.machine"}}{{t 'nav.admin.settings.machine'}}{{/link-to}}</li>
<li>{{#link-to "settings.advanced"}}{{t 'nav.admin.settings.advanced'}}{{/link-to}}</li>
</ul>
</section>
{{outlet}}
</section>
{{outlet}}

View File

@ -2,7 +2,7 @@
<h1 class="pull-left">{{t 'clustersPage.header'}}</h1> <div class="vertical-middle"></div>
<div class="right-buttons">
{{#link-to "authenticated.clusters.new" class="btn bg-primary btn-sm icon-btn"}}
{{#link-to "clusters.new" class="btn bg-primary btn-sm icon-btn"}}
<span class="darken"><i class="icon icon-cluster"></i></span>
<span>{{t 'clustersPage.newCluster'}}</span>
{{/link-to}}

View File

@ -0,0 +1 @@
Machines

View File

@ -1,3 +1,11 @@
<section class="header clearfix">
<h1>{{t 'podSecurityPoliciesPage.header'}}</h1>
<div class="right-buttons">
{{#link-to "policies.new" classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'podSecurityPoliciesPage.addPodSecurityPolicy'}} {{/link-to}}
</div>
</section>
<section class="instances">
{{#sortable-table
classNames="grid sortable-table"
@ -6,7 +14,6 @@
headers=headers
searchText=searchText
body=filtered
rightActions=true
as |sortable kind row dt|
}}
{{#if (eq kind "row")}}
@ -30,8 +37,6 @@
<td colspan="6" class="text-center text-muted lacsso pt-20 pb-20">{{t 'podSecurityPoliciesPage.index.table.noMatch'}}</td>
{{else if (eq kind "norows")}}
<td colspan="6" class="text-center text-muted lacsso pt-20 pb-20">{{t 'podSecurityPoliciesPage.index.table.noData'}}</td>
{{else if (eq kind "right-actions")}}
{{#link-to "policies.new" classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'podSecurityPoliciesPage.addPodSecurityPolicy'}} {{/link-to}}
{{/if}}
{{/sortable-table}}
</section>

View File

@ -1,3 +1,18 @@
<section class="header has-tabs clearfix p-0">
<ul class="tab-nav">
<li>{{#link-to (query-params type="project")}}{{t 'rolesPage.index.projectRoles'}}{{/link-to}}</li>
<li>{{#link-to (query-params type="cluster")}}{{t 'rolesPage.index.clusterRoles'}}{{/link-to}}</li>
</ul>
<div class="right-buttons">
{{#if (eq type "project")}}
{{#link-to "roles.new" (query-params type="project") classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'rolesPage.addProjectRole'}} {{/link-to}}
{{else if (eq type "cluster")}}
{{#link-to "roles.new" (query-params type="cluster") classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'rolesPage.addClusterRole'}} {{/link-to}}
{{/if}}
</div>
</section>
<section class="instances">
{{#sortable-table
classNames="grid sortable-table"
@ -6,7 +21,6 @@
headers=headers
searchText=searchText
body=filtered
rightActions=true
as |sortable kind row dt|
}}
{{#if (eq kind "row")}}
@ -30,12 +44,6 @@
<td colspan="6" class="text-center text-muted lacsso pt-20 pb-20">{{t 'rolesPage.index.table.noMatch'}}</td>
{{else if (eq kind "norows")}}
<td colspan="6" class="text-center text-muted lacsso pt-20 pb-20">{{t 'rolesPage.index.table.noData'}}</td>
{{else if (eq kind "right-actions")}}
{{#if (eq type "project")}}
{{#link-to "roles.new" (query-params type="project") classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'rolesPage.addProjectRole'}} {{/link-to}}
{{else if (eq type "cluster")}}
{{#link-to "roles.new" (query-params type="cluster") classNames="btn btn-sm bg-primary right-divider-btn"}} {{t 'rolesPage.addClusterRole'}} {{/link-to}}
{{/if}}
{{/if}}
{{/sortable-table}}
</section>

View File

@ -5,7 +5,7 @@
{{badge-state model=model}}
</td>
<td data-title="{{dt.name}}">
<a href="{{href-to 'authenticated.clusters.cluster' model.id}}">{{model.displayName}}</a>
{{#link-to-external 'authenticated.cluster' model.id}}{{model.displayName}}{{/link-to-external}}
</td>
{{#if (eq model.state "inactive")}}
<td colspan="4" class="text-center">

View File

@ -12,7 +12,7 @@
{{t 'clusterWelcome.embeddedDescription' appName=settings.appName htmlSafe=true}}
{{#if canCreate}}
<div class="links" style="top: auto; bottom: 30px;">
{{#link-to "authenticated.clusters.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
{{#link-to "authenticated.cluster.host-templates" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
</div>
{{/if}}
</div>
@ -51,7 +51,7 @@
{{#if canImport}}
<div class="links" style="top: auto; bottom: 30px;">
{{#link-to "authenticated.clusters.cluster.import" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
{{#link-to "authenticated.cluster.import" scope.currentCluster.id class="btn bg-primary"}}{{t 'clusterWelcome.select'}}{{/link-to}}
</div>
{{/if}}
</div>

View File

@ -294,6 +294,7 @@ export default Component.extend(NewOrEdit, {
} else if ( this.get('namespace') ) {
namespacePromise = this.get('namespace').save().then((newNamespace) => {
pr.set('namespaceId', newNamespace.get('id'));
return newNamespace.waitForState('active');
});
} else {
// This shouldn't happen since willSave checked it...

View File

@ -1,5 +1,5 @@
<div class="{{rowClass}} gutless">
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}" style="padding-right: 1%">
<div class="{{rowClass}}">
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}">
<label for="{{concat elementId '-form-name'}}" class="pb-5 acc-label">{{t nameLabel}}{{#if nameRequired}}{{field-required}}{{/if}}</label>
{{#if (and descriptionShown (not descriptionExpanded))}}
@ -12,13 +12,13 @@
{{#if nameHelpText}}<p class="text-info">{{nameHelpText}}</p>{{/if}}
</div>
{{#if hasBlock}}
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}" style="padding-left: 1%;">
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}">
{{yield}}
</div>
{{/if }}
{{#if (and descriptionShown descriptionExpanded)}}
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}" style="padding-right: 1%;">
<div class="{{if (or hasBlock descriptionExpanded) bothColClass colClass}}">
<div>
<label for="{{concat elementId '-form-description'}}" class="pb-5 acc-label desc-label">{{t descriptionLabel}}{{#if descriptionRequired}}{{field-required}}{{/if}}</label>
</div>

View File

@ -10,7 +10,6 @@
<div class="itemwrap m-10"><p>{{t 'hostTemplatesPage.new.helpText'}}</p></div>
<div class="footer">
<button role="button" class="ml-10 btn btn-sm bg-transparent" {{action (action add)}}>{{t 'hostTemplatesPage.new.btn'}}</button>
{{!-- {{#link-to "authenticated.clusters.cluster.host-new" classNames="btn bg-default"}}{{t 'hostTemplatesPage.new.btn'}}{{/link-to}} --}}
</div>
</div>
@ -36,7 +35,7 @@
{{host.description}}
</div>
{{else if (eq section 'footer')}}
<button role="button" class="btn bg-primary" {{action (action launch host)}}>{{t 'hostTemplatesPage.templateBox.button'}}</button>
<button role="button" class="btn bg-primary" {{action launch host}}>{{t 'hostTemplatesPage.templateBox.button'}}</button>
{{/if}}
{{/catalog-box}}
{{/each}}
@ -44,6 +43,6 @@
{{#unless app.isCaas}}
<div class="text-center">
<a href="#" class="ml-10 btn btn-sm bg-transparent">{{t 'hostTemplatesPage.custom'}}</a>
{{!-- {{#link-to "authenticated.clusters.cluster.host-new" (query-params driver="custom") classNames="ml-10 btn btn-sm bg-transparent"}}{{t 'hostTemplatesPage.custom'}}{{/link-to}} --}}
{{!-- {{#link-to "authenticated.cluster.host-new" (query-params driver="custom") classNames="ml-10 btn btn-sm bg-transparent"}}{{t 'hostTemplatesPage.custom'}}{{/link-to}} --}}
</div>
{{/unless}}
{{/unless}}

View File

@ -17,14 +17,17 @@ export default Component.extend(ModalBase, {
launchHostDriver: null,
launchHost: null,
addHostModel: null,
init() {
this._super(...arguments);
set(this, 'mode', 'hostTemplate');
},
actions: {
completed(cb) {
this.get('modalService').toggleModal();
},
launch(template) {
let driver = get(this, 'drivers').findBy('name', get(template, 'driver'));
this.setProperties({
@ -33,12 +36,14 @@ export default Component.extend(ModalBase, {
launchHostDriver: driver,
});
},
// cancel() {},
//
goBack() {
this.get('modalService').toggleModal();
},
add() {
let mOut =
this.setProperties({
mode: 'add',
addHostModel: {

View File

@ -17,4 +17,4 @@
}}
{{else if (eq mode 'add')}}
{{add-host allowCustom=(not app.isCaas) model=addHostModel.model driver=driver cluster=cluster hostId=hostId inModal=true completed=(action 'completed') goBack=(action 'goBack') cancel=(action 'goBack')}}
{{/if}}
{{/if}}

View File

@ -40,7 +40,7 @@ export default Component.extend(NewOrEdit, {
},
goBack: function () {
this.get('router').transitionTo('authenticated.clusters.cluster.projects.index');
this.get('router').transitionTo('authenticated.cluster.projects.index');
},
doesNameExist() {

View File

@ -15,12 +15,10 @@
nameRequired=true
nameDisabled=editing
namePlaceholder="projectsPage.new.form.name.placeholder"
colClass="col span-7"
descriptionShown=false
}}
</section>
{{#accordion-list as | al expandFn | }}
{{#accordion-list showExpandAll=false as | al expandFn | }}
{{#accordion-list-item
title="Members"
detail="Who has access to this project and what level of access they have to manipulate it."
@ -64,16 +62,6 @@
</button>
</div>
{{/accordion-list-item}}
{{#accordion-list-item
title="Namespaces"
detail="The Kubernetes namespaces that are managed by this project."
expandAll=al.expandAll
expand=(action expandFn)
expandOnInit=true
}}
Namespaces...
{{/accordion-list-item}}
{{/accordion-list}}
{{top-errors errors=errors}}

View File

@ -21,7 +21,7 @@ export default Component.extend({
actions: {
switchCluster(cluster) {
this.get('projects').setCurrentCluster(cluster).then(() => {
this.sendAction('switchCluster', cluster.id, 'authenticated.clusters.cluster', [cluster.id]);
this.sendAction('switchCluster', cluster.id, 'authenticated.cluster', [cluster.id]);
});
},
},

View File

@ -17,8 +17,9 @@
<div class="clip">
{{t 'nav.environment.manage'}}
</div>
{{else if (eq scope "admin")}}
{{else if (eq scope "global")}}
<div class="clip">
<i class="icon icon-globe icon-fw"></i>
{{t 'nav.admin.tab'}}
</div>
{{else}}
@ -33,11 +34,13 @@
</a>
<ul class="dropdown-menu cluster-menu" role="menu" data-dropdown-id="environment">
{{#if (and isOwner scope.current)}}
<li>{{#link-to "authenticated.clusters.project" scope.current.id class="clip"}}{{t 'nav.environment.edit' name=scope.current.displayName}}{{/link-to}}</li>
<li role="presentation" class="divider"></li>
{{/if}}
<li class="header {{if (eq scope "global") 'active selected'}}">
<a href="{{href-to "global-admin"}}">
<i class="icon icon-globe icon-fw"></i>
{{t 'nav.admin.tab'}}
</a>
</li>
<li role="presentation" class="divider"></li>
{{#if projectIsMissing}}
<li role="presentation" class="dropdown-header">{{t 'nav.environment.selected'}}</li>
@ -56,7 +59,7 @@
<li role="presentation" class="divider"></li>
{{/if}}
<li class="header {{if entry.active (if (eq scope 'cluster') 'active selected') 'inactive'}}">
<a href="#" {{action "switchCluster" entry.cluster 'authenticated.clusters.cluster'}}>
<a href="#" {{action "switchCluster" entry.cluster 'authenticated.cluster'}}>
<i class="icon icon-cluster icon-fw"></i>
&nbsp;
Cluster: {{entry.cluster.displayName}}

View File

@ -102,16 +102,6 @@
</a>
<ul class="dropdown-menu dropdown-menu-right" data-dropdown-id="header-user-menu">
<li class="{{if (eq scope "clusters") 'active selected'}}">
{{#link-to "authenticated.clusters"}}{{t 'nav.environment.manage'}}{{/link-to}}
</li>
{{#if isAdmin}}
<li class="">
{{#link-to "global-admin"}}{{t 'nav.admin.tab' appName=settings.appName}}{{/link-to}}
</li>
{{/if}}
{{#if accessEnabled}}
<li role="presentation" class="user-auth">
{{identity-block avatar=false identity=access.identity}}

View File

@ -2,11 +2,11 @@
&nbsp;
</td>
<td data-title="{{t 'projects.table.project.label'}}:" class="clip">
{{#link-to "authenticated.clusters.cluster.projects.edit" model.id }} {{model.name}} {{/link-to}}
{{#link-to "authenticated.project" model.id }} {{model.name}} {{/link-to}}
</td>
<td data-title="{{t 'projects.table.created.label'}}:">
{{date-calendar model.created}}
</td>
<td data-title="{{t 'generic.actions'}}:" class="actions">
{{action-menu model=model}}
</td>
</td>

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View File

@ -124,6 +124,7 @@ accountsPage:
podSecurityPoliciesPage:
index:
header: Pod Security Policies
table:
name: Name
created: Created Time
@ -517,6 +518,10 @@ certificatesPage:
description:
placeholder: e.g. EV cert for mydomain.com
namespacesPage:
header: Namespaces
addNamespace: Add Namespace
projectsPage:
header: Projects
addProject: Add Project
@ -889,7 +894,7 @@ hostsPage:
docker: Docker
instanceState: Container States
instanceStateWithIcon: States
noData: You do not have any hosts yet
noData: You do not have any nodes yet
noMatch: No hosts match the current search
new:
header:
@ -3818,11 +3823,11 @@ nav:
all: All Environments
your: Your Environments
selected: Selected Environment
manage: Manage Clusters
edit: 'Edit "{name}"'
cluster:
dashboard: Dashboard
hosts: Nodes
k8s: Kubernetes
namespaces: Namespaces
networking: Networking
storage: Storage
projects: Projects
@ -3864,15 +3869,12 @@ nav:
hooks: Webhooks
templateKeys: Template Keys
admin:
tab: Admin Settings
audit: Audit Log
processes: Processes
podSecurityPolicies: Pod Security Policies
accounts: Accounts
catalog: Catalogs
ha: HA
projectRoles: Project Roles
clusterRoles: Cluster Roles
tab: Global
accounts: Users
clusters: Clusters
machines: Machines
roles: Roles
podSecurityPolicies: PSPs
settings:
tab: Settings
auth: Access Control