From 30976696f9c5d3e41dca7e0e04765d31c3bfcb0a Mon Sep 17 00:00:00 2001 From: Alexander Platov Date: Thu, 7 Apr 2022 13:02:01 +0300 Subject: [PATCH] Update DataPicker layout (#1309) Signed-off-by: Alexander Platov --- packages/theme/styles/_colors.scss | 3 + packages/ui/lang/en.json | 4 + packages/ui/lang/ru.json | 4 + packages/ui/src/components/Button.svelte | 8 +- .../src/components/calendar/DatePicker.svelte | 4 +- .../calendar/DatePickerPopup.svelte | 129 +++ .../src/components/calendar/DatePopup.svelte | 7 +- .../components/calendar/DatePresenter.svelte | 748 +++++++++++------- .../calendar/DateRangePicker.svelte | 44 ++ .../components/calendar/DateRangePopup.svelte | 210 +++++ .../calendar/DateRangePresenter.svelte | 474 +++++++++++ .../calendar/DateTimePresenter.svelte | 4 +- .../calendar/DateTimeRangePresenter.svelte | 28 + .../calendar/icons/DPCalendar.svelte | 4 +- .../calendar/icons/DPCalendarOver.svelte | 8 + .../components/calendar/internal/DateUtils.ts | 6 +- .../ui/src/components/icons/NavNext.svelte | 8 + .../ui/src/components/icons/NavPrev.svelte | 8 + packages/ui/src/index.ts | 6 + packages/ui/src/plugin.ts | 4 + packages/ui/src/popups.ts | 52 ++ .../src/components/DateTimePresenter.svelte | 8 +- .../src/components/ReminderPresenter.svelte | 4 +- .../src/components/review/CreateReview.svelte | 6 +- .../src/components/CreateIssue.svelte | 6 +- .../src/components/DateEditor.svelte | 4 +- .../src/components/DatePresenter.svelte | 4 +- .../src/components/Workbench.svelte | 2 + 28 files changed, 1473 insertions(+), 324 deletions(-) create mode 100644 packages/ui/src/components/calendar/DatePickerPopup.svelte create mode 100644 packages/ui/src/components/calendar/DateRangePicker.svelte create mode 100644 packages/ui/src/components/calendar/DateRangePopup.svelte create mode 100644 packages/ui/src/components/calendar/DateRangePresenter.svelte create mode 100644 packages/ui/src/components/calendar/DateTimeRangePresenter.svelte create mode 100644 packages/ui/src/components/calendar/icons/DPCalendarOver.svelte create mode 100644 packages/ui/src/components/icons/NavNext.svelte create mode 100644 packages/ui/src/components/icons/NavPrev.svelte diff --git a/packages/theme/styles/_colors.scss b/packages/theme/styles/_colors.scss index d61c254bb2..f63d1dce9f 100644 --- a/packages/theme/styles/_colors.scss +++ b/packages/theme/styles/_colors.scss @@ -61,11 +61,14 @@ --accent-bg-color: #27282b; --accent-shadow: rgb(0 0 0 / 10%) 0px 2px 4px; + --dark-color: #62666d; --content-color: #8a8f98; --accent-color: #d7d8db; --caption-color: #f7f8f8; --white-color: #fff; --caret-color: #6e5ed2; + --warning-color: #f2994a; + --error-color: #eb5757; --divider-color: #303236; --menu-bg-select: #2d2f36; diff --git a/packages/ui/lang/en.json b/packages/ui/lang/en.json index 9050d5a498..2b3a10cc1e 100644 --- a/packages/ui/lang/en.json +++ b/packages/ui/lang/en.json @@ -15,6 +15,10 @@ "None": "None", "NotSelected": "Not selected", "Today": "Today", + "NoDate": "No date", + "StartDate": "Start date", + "TargetDate": "Target date", + "Overdue": "Overdue", "English": "English", "Russian": "Russian", "MinutesBefore": "{minutes, plural, =1 {a minute before} other {# minutes before}}", diff --git a/packages/ui/lang/ru.json b/packages/ui/lang/ru.json index e6fd4fefcb..2d87120778 100644 --- a/packages/ui/lang/ru.json +++ b/packages/ui/lang/ru.json @@ -15,6 +15,10 @@ "None": "Нет", "NotSelected": "Не выбрано", "Today": "Сегодня", + "NoDate": "Без даты", + "StartDate": "Дата начала", + "TargetDate": "Дата окончания", + "Overdue": "Просрочено", "English": "Английский", "Russian": "Русский", "MinutesBefore": "{minutes, plural, =1 {за минуту} other {за # минут}}", diff --git a/packages/ui/src/components/Button.svelte b/packages/ui/src/components/Button.svelte index 0fc3e5dfae..d61115a9a6 100644 --- a/packages/ui/src/components/Button.svelte +++ b/packages/ui/src/components/Button.svelte @@ -107,7 +107,7 @@ pointer-events: none; } &:hover { - color: var(--caption-color); + color: var(--accent-color); transition-duration: 0; .btn-icon { color: var(--caption-color); } @@ -137,15 +137,15 @@ } &.no-border { font-weight: 400; - color: var(--content-color); + color: var(--accent-color); background-color: var(--button-bg-color); box-shadow: var(--button-shadow); &:hover { - color: var(--accent-color); + color: var(--caption-color); background-color: var(--button-bg-hover); - .btn-icon { color: var(--accent-color); } + .btn-icon { color: var(--caption-color); } } &:disabled { background-color: #30323655; diff --git a/packages/ui/src/components/calendar/DatePicker.svelte b/packages/ui/src/components/calendar/DatePicker.svelte index 252615591c..0ed142db07 100644 --- a/packages/ui/src/components/calendar/DatePicker.svelte +++ b/packages/ui/src/components/calendar/DatePicker.svelte @@ -15,7 +15,9 @@ + + + + + diff --git a/packages/ui/src/components/calendar/DatePopup.svelte b/packages/ui/src/components/calendar/DatePopup.svelte index 231d621e1b..e00fede554 100644 --- a/packages/ui/src/components/calendar/DatePopup.svelte +++ b/packages/ui/src/components/calendar/DatePopup.svelte @@ -51,9 +51,7 @@ const tempDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), i) days.push({ dayOfWeek: (tempDate.getDay() === 0) ? 7 : tempDate.getDay(), - style: getDateStyle(tempDate), - focused: false, - today: areDatesEqual(tempDate, today) + style: getDateStyle(tempDate) }) } days = days @@ -92,9 +90,6 @@ {#each days as day, i}
{ if (currentDate) currentDate.setDate(i + 1) diff --git a/packages/ui/src/components/calendar/DatePresenter.svelte b/packages/ui/src/components/calendar/DatePresenter.svelte index 6aeda0ec93..5b4b87b152 100644 --- a/packages/ui/src/components/calendar/DatePresenter.svelte +++ b/packages/ui/src/components/calendar/DatePresenter.svelte @@ -13,54 +13,63 @@ // limitations under the License. --> -{#if currentDate !== undefined} -
- {#if editable} -
-
{ withDate = !withDate }}> -
-
-
-
hoverEdits(ev, 'date')} - > - editClick(ev, edits[0].id)} - on:input={ev => onInput(ev.target, edits[0].id)} - on:keydown={ev => keyDown(ev, edits[0].id)} - /> -
.
- editClick(ev, edits[1].id)} - on:input={ev => onInput(ev.target, edits[1].id)} - on:keydown={ev => keyDown(ev, edits[1].id)} - /> -
.
- editClick(ev, edits[2].id)} - on:input={ev => onInput(ev.target, edits[2].id)} - on:keydown={ev => keyDown(ev, edits[2].id)} - /> -
-
-
{ withTime = !withTime }}> -
-
-
hoverEdits(ev, 'time')} + + +
unfocus(ev, datePopup)}> + -{/if} +
diff --git a/packages/ui/src/components/calendar/DateRangePicker.svelte b/packages/ui/src/components/calendar/DateRangePicker.svelte new file mode 100644 index 0000000000..b79ef1b968 --- /dev/null +++ b/packages/ui/src/components/calendar/DateRangePicker.svelte @@ -0,0 +1,44 @@ + + + +
+
+ + +
+
diff --git a/packages/ui/src/components/calendar/DateRangePopup.svelte b/packages/ui/src/components/calendar/DateRangePopup.svelte new file mode 100644 index 0000000000..b40d6394ef --- /dev/null +++ b/packages/ui/src/components/calendar/DateRangePopup.svelte @@ -0,0 +1,210 @@ + + + +
+
+ {#if viewDate} +
{monthYear}
+
+
{ + viewDate.setMonth(viewDate.getMonth() - 1) + renderCellStyles() + }}> +
+
+
{ + viewDate.setMonth(viewDate.getMonth() + 1) + renderCellStyles() + }}> +
+
+
+ {/if} +
+ + {#if viewDate} +
+ {#each [...Array(7).keys()] as dayOfWeek} + {capitalizeFirstLetter(getWeekDayName(day(firstDayOfCurrentMonth, dayOfWeek), 'short'))} + {/each} + {#each days as day, i} +
5} + style="grid-column: {day.dayOfWeek}/{day.dayOfWeek + 1};" + on:click|stopPropagation={() => { + viewDate.setDate(i + 1) + dispatch('close', viewDate) + }} + > + {i + 1} +
+ {/each} +
+ {/if} +
+ + diff --git a/packages/ui/src/components/calendar/DateRangePresenter.svelte b/packages/ui/src/components/calendar/DateRangePresenter.svelte new file mode 100644 index 0000000000..4a13eee344 --- /dev/null +++ b/packages/ui/src/components/calendar/DateRangePresenter.svelte @@ -0,0 +1,474 @@ + + + + + + diff --git a/packages/ui/src/components/calendar/DateTimePresenter.svelte b/packages/ui/src/components/calendar/DateTimePresenter.svelte index 5ec70723a3..a80c9171ff 100644 --- a/packages/ui/src/components/calendar/DateTimePresenter.svelte +++ b/packages/ui/src/components/calendar/DateTimePresenter.svelte @@ -16,6 +16,8 @@ import DatePresenter from './DatePresenter.svelte' export let value: number | null | undefined + export let mondayStart: boolean = true + export let editable: boolean = false - + diff --git a/packages/ui/src/components/calendar/DateTimeRangePresenter.svelte b/packages/ui/src/components/calendar/DateTimeRangePresenter.svelte new file mode 100644 index 0000000000..04a9c18d3b --- /dev/null +++ b/packages/ui/src/components/calendar/DateTimeRangePresenter.svelte @@ -0,0 +1,28 @@ + + + + diff --git a/packages/ui/src/components/calendar/icons/DPCalendar.svelte b/packages/ui/src/components/calendar/icons/DPCalendar.svelte index 09b84816e6..60996663ff 100644 --- a/packages/ui/src/components/calendar/icons/DPCalendar.svelte +++ b/packages/ui/src/components/calendar/icons/DPCalendar.svelte @@ -3,6 +3,6 @@ export let fill: string = 'currentColor' - - + + diff --git a/packages/ui/src/components/calendar/icons/DPCalendarOver.svelte b/packages/ui/src/components/calendar/icons/DPCalendarOver.svelte new file mode 100644 index 0000000000..d005e5f667 --- /dev/null +++ b/packages/ui/src/components/calendar/icons/DPCalendarOver.svelte @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/ui/src/components/calendar/internal/DateUtils.ts b/packages/ui/src/components/calendar/internal/DateUtils.ts index 6c3682a28b..7233f1bc52 100644 --- a/packages/ui/src/components/calendar/internal/DateUtils.ts +++ b/packages/ui/src/components/calendar/internal/DateUtils.ts @@ -72,17 +72,15 @@ export function isWeekend (date: Date): boolean { return date.getDay() === 0 || date.getDay() === 6 } -export function getMonthName (date: Date): string { +export function getMonthName (date: Date, option: 'narrow' | 'short' | 'long' | 'numeric' | '2-digit' = 'long'): string { const locale = new Intl.NumberFormat().resolvedOptions().locale - return new Intl.DateTimeFormat(locale, { month: 'long' }).format(date) + return new Intl.DateTimeFormat(locale, { month: option }).format(date) } export type TCellStyle = 'not-selected' | 'selected' export interface ICell { dayOfWeek: number style: TCellStyle - focused: boolean - today?: boolean } export function getMonday (d: Date, mondayStart: boolean): Date { diff --git a/packages/ui/src/components/icons/NavNext.svelte b/packages/ui/src/components/icons/NavNext.svelte new file mode 100644 index 0000000000..d50188a612 --- /dev/null +++ b/packages/ui/src/components/icons/NavNext.svelte @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/ui/src/components/icons/NavPrev.svelte b/packages/ui/src/components/icons/NavPrev.svelte new file mode 100644 index 0000000000..6e6b88c945 --- /dev/null +++ b/packages/ui/src/components/icons/NavPrev.svelte @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index f3ea4e1bfe..23f322add2 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -45,9 +45,13 @@ export { default as PopupMenu } from './components/PopupMenu.svelte' // export { default as PopupItem } from './components/PopupItem.svelte' export { default as TextArea } from './components/TextArea.svelte' export { default as Section } from './components/Section.svelte' +export { default as DatePickerPopup } from './components/calendar/DatePickerPopup.svelte' export { default as DatePicker } from './components/calendar/DatePicker.svelte' +export { default as DateRangePicker } from './components/calendar/DateRangePicker.svelte' export { default as DatePopup } from './components/calendar/DatePopup.svelte' export { default as TimePopup } from './components/calendar/TimePopup.svelte' +export { default as DateRangePresenter } from './components/calendar/DateRangePresenter.svelte' +export { default as DateTimeRangePresenter } from './components/calendar/DateTimeRangePresenter.svelte' export { default as DatePresenter } from './components/calendar/DatePresenter.svelte' export { default as DateTimePresenter } from './components/calendar/DateTimePresenter.svelte' export { default as StylishEdit } from './components/StylishEdit.svelte' @@ -95,6 +99,8 @@ export { default as IconInfo } from './components/icons/Info.svelte' export { default as IconBlueCheck } from './components/icons/BlueCheck.svelte' export { default as IconCheck } from './components/icons/Check.svelte' export { default as IconArrowLeft } from './components/icons/ArrowLeft.svelte' +export { default as IconNavPrev } from './components/icons/NavPrev.svelte' +export { default as IconNavNext } from './components/icons/NavNext.svelte' export { default as PanelInstance } from './components/PanelInstance.svelte' export { default as Panel } from './components/Panel.svelte' diff --git a/packages/ui/src/plugin.ts b/packages/ui/src/plugin.ts index bc96135bec..8cba18c28e 100644 --- a/packages/ui/src/plugin.ts +++ b/packages/ui/src/plugin.ts @@ -40,6 +40,10 @@ export default plugin(uiId, { None: '' as IntlString, NotSelected: '' as IntlString, Today: '' as IntlString, + NoDate: '' as IntlString, + StartDate: '' as IntlString, + TargetDate: '' as IntlString, + Overdue: '' as IntlString, English: '' as IntlString, Russian: '' as IntlString, MinutesBefore: '' as IntlString, diff --git a/packages/ui/src/popups.ts b/packages/ui/src/popups.ts index ee5d526f67..5d052fe949 100644 --- a/packages/ui/src/popups.ts +++ b/packages/ui/src/popups.ts @@ -51,3 +51,55 @@ export function closePopup (): void { return popups }) } + +interface IDatePopup { + component: AnySvelteComponent | undefined + currentDate: Date | undefined + anchor: HTMLElement | undefined + popup: HTMLElement | undefined + frendlyFocus: HTMLElement[] | undefined + onClose?: (result: any) => void + onChange?: (result: any) => void +} + +export const dpstore = writable({ + component: undefined, + currentDate: undefined, + anchor: undefined, + popup: undefined, + frendlyFocus: undefined, + onClose: undefined, + onChange: undefined +}) + +export function showDatePopup ( + component: AnySvelteComponent | undefined, + currentDate: Date, + anchor?: HTMLElement, + popup?: HTMLElement, + frendlyFocus?: HTMLElement[] | undefined, + onClose?: (result: any) => void, + onChange?: (result: any) => void +): void { + dpstore.set({ + component: component, + currentDate: currentDate, + anchor: anchor, + popup: popup, + frendlyFocus: frendlyFocus, + onClose: onClose, + onChange: onChange + }) +} + +export function closeDatePopup (): void { + dpstore.set({ + component: undefined, + currentDate: undefined, + anchor: undefined, + popup: undefined, + frendlyFocus: undefined, + onClose: undefined, + onChange: undefined + }) +} diff --git a/plugins/calendar-resources/src/components/DateTimePresenter.svelte b/plugins/calendar-resources/src/components/DateTimePresenter.svelte index cf1ed0b287..8a6a2a0dbf 100644 --- a/plugins/calendar-resources/src/components/DateTimePresenter.svelte +++ b/plugins/calendar-resources/src/components/DateTimePresenter.svelte @@ -16,7 +16,7 @@
{#if date} - + {#if interval > 0} - {#await formatDueDate(interval) then t} - ({t}) + {#await formatDueDate(interval) then t} + ({t}) {/await} {/if} {:else} diff --git a/plugins/calendar-resources/src/components/ReminderPresenter.svelte b/plugins/calendar-resources/src/components/ReminderPresenter.svelte index 6a1777f542..26977afde2 100644 --- a/plugins/calendar-resources/src/components/ReminderPresenter.svelte +++ b/plugins/calendar-resources/src/components/ReminderPresenter.svelte @@ -16,7 +16,7 @@ - + { if (res.detail !== undefined) onChange(res.detail) }} /> diff --git a/plugins/view-resources/src/components/DatePresenter.svelte b/plugins/view-resources/src/components/DatePresenter.svelte index 484eefda23..71eb7cc114 100644 --- a/plugins/view-resources/src/components/DatePresenter.svelte +++ b/plugins/view-resources/src/components/DatePresenter.svelte @@ -16,10 +16,10 @@ - + diff --git a/plugins/workbench-resources/src/components/Workbench.svelte b/plugins/workbench-resources/src/components/Workbench.svelte index 00aea899fd..69588817e6 100644 --- a/plugins/workbench-resources/src/components/Workbench.svelte +++ b/plugins/workbench-resources/src/components/Workbench.svelte @@ -33,6 +33,7 @@ PanelInstance, Popup, showPopup, + DatePickerPopup, TooltipInstance } from '@anticrm/ui' import type { Application, NavigatorModel, SpecialNavModel, ViewConfiguration } from '@anticrm/workbench' @@ -366,6 +367,7 @@ + {:else} No client {/if}