diff --git a/api/http/handler/endpoints/endpoint_list.go b/api/http/handler/endpoints/endpoint_list.go index ddede499f..66ecc7e62 100644 --- a/api/http/handler/endpoints/endpoint_list.go +++ b/api/http/handler/endpoints/endpoint_list.go @@ -4,6 +4,7 @@ import ( "net/http" "strconv" "strings" + "time" "github.com/portainer/libhttp/request" @@ -125,6 +126,7 @@ func (handler *Handler) endpointList(w http.ResponseWriter, r *http.Request) *ht if paginatedEndpoints[idx].EdgeCheckinInterval == 0 { paginatedEndpoints[idx].EdgeCheckinInterval = settings.EdgeAgentCheckinInterval } + paginatedEndpoints[idx].QueryDate = time.Now().Unix() } w.Header().Set("X-Total-Count", strconv.Itoa(filteredEndpointCount)) diff --git a/api/portainer.go b/api/portainer.go index 773cf56fd..1c06b8086 100644 --- a/api/portainer.go +++ b/api/portainer.go @@ -325,6 +325,8 @@ type ( AMTDeviceGUID string `json:"AMTDeviceGUID,omitempty" example:"4c4c4544-004b-3910-8037-b6c04f504633"` // LastCheckInDate mark last check-in date on checkin LastCheckInDate int64 + // QueryDate of each query with the endpoints list + QueryDate int64 // IsEdgeDevice marks if the environment was created as an EdgeDevice IsEdgeDevice bool // Whether the device has been trusted or not by the user diff --git a/app/portainer/environments/types.ts b/app/portainer/environments/types.ts index f25c11106..b43084dae 100644 --- a/app/portainer/environments/types.ts +++ b/app/portainer/environments/types.ts @@ -63,6 +63,7 @@ export type Environment = { GroupId: EnvironmentGroupId; EdgeID?: string; EdgeCheckinInterval?: number; + QueryDate?: number; LastCheckInDate?: number; Name: string; Status: EnvironmentStatus; diff --git a/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.test.tsx b/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.test.tsx index 75c090584..5cb000ad4 100644 --- a/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.test.tsx +++ b/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.test.tsx @@ -21,14 +21,14 @@ function renderComponent( edgeId = '', lastCheckInDate = 0, checkInInterval = 0, - homepageLoadTime = 0 + queryDate = 0 ) { return render( ); } diff --git a/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.tsx b/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.tsx index 206c33a91..02759a346 100644 --- a/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.tsx +++ b/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.tsx @@ -5,7 +5,7 @@ import { isoDateFromTimestamp } from '@/portainer/filters/filters'; interface Props { checkInInterval?: number; edgeId?: string; - homepageLoadTime?: number; + queryDate?: number; lastCheckInDate?: number; } @@ -13,7 +13,7 @@ export function EdgeIndicator({ edgeId, lastCheckInDate, checkInInterval, - homepageLoadTime, + queryDate, }: Props) { if (!edgeId) { return ( @@ -25,9 +25,8 @@ export function EdgeIndicator({ // give checkIn some wiggle room let isCheckValid = false; - if (checkInInterval && homepageLoadTime && lastCheckInDate) { - isCheckValid = - homepageLoadTime - lastCheckInDate <= checkInInterval * 2 + 20; + if (checkInInterval && queryDate && lastCheckInDate) { + isCheckValid = queryDate - lastCheckInDate <= checkInInterval * 2 + 20; } return ( diff --git a/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.stories.tsx b/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.stories.tsx index 482a9c6f4..c941bba0c 100644 --- a/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.stories.tsx +++ b/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.stories.tsx @@ -15,17 +15,10 @@ export default { interface Args { environment: Environment; - homepageLoadTime: number; } -function Template({ environment, homepageLoadTime = 1 }: Args) { - return ( - {}} - /> - ); +function Template({ environment }: Args) { + return {}} />; } export const DockerEnvironment: Story = Template.bind({}); diff --git a/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.test.tsx b/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.test.tsx index cf203c7cf..6b4122ccc 100644 --- a/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.test.tsx +++ b/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.test.tsx @@ -67,7 +67,6 @@ function renderComponent( onClick={() => {}} environment={env} groupName={group.Name} - homepageLoadTime={0} /> ); diff --git a/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.tsx b/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.tsx index 2cdbc42da..b79cb5bff 100644 --- a/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.tsx +++ b/app/portainer/home/EnvironmentList/EnvironmentItem/EnvironmentItem.tsx @@ -25,18 +25,12 @@ import styles from './EnvironmentItem.module.css'; import { EnvironmentStatusBadge } from './EnvironmentStatusBadge'; interface Props { - homepageLoadTime?: number; environment: Environment; groupName?: string; onClick(environment: Environment): void; } -export function EnvironmentItem({ - environment, - onClick, - homepageLoadTime, - groupName, -}: Props) { +export function EnvironmentItem({ environment, onClick, groupName }: Props) { const isAdmin = useIsAdmin(); const isEdge = isEdgeEnvironment(environment.Type); @@ -77,7 +71,7 @@ export function EnvironmentItem({ edgeId={environment.EdgeID} checkInInterval={environment.EdgeCheckinInterval} lastCheckInDate={environment.LastCheckInDate} - homepageLoadTime={homepageLoadTime} + queryDate={environment.QueryDate} /> ) : ( <> diff --git a/app/portainer/home/EnvironmentList/EnvironmentList.tsx b/app/portainer/home/EnvironmentList/EnvironmentList.tsx index f1e09df8e..a79d746e8 100644 --- a/app/portainer/home/EnvironmentList/EnvironmentList.tsx +++ b/app/portainer/home/EnvironmentList/EnvironmentList.tsx @@ -31,8 +31,6 @@ interface Props { } export function EnvironmentList({ onClickItem, onRefresh }: Props) { - const homepageLoadTime = usePageLoadingTime(); - const isAdmin = useIsAdmin(); const storageKey = 'home_endpoints'; @@ -98,7 +96,6 @@ export function EnvironmentList({ onClickItem, onRefresh }: Props) { groupsQuery.data?.find((g) => g.Id === env.GroupId)?.Name } onClick={onClickItem} - homepageLoadTime={homepageLoadTime} /> )) )} @@ -145,15 +142,3 @@ function renderItems( return items; } - -function usePageLoadingTime() { - const [homepageLoadTime, setHomepageLoadTime] = useState< - number | undefined - >(); - - useEffect(() => { - setHomepageLoadTime(Math.floor(Date.now() / 1000)); - }, []); - - return homepageLoadTime; -} diff --git a/app/portainer/home/EnvironmentList/index.ts b/app/portainer/home/EnvironmentList/index.ts index ac5df9c70..2322dcf40 100644 --- a/app/portainer/home/EnvironmentList/index.ts +++ b/app/portainer/home/EnvironmentList/index.ts @@ -8,6 +8,5 @@ export const EnvironmentListAngular = react2angular(EnvironmentList, [ 'tags', 'onClickItem', 'onRefresh', - 'homepageLoadTime', 'groups', ]);