mirror of
https://github.com/hcengineering/platform.git
synced 2026-09-21 09:07:50 +02:00
118 lines
3.4 KiB
Svelte
118 lines
3.4 KiB
Svelte
<!--
|
|
// Copyright © 2022 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 { createEventDispatcher } from 'svelte'
|
|
import { Data } from '@hcengineering/core'
|
|
import { IssueStatus } from '@hcengineering/tracker'
|
|
import { Button, eventToHTMLElement, getPlatformColor, showPopup } from '@hcengineering/ui'
|
|
import presentation from '@hcengineering/presentation'
|
|
import { ColorsPopup } from '@hcengineering/view-resources'
|
|
import tracker from '../../plugin'
|
|
import Circles from '../icons/Circles.svelte'
|
|
import StatusInput from './StatusInput.svelte'
|
|
|
|
export let value: Partial<Data<IssueStatus>>
|
|
export let isSingle = true
|
|
export let isSaving = false
|
|
|
|
const dispatch = createEventDispatcher()
|
|
|
|
function pickColor (evt: MouseEvent) {
|
|
showPopup(
|
|
ColorsPopup,
|
|
{ selected: value.color ? getPlatformColor(value.color) : undefined },
|
|
eventToHTMLElement(evt),
|
|
(newColor) => (value.color = newColor)
|
|
)
|
|
}
|
|
|
|
$: canSave = !isSaving && (value.name ?? '').length > 0
|
|
</script>
|
|
|
|
<div class="flex-between background-button-bg-color border-radius-1 p-2 root">
|
|
<div class="flex flex-grow items-center clear-mins inputs">
|
|
<div class="flex-no-shrink draggable-mark">
|
|
{#if !isSingle}<Circles />{/if}
|
|
</div>
|
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
<div class="flex-no-shrink ml-2 color" on:click={pickColor}>
|
|
<div class="dot" style="background-color: {getPlatformColor(value.color ?? 0)}" />
|
|
</div>
|
|
<div class="ml-2 w-full name">
|
|
<StatusInput bind:value={value.name} placeholder={tracker.string.Name} focus fill />
|
|
</div>
|
|
<div class="ml-2 w-full">
|
|
<StatusInput bind:value={value.description} placeholder={tracker.string.Description} fill />
|
|
</div>
|
|
</div>
|
|
<div class="buttons-group small-gap flex-no-shrink ml-2 mr-1">
|
|
<Button label={presentation.string.Cancel} kind="secondary" on:click={() => dispatch('cancel')} />
|
|
<Button label={presentation.string.Save} kind="primary" disabled={!canSave} on:click={() => dispatch('save')} />
|
|
</div>
|
|
</div>
|
|
|
|
<style lang="scss">
|
|
.root {
|
|
line-height: 1.125rem;
|
|
|
|
&:hover {
|
|
.draggable-mark {
|
|
opacity: 0.4;
|
|
}
|
|
}
|
|
}
|
|
|
|
.inputs {
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
|
|
.name {
|
|
max-width: 10rem;
|
|
}
|
|
}
|
|
|
|
.draggable-mark {
|
|
position: relative;
|
|
opacity: 0;
|
|
width: 0.375rem;
|
|
height: 1rem;
|
|
margin-left: 0.25rem;
|
|
transition: opacity 0.1s;
|
|
|
|
&::before {
|
|
position: absolute;
|
|
content: '';
|
|
inset: -0.5rem;
|
|
}
|
|
}
|
|
|
|
.color {
|
|
position: relative;
|
|
width: 1.75rem;
|
|
height: 1.75rem;
|
|
background-color: var(--accent-bg-color);
|
|
border: 1px solid transparent;
|
|
border-radius: 0.25rem;
|
|
cursor: pointer;
|
|
|
|
.dot {
|
|
position: absolute;
|
|
content: '';
|
|
border-radius: 50%;
|
|
inset: 30%;
|
|
}
|
|
}
|
|
</style>
|