From 5a4a0d418560f215a05789e7bf2978c043989b60 Mon Sep 17 00:00:00 2001 From: Vincent Fiduccia Date: Thu, 28 Dec 2017 14:36:09 -0700 Subject: [PATCH 1/3] Disable import and embedded clusters --- app/models/machine.js | 6 +++++- lib/global-admin/addon/clusters/new/index/template.hbs | 4 ++-- lib/global-admin/addon/clusters/new/rke/template.hbs | 6 +++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/models/machine.js b/app/models/machine.js index 92ff82073..33a278936 100644 --- a/app/models/machine.js +++ b/app/models/machine.js @@ -92,7 +92,11 @@ var Machine = Resource.extend(StateCounts,{ name = this.get('nodeName'); if ( name ) { - return name.replace(/\..*$/,''); + if ( name.match(/[a-z]/i) ) { + name = name.replace(/\..*$/,''); + } + + return name; } name = this.get('requestedHostname'); diff --git a/lib/global-admin/addon/clusters/new/index/template.hbs b/lib/global-admin/addon/clusters/new/index/template.hbs index 5f2bdf1ba..dd045802e 100644 --- a/lib/global-admin/addon/clusters/new/index/template.hbs +++ b/lib/global-admin/addon/clusters/new/index/template.hbs @@ -26,12 +26,12 @@
-
+

{{t 'clustersPage.indexPage.import.header'}}

{{t 'clustersPage.indexPage.import.desc'}}

diff --git a/lib/global-admin/addon/clusters/new/rke/template.hbs b/lib/global-admin/addon/clusters/new/rke/template.hbs index 7cdbe90cf..d988a61df 100644 --- a/lib/global-admin/addon/clusters/new/rke/template.hbs +++ b/lib/global-admin/addon/clusters/new/rke/template.hbs @@ -23,9 +23,9 @@ }}
-
- -

{{t 'clustersPage.addPage.rke.new.radio.embedded.detail' appName=settings.appName}}

+
+ +

{{t 'clustersPage.addPage.rke.new.radio.embedded.detail' appName=settings.appName}} — Coming Soon

From 3461fc6dfb73f284b9529ef700ae90829c52c11b Mon Sep 17 00:00:00 2001 From: Vincent Fiduccia Date: Thu, 28 Dec 2017 15:24:37 -0700 Subject: [PATCH 2/3] Node cluster --- app/models/machine.js | 3 + .../addon/machines/index/template.hbs | 2 +- .../addon/components/node-row/component.js | 50 ++++++--------- .../addon/components/node-row/template.hbs | 61 +++++-------------- translations/en-us.yaml | 1 + 5 files changed, 41 insertions(+), 76 deletions(-) diff --git a/app/models/machine.js b/app/models/machine.js index 33a278936..e43899afd 100644 --- a/app/models/machine.js +++ b/app/models/machine.js @@ -6,6 +6,7 @@ import { formatSi, parseSi, exponentNeeded } from 'shared/utils/parse-unit'; import C from 'ui/utils/constants'; import StateCounts from 'ui/mixins/state-counts'; import { inject as service } from "@ember/service"; +import { reference } from 'ember-api-store/utils/denormalize'; var Machine = Resource.extend(StateCounts,{ @@ -16,6 +17,8 @@ var Machine = Resource.extend(StateCounts,{ router: service(), clusterStore: service(), + cluster: reference('clusterId','cluster'), + init() { this._super(...arguments); this.defineStateCounts('arrangedInstances', 'instanceStates', 'instanceCountSort'); diff --git a/lib/global-admin/addon/machines/index/template.hbs b/lib/global-admin/addon/machines/index/template.hbs index ba2a7d80f..e9a74e953 100644 --- a/lib/global-admin/addon/machines/index/template.hbs +++ b/lib/global-admin/addon/machines/index/template.hbs @@ -21,7 +21,7 @@ headers=headers as |sortable kind nodes dt|}} {{#if (eq kind "row")}} {{node-row - view="cluster" + view="global" model=nodes fullColspan=sortable.fullColspan dt=dt diff --git a/lib/shared/addon/components/node-row/component.js b/lib/shared/addon/components/node-row/component.js index e571439d5..071dd987a 100644 --- a/lib/shared/addon/components/node-row/component.js +++ b/lib/shared/addon/components/node-row/component.js @@ -1,16 +1,10 @@ -import { or, equal, not, alias } from '@ember/object/computed'; +import { or } from '@ember/object/computed'; +import { get, computed } from '@ember/object'; import Component from '@ember/component'; import layout from './template'; import { inject as service } from '@ember/service' export const headersAll = [ - { - name: 'expand', - sort: false, - searchField: null, - width: 30, - views: ['project'], - }, { name: 'state', sort: ['sortState','displayName'], @@ -24,6 +18,13 @@ export const headersAll = [ searchField: 'displayName', translationKey: 'generic.name', }, + { + name: 'cluster', + sort: ['cluster.displayName','name','id'], + searchField: 'cluster.displayName', + translationKey: 'nodesPage.table.clusterName', + views: ['global'], + }, { name: 'ip', sort: ['displayIp','displayName'], @@ -54,21 +55,16 @@ export const headersAll = [ translationKey: 'nodesPage.table.pod', views: ['cluster','global'], }, - { - name: 'instanceState', - sort: ['instanceCountSort:desc','displayName'], - searchField: null, - width: 140, - icon: 'icon icon-lg icon-container', - dtTranslationKey: 'nodesPage.table.instanceState', - translationKey: 'nodesPage.table.instanceStateWithIcon', - views: ['project'], - }, ]; -export const headersProject = headersAll.filter((x) => !x.views || x.views.includes('project')); -export const headersCluster = headersAll.filter((x) => !x.views || x.views.includes('cluster')); -export const headersGlobal = headersAll.filter((x) => !x.views || x.views.includes('global' )); +const headersMap = { + all: headersAll, + global: headersAll.filter((x) => !x.views || x.views.includes('global' )), + cluster: headersAll.filter((x) => !x.views || x.views.includes('cluster')), +}; + +export const headersCluster = headersMap.cluster; +export const headersGlobal = headersMap.global; export default Component.extend({ layout, @@ -83,15 +79,9 @@ export default Component.extend({ showLabelRow: or('model.displayUserLabelStrings.length','model.requireAnyLabelStrings.length'), - isGlobal: equal('view', 'global'), - isCluster: equal('view','cluster'), - isProject: equal('view','project'), - - showExpand: alias('isProject'), - linkName: alias('isProject'), - showInstanceStates: alias('isProject'), - showCpu: not('isProject'), - showPod: not('isProject'), + showCluster: computed('view', function() { + return !!headersMap[get(this,'view')].findBy('name','cluster'); + }), actions: { toggle() { diff --git a/lib/shared/addon/components/node-row/template.hbs b/lib/shared/addon/components/node-row/template.hbs index 1c36ed54b..957f9d0f7 100644 --- a/lib/shared/addon/components/node-row/template.hbs +++ b/lib/shared/addon/components/node-row/template.hbs @@ -3,12 +3,6 @@ {{check-box nodeId=model.id}} - {{#if showExpand}} - - Open accordion - - {{/if}} - {{badge-state model=model}} @@ -27,56 +21,33 @@ {{/each}} + {{#if showCluster}} + + {{#if model.cluster}} + {{model.cluster.displayName}} + {{else}} + {{t 'generic.none'}} + {{/if}} + + {{/if}} + {{#copy-inline clipboardText=model.displayIp size="small"}} {{format-ip model.displayIp}} {{/copy-inline}} - {{#if showCpu}} - - {{model.cpuUsage}} - - {{/if}} + + {{model.cpuUsage}} + {{model.memoryUsage}} - {{#if showPod}} - - {{model.podUsage}} - - {{/if}} - - {{#if showInstanceStates}} - -
- {{progress-bar-multi - labelKey="state" - valueKey="count" - values=model.instanceStates.byColor - tooltipValues=model.instanceStates.byName - }} - -

- - {{#if subMatches}} - {{#if (eq (get subMatches model.id) 0)}} - {{t 'pagination.containerNoSubset' count=model.arrangedInstances.length htmlSafe=true}} - {{else if (lt (get subMatches model.id) model.arrangedInstances.length)}} - {{t 'pagination.containerHighlightSubset' subset=(get subMatches model.id) count=model.arrangedInstances.length htmlSafe=true}} - {{else}} - {{t 'pagination.container' pages=1 count=model.arrangedInstances.length}} - {{/if}} - {{else}} - {{t 'pagination.container' pages=1 count=(concat model.arrangedInstances.length "")}} - {{/if}} - -

-
- - {{/if}} + + {{model.podUsage}} + {{action-menu model=model showPrimary=false}} diff --git a/translations/en-us.yaml b/translations/en-us.yaml index aaf84fa59..5cd956cb6 100644 --- a/translations/en-us.yaml +++ b/translations/en-us.yaml @@ -924,6 +924,7 @@ nodesPage: header: Nodes addNode: Add Node table: + clusterName: Cluster cpu: CPU memory: RAM disk: Disk From c55217335e892d93ea3e4909628caf424600f0a0 Mon Sep 17 00:00:00 2001 From: Vincent Fiduccia Date: Fri, 29 Dec 2017 18:44:55 -0700 Subject: [PATCH 3/3] Secrets --- .../cluster/nodes/index/template.hbs | 1 - .../cluster/ns/index/template.hbs | 1 - .../project/apikeys/account/template.hbs | 1 - .../project/apikeys/project/template.hbs | 1 - .../project/hooks/index/template.hbs | 1 - app/balancers/index/template.hbs | 1 - app/certificates/index/template.hbs | 1 - app/containers/index/template.hbs | 1 - app/dns/index/template.hbs | 1 - app/host/template.hbs | 1 - app/hosts/index/template.hbs | 1 - app/initializers/extend-ember-input.js | 2 +- app/models/secret.js | 17 +++- app/registries/index/template.hbs | 1 - app/router.js | 4 +- app/secrets/detail/edit/controller.js | 13 +++ app/secrets/detail/edit/route.js | 16 +++ app/secrets/detail/edit/template.hbs | 7 ++ app/secrets/detail/index/template.hbs | 4 + app/secrets/detail/route.js | 20 ++++ app/secrets/index/controller.js | 13 +++ app/secrets/index/template.hbs | 12 ++- app/secrets/new/template.hbs | 2 +- app/stack/index/template.hbs | 4 - app/styles/_rancher.scss | 1 + app/styles/components/_forms.scss | 5 +- app/styles/fonts/_dots.scss | 12 +++ app/volume/template.hbs | 1 - app/volumes/index/template.hbs | 1 - .../addon/accounts/detail/template.hbs | 4 +- .../addon/accounts/edit/template.hbs | 3 +- .../addon/accounts/index/template.hbs | 1 - .../addon/accounts/new/template.hbs | 1 - lib/global-admin/addon/catalog/template.hbs | 1 - .../addon/clusters/index/template.hbs | 15 ++- .../addon/clusters/new/rke/template.hbs | 1 - .../addon/machines/index/template.hbs | 1 - .../security/policies/index/template.hbs | 1 - .../addon/security/roles/index/template.hbs | 1 - .../addon/components/action-menu/component.js | 8 +- .../components/container-table/template.hbs | 1 - .../form-container-links/template.hbs | 1 - .../components/containers-header/template.hbs | 6 +- .../components/form-key-value/component.js | 17 +++- .../components/form-key-value/template.hbs | 4 +- .../components/new-edit-secret/component.js | 57 +++++++++-- .../components/new-edit-secret/template.hbs | 70 +++++++++++-- .../addon/components/pod-row/template.hbs | 4 +- .../components/project-table/template.hbs | 1 - .../project-template-list/template.hbs | 1 - .../components/public-endpoints/template.hbs | 1 - .../addon/components/secret-row/template.hbs | 12 ++- .../addon/components/service-log/template.hbs | 1 - .../components/sortable-table/template.hbs | 29 +----- .../components/textarea-autogrow/component.js | 1 + .../addon/components/volume-row/template.hbs | 1 - .../components/workload-row/template.hbs | 4 +- lib/shared/addon/helpers/date-from-now.js | 5 +- lib/shared/addon/mixins/subscribe.js | 2 +- lib/shared/addon/mixins/view-new-edit.js | 49 +++++++++ lib/shared/addon/resource-actions/service.js | 11 +- translations/en-us.yaml | 29 ++++-- vendor/dotsfont/OFL.txt | 95 ++++++++++++++++++ vendor/dotsfont/dotsfont.woff | Bin 0 -> 2548 bytes vendor/dotsfont/readme.md | 36 +++++++ 65 files changed, 488 insertions(+), 133 deletions(-) create mode 100644 app/secrets/detail/edit/controller.js create mode 100644 app/secrets/detail/edit/route.js create mode 100644 app/secrets/detail/edit/template.hbs create mode 100644 app/secrets/detail/index/template.hbs create mode 100644 app/secrets/detail/route.js create mode 100644 app/styles/fonts/_dots.scss create mode 100644 lib/shared/addon/mixins/view-new-edit.js create mode 100644 vendor/dotsfont/OFL.txt create mode 100644 vendor/dotsfont/dotsfont.woff create mode 100644 vendor/dotsfont/readme.md diff --git a/app/authenticated/cluster/nodes/index/template.hbs b/app/authenticated/cluster/nodes/index/template.hbs index 1d7fae308..e2a15c185 100644 --- a/app/authenticated/cluster/nodes/index/template.hbs +++ b/app/authenticated/cluster/nodes/index/template.hbs @@ -19,7 +19,6 @@ sortBy=sortBy bulkActions=true subRows=true - fullRows=true pagingLabel="pagination.node" extraSearchFields=extraSearchFields headers=headers as |sortable kind node dt|}} diff --git a/app/authenticated/cluster/ns/index/template.hbs b/app/authenticated/cluster/ns/index/template.hbs index f6fabebfa..177b37413 100644 --- a/app/authenticated/cluster/ns/index/template.hbs +++ b/app/authenticated/cluster/ns/index/template.hbs @@ -20,7 +20,6 @@ bulkActions=true body=rows sortBy=sortBy - fullRows=true as |sortable kind obj dt| }} {{#if (eq kind "row")}} diff --git a/app/authenticated/project/apikeys/account/template.hbs b/app/authenticated/project/apikeys/account/template.hbs index a720a65db..1c2558dca 100644 --- a/app/authenticated/project/apikeys/account/template.hbs +++ b/app/authenticated/project/apikeys/account/template.hbs @@ -36,7 +36,6 @@ sortBy=sortBy headers=headers body=filtered - fullRows=true as |sortable kind key| }} {{#if (eq kind "row")}} diff --git a/app/authenticated/project/apikeys/project/template.hbs b/app/authenticated/project/apikeys/project/template.hbs index 1763ce179..533ea0d22 100644 --- a/app/authenticated/project/apikeys/project/template.hbs +++ b/app/authenticated/project/apikeys/project/template.hbs @@ -35,7 +35,6 @@ sortBy=sortBy headers=headers body=arranged - fullRows=true as |sortable kind key| }} {{#if (eq kind "row")}} diff --git a/app/authenticated/project/hooks/index/template.hbs b/app/authenticated/project/hooks/index/template.hbs index 6d569ae4f..8226cf7a9 100644 --- a/app/authenticated/project/hooks/index/template.hbs +++ b/app/authenticated/project/hooks/index/template.hbs @@ -19,7 +19,6 @@ sortBy=sortBy headers=headers body=model.receivers - fullRows=true as |sortable kind row| }} {{#if (eq kind "row")}} diff --git a/app/balancers/index/template.hbs b/app/balancers/index/template.hbs index 53fce7a1b..f5003c3b4 100644 --- a/app/balancers/index/template.hbs +++ b/app/balancers/index/template.hbs @@ -15,7 +15,6 @@ sortBy=sortBy bulkActions=true subRows=true - fullRows=true groupByKey=groupTableBy groupByRef="stack" pagingLabel="pagination.loadBalancer" diff --git a/app/certificates/index/template.hbs b/app/certificates/index/template.hbs index 24db6e3f0..dd0ad26c2 100644 --- a/app/certificates/index/template.hbs +++ b/app/certificates/index/template.hbs @@ -18,7 +18,6 @@ sortBy=sortBy headers=headers body=model - fullRows=true as |sortable kind cert| }} {{#if (eq kind "row")}} diff --git a/app/containers/index/template.hbs b/app/containers/index/template.hbs index a8c7c67e5..8c57e5bd5 100644 --- a/app/containers/index/template.hbs +++ b/app/containers/index/template.hbs @@ -16,7 +16,6 @@ sortBy=sortBy bulkActions=true subRows=true - fullRows=true groupByKey=groupTableBy groupByRef="namespace" extraGroups=emptyNamespaces diff --git a/app/dns/index/template.hbs b/app/dns/index/template.hbs index 0fe315d35..b86eff0c5 100644 --- a/app/dns/index/template.hbs +++ b/app/dns/index/template.hbs @@ -15,7 +15,6 @@ sortBy=sortBy bulkActions=true subRows=true - fullRows=true groupByKey=groupTableBy groupByRef="namespace" pagingLabel="pagination.dnsRecord" diff --git a/app/host/template.hbs b/app/host/template.hbs index 560eeac2f..c2e0bd85f 100644 --- a/app/host/template.hbs +++ b/app/host/template.hbs @@ -253,7 +253,6 @@ descending=descending headers=storageHeaders body=nonRootVolumes - fullRows=true as |sortable kind volume| }} {{#if (eq kind "row")}} diff --git a/app/hosts/index/template.hbs b/app/hosts/index/template.hbs index 0c1b4021c..9f8897484 100644 --- a/app/hosts/index/template.hbs +++ b/app/hosts/index/template.hbs @@ -34,7 +34,6 @@ sortBy=sortBy bulkActions=true subRows=true - fullRows=true pagingLabel="pagination.host" subHeaders=containerHeaders subSearchField="arrangedInstances" diff --git a/app/initializers/extend-ember-input.js b/app/initializers/extend-ember-input.js index d2dc5a250..0b45ccf13 100644 --- a/app/initializers/extend-ember-input.js +++ b/app/initializers/extend-ember-input.js @@ -11,7 +11,7 @@ export function initialize(/*application */) { // Disable iOS auto-capitalization TextField.reopen({ - attributeBindings: ['autocapitalize'], + attributeBindings: ['autocapitalize','spellcheck','autocomplete'], autocapitalize: 'none', }); } diff --git a/app/models/secret.js b/app/models/secret.js index acf49e0ab..b1c0483a7 100644 --- a/app/models/secret.js +++ b/app/models/secret.js @@ -1,19 +1,32 @@ import { inject as service } from '@ember/service'; +import { alias } from '@ember/object/computed'; +import { computed, get } from '@ember/object'; import Resource from 'ember-api-store/models/resource'; export default Resource.extend({ modalService: service('modal'), + router: service(), + + state: 'active', actions: { - edit: function() { - this.get('modalService').toggleModal('modal-edit-secret', this); + edit: function(act) { + this.get('router').transitionTo('secrets.detail.edit', this.get('id')); }, }, + keys: computed('data', function() { + return Object.keys(get(this, 'data')).sort(); + }), + + firstKey: alias('keys.firstObject'), + availableActions: function() { var l = this.get('links'); var choices = [ + { label: 'action.edit', icon: 'icon icon-edit', action: 'edit', enabled: !!l.update }, + { divider: true }, { label: 'action.remove', icon: 'icon icon-trash', action: 'promptDelete', enabled: !!l.remove, altAction: 'delete', bulkable: true }, { divider: true }, { label: 'action.viewInApi', icon: 'icon icon-external-link', action: 'goToApi', enabled: true }, diff --git a/app/registries/index/template.hbs b/app/registries/index/template.hbs index 1970ed00e..30cf56a84 100644 --- a/app/registries/index/template.hbs +++ b/app/registries/index/template.hbs @@ -18,7 +18,6 @@ sortBy=sortBy headers=headers body=model - fullRows=true as |sortable kind registry| }} {{#if (eq kind "row")}} diff --git a/app/router.js b/app/router.js index fb79b2ecc..ebe4c93e4 100644 --- a/app/router.js +++ b/app/router.js @@ -144,7 +144,9 @@ Router.map(function() { this.route('secrets', {path: '/secrets', resetNamespace: true}, function() { this.route('new', {path: '/add'}); this.route('index', {path: '/'}); - this.route('detail', {path: '/:secret_id'}); + this.route('detail', {path: '/:secret_id'}, function() { + this.route('edit'); + }); }); }); diff --git a/app/secrets/detail/edit/controller.js b/app/secrets/detail/edit/controller.js new file mode 100644 index 000000000..316849c26 --- /dev/null +++ b/app/secrets/detail/edit/controller.js @@ -0,0 +1,13 @@ +import Controller from '@ember/controller'; + +export default Controller.extend({ + actions: { + done() { + this.send('goToPrevious'); + }, + + cancel() { + this.send('goToPrevious'); + } + }, +}); diff --git a/app/secrets/detail/edit/route.js b/app/secrets/detail/edit/route.js new file mode 100644 index 000000000..2912f1dc1 --- /dev/null +++ b/app/secrets/detail/edit/route.js @@ -0,0 +1,16 @@ +import Route from '@ember/routing/route'; +import { get, set } from '@ember/object'; + +export default Route.extend({ + model: function(params) { + const original = this.modelFor('secrets.detail'); + set(this, 'originalModel', original); + + return original.clone(); + }, + + setupController(controller, model) { + this._super(...arguments); + set(controller,'originalModel', this.modelFor('secrets.detail')); + } +}); diff --git a/app/secrets/detail/edit/template.hbs b/app/secrets/detail/edit/template.hbs new file mode 100644 index 000000000..f97b377ce --- /dev/null +++ b/app/secrets/detail/edit/template.hbs @@ -0,0 +1,7 @@ +{{new-edit-secret + originalModel=originalModel + model=model + mode="edit" + done=(action "done") + cancel=(action "cancel") +}} diff --git a/app/secrets/detail/index/template.hbs b/app/secrets/detail/index/template.hbs new file mode 100644 index 000000000..18817b151 --- /dev/null +++ b/app/secrets/detail/index/template.hbs @@ -0,0 +1,4 @@ +{{new-edit-secret + mode="view" + model=model +}} diff --git a/app/secrets/detail/route.js b/app/secrets/detail/route.js new file mode 100644 index 000000000..52543b4a5 --- /dev/null +++ b/app/secrets/detail/route.js @@ -0,0 +1,20 @@ +import Route from '@ember/routing/route'; +import { get } from '@ember/object'; + +export default Route.extend({ + model: function(params) { + const all = this.modelFor('secrets'); + + let secret = all.projectSecrets.findBy('id', params.secret_id); + if ( secret ) { + return secret; + } + + secret = all.namespacedSecrets.findBy('id', params.secret_id); + if ( secret ) { + return secret; + } + + return get(this, 'store').find('secret', params.secret_id); + }, +}); diff --git a/app/secrets/index/controller.js b/app/secrets/index/controller.js index 8cd5fdb26..df7153788 100644 --- a/app/secrets/index/controller.js +++ b/app/secrets/index/controller.js @@ -37,12 +37,25 @@ export default Controller.extend({ translationKey: 'generic.description', sort: ['description','name','id'], }, + { + name: 'namespace', + translationKey: 'generic.namespace', + searchField: 'namespace.displayName', + sort: ['namespace.displayName','name','id'], + }, + { + name: 'keys', + translationKey: 'secretsPage.table.keys', + searchField: 'keys', + sort: ['firstKey','name','id'], + }, { name: 'created', translationKey: 'generic.created', sort: ['created:desc','name','id'], searchField: false, type: 'string', + width: 150, }, ], diff --git a/app/secrets/index/template.hbs b/app/secrets/index/template.hbs index dd2decf2a..86afdb515 100644 --- a/app/secrets/index/template.hbs +++ b/app/secrets/index/template.hbs @@ -4,6 +4,16 @@
+
+ {{#tooltip-element type="tooltip-basic" model=(t 'nav.group.none') tooltipTemplate='tooltip-static' aria-describedby="tooltip-base" tooltipFor="tooltipLink"}} + {{#link-to (query-params group="none") classNames="btn btn-sm bg-default"}}{{/link-to}} + {{/tooltip-element}} + + {{#tooltip-element type="tooltip-basic" model=(t 'nav.group.namespace') tooltipTemplate='tooltip-static' aria-describedby="tooltip-base" tooltipFor="tooltipLink"}} + {{#link-to (query-params group="namespace") classNames="btn btn-sm bg-default"}}{{/link-to}} + {{/tooltip-element}} +
+ {{#link-to "secrets.new" classNames="btn btn-sm bg-primary" disabled=scope.current.isKubernetes}}{{t 'secretsPage.index.linkTo'}}{{/link-to}}
@@ -21,7 +31,7 @@ {{#if (eq kind "row")}} {{secret-row model=row}} {{else if (eq kind "group")}} - {{namespace-group model=inst.ref fullColspan=sortable.fullColspan showState=true}} + {{namespace-group model=row.ref noGroup="namespaceGroup.project" fullColspan=sortable.fullColspan}} {{else if (eq kind "nomatch")}} {{t 'secretsPage.index.noMatch'}} {{else if (eq kind "norows")}} diff --git a/app/secrets/new/template.hbs b/app/secrets/new/template.hbs index 1121b0e84..b05d480b5 100644 --- a/app/secrets/new/template.hbs +++ b/app/secrets/new/template.hbs @@ -1,5 +1,5 @@ {{new-edit-secret - editing=false + mode="new" model=model cancel=(action "cancel") }} diff --git a/app/stack/index/template.hbs b/app/stack/index/template.hbs index dfd470547..9fcfa3865 100644 --- a/app/stack/index/template.hbs +++ b/app/stack/index/template.hbs @@ -37,7 +37,6 @@ sortBy=sortBy bulkActions=true subRows=true - fullRows=true pagingLabel="pagination.workload" subSearchField="instances" extraSearchFields=extraSearchFields @@ -84,7 +83,6 @@ body=loadBalancers bulkActions=true classNames="grid sortable-table" - fullRows=true pagingLabel="pagination.container" searchText=searchText sortBy=sortBy @@ -131,7 +129,6 @@ subHeaders=containerHeaders subSearchField="instances" bulkActions=true - fullRows=true pagingLabel="pagination.container" headers=dnsHeaders as |sortable kind serv dt|}} @@ -165,7 +162,6 @@ body=model.volumes bulkActions=true classNames="grid sortable-table" - fullRows=true isVisible=parent.expanded pagingLabel="pagination.volume" searchText=searchText diff --git a/app/styles/_rancher.scss b/app/styles/_rancher.scss index dd7cb6ca8..61829d2e3 100644 --- a/app/styles/_rancher.scss +++ b/app/styles/_rancher.scss @@ -9,6 +9,7 @@ @import "app/styles/fonts/prompt"; @import "app/styles/fonts/icons"; @import "app/styles/fonts/zerowidthspace"; +@import "app/styles/fonts/dots"; @import "app/styles/base/base"; @import "app/styles/base/color"; @import "app/styles/base/typography"; diff --git a/app/styles/components/_forms.scss b/app/styles/components/_forms.scss index 729307cc7..0014dbbbf 100644 --- a/app/styles/components/_forms.scss +++ b/app/styles/components/_forms.scss @@ -266,7 +266,10 @@ input.input-sm, .input-group.input-sm .input-group-addon { padding: 3px 8px; font-size: 0.87em; - max-height: 32px; + + &:not(textarea) { + max-height: 32px; + } } .input-lg, diff --git a/app/styles/fonts/_dots.scss b/app/styles/fonts/_dots.scss new file mode 100644 index 000000000..288dec764 --- /dev/null +++ b/app/styles/fonts/_dots.scss @@ -0,0 +1,12 @@ +@font-face { + font-family: 'dotsfont'; + font-weight: normal; + font-style: normal; + src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); +} + +.conceal:not(:invalid):not(:active):not(:focus) { + font-family: 'dotsfont'; +} + + diff --git a/app/volume/template.hbs b/app/volume/template.hbs index 292263547..958c4133b 100644 --- a/app/volume/template.hbs +++ b/app/volume/template.hbs @@ -79,7 +79,6 @@ classNames="grid fixed mb-0 sortable-table" bulkActions=false pagingLabel="pagination.mount" - fullRows=true rowActions=false search=true sortBy=sortBy diff --git a/app/volumes/index/template.hbs b/app/volumes/index/template.hbs index 49593edbe..5b23d3da8 100644 --- a/app/volumes/index/template.hbs +++ b/app/volumes/index/template.hbs @@ -15,7 +15,6 @@ sortBy=sortBy bulkActions=true subRows=true - fullRows=true groupByKey=groupTableBy groupByRef="stack" pagingLabel="pagination.volume" diff --git a/lib/global-admin/addon/accounts/detail/template.hbs b/lib/global-admin/addon/accounts/detail/template.hbs index afbd6bb19..3e36a8130 100644 --- a/lib/global-admin/addon/accounts/detail/template.hbs +++ b/lib/global-admin/addon/accounts/detail/template.hbs @@ -74,7 +74,6 @@ search=false sortBy=sortBy bulkActions=false - fullRows=true pagingLabel="pagination.node" headers=projectHeaders as |sortable kind role dt|}} {{#if (eq kind "row")}} @@ -107,7 +106,6 @@ search=false sortBy=sortBy bulkActions=false - fullRows=true pagingLabel="pagination.node" headers=clusterHeaders as |sortable kind role dt|}} {{#if (eq kind "row")}} @@ -133,4 +131,4 @@ -{{top-errors errors=errors}} \ No newline at end of file +{{top-errors errors=errors}} diff --git a/lib/global-admin/addon/accounts/edit/template.hbs b/lib/global-admin/addon/accounts/edit/template.hbs index cc5aa6790..7d172f11d 100644 --- a/lib/global-admin/addon/accounts/edit/template.hbs +++ b/lib/global-admin/addon/accounts/edit/template.hbs @@ -61,7 +61,6 @@ search=false sortBy=sortBy bulkActions=false - fullRows=true pagingLabel="pagination.node" headers=headers as |sortable kind role dt|}} {{#if (eq kind "row")}} @@ -85,4 +84,4 @@ {{top-errors errors=errors}} -{{save-cancel save="doSave" createLabel="generic.save" cancel="cancel"}} \ No newline at end of file +{{save-cancel save="doSave" createLabel="generic.save" cancel="cancel"}} diff --git a/lib/global-admin/addon/accounts/index/template.hbs b/lib/global-admin/addon/accounts/index/template.hbs index ea819dd4e..d884f6b22 100644 --- a/lib/global-admin/addon/accounts/index/template.hbs +++ b/lib/global-admin/addon/accounts/index/template.hbs @@ -9,7 +9,6 @@
{{#sortable-table classNames="grid sortable-table" - fullRows=true sortBy=sortBy headers=headers body=model diff --git a/lib/global-admin/addon/accounts/new/template.hbs b/lib/global-admin/addon/accounts/new/template.hbs index edb99de59..31ebf837e 100644 --- a/lib/global-admin/addon/accounts/new/template.hbs +++ b/lib/global-admin/addon/accounts/new/template.hbs @@ -59,7 +59,6 @@ search=false sortBy=sortBy bulkActions=false - fullRows=true pagingLabel="pagination.node" headers=headers as |sortable kind role dt|}} {{#if (eq kind "row")}} diff --git a/lib/global-admin/addon/catalog/template.hbs b/lib/global-admin/addon/catalog/template.hbs index 9f232d8ea..b4aa7d827 100644 --- a/lib/global-admin/addon/catalog/template.hbs +++ b/lib/global-admin/addon/catalog/template.hbs @@ -55,7 +55,6 @@ headers=headers body=custom sortBy=sortBy - fullRows=true rightActions=true as |sortable kind row dt| }} diff --git a/lib/global-admin/addon/clusters/index/template.hbs b/lib/global-admin/addon/clusters/index/template.hbs index 4a62fe7c8..e224dde71 100644 --- a/lib/global-admin/addon/clusters/index/template.hbs +++ b/lib/global-admin/addon/clusters/index/template.hbs @@ -10,14 +10,13 @@
{{#sortable-table - classNames="grid sortable-table" - body=model.clusters - searchText=searchText - sortBy=sortBy - bulkActions=true - fullRows=true - pagingLabel="pagination.cluster" - headers=headers as |sortable kind inst dt| + classNames="grid sortable-table" + body=model.clusters + searchText=searchText + sortBy=sortBy + bulkActions=true + pagingLabel="pagination.cluster" + headers=headers as |sortable kind inst dt| }} {{#if (eq kind "row")}} {{cluster-row diff --git a/lib/global-admin/addon/clusters/new/rke/template.hbs b/lib/global-admin/addon/clusters/new/rke/template.hbs index d988a61df..250ef4d12 100644 --- a/lib/global-admin/addon/clusters/new/rke/template.hbs +++ b/lib/global-admin/addon/clusters/new/rke/template.hbs @@ -50,7 +50,6 @@ body=filteredMachines searchText=searchText sortBy=sortBy - fullRows=true suffix=true bulkActions=false rowActions=false diff --git a/lib/global-admin/addon/machines/index/template.hbs b/lib/global-admin/addon/machines/index/template.hbs index e9a74e953..cfa2672fa 100644 --- a/lib/global-admin/addon/machines/index/template.hbs +++ b/lib/global-admin/addon/machines/index/template.hbs @@ -16,7 +16,6 @@ searchText=searchText sortBy=sortBy bulkActions=true - fullRows=true pagingLabel="pagination.node" headers=headers as |sortable kind nodes dt|}} {{#if (eq kind "row")}} diff --git a/lib/global-admin/addon/security/policies/index/template.hbs b/lib/global-admin/addon/security/policies/index/template.hbs index 2a4ed3e2c..3a3839adc 100644 --- a/lib/global-admin/addon/security/policies/index/template.hbs +++ b/lib/global-admin/addon/security/policies/index/template.hbs @@ -5,7 +5,6 @@
{{#sortable-table classNames="grid sortable-table" - fullRows=true sortBy=sortBy headers=headers searchText=searchText diff --git a/lib/global-admin/addon/security/roles/index/template.hbs b/lib/global-admin/addon/security/roles/index/template.hbs index b75e2dde4..da47cf230 100644 --- a/lib/global-admin/addon/security/roles/index/template.hbs +++ b/lib/global-admin/addon/security/roles/index/template.hbs @@ -5,7 +5,6 @@
{{#sortable-table classNames="grid sortable-table" - fullRows=true sortBy=sortBy headers=headers searchText=searchText diff --git a/lib/shared/addon/components/action-menu/component.js b/lib/shared/addon/components/action-menu/component.js index 33366cc5a..b85632570 100644 --- a/lib/shared/addon/components/action-menu/component.js +++ b/lib/shared/addon/components/action-menu/component.js @@ -7,6 +7,7 @@ export default Component.extend({ model : null, size : 'xs', inTooltip : false, + context : null, resourceActions : service('resource-actions'), @@ -39,12 +40,7 @@ export default Component.extend({ this.get('resourceActions').set('tooltipActions', false); } - this.get('resourceActions').show(this.get('model'), more, this.$(), offsets); + this.get('resourceActions').show(this.get('model'), more, this.$(), offsets, this.get('context')); } }, - - sendToModel(action) { - this.get('tooltipService').leave(); - this.get('model').send(action); - }, }); diff --git a/lib/shared/addon/components/container-table/template.hbs b/lib/shared/addon/components/container-table/template.hbs index 8bc7241a8..3d04c41e7 100644 --- a/lib/shared/addon/components/container-table/template.hbs +++ b/lib/shared/addon/components/container-table/template.hbs @@ -12,7 +12,6 @@ subRow=subRow subRows=subRows pagingLabel=pagingLabel - fullRows=true headers=headers as |sortable kind inst dt|}} {{#if (eq kind "row")}} {{pod-row model=inst dt=dt bulkActions=bulkActions showNode=showNode showActions=true showPrimaryActions=false fullColspan=sortable.fullColspan subRow=subRow}} diff --git a/lib/shared/addon/components/container/form-container-links/template.hbs b/lib/shared/addon/components/container/form-container-links/template.hbs index 2b657cfd9..3c6f47b57 100644 --- a/lib/shared/addon/components/container/form-container-links/template.hbs +++ b/lib/shared/addon/components/container/form-container-links/template.hbs @@ -47,7 +47,6 @@ classNames="grid sortable-table" body=linksArray bulkActions=false - fullRows=true pagingLabel="pagination.link" headers=headers as |sortable kind row dt|}} {{#if (eq kind "row")}} diff --git a/lib/shared/addon/components/containers-header/template.hbs b/lib/shared/addon/components/containers-header/template.hbs index ccfdd8a35..2f1f03b26 100644 --- a/lib/shared/addon/components/containers-header/template.hbs +++ b/lib/shared/addon/components/containers-header/template.hbs @@ -38,15 +38,15 @@ {{#if showGroup}}
- {{#tooltip-element type="tooltip-basic" model=(t 'nav.containers.groupNone') tooltipTemplate='tooltip-static' aria-describedby="tooltip-base" tooltipFor="tooltipLink"}} + {{#tooltip-element type="tooltip-basic" model=(t 'nav.group.none') tooltipTemplate='tooltip-static' aria-describedby="tooltip-base" tooltipFor="tooltipLink"}} {{#link-to (query-params group="none") classNames="btn btn-sm bg-default"}}{{/link-to}} {{/tooltip-element}} - {{#tooltip-element type="tooltip-basic" model=(t 'nav.containers.groupService') tooltipTemplate='tooltip-static' aria-describedby="tooltip-base" tooltipFor="tooltipLink"}} + {{#tooltip-element type="tooltip-basic" model=(t 'nav.group.workload') tooltipTemplate='tooltip-static' aria-describedby="tooltip-base" tooltipFor="tooltipLink"}} {{#link-to (query-params group="workload") classNames="btn btn-sm bg-default"}}{{/link-to}} {{/tooltip-element}} - {{#tooltip-element type="tooltip-basic" model=(t 'nav.containers.groupStack') tooltipTemplate='tooltip-static' aria-describedby="tooltip-base" tooltipFor="tooltipLink"}} + {{#tooltip-element type="tooltip-basic" model=(t 'nav.group.namespaceWorkload') tooltipTemplate='tooltip-static' aria-describedby="tooltip-base" tooltipFor="tooltipLink"}} {{#link-to (query-params group="namespace") classNames="btn btn-sm bg-default"}}{{/link-to}} {{/tooltip-element}}
diff --git a/lib/shared/addon/components/form-key-value/component.js b/lib/shared/addon/components/form-key-value/component.js index f1dc473a4..3f03364df 100644 --- a/lib/shared/addon/components/form-key-value/component.js +++ b/lib/shared/addon/components/form-key-value/component.js @@ -74,6 +74,8 @@ export default Component.extend({ allowEmptyValue: false, addInitialEmptyRow: false, allowMultilineValue: true, + base64Value: false, + concealValue: false, editing: true, ary: null, @@ -94,7 +96,10 @@ export default Component.extend({ return; } - this.$('INPUT.key').last()[0].focus(); + let elem = this.$('INPUT.key').last()[0]; + if ( elem ) { + elem.focus(); + } }); }, @@ -147,6 +152,12 @@ export default Component.extend({ } + if ( this.get('base64Value') ) { + ary.forEach((entry) => { + entry.value = AWS.util.base64.decode(entry.value).toString(); + }); + } + this.set('ary', ary); if ( !ary.length && this.get('addInitialEmptyRow') ) { @@ -170,6 +181,10 @@ export default Component.extend({ var k = row.get('key').trim(); var v = row.get('value').trim(); + if ( this.get('base64Value') ) { + v = AWS.util.base64.encode(v); + } + if ( k && (v || this.get('allowEmptyValue')) ) { map[k] = v; diff --git a/lib/shared/addon/components/form-key-value/template.hbs b/lib/shared/addon/components/form-key-value/template.hbs index 47dbe2b6d..6dbe97d2b 100644 --- a/lib/shared/addon/components/form-key-value/template.hbs +++ b/lib/shared/addon/components/form-key-value/template.hbs @@ -35,9 +35,9 @@ {{#if editing}} {{#if allowMultilineValue}} - {{textarea-autogrow class="form-control input-sm value" value=row.value placeholder=valuePlaceholder disabled=(eq row.editable false)}} + {{textarea-autogrow class=(concat "form-control input-sm value" (if concealValue " conceal")) spellcheck="false" required=true value=row.value placeholder=valuePlaceholder disabled=(eq row.editable false)}} {{else}} - {{input class="form-control input-sm value" type="text" value=row.value placeholder=valuePlaceholder disabled=(eq row.editable false)}} + {{input class=(concat "form-control input-sm value" (if concealValue " conceal")) spellcheck="false" type="text" value=row.value placeholder=valuePlaceholder disabled=(eq row.editable false)}} {{/if}} {{else}} {{row.value}} diff --git a/lib/shared/addon/components/new-edit-secret/component.js b/lib/shared/addon/components/new-edit-secret/component.js index cb7d937b2..c964c26cd 100644 --- a/lib/shared/addon/components/new-edit-secret/component.js +++ b/lib/shared/addon/components/new-edit-secret/component.js @@ -1,21 +1,64 @@ -import { observer } from '@ember/object'; +import { get, set } from '@ember/object'; +import { resolve, reject } from 'rsvp'; import Component from '@ember/component'; -import NewOrEdit from 'shared/mixins/new-or-edit'; +import ViewNewEdit from 'shared/mixins/view-new-edit'; import layout from './template'; -export default Component.extend(NewOrEdit, { +export default Component.extend(ViewNewEdit, { layout, model: null, - userValue: '', - userValueChanged: observer('userValue', function() { - this.set('primaryResource.value', AWS.util.base64.encode(this.get('userValue'))); - }), + titleKey: 'newSecret.title', + + scope: 'project', + namespace: null, actions: { + updateData(map) { + set(this, 'primaryResource.data', map); + }, + cancel() { this.sendAction('cancel'); + }, + }, + + doSave() { + let mode = get(this, 'mode'); + let scope = get(this, 'scope'); + let pr = get(this, 'primaryResource'); + let ns = get(this, 'namespace'); + + if ( mode === 'edit' || scope === 'project' ) { + return this._super(...arguments); } + + let promise = resolve(); + + // Convert to a namespacedSecret and create the NS as needed + if ( ns ) { + let obj = pr.serialize(); + obj.type = 'namespacedSecret'; + pr = get(this,'store').createRecord(obj); + set(this,'primaryResource',pr); + + if ( get(ns, 'id') ) { + set(pr, 'namespaceId', get(ns, 'id')); + } else if ( ns ) { + promise = ns.save().then((newNs) => { + set(pr, 'namespaceId', get(newNs, 'id')); + return newNs.waitForState('active'); + }); + } else { + return reject('No namespace specified'); + } + } + + let self = this; + let sup = self._super; + return promise.then(() => { + return sup.apply(self,arguments); + }); }, doneSaving() { diff --git a/lib/shared/addon/components/new-edit-secret/template.hbs b/lib/shared/addon/components/new-edit-secret/template.hbs index a52aaa977..fc77f7329 100644 --- a/lib/shared/addon/components/new-edit-secret/template.hbs +++ b/lib/shared/addon/components/new-edit-secret/template.hbs @@ -1,24 +1,72 @@
-

{{t (if editing 'newSecret.title.edit' 'newSecret.title.add')}}

+ {{#if isView}} +
+ {{badge-state model=model}} + {{action-menu model=model showPrimary=false classNames="ml-10 inline-block" size="sm"}} +
+ {{/if}} + +

{{title}}

-
-
+{{#if isView}} + {{#if model.description}} + {{banner-message color='bg-secondary mb-0 mt-10' message=(linkify model.container.description)}} + {{/if}} +{{else}} {{form-name-description model=primaryResource nameRequired=true namePlaceholder="newSecret.name.placeholder" descriptionPlaceholder="newSecret.description.placeholder" }} +{{/if}} - {{#unless editing}} -
- - {{textarea-autogrow class="form-control" value=userValue placeholder="newSecret.value.placeholder"}} +
+
+ + {{#if isNew}} +
+
- {{/unless}} +
+ +
+ {{else}} +
+ {{#if model.namespace}} + {{t 'newSecret.scope.namespace'}}: {{model.namespace.displayName}} + {{else}} + {{t 'newSecret.scope.project'}} + {{/if}} +
+ {{/if}}
-
-{{top-errors errors=errors}} -{{save-cancel editing=true save="save" cancel="cancel"}} + {{#if (and isNew (eq scope "namespace"))}} +
+ {{form-namespace + namespace=namespace + errors=namespaceErrors + }} +
+ {{/if}} +
+ +
+ + {{form-key-value + initialMap=primaryResource.data + addActionLabel="newSecret.addActionLabel" + addInitialEmptyRow=true + base64Value=true + concealValue=true + editing=notIsView + changed=(action "updateData") + }} +
+ +{{#unless isView}} + {{top-errors errors=errors}} + {{save-cancel editing=true save="save" cancel="viewEditCancel"}} +{{/unless}} diff --git a/lib/shared/addon/components/pod-row/template.hbs b/lib/shared/addon/components/pod-row/template.hbs index d8bc8f032..0fd235856 100644 --- a/lib/shared/addon/components/pod-row/template.hbs +++ b/lib/shared/addon/components/pod-row/template.hbs @@ -34,12 +34,12 @@ {{#if (and showNode model.node)}} {{model.node.displayName}} / {{/if}} - {{t 'generic.createdDate' date=(date-from-now model.created)}} + {{t 'generic.createdDate' date=(date-from-now model.created) htmlSafe=true}}

{{#if scalePlaceholder}} - {{t 'stackRow.standalone'}} + {{t 'namespaceGroup.none'}} {{/if}} {{#if showActions}} diff --git a/lib/shared/addon/components/project-table/template.hbs b/lib/shared/addon/components/project-table/template.hbs index f66ac87b6..c70844c1b 100644 --- a/lib/shared/addon/components/project-table/template.hbs +++ b/lib/shared/addon/components/project-table/template.hbs @@ -5,7 +5,6 @@ headers=headers body=model sortBy=sortBy - fullRows=true as |sortable kind p dt| }} {{#if (eq kind "row")}} diff --git a/lib/shared/addon/components/project-template-list/template.hbs b/lib/shared/addon/components/project-template-list/template.hbs index e3de540cf..2f78ab2d7 100644 --- a/lib/shared/addon/components/project-template-list/template.hbs +++ b/lib/shared/addon/components/project-template-list/template.hbs @@ -14,7 +14,6 @@ descending=descending headers=headers body=model - fullRows=true as |sortable kind row| }} {{#if (eq kind "row")}} diff --git a/lib/shared/addon/components/public-endpoints/template.hbs b/lib/shared/addon/components/public-endpoints/template.hbs index 0b316447f..23f6b0e4d 100644 --- a/lib/shared/addon/components/public-endpoints/template.hbs +++ b/lib/shared/addon/components/public-endpoints/template.hbs @@ -4,7 +4,6 @@ searchText=searchText sortBy=sortBy bulkActions=false - fullRows=true pagingLabel="pagination.port" headers=headers as |sortable kind row dt|}} {{#if (eq kind "row")}} diff --git a/lib/shared/addon/components/secret-row/template.hbs b/lib/shared/addon/components/secret-row/template.hbs index 3e9447956..7b797dc90 100644 --- a/lib/shared/addon/components/secret-row/template.hbs +++ b/lib/shared/addon/components/secret-row/template.hbs @@ -11,8 +11,18 @@ {{model.description}} + + {{#if model.namespace}} + {{model.namespace.displayName}} + {{else}} + {{t 'generic.all'}} + {{/if}} + + + {{join-array model.keys}} + - {{date-from-now row.created}} + {{date-from-now model.created}} {{action-menu model=model}} diff --git a/lib/shared/addon/components/service-log/template.hbs b/lib/shared/addon/components/service-log/template.hbs index abc02dca6..25adf8492 100644 --- a/lib/shared/addon/components/service-log/template.hbs +++ b/lib/shared/addon/components/service-log/template.hbs @@ -4,7 +4,6 @@ body=logs bulkActions=false search=true - fullRows=true sortBy=sortBy pagingLabel="pagination.event" headers=headers as |sortable kind row dt|}} diff --git a/lib/shared/addon/components/sortable-table/template.hbs b/lib/shared/addon/components/sortable-table/template.hbs index fa9e512f6..48739bf62 100644 --- a/lib/shared/addon/components/sortable-table/template.hbs +++ b/lib/shared/addon/components/sortable-table/template.hbs @@ -80,7 +80,6 @@ {{/if}} {{#if groupByKey}} - {{! Note: Grouping requires fullRows}} {{#if extraGroups.length}} {{#each extraGroups as |group|}} @@ -99,7 +98,7 @@ {{else}} {{yield this (if arranged.length 'nomatch' 'norows')}} {{/each}} - {{else if fullRows}} + {{else}} {{#each pagedContent as |row|}} {{yield this 'row' row dt (array-includes childFilterNodes row.id)}} @@ -107,32 +106,6 @@ {{yield this (if arranged.length 'nomatch' 'norows')}} {{/each}} - {{else}} - - {{#each pagedContent as |row|}} - - {{#if bulkActions}} - - {{check-box nodeId=row.id}} - - {{/if}} - {{#if hasBlock}} - {{yield this 'row' row dt}} - {{else}} - {{#each headers as |header|}} - {{select-property row header.name}} - {{/each}} - {{/if}} - - {{#if hasBlock}} - {{yield this 'sub-row' row dt}} - {{/if}} - {{else}} - {{#if hasBlock}} - {{yield this (if arranged.length 'nomatch' 'norows')}} - {{/if}} - {{/each}} - {{/if}} {{#if suffix}} diff --git a/lib/shared/addon/components/textarea-autogrow/component.js b/lib/shared/addon/components/textarea-autogrow/component.js index 13c400a7e..f66349461 100644 --- a/lib/shared/addon/components/textarea-autogrow/component.js +++ b/lib/shared/addon/components/textarea-autogrow/component.js @@ -14,6 +14,7 @@ export default TextArea.extend(IntlPlaceholder, { tagName: 'textarea', classNames: ['no-resize','no-ease'], + attributeBindings: ['spellcheck'], didInsertElement() { run.scheduleOnce('afterRender', this, 'initHeights'); diff --git a/lib/shared/addon/components/volume-row/template.hbs b/lib/shared/addon/components/volume-row/template.hbs index 6a7f3c677..382c51c4e 100644 --- a/lib/shared/addon/components/volume-row/template.hbs +++ b/lib/shared/addon/components/volume-row/template.hbs @@ -49,7 +49,6 @@ classNames="grid fixed mb-0 sortable-table" bulkActions=false pagingLabel="pagination.volumes" - fullRows=true rowActions=false search=false stickyHeader=false diff --git a/lib/shared/addon/components/workload-row/template.hbs b/lib/shared/addon/components/workload-row/template.hbs index 1c5321b6a..dd3894061 100644 --- a/lib/shared/addon/components/workload-row/template.hbs +++ b/lib/shared/addon/components/workload-row/template.hbs @@ -9,7 +9,7 @@ {{badge-state model=model}} - {{model.displayName}} + {{model.displayName}} {{#if model.showTransitioningMessage}}
{{model.transitioningMessage}}
{{else if model.displayEndpoints}} @@ -33,7 +33,7 @@ {{else}} {{t 'pagination.pod' pages=1 count=(concat model.pods.length "")}} {{/if}} / - {{t 'generic.createdDate' date=(date-from-now model.created)}} + {{t 'generic.createdDate' date=(date-from-now model.created) htmlSafe=true}}

{{/if}} diff --git a/lib/shared/addon/helpers/date-from-now.js b/lib/shared/addon/helpers/date-from-now.js index 330e51f11..c94580650 100644 --- a/lib/shared/addon/helpers/date-from-now.js +++ b/lib/shared/addon/helpers/date-from-now.js @@ -1,7 +1,10 @@ import { helper } from '@ember/component/helper'; +import { htmlSafe} from '@ember/string'; export function dateFromNow(params) { - return moment(params[0]).fromNow(); + let d = moment(params[0]); + let str = '' + d.fromNow() + ''; + return htmlSafe(str); } export default helper(dateFromNow); diff --git a/lib/shared/addon/mixins/subscribe.js b/lib/shared/addon/mixins/subscribe.js index b8782a832..3457bc823 100644 --- a/lib/shared/addon/mixins/subscribe.js +++ b/lib/shared/addon/mixins/subscribe.js @@ -116,7 +116,7 @@ export default Mixin.create({ type = get(event.data, 'type'); forceRemove = (event.name === 'resource.remove'); - console.log(this.label, (forceRemove ? 'Remove' : 'Change'), type +':'+ event.data.id, clusterId, projectId); + //console.log(this.label, (forceRemove ? 'Remove' : 'Change'), type +':'+ event.data.id, clusterId, projectId); if ( get(this, 'updateProjectStore') && projectId && projectStore.hasType(type) ) { //console.log(' Update project store', type, event.data.id, projectId); diff --git a/lib/shared/addon/mixins/view-new-edit.js b/lib/shared/addon/mixins/view-new-edit.js new file mode 100644 index 000000000..117855a49 --- /dev/null +++ b/lib/shared/addon/mixins/view-new-edit.js @@ -0,0 +1,49 @@ +import Mixin from '@ember/object/mixin' +import NewOrEdit from './new-or-edit'; +import { computed, get, set } from '@ember/object' +import { equal, or } from '@ember/object/computed' +import { inject as service } from '@ember/service'; + +export const VIEW = 'view'; +export const NEW = 'new'; +export const EDIT = 'edit'; + +export default Mixin.create(NewOrEdit, { + intl: service(), + + titleKey: null, + inlineEdit: false, + + isView: equal('mode', VIEW), + isNew: equal('mode', NEW), + isEdit: equal('mode', EDIT), + notView: or('isNew','isEdit'), + + actions: { + inlineEdit() { + set(this, 'mode', EDIT); + set(this, 'inlineEdit', true); + }, + + viewEditCancel() { + if ( get(this, 'inlineEdit') ) { + set(this, 'inlineEdit', false); + set(this, 'mode', VIEW); + } else { + this.sendAction('cancel'); + } + }, + }, + + title: computed('mode', 'primaryResource.displayName', 'titleKey', function() { + const prefix = get(this, 'titleKey'); + const mode = get(this, 'mode'); + const intl = get(this, 'intl'); + + let name = get(this, 'originalModel.displayName') + || get(this, 'primaryResource.displayName') + || ''; + + return intl.t(prefix+'.'+mode, { name }); + }), +}); diff --git a/lib/shared/addon/resource-actions/service.js b/lib/shared/addon/resource-actions/service.js index 795fb76cb..f6b271313 100644 --- a/lib/shared/addon/resource-actions/service.js +++ b/lib/shared/addon/resource-actions/service.js @@ -9,6 +9,7 @@ export default Service.extend({ tooltipActions : null, actionToggle : null, actionMenu : null, + actionContext : null, app: service(), // offset is a parameter that we need to open in our api, it allows us to pass a @@ -20,7 +21,7 @@ export default Service.extend({ // mirror: true // }, - show: function(model,trigger,toggle, offset) { + show: function(model, trigger, toggle, offset, context) { if (this.get('open') && this.get('actionMenu')) { this.hide(); } @@ -28,14 +29,12 @@ export default Service.extend({ let $menu = this.set('actionMenu', $('#resource-actions')); let $toggle = this.set('actionToggle', $(toggle||trigger)); - if ( model === this.get('model') && this.get('open') ) - { - // @@TODO@@ - 10-27-17 - need to figure out where event went - // event.preventDefault(); + if ( model === this.get('model') && this.get('open') ) { return; } this.set('model', model); + this.set('context', context); $('BODY').one('click', () => { // check to see if we've opened the menu @@ -85,7 +84,7 @@ export default Service.extend({ }, triggerAction: function(actionName) { - this.get('model').send(actionName); + this.get('model').send(actionName, this.get('context')); }, activeActions: function() { diff --git a/translations/en-us.yaml b/translations/en-us.yaml index 5cd956cb6..a51a34e7c 100644 --- a/translations/en-us.yaml +++ b/translations/en-us.yaml @@ -1092,6 +1092,8 @@ secretsPage: linkTo: Add Secret noData: You do not have any Secrets yet noMatch: No Secrets match the current search + table: + keys: Keys servicePage: header: '{type}: {name}' @@ -3650,15 +3652,20 @@ newReceiver: newSecret: title: - edit: Edit Secret add: Add Secret + edit: 'Edit Secret: {name}' + view: 'Secret: {name}' name: - placeholder: e.g. api-token + placeholder: e.g. api-key + scope: + label: Scope + project: Available to all namespaces in this project + namespace: Available to a single namespace description: - placeholder: e.g. Secret token for the API - value: - label: Secret Value - placeholder: The secret value + placeholder: e.g. S3 key pair + values: + label: Secrets Values + addActionLabel: Add Secret Value orchestrationWelcome: simple: @@ -3905,7 +3912,7 @@ siteAccess: namespaceGroup: label: "Namespace: {name}" none: Standalone - project: Project-Level + project: Any Namespace in Project svgServiceContainer: sidekicks: Sidekicks @@ -4088,10 +4095,12 @@ nav: addBalancer: Add Balancer addDns: Add Record addVolume: Add Volume - groupNone: Flat Pod List - groupService: Group by Workload - groupStack: Group by Namespace/Workload importCompose: Import from YAML + group: + none: Flat List + workload: Group by Workload + namespace: Group by Namespace + namespaceWorkload: Group by Namespace/Workload hosts: tab: Hosts addHost: Add Host diff --git a/vendor/dotsfont/OFL.txt b/vendor/dotsfont/OFL.txt new file mode 100644 index 000000000..632bb1ea2 --- /dev/null +++ b/vendor/dotsfont/OFL.txt @@ -0,0 +1,95 @@ +https://github.com/kylewelsby/dotsfont + +Copyright (c) 2016, Kyle Welsby (kyle@mekyle.com) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/vendor/dotsfont/dotsfont.woff b/vendor/dotsfont/dotsfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..2eb4cbb3bf802c02cd9beb98385e3b8f55f78de9 GIT binary patch literal 2548 zcmZuzc{tSD8~>sxgc(HCq%MkVQ@CSmG42@KAY?7;AdD@>nyziel4WFRWScDGaziFt z$jvmPvL%(oSTkWl5s_u?w|js0zu)_u&w04*Sglo z6XzZb)`bB8Zvv?CiLCA}U#$DjoE;DvAhd;rPqg}iPO#Ppw2y<37kIW$+!q%X3Hnq( zTME=gZn4g?IQK}fAMgzX|3B!n0s`G}STNoIq8q&9_wbhHf#9GU;GO$7!5ncAa@?hOI9a#^@q#CrZ1)~T(3n;38%@Sm`>2TSWAhta z8nkjK_-=q4d}U*M;WsQaZiRahaG5!$l<9N|fe9(X^jyz`&m-unibs8P1_`rA`Fwk# z%Dcj16KrCGV++$`<&nxUypesUdXxsJ%%fDDdro0Rlrv2Wh;+0;c+srJ`iBr0DL>OP zSj&L3shRb*)RXM!2LrEWBAsc2Sd-F7nu7WoNRJyLwN{W7yf~o3#eZcqo|kdg2AQZ9pn)yz0bH z-dPOs-7VIU0A8(i*^f2j{#{v)E&kxCcH6y^v8mXG7sEs)DDzrj9I{Ueg#uILM*@y- zjWc2G(L2vxT#d0*D4B>-^jI%!;=Bub-+Fy5|9N%AN7@klQr&penxxw0M-B^TvAucq z4xOlerzVbOz?)VR8tdWq@`sQJ4yL#r&tXx6x}G8lBC_X0cal=?C|Z(r{5OiWVg{Bj zs2dOH?^m|zO=KgvF}=5&C43!{wqXp}6v zsGaiF%IE8x>WW5G^t@*_#QUx%Nz#MSJ_E~&8Zevq@?vD_43A(XsR>u_vM%sOXXNP@TxPjc2^jpWL?x1;er4v=(CwjSjP3h^FJJ&VKm9w`} zsW!4w_l1P<9Ekq?mrPxD%`66Sy`U3g67~V(W8{F#XnN-ul$fDC8jy~*&XLzU<8=F? zTH9Qn<#lYX9VSXr>kZn|LX+nF=gs9tI?IVuL92UwBp`)CI1*Sv_9o*pw>A(yU2E4Q zK54hK(~DtitugxU@qB8LuRBXZht^7Nlu{Y(leELSUbVPpGcjns1zzXl8y6TO&+4+0 zsx5k}R=K8zos+*eewbn`5Nywn`v3vLh)+xIHM_49`VARG0nSp;#t zCR}?LNK(hKW`p;`GlqUAPilA8QJO06Q=WvcuvcF;f2h63y>@udVXEi;=0n8RL-}>O zD{OD;S!tl<_H<*y@yW?=mB(IxXPI9y@_u?nFMru)G{naF=6ak!N$|`hwo6=u+j4X> zNN1`vbSLh?TzE#4eM|ldjhlKX<7)rgJi79t{bE`1>tY179>FMo=H%_v~pPONo%9BxPvr$aF!XB-L< zS`3*hiUa0N`D^c=KmMXDi@4D5+)>i1!5Evq44ZRino4X9;>C@A{%}V~rX1=B5 za1i;jZHdlpsqL+*<1Y-xyIEo72|VAb^i-2te@zu&@Tr(4JtfElRtzy^g6_YlDh#X| zWfulf82L_tm2clU1(lCG|L*mV& zQ)0#l=0Qvd;fBi;)V`H@C@_Q=qdx_)jARO3`^ujoOOH7(=pjywOexq*Dcv+H+h>MI zl_SZg8QqbFn$4i~P2^JLQ|0eS%NdXqCoS?`5B7p9``5 zS9;&Z`jfR*Xa+BL&zU-!7PllTMtm3X!NktjSR!adtl&ti)$T7D7T)1rQSNhJ-y{hY zte}6nvz6CFLQTv3YBk`)xDfHt>`R*qI%>X8p<6+Nta@xAg?P3unCX7jpZIb$z;m`a z10SV-uI&j`Kdgc|4Yj?=w#9a91$F_2ZC5N}amvKM-STHIjPnXw^ zh`E+lZ_J&b)OTA5?X8}=oDu3{9D%o|CC?41)5(I0WD_sHTUANAC2F<390}djx=Q~= YBgH35vaI!kFWQr{z>m+*f7yTXHw1yMZ~y=R literal 0 HcmV?d00001 diff --git a/vendor/dotsfont/readme.md b/vendor/dotsfont/readme.md new file mode 100644 index 000000000..abf2f2e93 --- /dev/null +++ b/vendor/dotsfont/readme.md @@ -0,0 +1,36 @@ +DotsFont: A font made of only dots +=== +This font is to enable a work-around for `-webkit-text-security` property. + +![Preview](./dotsfont.png) + +Usage +--- + +Download the font + +```css +@font-face { + font-family: 'dotsfont'; + src: url('dotsfont.eot'); + src: url('dotsfont.eot?#iefix') format('embedded-opentype'), + url('dotsfont.woff') format('woff'), + url('dotsfont.ttf') format('truetype'), + url('dotsfont.svg#dotsfontregular') format('svg'); +} + +[conceal]:not(:active):not(:focus) { + font-family: 'dotsfont'; +} +``` + +```html +hide me +``` + +License +--- + +Copyright (c) 2016, Kyle Welsby (kyle@mekyle.com) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is included in this repository (OFL.txt), and is also available with a FAQ at: http://scripts.sil.org/OFL \ No newline at end of file