diff --git a/grafana-plugin/src/components/ScheduleBorderedAvatar/ScheduleBorderedAvatar.module.scss b/grafana-plugin/src/components/ScheduleBorderedAvatar/ScheduleBorderedAvatar.module.scss index 657b81d0..0e179253 100644 --- a/grafana-plugin/src/components/ScheduleBorderedAvatar/ScheduleBorderedAvatar.module.scss +++ b/grafana-plugin/src/components/ScheduleBorderedAvatar/ScheduleBorderedAvatar.module.scss @@ -7,3 +7,7 @@ left: 0px; z-index: -1; } +.icon { + position: relative; + top: -8px; +} diff --git a/grafana-plugin/src/components/ScheduleBorderedAvatar/ScheduleBorderedAvatar.tsx b/grafana-plugin/src/components/ScheduleBorderedAvatar/ScheduleBorderedAvatar.tsx index 538365d2..e6c287e0 100644 --- a/grafana-plugin/src/components/ScheduleBorderedAvatar/ScheduleBorderedAvatar.tsx +++ b/grafana-plugin/src/components/ScheduleBorderedAvatar/ScheduleBorderedAvatar.tsx @@ -1,9 +1,15 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; +import { FadeTransition } from '@grafana/ui'; import cn from 'classnames/bind'; +import dayjs from 'dayjs'; +import { CSSTransition } from 'react-transition-group'; import styles from './ScheduleBorderedAvatar.module.scss'; +import animationStyles from 'containers/Rotations/Rotations.module.css'; + + const cx = cn.bind(styles); interface ScheduleBorderedAvatarProps { @@ -36,7 +42,7 @@ export default function ScheduleBorderedAvatar({ return ( <> - + {renderColorPaths(colors)} @@ -46,10 +52,11 @@ export default function ScheduleBorderedAvatar({ } function renderColorPaths(colors: string[]) { - if (!colors?.length) return null; + if (!colors?.length) {return null;} const colorSchemeList = colors; - if (colors.length === 1) { // minimum is 2 arcs to round the circle + if (colors.length === 1) { + // minimum is 2 arcs to round the circle colorSchemeList.push(colors[0]); } diff --git a/grafana-plugin/src/containers/UsersTimezones/UsersTimezones.tsx b/grafana-plugin/src/containers/UsersTimezones/UsersTimezones.tsx index 0ef053c1..e6601e90 100644 --- a/grafana-plugin/src/containers/UsersTimezones/UsersTimezones.tsx +++ b/grafana-plugin/src/containers/UsersTimezones/UsersTimezones.tsx @@ -1,26 +1,18 @@ import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { HorizontalGroup, InlineSwitch, Tooltip } from '@grafana/ui'; +import { HorizontalGroup, Tooltip } from '@grafana/ui'; import cn from 'classnames/bind'; -import dayjs, { Dayjs } from 'dayjs'; -import { toJS } from 'mobx'; -import moment from 'moment'; +import dayjs from 'dayjs'; import Avatar from 'components/Avatar/Avatar'; import ScheduleBorderedAvatar from 'components/ScheduleBorderedAvatar/ScheduleBorderedAvatar'; import ScheduleUserDetails from 'components/ScheduleUserDetails/ScheduleUserDetails'; import Text from 'components/Text/Text'; -import { findColor } from 'containers/Rotations/Rotations.helpers'; import { IsOncallIcon } from 'icons'; -import { - getLayersFromStore, - getOverrideColor, - getOverridesFromStore, - getShiftsFromStore, -} from 'models/schedule/schedule.helpers'; import { Event, Layer, Schedule } from 'models/schedule/schedule.types'; import { Timezone } from 'models/timezone/timezone.types'; import { User } from 'models/user/user.types'; +import { getColorSchemeMappingForUsers } from 'pages/schedule/Schedule.helpers'; import { RootStore } from 'state'; import { useStore } from 'state/useStore'; @@ -315,37 +307,4 @@ const AvatarGroup = (props: AvatarGroupProps) => { ); }; -function getColorSchemeMappingForUsers(store: RootStore, scheduleId: string, startMoment: dayjs.Dayjs): { [userId: string]: Set } { - const usersColorSchemeHash: { [userId: string]: Set } = {}; - - const shifts = getShiftsFromStore(store, scheduleId, startMoment); - const layers = getLayersFromStore(store, scheduleId, startMoment); - const overrides = getOverridesFromStore(store, scheduleId, startMoment); - - if (!shifts?.length || !layers?.length) { - return usersColorSchemeHash; - } - - shifts.forEach(({ shiftId, events }, rotationIndex) => { - populateUserHashSet(events, shiftId, false); - populateUserHashSet(events, rotationIndex, true); - }); - - return usersColorSchemeHash; - - function populateUserHashSet(events: Event[], id: string | number, isOverride: boolean) { - events.forEach((event) => { - event.users.forEach((user) => { - if (!usersColorSchemeHash[user.pk]) { - usersColorSchemeHash[user.pk] = new Set(); - } - - usersColorSchemeHash[user.pk].add( - isOverride ? getOverrideColor(id as number) : findColor(id as string, layers, overrides) - ); - }); - }); - } -} - export default UsersTimezones; diff --git a/grafana-plugin/src/pages/schedule/Schedule.helpers.ts b/grafana-plugin/src/pages/schedule/Schedule.helpers.ts index 94e967eb..1f9e98e5 100644 --- a/grafana-plugin/src/pages/schedule/Schedule.helpers.ts +++ b/grafana-plugin/src/pages/schedule/Schedule.helpers.ts @@ -1,7 +1,10 @@ -import { DateTime, dateTime } from '@grafana/data'; import dayjs from 'dayjs'; +import { findColor } from 'containers/Rotations/Rotations.helpers'; +import { getLayersFromStore, getOverridesFromStore, getShiftsFromStore } from 'models/schedule/schedule.helpers'; +import { Event } from 'models/schedule/schedule.types'; import { Timezone } from 'models/timezone/timezone.types'; +import { RootStore } from 'state'; export const getStartOfWeek = (tz: Timezone) => { return dayjs().tz(tz).utcOffset() === 0 ? dayjs().utc().startOf('isoWeek') : dayjs().tz(tz).startOf('isoWeek'); @@ -14,3 +17,36 @@ export const getUTCString = (moment: dayjs.Dayjs) => { export const getDateTime = (date: string) => { return dayjs(date); }; + + +export const getColorSchemeMappingForUsers = ( + store: RootStore, + scheduleId: string, + startMoment: dayjs.Dayjs +): { [userId: string]: Set } => { + const usersColorSchemeHash: { [userId: string]: Set } = {}; + + const shifts = getShiftsFromStore(store, scheduleId, startMoment); + const layers = getLayersFromStore(store, scheduleId, startMoment); + const overrides = getOverridesFromStore(store, scheduleId, startMoment); + + if (!shifts?.length || !layers?.length) { + return usersColorSchemeHash; + } + + shifts.forEach(({ shiftId, events }) => populateUserHashSet(events, shiftId)); + + return usersColorSchemeHash; + + function populateUserHashSet(events: Event[], id: string) { + events.forEach((event) => { + event.users.forEach((user) => { + if (!usersColorSchemeHash[user.pk]) { + usersColorSchemeHash[user.pk] = new Set(); + } + + usersColorSchemeHash[user.pk].add(findColor(id as string, layers, overrides)); + }); + }); + } +}