platform/plugins/view-resources/src/components/FixedColumn.svelte
Denis Bykhov 077b7b3f0d
Fixed column fix (#2519)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2023-01-18 17:13:29 +06:00

64 lines
1.8 KiB
Svelte

<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
// Copyright © 2021 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { resizeObserver } from '@hcengineering/ui'
import { afterUpdate, onDestroy } from 'svelte'
import { fixedWidthStore } from '../utils'
export let key: string
export let justify: string = ''
export let addClass: string | undefined = undefined
let prevKey = key
let element: HTMLDivElement | undefined
let cWidth: number | undefined = undefined
afterUpdate(() => {
if (cWidth !== undefined) {
if (prevKey !== key) {
$fixedWidthStore[prevKey] = 0
$fixedWidthStore[key] = 0
prevKey = key
cWidth = undefined
}
}
})
function resize (element: Element) {
cWidth = element.clientWidth
if (cWidth > ($fixedWidthStore[key] ?? 0)) {
$fixedWidthStore[key] = cWidth
}
}
onDestroy(() => {
if (cWidth === $fixedWidthStore[key]) {
// If we are longest element
$fixedWidthStore[key] = 0
}
})
</script>
<div
bind:this={element}
class="flex-no-shrink{addClass ? ` ${addClass}` : ''}"
style:text-align={justify !== '' ? justify : ''}
style:min-width={`${$fixedWidthStore[key] ?? 0}px`}
use:resizeObserver={resize}
>
<slot />
</div>