diff --git a/packages/theme/styles/_layouts.scss b/packages/theme/styles/_layouts.scss index e788117975..4b44b32c27 100644 --- a/packages/theme/styles/_layouts.scss +++ b/packages/theme/styles/_layouts.scss @@ -199,7 +199,10 @@ p:last-child { margin-block-end: 0; } line-clamp: 2; user-select: none; - &.nowrap { white-space: nowrap; } + &.nowrap { + white-space: nowrap; + text-overflow: ellipsis; + } } .action { visibility: hidden; diff --git a/packages/theme/styles/components.scss b/packages/theme/styles/components.scss index c9f09d47e2..e06e1f1924 100644 --- a/packages/theme/styles/components.scss +++ b/packages/theme/styles/components.scss @@ -434,6 +434,7 @@ cursor: pointer; .button { + flex-shrink: 0; width: 2.25rem; height: 2.25rem; background-color: transparent; @@ -487,31 +488,6 @@ margin-left: .75rem; min-height: 0; } - .wrap { - position: relative; - display: flex; - align-items: center; - flex-wrap: nowrap; - min-width: 0; - - &::after, &::before { - position: absolute; - width: 6px; - height: 6px; - background-color: var(--primary-button-enabled); - } - &::before { - top: -2px; - left: -4px; - clip-path: path('M0,6v-6h6v1h-5v5z'); - } - &::after { - bottom: -2px; - right: -4px; - clip-path: path('M0,6h6v-6h-1v5h-5z'); - } - &.wraped::before, &.wraped::after { content: ''; } - } .divider { margin: 0 .125rem; @@ -527,3 +503,32 @@ } } } + +/* Wraps */ +.antiWrapper { + position: relative; + display: flex; + align-items: center; + flex-wrap: nowrap; + min-width: 0; + + &::after, &::before { + position: absolute; + width: 6px; + height: 6px; + background-color: var(--primary-button-enabled); + } + &::before { + top: -2px; + left: -4px; + clip-path: path('M0,6v-6h6v1h-5v5z'); + } + &::after { + bottom: -2px; + right: -4px; + clip-path: path('M0,6h6v-6h-1v5h-5z'); + } + &.wraped::before, &.wraped::after { content: ''; } + &.focusWI:focus-within::before, &.focusWI:focus-within::after { content: ''; } + &.focus:focus::before, &.focus:focus::after { content: ''; } +} diff --git a/packages/ui/lang/en.json b/packages/ui/lang/en.json index 7ee945535c..748aaba17e 100644 --- a/packages/ui/lang/en.json +++ b/packages/ui/lang/en.json @@ -1,6 +1,7 @@ { "string": { "EditBoxPlaceholder": "placeholder", + "Ok": "Ok", "Cancel": "Cancel", "Minutes": "{minutes, plural, =0 {less than a minute ago} =1 {a minute ago} other {# minutes ago}}", "Hours": "{hours, plural, =0 {less than an hour ago} =1 {an hour ago} other {# hours ago}}", diff --git a/packages/ui/lang/ru.json b/packages/ui/lang/ru.json index a98fba401c..696987d51f 100644 --- a/packages/ui/lang/ru.json +++ b/packages/ui/lang/ru.json @@ -1,6 +1,7 @@ { "string": { "EditBoxPlaceholder": "Введите текст здесь", + "Ok": "Ок", "Cancel": "Отменить", "Minutes": "{minutes, plural, =0 {меньше минуты назад} =1 {минуту назад} other {# минут назад}}", "Hours": "{hours, plural, =0 {меньше часа назад} =1 {час назад} other {# часов назад}}", diff --git a/packages/ui/src/components/Button.svelte b/packages/ui/src/components/Button.svelte index ce839aad6d..84f4be208d 100644 --- a/packages/ui/src/components/Button.svelte +++ b/packages/ui/src/components/Button.svelte @@ -30,9 +30,10 @@ export let width: string | undefined = undefined export let focus: boolean = false - let input: HTMLButtonElement + export let input: HTMLButtonElement | undefined = undefined + onMount(() => { - if (focus) { + if (focus && input) { input.focus() focus = false } diff --git a/packages/ui/src/components/DatePicker.svelte b/packages/ui/src/components/DatePicker.svelte index 036064266f..4270a8079c 100644 --- a/packages/ui/src/components/DatePicker.svelte +++ b/packages/ui/src/components/DatePicker.svelte @@ -22,40 +22,29 @@ export let title: IntlString export let value: Date | null | undefined = null - export let range: Date | null | undefined = undefined + export let withTime: boolean = false export let bigDay: boolean = false export let show: boolean = false const dispatch = createEventDispatcher() let opened: boolean = false - let secondSelect: boolean = false let container: HTMLElement let btn: HTMLElement + const changeValue = (result: any): void => { + if (result !== undefined) { + value = result + dispatch('change', result) + } + } + onMount(() => { if (btn && show) { btn.click() show = false } }) - - const splitRes = (result: any): void => { - if (result !== undefined) { - if (result[0] !== value) value = result[0] - if (result[1] !== range) range = result[1] - dispatch('change', [value, range]) - } - } - const onClosePopup = (result: any): void => { - splitRes(result) - opened = false - secondSelect = false - } - const onUpdatePopup = (result: any): void => { - secondSelect = true - splitRes(result) - }
{ + changeValue(ev) + opened = false + }, changeValue) } }} > @@ -81,13 +73,7 @@
{#if value !== undefined} -
- - {#if range !== undefined} - - - {/if} -
+ {:else} {/if} diff --git a/packages/ui/src/components/DatePopup.svelte b/packages/ui/src/components/DatePopup.svelte index f19094ce71..16d6646c88 100644 --- a/packages/ui/src/components/DatePopup.svelte +++ b/packages/ui/src/components/DatePopup.svelte @@ -18,12 +18,12 @@ import Back from './icons/Back.svelte' import Forward from './icons/Forward.svelte' import { createEventDispatcher } from 'svelte' - import ui, { Label } from '..' + import ui, { Label, Button } from '..' import type { TSelectDate, TCellStyle, ICell } from '../types' export let title: IntlString - export let value: TSelectDate = null - export let range: TSelectDate = undefined + export let value: TSelectDate + export let withTime: boolean = false const dispatch = createEventDispatcher() @@ -55,8 +55,12 @@ ] let monthYear: string let days: Array = [] - let firstClick: boolean = true - let result: Array = [value, range] + let result: TSelectDate = value + let prevDiv: HTMLElement + let nextDiv: HTMLElement + let hourDiv: HTMLElement + let minDiv: HTMLElement + let okDiv: HTMLButtonElement const daysInMonth = (date: Date): number => { return 33 - new Date(date.getFullYear(), date.getMonth(), 33).getDate() @@ -69,12 +73,7 @@ return false } const getDateStyle = (date: Date): TCellStyle => { - if (value !== undefined && value !== null && compareDates(value, date)) return 'selected-start' - else if (value && value < date && range) { - if (range && compareDates(range, date)) return 'selected-end' - else if (date < range) return 'selected' - else return 'not-selected' - } + if (value !== undefined && value !== null && compareDates(value, date)) return 'selected' return 'not-selected' } @@ -94,14 +93,56 @@ $: monthYear = months[view.getMonth()] + ' ' + view.getFullYear() $: if (value) renderCellStyles() - $: if (range) renderCellStyles() + + const zeroLead = (n: number): string => { + if (n < 10) return '0' + n.toString() + return n.toString() + } + + const keyPress = (ev: KeyboardEvent, isHour: boolean): void => { + if (ev.key >= '0' && ev.key <= '9') { + const keyNumber: number = parseInt(ev.key, 10) + let number: number = isHour ? view.getHours() : view.getMinutes() + let newNumber: number = ((isHour && number > 2) || (!isHour && number > 5)) + ? keyNumber + : number * 10 + keyNumber + + if (isHour) { + if (newNumber > 23) newNumber = 23 + view.setHours(newNumber) + } else { + if (newNumber > 59) newNumber = 59 + view.setMinutes(newNumber) + } + view = view + value = view + if (isHour && newNumber > 9) minDiv.focus() + if (!isHour && newNumber > 9) okDiv.focus() + } + } + + const keyDown = (ev: KeyboardEvent, isHour: boolean): void => { + if (ev.key === 'Backspace') { + console.log('BACKSPACE') + if (isHour) view.setHours(0) + else view.setMinutes(0) + view = view + value = view + } + } + const navKey = (ev: KeyboardEvent): void => { + if (ev.code === 'ArrowLeft') prevDiv.click() + if (ev.code === 'ArrowRight') nextDiv.click() + } + + {#if withTime} +
+
+
+
+
+ +
:
+ +
+
+ {/if}
diff --git a/packages/ui/src/components/DatePresenter.svelte b/packages/ui/src/components/DatePresenter.svelte index 96a862144b..2385f06ba9 100644 --- a/packages/ui/src/components/DatePresenter.svelte +++ b/packages/ui/src/components/DatePresenter.svelte @@ -19,13 +19,19 @@ export let value: TSelectDate export let bigDay: boolean = false export let wraped: boolean = false + export let withTime: boolean = false const { currentLanguage } = getContext('lang') let inter: boolean = (currentLanguage === 'ru') ?? false + + const zeroLead = (n: number): string => { + if (n < 10) return '0' + n.toString() + return n.toString() + } {#if value !== undefined} -
+
{#if value === null}--{:else}{inter ? value.getDate() : value.getMonth() + 1}{/if} @@ -37,5 +43,15 @@ {#if value === null}--{:else}{value.getFullYear()}{/if} + {#if withTime} + + + {#if value === null}--{:else}{zeroLead(value.getHours())}{/if} + + : + + {#if value === null}--{:else}{zeroLead(value.getMinutes())}{/if} + + {/if}
{/if} diff --git a/packages/ui/src/components/DateTimePresenter.svelte b/packages/ui/src/components/DateTimePresenter.svelte new file mode 100644 index 0000000000..16034efe6f --- /dev/null +++ b/packages/ui/src/components/DateTimePresenter.svelte @@ -0,0 +1,24 @@ + + + + diff --git a/packages/ui/src/components/EditBox.svelte b/packages/ui/src/components/EditBox.svelte index 25d307a78b..996e5c6f4b 100644 --- a/packages/ui/src/components/EditBox.svelte +++ b/packages/ui/src/components/EditBox.svelte @@ -75,7 +75,7 @@
{/if} -
+
{#if format === 'password'} ev.target && computeSize(ev.target)} on:change/> {:else if format === 'number'} @@ -94,28 +94,6 @@ align-items: flex-start; } - .wrap { - position: relative; - - &::after, &::before { - position: absolute; - width: 6px; - height: 6px; - background-color: var(--primary-button-enabled); - } - &::before { - top: -2px; - left: -4px; - clip-path: path('M0,6v-6h6v1h-5v5z'); - } - &::after { - bottom: -2px; - right: -4px; - clip-path: path('M0,6h6v-6h-1v5h-5z'); - } - &:focus-within::before, &:focus-within::after { content: ''; } - } - .label { margin-bottom: .25rem; font-size: .75rem; diff --git a/packages/ui/src/components/TimeSince.svelte b/packages/ui/src/components/TimeSince.svelte index 5cfbca350f..43c9e06dd4 100644 --- a/packages/ui/src/components/TimeSince.svelte +++ b/packages/ui/src/components/TimeSince.svelte @@ -16,7 +16,7 @@ {#if value} - + {/if} diff --git a/plugins/contact-resources/src/components/PersonPresenter.svelte b/plugins/contact-resources/src/components/PersonPresenter.svelte index 8753215b5e..b18c66c26c 100644 --- a/plugins/contact-resources/src/components/PersonPresenter.svelte +++ b/plugins/contact-resources/src/components/PersonPresenter.svelte @@ -29,10 +29,15 @@ {#if value} - + {/if} diff --git a/plugins/inventory-resources/src/components/ProductPresenter.svelte b/plugins/inventory-resources/src/components/ProductPresenter.svelte index 7d8b6a8748..e9f35c34ca 100644 --- a/plugins/inventory-resources/src/components/ProductPresenter.svelte +++ b/plugins/inventory-resources/src/components/ProductPresenter.svelte @@ -29,8 +29,13 @@ {#if value} - + {/if} diff --git a/plugins/lead-resources/src/components/LeadPresenter.svelte b/plugins/lead-resources/src/components/LeadPresenter.svelte index 00e2142ee3..3d68046527 100644 --- a/plugins/lead-resources/src/components/LeadPresenter.svelte +++ b/plugins/lead-resources/src/components/LeadPresenter.svelte @@ -20,14 +20,23 @@ import lead from '../plugin' export let value: Lead + export let inline: boolean = false - function show () { + async function show () { showPanel(view.component.EditDoc, value._id, value._class, 'full') } {#if value} -
- {value.title} -
+ +
+ +
+ {value.title} +
{/if} diff --git a/plugins/recruit-assets/lang/en.json b/plugins/recruit-assets/lang/en.json index 706ab259b1..f6bb603c66 100644 --- a/plugins/recruit-assets/lang/en.json +++ b/plugins/recruit-assets/lang/en.json @@ -74,7 +74,6 @@ "ReviewShortLabel": "RVE", "StartDate": "Start date", "DueDate": "Due date", - "Period": "Period", "ReviewCategoryTitle":"Category", "Verdict": "Verdict", "OpinionSave": "Save", diff --git a/plugins/recruit-assets/lang/ru.json b/plugins/recruit-assets/lang/ru.json index 8008cd3e3a..5d83fbaf1a 100644 --- a/plugins/recruit-assets/lang/ru.json +++ b/plugins/recruit-assets/lang/ru.json @@ -75,7 +75,6 @@ "ReviewShortLabel": "RVE", "StartDate": "Дата начала", "DueDate": "Дата конца", - "Period": "Период", "ReviewCategoryTitle":"Категория", "Verdict": "Вердикт", "OpinionSave": "Сохранить", diff --git a/plugins/recruit-resources/src/components/ApplicationPresenter.svelte b/plugins/recruit-resources/src/components/ApplicationPresenter.svelte index 086805a395..513d21ff1b 100644 --- a/plugins/recruit-resources/src/components/ApplicationPresenter.svelte +++ b/plugins/recruit-resources/src/components/ApplicationPresenter.svelte @@ -33,10 +33,15 @@ {#if value && shortLabel} - + {/if} diff --git a/plugins/recruit-resources/src/components/VacancyPresenter.svelte b/plugins/recruit-resources/src/components/VacancyPresenter.svelte index 39e77e74c8..7eac188ffd 100644 --- a/plugins/recruit-resources/src/components/VacancyPresenter.svelte +++ b/plugins/recruit-resources/src/components/VacancyPresenter.svelte @@ -28,10 +28,15 @@ {#if value} - + {/if} diff --git a/plugins/recruit-resources/src/components/review/CreateReview.svelte b/plugins/recruit-resources/src/components/review/CreateReview.svelte index 0a97f45ab7..22fdaf2b81 100644 --- a/plugins/recruit-resources/src/components/review/CreateReview.svelte +++ b/plugins/recruit-resources/src/components/review/CreateReview.svelte @@ -155,6 +155,7 @@ allowDeselect titleDeselect={recruit.string.UnAssignRecruiter} /> - + + diff --git a/plugins/recruit-resources/src/components/review/ReviewPresenter.svelte b/plugins/recruit-resources/src/components/review/ReviewPresenter.svelte index e309a135d7..0c31560f23 100644 --- a/plugins/recruit-resources/src/components/review/ReviewPresenter.svelte +++ b/plugins/recruit-resources/src/components/review/ReviewPresenter.svelte @@ -42,10 +42,15 @@ {#if value && shortLabel} - + {/if} diff --git a/plugins/recruit-resources/src/plugin.ts b/plugins/recruit-resources/src/plugin.ts index 99065d9daa..d0765b3b04 100644 --- a/plugins/recruit-resources/src/plugin.ts +++ b/plugins/recruit-resources/src/plugin.ts @@ -100,7 +100,6 @@ export default mergeIds(recruitId, recruit, { ReviewShortLabel: '' as IntlString, StartDate: '' as IntlString, DueDate: '' as IntlString, - Period: '' as IntlString, CandidateReviews: '' as IntlString, Participants: '' as IntlString, NoParticipants: '' as IntlString, diff --git a/plugins/task-resources/src/components/TaskPresenter.svelte b/plugins/task-resources/src/components/TaskPresenter.svelte index 5aed21711d..2e2dcb33b6 100644 --- a/plugins/task-resources/src/components/TaskPresenter.svelte +++ b/plugins/task-resources/src/components/TaskPresenter.svelte @@ -21,6 +21,7 @@ import task from '../plugin' export let value: Issue + export let inline: boolean = false const client = getClient() const shortLabel = client.getHierarchy().getClass(value._class).shortLabel @@ -30,6 +31,16 @@ } -
- {#if shortLabel}
+{#if value && shortLabel} + +
+ +
+ {#if shortLabel} +
+{/if}