mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Fix: proper sorting resources by age column (#2182)
* - fix: proper sorting for resource age column - use Date.now() instead of new Date().getTime() (#2141 follow-up) Signed-off-by: Roman <ixrock@gmail.com> * fix: proper bar-chart tooltip callback Signed-off-by: Roman <ixrock@gmail.com> * fix: sorting in cronjobs, more Date.now() replacements Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
parent
e87bb850fb
commit
82d8181938
@ -198,10 +198,9 @@ export class HelmRelease implements ItemObject {
|
||||
}
|
||||
|
||||
getUpdated(humanize = true, compact = true) {
|
||||
const now = new Date().getTime();
|
||||
const updated = this.updated.replace(/\s\w*$/, ""); // 2019-11-26 10:58:09 +0300 MSK -> 2019-11-26 10:58:09 +0300 to pass into Date()
|
||||
const updatedDate = new Date(updated).getTime();
|
||||
const diff = now - updatedDate;
|
||||
const diff = Date.now() - updatedDate;
|
||||
|
||||
if (humanize) {
|
||||
return formatDuration(diff, compact);
|
||||
|
||||
@ -63,10 +63,12 @@ export class PersistentVolume extends KubeObject {
|
||||
return this.status.phase || "-";
|
||||
}
|
||||
|
||||
getClaimRefName() {
|
||||
const { claimRef } = this.spec;
|
||||
getStorageClass(): string {
|
||||
return this.spec.storageClassName;
|
||||
}
|
||||
|
||||
return claimRef ? claimRef.name : "";
|
||||
getClaimRefName(): string {
|
||||
return this.spec.claimRef?.name ?? "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -123,7 +123,7 @@ export class KubeObject implements ItemObject {
|
||||
}
|
||||
|
||||
getTimeDiffFromNow(): number {
|
||||
return new Date().getTime() - new Date(this.metadata.creationTimestamp).getTime();
|
||||
return Date.now() - new Date(this.metadata.creationTimestamp).getTime();
|
||||
}
|
||||
|
||||
getAge(humanize = true, compact = true, fromNow = false): string | number {
|
||||
|
||||
@ -30,7 +30,7 @@ export class LimitRanges extends React.Component<Props> {
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (item: LimitRange) => item.getName(),
|
||||
[columnId.namespace]: (item: LimitRange) => item.getNs(),
|
||||
[columnId.age]: (item: LimitRange) => item.metadata.creationTimestamp,
|
||||
[columnId.age]: (item: LimitRange) => item.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(item: LimitRange) => item.getName(),
|
||||
|
||||
@ -31,7 +31,7 @@ export class ConfigMaps extends React.Component<Props> {
|
||||
[columnId.name]: (item: ConfigMap) => item.getName(),
|
||||
[columnId.namespace]: (item: ConfigMap) => item.getNs(),
|
||||
[columnId.keys]: (item: ConfigMap) => item.getKeys(),
|
||||
[columnId.age]: (item: ConfigMap) => item.metadata.creationTimestamp,
|
||||
[columnId.age]: (item: ConfigMap) => item.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(item: ConfigMap) => item.getSearchFields(),
|
||||
|
||||
@ -31,7 +31,7 @@ export class ResourceQuotas extends React.Component<Props> {
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (item: ResourceQuota) => item.getName(),
|
||||
[columnId.namespace]: (item: ResourceQuota) => item.getNs(),
|
||||
[columnId.age]: (item: ResourceQuota) => item.metadata.creationTimestamp,
|
||||
[columnId.age]: (item: ResourceQuota) => item.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(item: ResourceQuota) => item.getSearchFields(),
|
||||
|
||||
@ -38,7 +38,7 @@ export class Secrets extends React.Component<Props> {
|
||||
[columnId.labels]: (item: Secret) => item.getLabels(),
|
||||
[columnId.keys]: (item: Secret) => item.getKeys(),
|
||||
[columnId.type]: (item: Secret) => item.type,
|
||||
[columnId.age]: (item: Secret) => item.metadata.creationTimestamp,
|
||||
[columnId.age]: (item: Secret) => item.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(item: Secret) => item.getSearchFields(),
|
||||
|
||||
@ -57,7 +57,7 @@ export class CrdResources extends React.Component<Props> {
|
||||
const sortingCallbacks: { [sortBy: string]: TableSortCallback } = {
|
||||
[columnId.name]: (item: KubeObject) => item.getName(),
|
||||
[columnId.namespace]: (item: KubeObject) => item.getNs(),
|
||||
[columnId.age]: (item: KubeObject) => item.metadata.creationTimestamp,
|
||||
[columnId.age]: (item: KubeObject) => item.getTimeDiffFromNow(),
|
||||
};
|
||||
|
||||
extraColumns.forEach(column => {
|
||||
|
||||
@ -33,7 +33,7 @@ export class Namespaces extends React.Component<Props> {
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (ns: Namespace) => ns.getName(),
|
||||
[columnId.labels]: (ns: Namespace) => ns.getLabels(),
|
||||
[columnId.age]: (ns: Namespace) => ns.metadata.creationTimestamp,
|
||||
[columnId.age]: (ns: Namespace) => ns.getTimeDiffFromNow(),
|
||||
[columnId.status]: (ns: Namespace) => ns.getStatus(),
|
||||
}}
|
||||
searchFilters={[
|
||||
|
||||
@ -30,7 +30,7 @@ export class Endpoints extends React.Component<Props> {
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (endpoint: Endpoint) => endpoint.getName(),
|
||||
[columnId.namespace]: (endpoint: Endpoint) => endpoint.getNs(),
|
||||
[columnId.age]: (endpoint: Endpoint) => endpoint.metadata.creationTimestamp,
|
||||
[columnId.age]: (endpoint: Endpoint) => endpoint.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(endpoint: Endpoint) => endpoint.getSearchFields()
|
||||
|
||||
@ -31,7 +31,7 @@ export class Ingresses extends React.Component<Props> {
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (ingress: Ingress) => ingress.getName(),
|
||||
[columnId.namespace]: (ingress: Ingress) => ingress.getNs(),
|
||||
[columnId.age]: (ingress: Ingress) => ingress.metadata.creationTimestamp,
|
||||
[columnId.age]: (ingress: Ingress) => ingress.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(ingress: Ingress) => ingress.getSearchFields(),
|
||||
|
||||
@ -30,7 +30,7 @@ export class NetworkPolicies extends React.Component<Props> {
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (item: NetworkPolicy) => item.getName(),
|
||||
[columnId.namespace]: (item: NetworkPolicy) => item.getNs(),
|
||||
[columnId.age]: (item: NetworkPolicy) => item.metadata.creationTimestamp,
|
||||
[columnId.age]: (item: NetworkPolicy) => item.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(item: NetworkPolicy) => item.getSearchFields(),
|
||||
|
||||
@ -40,7 +40,7 @@ export class Services extends React.Component<Props> {
|
||||
[columnId.ports]: (service: Service) => (service.spec.ports || []).map(({ port }) => port)[0],
|
||||
[columnId.clusterIp]: (service: Service) => service.getClusterIp(),
|
||||
[columnId.type]: (service: Service) => service.getType(),
|
||||
[columnId.age]: (service: Service) => service.metadata.creationTimestamp,
|
||||
[columnId.age]: (service: Service) => service.getTimeDiffFromNow(),
|
||||
[columnId.status]: (service: Service) => service.getStatus(),
|
||||
}}
|
||||
searchFilters={[
|
||||
|
||||
@ -150,7 +150,7 @@ export class Nodes extends React.Component<Props> {
|
||||
[columnId.conditions]: (node: Node) => node.getNodeConditionText(),
|
||||
[columnId.taints]: (node: Node) => node.getTaints().length,
|
||||
[columnId.roles]: (node: Node) => node.getRoleLabels(),
|
||||
[columnId.age]: (node: Node) => node.metadata.creationTimestamp,
|
||||
[columnId.age]: (node: Node) => node.getTimeDiffFromNow(),
|
||||
[columnId.version]: (node: Node) => node.getKubeletVersion(),
|
||||
}}
|
||||
searchFilters={[
|
||||
|
||||
@ -28,7 +28,7 @@ export class PodSecurityPolicies extends React.Component {
|
||||
[columnId.name]: (item: PodSecurityPolicy) => item.getName(),
|
||||
[columnId.volumes]: (item: PodSecurityPolicy) => item.getVolumes(),
|
||||
[columnId.privileged]: (item: PodSecurityPolicy) => +item.isPrivileged(),
|
||||
[columnId.age]: (item: PodSecurityPolicy) => item.metadata.creationTimestamp,
|
||||
[columnId.age]: (item: PodSecurityPolicy) => item.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(item: PodSecurityPolicy) => item.getSearchFields(),
|
||||
|
||||
@ -31,7 +31,7 @@ export class StorageClasses extends React.Component<Props> {
|
||||
store={storageClassStore} isClusterScoped
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (item: StorageClass) => item.getName(),
|
||||
[columnId.age]: (item: StorageClass) => item.metadata.creationTimestamp,
|
||||
[columnId.age]: (item: StorageClass) => item.getTimeDiffFromNow(),
|
||||
[columnId.provisioner]: (item: StorageClass) => item.provisioner,
|
||||
[columnId.reclaimPolicy]: (item: StorageClass) => item.reclaimPolicy,
|
||||
}}
|
||||
|
||||
@ -43,7 +43,7 @@ export class PersistentVolumeClaims extends React.Component<Props> {
|
||||
[columnId.status]: (pvc: PersistentVolumeClaim) => pvc.getStatus(),
|
||||
[columnId.size]: (pvc: PersistentVolumeClaim) => unitsToBytes(pvc.getStorage()),
|
||||
[columnId.storageClass]: (pvc: PersistentVolumeClaim) => pvc.spec.storageClassName,
|
||||
[columnId.age]: (pvc: PersistentVolumeClaim) => pvc.metadata.creationTimestamp,
|
||||
[columnId.age]: (pvc: PersistentVolumeClaim) => pvc.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(item: PersistentVolumeClaim) => item.getSearchFields(),
|
||||
|
||||
@ -34,10 +34,10 @@ export class PersistentVolumes extends React.Component<Props> {
|
||||
store={volumesStore} isClusterScoped
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (item: PersistentVolume) => item.getName(),
|
||||
[columnId.storageClass]: (item: PersistentVolume) => item.spec.storageClassName,
|
||||
[columnId.storageClass]: (item: PersistentVolume) => item.getStorageClass(),
|
||||
[columnId.capacity]: (item: PersistentVolume) => item.getCapacity(true),
|
||||
[columnId.status]: (item: PersistentVolume) => item.getStatus(),
|
||||
[columnId.age]: (item: PersistentVolume) => item.metadata.creationTimestamp,
|
||||
[columnId.age]: (item: PersistentVolume) => item.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(item: PersistentVolume) => item.getSearchFields(),
|
||||
|
||||
@ -33,7 +33,7 @@ export class RoleBindings extends React.Component<Props> {
|
||||
[columnId.name]: (binding: RoleBinding) => binding.getName(),
|
||||
[columnId.namespace]: (binding: RoleBinding) => binding.getNs(),
|
||||
[columnId.bindings]: (binding: RoleBinding) => binding.getSubjectNames(),
|
||||
[columnId.age]: (binding: RoleBinding) => binding.metadata.creationTimestamp,
|
||||
[columnId.age]: (binding: RoleBinding) => binding.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(binding: RoleBinding) => binding.getSearchFields(),
|
||||
|
||||
@ -32,7 +32,7 @@ export class Roles extends React.Component<Props> {
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (role: Role) => role.getName(),
|
||||
[columnId.namespace]: (role: Role) => role.getNs(),
|
||||
[columnId.age]: (role: Role) => role.metadata.creationTimestamp,
|
||||
[columnId.age]: (role: Role) => role.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(role: Role) => role.getSearchFields(),
|
||||
|
||||
@ -36,7 +36,7 @@ export class ServiceAccounts extends React.Component<Props> {
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (account: ServiceAccount) => account.getName(),
|
||||
[columnId.namespace]: (account: ServiceAccount) => account.getNs(),
|
||||
[columnId.age]: (account: ServiceAccount) => account.metadata.creationTimestamp,
|
||||
[columnId.age]: (account: ServiceAccount) => account.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(account: ServiceAccount) => account.getSearchFields(),
|
||||
|
||||
@ -46,7 +46,7 @@ export class CronJobs extends React.Component<Props> {
|
||||
[columnId.suspend]: (cronJob: CronJob) => cronJob.getSuspendFlag(),
|
||||
[columnId.active]: (cronJob: CronJob) => cronJobStore.getActiveJobsNum(cronJob),
|
||||
[columnId.lastSchedule]: (cronJob: CronJob) => cronJob.getLastScheduleTime(),
|
||||
[columnId.age]: (cronJob: CronJob) => cronJob.metadata.creationTimestamp,
|
||||
[columnId.age]: (cronJob: CronJob) => cronJob.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(cronJob: CronJob) => cronJob.getSearchFields(),
|
||||
|
||||
@ -47,7 +47,7 @@ export class DaemonSets extends React.Component<Props> {
|
||||
[columnId.name]: (daemonSet: DaemonSet) => daemonSet.getName(),
|
||||
[columnId.namespace]: (daemonSet: DaemonSet) => daemonSet.getNs(),
|
||||
[columnId.pods]: (daemonSet: DaemonSet) => this.getPodsLength(daemonSet),
|
||||
[columnId.age]: (daemonSet: DaemonSet) => daemonSet.metadata.creationTimestamp,
|
||||
[columnId.age]: (daemonSet: DaemonSet) => daemonSet.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(daemonSet: DaemonSet) => daemonSet.getSearchFields(),
|
||||
|
||||
@ -64,7 +64,7 @@ export class Deployments extends React.Component<Props> {
|
||||
[columnId.name]: (deployment: Deployment) => deployment.getName(),
|
||||
[columnId.namespace]: (deployment: Deployment) => deployment.getNs(),
|
||||
[columnId.replicas]: (deployment: Deployment) => deployment.getReplicas(),
|
||||
[columnId.age]: (deployment: Deployment) => deployment.metadata.creationTimestamp,
|
||||
[columnId.age]: (deployment: Deployment) => deployment.getTimeDiffFromNow(),
|
||||
[columnId.condition]: (deployment: Deployment) => deployment.getConditionsText(),
|
||||
}}
|
||||
searchFilters={[
|
||||
|
||||
@ -36,7 +36,7 @@ export class Jobs extends React.Component<Props> {
|
||||
[columnId.name]: (job: Job) => job.getName(),
|
||||
[columnId.namespace]: (job: Job) => job.getNs(),
|
||||
[columnId.conditions]: (job: Job) => job.getCondition() != null ? job.getCondition().type : "",
|
||||
[columnId.age]: (job: Job) => job.metadata.creationTimestamp,
|
||||
[columnId.age]: (job: Job) => job.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(job: Job) => job.getSearchFields(),
|
||||
|
||||
@ -83,7 +83,7 @@ export class Pods extends React.Component<Props> {
|
||||
[columnId.owners]: (pod: Pod) => pod.getOwnerRefs().map(ref => ref.kind),
|
||||
[columnId.qos]: (pod: Pod) => pod.getQosClass(),
|
||||
[columnId.node]: (pod: Pod) => pod.getNodeName(),
|
||||
[columnId.age]: (pod: Pod) => pod.metadata.creationTimestamp,
|
||||
[columnId.age]: (pod: Pod) => pod.getTimeDiffFromNow(),
|
||||
[columnId.status]: (pod: Pod) => pod.getStatusMessage(),
|
||||
}}
|
||||
searchFilters={[
|
||||
|
||||
@ -40,7 +40,7 @@ export class ReplicaSets extends React.Component<Props> {
|
||||
[columnId.desired]: (replicaSet: ReplicaSet) => replicaSet.getDesired(),
|
||||
[columnId.current]: (replicaSet: ReplicaSet) => replicaSet.getCurrent(),
|
||||
[columnId.ready]: (replicaSet: ReplicaSet) => replicaSet.getReady(),
|
||||
[columnId.age]: (replicaSet: ReplicaSet) => replicaSet.metadata.creationTimestamp,
|
||||
[columnId.age]: (replicaSet: ReplicaSet) => replicaSet.getTimeDiffFromNow(),
|
||||
}}
|
||||
searchFilters={[
|
||||
(replicaSet: ReplicaSet) => replicaSet.getSearchFields(),
|
||||
|
||||
@ -46,7 +46,7 @@ export class StatefulSets extends React.Component<Props> {
|
||||
sortingCallbacks={{
|
||||
[columnId.name]: (statefulSet: StatefulSet) => statefulSet.getName(),
|
||||
[columnId.namespace]: (statefulSet: StatefulSet) => statefulSet.getNs(),
|
||||
[columnId.age]: (statefulSet: StatefulSet) => statefulSet.metadata.creationTimestamp,
|
||||
[columnId.age]: (statefulSet: StatefulSet) => statefulSet.getTimeDiffFromNow(),
|
||||
[columnId.replicas]: (statefulSet: StatefulSet) => statefulSet.getReplicas(),
|
||||
}}
|
||||
searchFilters={[
|
||||
|
||||
@ -3,7 +3,7 @@ import merge from "lodash/merge";
|
||||
import moment from "moment";
|
||||
import Color from "color";
|
||||
import { observer } from "mobx-react";
|
||||
import { ChartData, ChartOptions, ChartPoint, Scriptable } from "chart.js";
|
||||
import { ChartData, ChartOptions, ChartPoint, ChartTooltipItem, Scriptable } from "chart.js";
|
||||
import { Chart, ChartKind, ChartProps } from "./chart";
|
||||
import { bytesToUnits, cssNames } from "../../utils";
|
||||
import { ZebraStripes } from "./zebra-stripes.plugin";
|
||||
@ -115,12 +115,13 @@ export class BarChart extends React.Component<Props> {
|
||||
mode: "index",
|
||||
position: "cursor",
|
||||
callbacks: {
|
||||
title: tooltipItems => {
|
||||
const now = new Date().getTime();
|
||||
title([tooltip]: ChartTooltipItem[]) {
|
||||
const xLabel = tooltip?.xLabel;
|
||||
const skipLabel = xLabel == null || new Date(xLabel).getTime() > Date.now();
|
||||
|
||||
if (new Date(tooltipItems[0].xLabel).getTime() > now) return "";
|
||||
if (skipLabel) return "";
|
||||
|
||||
return `${tooltipItems[0].xLabel}`;
|
||||
return String(xLabel);
|
||||
},
|
||||
labelColor: ({ datasetIndex }) => {
|
||||
return {
|
||||
|
||||
@ -48,7 +48,7 @@ export class KubeObjectStatusIcon extends React.Component<Props> {
|
||||
|
||||
getAge(timestamp: string) {
|
||||
if (!timestamp) return "";
|
||||
const diff = new Date().getTime() - new Date(timestamp).getTime();
|
||||
const diff = Date.now() - new Date(timestamp).getTime();
|
||||
|
||||
return formatDuration(diff, true);
|
||||
}
|
||||
|
||||
@ -50,7 +50,7 @@ describe("human format durations", () => {
|
||||
});
|
||||
|
||||
test("durations less than 8 years returns years and days", () => {
|
||||
const timeValue = new Date().getTime() - new Date(moment().subtract(2, "years").subtract(5, "days").subtract(2, "hours").toDate()).getTime();
|
||||
const timeValue = Date.now() - new Date(moment().subtract(2, "years").subtract(5, "days").subtract(2, "hours").toDate()).getTime();
|
||||
|
||||
const res = formatDuration(timeValue);
|
||||
|
||||
@ -58,7 +58,7 @@ describe("human format durations", () => {
|
||||
});
|
||||
|
||||
test("durations more than 8 years returns years", () => {
|
||||
const timeValue = new Date().getTime() - new Date(moment().subtract(9, "years").subtract(5, "days").toDate()).getTime();
|
||||
const timeValue = Date.now() - new Date(moment().subtract(9, "years").subtract(5, "days").toDate()).getTime();
|
||||
|
||||
const res = formatDuration(timeValue);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user