seitime-frappe/frappe/public/js/form_builder/components/Column.vue
Fisher Yu 41a7b42f16
fix: Translate form and workflow builder (#25482)
* Update AttachControl.vue

* Update ButtonControl.vue

* Update CheckControl.vue

* Update CodeControl.vue

* Update DataControl.vue

* Update ImageControl.vue

* Update LinkControl.vue

* Update RatingControl.vue

* Update SelectControl.vue

* Update SignatureControl.vue

* Update TableControl.vue

* Update TextControl.vue

* Update TextEditorControl.vue

* Update Section.vue

* Update Column.vue

* Update Tabs.vue

* Update Field.vue

* Update Sidebar.vue

* Update AddFieldButton.vue

* Update AddFieldButton.vue

* Update Section.vue

* Update WorkflowBuilder.vue

* Update Autocomplete.vue

* Update EditableInput.vue

* Update AttachControl.vue

* Update ButtonControl.vue

* Update CheckControl.vue

* Update CodeControl.vue

* Update DataControl.vue

* Update ImageControl.vue

* Update LinkControl.vue

* Update RatingControl.vue

* Update SelectControl.vue

* Update SignatureControl.vue

* Update TextControl.vue

* Update TextEditorControl.vue

* Update Field.vue

* Update EditableInput.vue

* Update TableControl.vue

* Update Column.vue

* fix: variable in translatable string

* fix: add context for row number label

* fix: translate labels in workflow builder

* style: formatting

---------

Co-authored-by: barredterra <14891507+barredterra@users.noreply.github.com>
Co-authored-by: Ankush Menat <ankush@frappe.io>
2024-03-18 18:41:50 +05:30

185 lines
3.7 KiB
Vue

<template>
<div
:class="['column', selected ? 'selected' : hovered ? 'hovered' : '']"
:title="column.df.fieldname"
@click.stop="store.form.selected_field = column.df"
@mouseover.stop="hovered = true"
@mouseout.stop="hovered = false"
>
<div
v-if="column.df.label"
class="column-header"
:hidden="!column.df.label && store.read_only"
>
<div class="column-label">
<span>{{ __(column.df.label) }}</span>
</div>
</div>
<div v-if="column.df.description" class="column-description">
{{ column.df.description }}
</div>
<draggable
class="column-container"
v-model="column.fields"
group="fields"
:delay="is_touch_screen_device() ? 200 : 0"
:animation="200"
:easing="store.get_animation"
item-key="id"
:disabled="store.read_only"
>
<template #item="{ element }">
<Field
:column="column"
:field="element"
:data-is-user-generated="store.is_user_generated_field(element)"
/>
</template>
</draggable>
<div class="empty-column" :hidden="store.read_only">
<AddFieldButton :column="column" />
</div>
<div v-if="column.fields.length" class="add-new-field-btn">
<AddFieldButton :field="column.fields[column.fields.length - 1]" :column="column" />
</div>
</div>
</template>
<script setup>
import draggable from "vuedraggable";
import Field from "./Field.vue";
import AddFieldButton from "./AddFieldButton.vue";
import { computed, ref } from "vue";
import { useStore } from "../store";
import { is_touch_screen_device } from "../utils";
import { useMagicKeys, whenever } from "@vueuse/core";
const props = defineProps(["section", "column"]);
const store = useStore();
// delete/backspace to delete the field
const { Backspace } = useMagicKeys();
whenever(Backspace, (value) => {
if (value && selected.value && store.not_using_input) {
remove_column();
}
});
const hovered = ref(false);
const selected = computed(() => store.selected(props.column.df.name));
</script>
<style lang="scss" scoped>
.column {
position: relative;
display: flex;
flex-direction: column;
width: 100%;
background-color: var(--bg-light-gray);
border-radius: var(--border-radius);
border: 1px dashed var(--gray-400);
padding: 0.5rem;
margin-left: 4px;
margin-right: 4px;
&.hovered,
&.selected {
border-color: var(--border-primary);
border-style: solid;
}
.column-header {
display: flex;
align-items: center;
justify-content: space-between;
padding-bottom: 0.5rem;
padding-left: 0.3rem;
.column-label {
:deep(span) {
font-weight: 600;
color: var(--heading-color);
}
}
.column-actions {
display: flex;
justify-content: flex-end;
.btn.btn-icon {
padding: 2px;
box-shadow: none;
opacity: 0;
&:hover {
opacity: 1;
background-color: var(--fg-color);
}
}
}
}
.column-description {
margin-bottom: 10px;
margin-left: 0.3rem;
font-size: var(--text-xs);
color: var(--text-muted);
}
&:first-child {
margin-left: 0px;
}
&:last-child {
margin-right: 0px;
}
.column-container {
min-height: 2rem;
border-radius: var(--border-radius);
z-index: 1;
&:empty {
flex: 1;
& + .empty-column {
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
position: absolute;
top: 0;
bottom: 0;
left: 0;
gap: 5px;
width: 100%;
padding: 15px;
button {
background-color: var(--bg-color);
z-index: 2;
&:hover {
background-color: var(--btn-default-hover-bg);
}
}
}
}
& + .empty-column {
display: none;
}
}
.add-new-field-btn {
padding: 10px 6px 5px;
button {
background-color: var(--fg-color);
&:hover {
background-color: var(--btn-default-hover-bg);
}
}
}
}
</style>