diff --git a/models/tags/package.json b/models/tags/package.json index ce855b7959..ea8b37690f 100644 --- a/models/tags/package.json +++ b/models/tags/package.json @@ -33,6 +33,6 @@ "@anticrm/tags-resources": "~0.6.0", "@anticrm/ui": "~0.6.0", "@anticrm/model-core": "~0.6.0", - "@anticrm/model-view": "~0.6.0" + "@anticrm/model-view": "~0.6.0" } } diff --git a/packages/theme/styles/components.scss b/packages/theme/styles/components.scss index 618ad06ea7..e2ea819783 100644 --- a/packages/theme/styles/components.scss +++ b/packages/theme/styles/components.scss @@ -407,6 +407,10 @@ } } + .antiTable-body__border { + border: 1px solid var(--theme-button-border-hovered); + } + &.highlightRows .antiTable-body__row { &:hover, &.checking { background-color: var(--theme-table-bg-hover); } } diff --git a/packages/ui/src/components/calendar/MonthCalendar.svelte b/packages/ui/src/components/calendar/MonthCalendar.svelte index 06053f44fa..4ca213643f 100644 --- a/packages/ui/src/components/calendar/MonthCalendar.svelte +++ b/packages/ui/src/components/calendar/MonthCalendar.svelte @@ -13,6 +13,7 @@ // limitations under the License. --> + + + + + + {#each [...Array(displayedDaysCount).keys()] as dayOfWeek} + + {/each} + + + + {#if $$slots.cell} + + {/if} + {#each [...Array(displayedHours).keys()] as hourOfDay, row} + + + {#each [...Array(displayedDaysCount).keys()] as dayIndex} + + {/each} + + {/each} + +
Hours +
+ {getWeekDayName(day(weekMonday, dayOfWeek), 'short')} + {day(weekMonday, dayOfWeek).getDate()} +
+
+
+ {addZero(hourOfDay)}:00 +
+
{ + onSelect(day(weekMonday, dayIndex)) + }} + > + {#if $$slots.cell} + + {/if} +
+ + diff --git a/packages/ui/src/components/calendar/YearCalendar.svelte b/packages/ui/src/components/calendar/YearCalendar.svelte index 8dde3ad2db..2f03ffe546 100644 --- a/packages/ui/src/components/calendar/YearCalendar.svelte +++ b/packages/ui/src/components/calendar/YearCalendar.svelte @@ -39,7 +39,7 @@ {#each [...Array(12).keys()] as m}
{getMonthName(month(value, m))} - + eslint-disable-next-line no-undef --> diff --git a/packages/ui/src/components/calendar/internal/DateUtils.ts b/packages/ui/src/components/calendar/internal/DateUtils.ts index 59b0ea1f6f..fb86438d2b 100644 --- a/packages/ui/src/components/calendar/internal/DateUtils.ts +++ b/packages/ui/src/components/calendar/internal/DateUtils.ts @@ -11,9 +11,9 @@ // See the License for the specific language governing permissions and // limitations under the License. - const DAYS_IN_WEEK = 7 const MILLISECONDS_IN_DAY = 86400000 +const MILLISECONDS_IN_MINUTE = 60000 export function firstDay (date: Date, mondayStart: boolean): Date { const firstDayOfMonth = new Date(date) @@ -40,8 +40,8 @@ export function getWeekDayName (weekDay: Date, weekFormat: 'narrow' | 'short' | }).format(weekDay) } -export function day (firstDay: Date, offset: number): Date { - return new Date(firstDay.getTime() + offset * MILLISECONDS_IN_DAY) +export function day (firstDay: Date, offset: number, minutes?: number): Date { + return new Date(firstDay.getTime() + offset * MILLISECONDS_IN_DAY + (minutes ?? 0) * MILLISECONDS_IN_MINUTE) } export function weekday (firstDay: Date, w: number, d: number): Date { @@ -67,3 +67,16 @@ export function getMonthName (date: Date): string { const locale = new Intl.NumberFormat().resolvedOptions().locale return new Intl.DateTimeFormat(locale, { month: 'long' }).format(date) } +export function getMonday (d: Date, mondayStart: boolean): Date { + d = new Date(d) + const day = d.getDay() + const diff = d.getDate() - day + (day === 0 ? -6 : 1) // adjust when day is sunday + return new Date(d.setDate(diff)) +} + +export function addZero (value: number): string { + if (value < 10) { + return `0${value}` + } + return `${value}` +} diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index caa671ff1c..7b8005d2c1 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -120,3 +120,4 @@ export * from './colors' export { default as MonthCalendar } from './components/calendar/MonthCalendar.svelte' export { default as YearCalendar } from './components/calendar/YearCalendar.svelte' +export { default as WeekCalendar } from './components/calendar/WeekCalendar.svelte' diff --git a/plugins/calendar-resources/src/components/CalendarView.svelte b/plugins/calendar-resources/src/components/CalendarView.svelte index 3738c28320..16c96d917f 100644 --- a/plugins/calendar-resources/src/components/CalendarView.svelte +++ b/plugins/calendar-resources/src/components/CalendarView.svelte @@ -16,9 +16,11 @@ import { Event } from '@anticrm/calendar' import { Class, Doc, DocumentQuery, FindOptions, Ref, SortingOrder, Space } from '@anticrm/core' import { createQuery } from '@anticrm/presentation' - import { Button, IconBack, IconForward, MonthCalendar, ScrollBox, YearCalendar } from '@anticrm/ui' + import { Button, IconBack, IconForward, MonthCalendar, ScrollBox, WeekCalendar, YearCalendar } from '@anticrm/ui' + import Scroller from '@anticrm/ui/src/components/Scroller.svelte' import calendar from '../plugin' import Day from './Day.svelte' + import Hour from './Hour.svelte' export let _class: Ref> export let space: Ref | undefined = undefined @@ -38,7 +40,7 @@ let loading = false let resultQuery: DocumentQuery - $: spaceOpt = (space ? { space } : {}) + $: spaceOpt = space ? { space } : {} $: resultQuery = search === '' ? { ...query, ...spaceOpt } : { ...query, $search: search, ...spaceOpt } let objects: Event[] = [] @@ -73,12 +75,48 @@ ) } - function findEvents (events: Event[], date: Date): Event[] { - return events.filter( - (it) => areDatesLess(new Date(it.date), date) && areDatesLess(date, new Date(it.dueDate ?? it.date)) + function isSameDay (firstDate: Date, secondDate: Date): boolean { + return ( + firstDate.getFullYear() === secondDate.getFullYear() && + firstDate.getMonth() === secondDate.getMonth() && + firstDate.getDate() === secondDate.getDate() ) } + function findEvents (events: Event[], date: Date, minutes = false): Event[] { + return events.filter((it) => { + const d1 = new Date(it.date) + const d2 = new Date(it.dueDate ?? it.date) + const inDays = areDatesLess(d1, date) && areDatesLess(date, d2) + + if (minutes) { + if (isSameDay(d1, date)) { + return (date.getTime() < d1.getTime() && d1.getTime() < date.getTime() + 3600 * 1000) || + (d1.getTime() < date.getTime() && date.getTime() <= d2.getTime()) + } + + if (isSameDay(d2, date)) { + return (date.getTime() < d2.getTime() && d2.getTime() < date.getTime() + 3600000) || + (date.getTime() < d2.getTime() && d1.getTime() < date.getTime()) + } + + // Somethere in middle + return inDays + } + return inDays + }) + } + + function findDayEvents (events: Event[], date: Date): Event[] { + return events.filter((it) => { + const d1 = new Date(it.date) + const d2 = new Date(it.dueDate ?? it.date) + const inDays = areDatesLess(d1, date) && areDatesLess(date, d2) + + return inDays && !isSameDay(d1, date) && !isSameDay(d2, date) + }) + } + interface ShiftType { yearShift: number monthShift: number @@ -128,6 +166,12 @@ month: 'long' }).format(date) } + function getWeekName (date: Date): string { + const onejan = new Date(date.getFullYear(), 0, 1) + const week = Math.ceil(((date.getTime() - onejan.getTime()) / 86400000 + onejan.getDay() + 1) / 7) + + return `W${week}` + } function currentDate (date: Date, shifts: ShiftType): Date { const res = new Date(date) @@ -152,7 +196,7 @@ return `${date.getDate()} ${getMonthName(date)} ${date.getFullYear()}` } case CalendarMode.Week: { - return `${getMonthName(date)} ${date.getFullYear()}` + return `${getWeekName(date)} ${getMonthName(date)} ${date.getFullYear()}` } case CalendarMode.Month: { return `${getMonthName(date)} ${date.getFullYear()}` @@ -175,14 +219,14 @@ on:click={() => { mode = CalendarMode.Day }} - /> + /> -->