diff --git a/packages/theme/styles/common.scss b/packages/theme/styles/common.scss index bc8ce8e2aa..a252ac9c73 100644 --- a/packages/theme/styles/common.scss +++ b/packages/theme/styles/common.scss @@ -63,7 +63,7 @@ max-width: 17.5rem; width: 17.5rem; background-color: var(--theme-navpanel-color); - border-right: 1px solid var(--theme-navpanel-border); + // border-right: 1px solid var(--theme-navpanel-border); } @media (max-width: 1024px) { .antiPanel-navigator { diff --git a/packages/ui/src/components/Panel.svelte b/packages/ui/src/components/Panel.svelte index 8477f0650c..5dbeb696aa 100644 --- a/packages/ui/src/components/Panel.svelte +++ b/packages/ui/src/components/Panel.svelte @@ -14,10 +14,17 @@ -->
{/if} {#if $$slots.aside && isAside && asideShown} +
{#if moveUtils}
diff --git a/packages/ui/src/components/Separator.svelte b/packages/ui/src/components/Separator.svelte new file mode 100644 index 0000000000..1186f4df85 --- /dev/null +++ b/packages/ui/src/components/Separator.svelte @@ -0,0 +1,473 @@ + + + +
+ + diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index efe37787f1..4a0c5f59bd 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -35,7 +35,11 @@ export type { ButtonSize, IconSize, TabItem, - DeviceOptions + DeviceOptions, + TSeparatedItem, + SeparatedItem, + DefSeparators, + SeparatedElement } from './types' export { themeStore } from '@hcengineering/theme' @@ -114,6 +118,7 @@ export { default as TabList } from './components/TabList.svelte' export { default as Chevron } from './components/Chevron.svelte' export { default as Timeline } from './components/Timeline.svelte' export { default as TimeShiftPresenter } from './components/TimeShiftPresenter.svelte' +export { default as Separator } from './components/Separator.svelte' export { default as IconAdd } from './components/icons/Add.svelte' export { default as IconCircleAdd } from './components/icons/CircleAdd.svelte' diff --git a/packages/ui/src/resize.ts b/packages/ui/src/resize.ts index 491e9b2a4b..76ff5ca5c9 100644 --- a/packages/ui/src/resize.ts +++ b/packages/ui/src/resize.ts @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and import { DelayedCaller } from './utils' +import type { SeparatedItem, DefSeparators } from './types' // limitations under the License. let observer: ResizeObserver @@ -56,3 +57,69 @@ export function resizeObserver (element: Element, onResize: (element: Element) = } } } + +/** + * @public + */ +export const separatorsKeyId = 'separators' + +export const nullSeparatedItem: SeparatedItem = { + size: 'auto', + minSize: 20, + maxSize: 'auto', + float: undefined +} + +const compareSeparators = (a: SeparatedItem[], b: SeparatedItem[]): boolean => { + if (a.length !== b.length) return false + return a.every( + (sep, index) => sep.minSize === b[index].minSize && sep.maxSize === b[index].maxSize && sep.float === b[index].float + ) +} + +const generateSeparatorsId = (name: string): string => { + return separatorsKeyId + '_' + name +} + +export function defineSeparators (name: string, items: DefSeparators): void { + const id = generateSeparatorsId(name) + const income = items.map((it) => (it === null ? nullSeparatedItem : it)) + const saved = localStorage.getItem(id) + let needAdd = false + if (saved !== null) { + const loaded: SeparatedItem[] = JSON.parse(saved) + if (!compareSeparators(loaded, income)) { + localStorage.removeItem(id) + needAdd = true + } + } else needAdd = true + if (needAdd) localStorage.setItem(id, JSON.stringify(income)) +} + +export function getSeparators (name: string): SeparatedItem[] | null { + const id = generateSeparatorsId(name) + const saved = localStorage.getItem(id) + return saved !== null ? JSON.parse(saved) : null +} + +export function saveSeparator (name: string, separators: SeparatedItem[]): void { + const id = generateSeparatorsId(name) + localStorage.setItem(id, JSON.stringify(separators)) +} + +export const panelSeparators: DefSeparators = [ + { minSize: 30, size: 'auto', maxSize: 'auto' }, + { minSize: 17, size: 25, maxSize: 50, float: 'aside' } +] + +export const workbenchSeparators: DefSeparators = [ + { minSize: 12, size: 17.5, maxSize: 22, float: 'navigator' }, + null, + { minSize: 20, size: 30, maxSize: 50, float: 'aside' } +] + +export const timeSeparators: DefSeparators = [ + { minSize: 10, size: 17.5, maxSize: 22, float: 'navigator' }, + { minSize: 25, size: 35, maxSize: 45 }, + null +] diff --git a/packages/ui/src/types.ts b/packages/ui/src/types.ts index aff86afe52..bfc8184a20 100644 --- a/packages/ui/src/types.ts +++ b/packages/ui/src/types.ts @@ -428,3 +428,23 @@ export const HOUR = MINUTE * 60 export const DAY = HOUR * 24 export const MONTH = DAY * 30 export const YEAR = MONTH * 12 + +export type TSeparatedItem = number | 'auto' +export interface SeparatedItem { + size: TSeparatedItem + minSize: TSeparatedItem + maxSize: TSeparatedItem + float?: string | undefined +} +export type DefSeparators = Array +export interface SeparatedElement { + id: number + element: Element + styles: Map | null + minSize: number + size: number + maxSize: number + begin: boolean + resize: boolean + float?: string | undefined +} diff --git a/plugins/hr-resources/src/components/Schedule.svelte b/plugins/hr-resources/src/components/Schedule.svelte index 810772e476..59e81948bd 100644 --- a/plugins/hr-resources/src/components/Schedule.svelte +++ b/plugins/hr-resources/src/components/Schedule.svelte @@ -21,7 +21,17 @@ import { Department, Staff } from '@hcengineering/hr' import { createQuery } from '@hcengineering/presentation' import type { TabItem } from '@hcengineering/ui' - import { Button, IconBack, IconForward, Label, SearchEdit, TabList } from '@hcengineering/ui' + import { + Button, + IconBack, + IconForward, + Label, + SearchEdit, + TabList, + workbenchSeparators, + defineSeparators, + Separator + } from '@hcengineering/ui' import view from '@hcengineering/view' import hr from '../plugin' @@ -110,6 +120,8 @@ { id: 'chart', icon: view.icon.Views }, { id: 'stats', icon: view.icon.Table } ] + + defineSeparators('workbench', workbenchSeparators)
@@ -120,6 +132,7 @@ departmentById={departments} on:selected={(e) => departmentSelected(e.detail)} /> + {/if}
diff --git a/plugins/notification-resources/src/components/Inbox.svelte b/plugins/notification-resources/src/components/Inbox.svelte index 3e13580b06..5cd7ada0ec 100644 --- a/plugins/notification-resources/src/components/Inbox.svelte +++ b/plugins/notification-resources/src/components/Inbox.svelte @@ -27,7 +27,9 @@ eventToHTMLElement, getLocation, navigate, - showPopup + showPopup, + defineSeparators, + Separator } from '@hcengineering/ui' import view from '@hcengineering/view' import contact from '@hcengineering/contact' @@ -132,6 +134,7 @@ } ) } + defineSeparators('inbox', [{ minSize: 20, maxSize: 40, size: 30 }, null])
@@ -158,6 +161,7 @@
+ {/if}
{#if selectedEmployee !== undefined && component === undefined} diff --git a/plugins/workbench-resources/src/components/Workbench.svelte b/plugins/workbench-resources/src/components/Workbench.svelte index 043d81ed44..0e5e6e9031 100644 --- a/plugins/workbench-resources/src/components/Workbench.svelte +++ b/plugins/workbench-resources/src/components/Workbench.svelte @@ -51,7 +51,10 @@ resizeObserver, resolvedLocationStore, setResolvedLocation, - showPopup + showPopup, + Separator, + defineSeparators, + workbenchSeparators } from '@hcengineering/ui' import view from '@hcengineering/view' import { @@ -472,40 +475,8 @@ let aside: HTMLElement let cover: HTMLElement - let isResizing: boolean = false let asideWidth: number let componentWidth: number - let dX: number - let oldX: number - - const resizing = (event: MouseEvent): void => { - if (isResizing && aside) { - const X = event.clientX - dX - const newWidth = asideWidth + oldX - X - if (newWidth > 320 && componentWidth - (oldX - X) > 320) { - aside.style.width = aside.style.maxWidth = aside.style.minWidth = newWidth + 'px' - oldX = X - } - } - } - const endResize = (event: MouseEvent): void => { - const el: HTMLElement = event.currentTarget as HTMLElement - if (el && isResizing) document.removeEventListener('mousemove', resizing) - document.removeEventListener('mouseup', endResize) - cover.style.display = 'none' - isResizing = false - } - const startResize = (event: MouseEvent): void => { - const el: HTMLElement = event.currentTarget as HTMLElement - if (el && !isResizing) { - oldX = el.getBoundingClientRect().y - dX = event.clientX - oldX - document.addEventListener('mouseup', endResize) - document.addEventListener('mousemove', resizing) - cover.style.display = 'block' - isResizing = true - } - } let navFloat: boolean = !($deviceInfo.docWidth < 1024) $: if ($deviceInfo.docWidth <= 1024 && !navFloat) { @@ -600,6 +571,8 @@ let inboxPopup: PopupResult | undefined = undefined let lastLoc: Location | undefined = undefined + + defineSeparators('workbench', workbenchSeparators) {#if employee?.active === true || accountId === core.account.System} @@ -751,6 +724,7 @@ {/if}
+ {/if}
+
{