Skip to content

Commit e11a223

Browse files
committed
feat: add conditions-editor export and refactor RelativeTimePicker component for improved prop handling
1 parent 76ab4e9 commit e11a223

6 files changed

Lines changed: 248 additions & 213 deletions

File tree

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
import { observer } from '@formily/reactive-vue'
2+
import { BaseFieldSelect as FieldSelect } from '@tap/form'
3+
import i18n from '@tap/i18n'
4+
import { defineComponent } from 'vue'
5+
import { RelativeTimePicker } from '../relative-time-picker'
6+
import './style.scss'
7+
8+
const OPERATOR_OPTIONS = [
9+
{ label: '>', value: 1 },
10+
{ label: '>=', value: 2 },
11+
{ label: '<', value: 3 },
12+
{ label: '<=', value: 4 },
13+
{ label: '=', value: 5 },
14+
]
15+
16+
const DATE_VIEW_OPTIONS = [
17+
{ label: i18n.t('public_date_specific'), value: false },
18+
{ label: i18n.t('public_date_relative'), value: true },
19+
]
20+
21+
const DATE_TYPE_REG = /timestamp|date/i
22+
23+
const isDateField = (field: any) => DATE_TYPE_REG.test(field?.type || '')
24+
25+
const createItem = () => ({
26+
key: '',
27+
value: '',
28+
operator: 5,
29+
fastQuery: false,
30+
number: 1,
31+
unit: 'DAY',
32+
form: 'BEFORE',
33+
})
34+
35+
export const ConditionsEditor = observer(
36+
defineComponent({
37+
name: 'ConditionsEditor',
38+
inheritAttrs: false,
39+
props: {
40+
value: { type: Array, default: () => [] },
41+
disabled: Boolean,
42+
fields: { type: Array, default: () => [] },
43+
fieldsLoading: Boolean,
44+
offsetHours: { type: Number, default: 0 },
45+
},
46+
setup(props) {
47+
const getField = (key: string) =>
48+
(props.fields as any[])?.find((item) => item.value === key)
49+
50+
const handleAdd = () => {
51+
;(props.value as any[]).push(createItem())
52+
}
53+
54+
const handleRemove = (index: number) => {
55+
;(props.value as any[]).splice(index, 1)
56+
}
57+
58+
const handleFieldChange = (item: any, val: string) => {
59+
item.key = val
60+
item.value = ''
61+
}
62+
63+
return () => {
64+
const items = (props.value || []) as any[]
65+
66+
return (
67+
<div class="conditions-editor">
68+
{items.map((item, index) => {
69+
const field = getField(item.key)
70+
const dateField = isDateField(field)
71+
72+
return (
73+
<div class="conditions-editor__row" key={index}>
74+
<div class="conditions-editor__main">
75+
<FieldSelect
76+
class="conditions-editor__field"
77+
modelValue={item.key}
78+
options={props.fields}
79+
loading={props.fieldsLoading}
80+
filterable
81+
disabled={props.disabled}
82+
onUpdate:modelValue={(val: string) =>
83+
handleFieldChange(item, val)
84+
}
85+
/>
86+
<ElSelect
87+
class="conditions-editor__operator"
88+
v-model={item.operator}
89+
disabled={props.disabled || item.fastQuery}
90+
>
91+
{OPERATOR_OPTIONS.map((option) => (
92+
<ElOption
93+
key={option.value}
94+
label={option.label}
95+
value={option.value}
96+
></ElOption>
97+
))}
98+
</ElSelect>
99+
<div class="conditions-editor__value">
100+
{dateField ? (
101+
<>
102+
<ElSegmented
103+
class="w-100"
104+
v-model={item.fastQuery}
105+
options={DATE_VIEW_OPTIONS}
106+
disabled={props.disabled}
107+
onChange={(val: boolean) => {
108+
if (val) {
109+
item.operator = 5
110+
}
111+
}}
112+
/>
113+
114+
<div class="conditions-editor__date flex justify-content-end">
115+
{item.fastQuery ? (
116+
<RelativeTimePicker
117+
disabled={props.disabled}
118+
offsetHours={props.offsetHours}
119+
number={item.number}
120+
unit={item.unit}
121+
form={item.form}
122+
onChange={(val: any) =>
123+
Object.assign(item, val)
124+
}
125+
/>
126+
) : (
127+
<ElDatePicker
128+
class="w-100"
129+
modelValue={item.value}
130+
type="datetime"
131+
format="YYYY-MM-DD HH:mm:ss"
132+
value-format="YYYY-MM-DD HH:mm:ss"
133+
disabled={props.disabled}
134+
onUpdate:modelValue={(val: string) =>
135+
(item.value = val)
136+
}
137+
/>
138+
)}
139+
</div>
140+
</>
141+
) : (
142+
<ElInput
143+
modelValue={item.value}
144+
disabled={props.disabled}
145+
onUpdate:modelValue={(val: string) =>
146+
(item.value = val)
147+
}
148+
/>
149+
)}
150+
</div>
151+
<ElButton
152+
class="conditions-editor__remove"
153+
text
154+
disabled={props.disabled || items.length < 2}
155+
onClick={() => handleRemove(index)}
156+
icon={IconLucideTrash2}
157+
></ElButton>
158+
</div>
159+
</div>
160+
)
161+
})}
162+
<ElButton
163+
class="w-100 border-dashed"
164+
disabled={props.disabled}
165+
onClick={handleAdd}
166+
icon={IconLucidePlus}
167+
></ElButton>
168+
</div>
169+
)
170+
}
171+
},
172+
}),
173+
)
174+
175+
export default ConditionsEditor
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
.conditions-editor {
2+
&__row {
3+
margin-bottom: 8px;
4+
}
5+
6+
&__main {
7+
display: flex;
8+
align-items: flex-start;
9+
gap: 8px;
10+
}
11+
12+
&__field {
13+
flex: 1;
14+
min-width: 0;
15+
}
16+
17+
&__operator {
18+
width: 64px !important;
19+
flex: none;
20+
}
21+
22+
&__value {
23+
flex: 1;
24+
min-width: 0;
25+
}
26+
27+
&__remove {
28+
flex: none;
29+
}
30+
31+
&__date {
32+
margin-top: 8px;
33+
margin-left: 0;
34+
}
35+
}

packages/dag/src/components/form/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export * from './schema-preview'
2929
export * from './schema-panel'
3030
export * from './js-field'
3131
export * from './relative-time-picker'
32+
export * from './conditions-editor'
3233
export * from './sync-points'
3334
export * from './schema-form-item'
3435
export * from './source-database-node'

packages/dag/src/components/form/relative-time-picker/index.tsx

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import { observer } from '@formily/reactive-vue'
2-
import { connect, mapProps } from '@formily/vue'
32
import { getCurrentEngineTime } from '@tap/api/src/core/task'
43
import { dayjs } from '@tap/business/src/shared/dayjs'
54
import { DownBoldOutlined } from '@tap/component/src/DownBoldOutlined'
6-
import { useField, useForm } from '@tap/form'
75
import i18n from '@tap/i18n'
86
import { computed, defineComponent, reactive, ref, watch } from 'vue'
97

@@ -14,29 +12,25 @@ const RelativeTimePickerComponent = defineComponent({
1412
type: Number,
1513
default: 0,
1614
},
15+
number: {
16+
type: Number,
17+
default: 1,
18+
},
19+
unit: {
20+
type: String,
21+
default: 'DAY',
22+
},
23+
form: {
24+
type: String,
25+
default: 'BEFORE',
26+
},
1727
},
18-
setup(props) {
19-
const formRef = useForm()
20-
const fieldRef = useField()
21-
const recordField = formRef.value
22-
.query(`conditions.${fieldRef.value.index}`)
23-
.take()
24-
const record = recordField.value
25-
26-
if (!('number' in record)) {
27-
record.number = 1
28-
}
29-
if (!('unit' in record)) {
30-
record.unit = 'DAY'
31-
}
32-
if (!('form' in record)) {
33-
record.form = 'BEFORE'
34-
}
35-
28+
emits: ['change'],
29+
setup(props, { emit, attrs }) {
3630
const state = reactive({
37-
number: record.number || 1,
38-
form: record.form || 'BEFORE',
39-
unit: record.unit || 'DAY',
31+
number: props.number || 1,
32+
form: props.form || 'BEFORE',
33+
unit: props.unit || 'DAY',
4034
})
4135
const engineDate = ref(dayjs())
4236
const loadCurrentEngineTime = async () => {
@@ -86,8 +80,8 @@ const RelativeTimePickerComponent = defineComponent({
8680
return `${start.format(formatStr)} - ${end.format(formatStr)}`
8781
})
8882

89-
watch(state, (val) => {
90-
Object.assign(record, state)
83+
watch(state, () => {
84+
emit('change', { ...state })
9185
})
9286

9387
const unitOptions = [
@@ -178,6 +172,7 @@ const RelativeTimePickerComponent = defineComponent({
178172
{{
179173
reference: () => (
180174
<ElButton
175+
{...attrs}
181176
class="py-2 px-3 align-self-start"
182177
disabled={props.disabled}
183178
>
@@ -246,7 +241,4 @@ const RelativeTimePickerComponent = defineComponent({
246241
},
247242
})
248243

249-
export const RelativeTimePicker = connect(
250-
observer(RelativeTimePickerComponent),
251-
mapProps({ disabled: true }),
252-
)
244+
export const RelativeTimePicker = observer(RelativeTimePickerComponent)

0 commit comments

Comments
 (0)