poe-svelte-ui-lib 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +3 -3
- package/dist/Accordion/Accordion.svelte +53 -53
- package/dist/Accordion/AccordionProps.svelte +70 -70
- package/dist/Button/Button.svelte +144 -144
- package/dist/Button/ButtonProps.svelte +200 -200
- package/dist/ColorPicker/ColorPicker.svelte +207 -207
- package/dist/ColorPicker/ColorPickerProps.svelte +100 -100
- package/dist/FileAttach/FileAttach.svelte +103 -103
- package/dist/Graph/Graph.svelte +270 -270
- package/dist/Graph/GraphProps.svelte +56 -56
- package/dist/Input/Input.svelte +239 -239
- package/dist/Input/InputProps.svelte +221 -221
- package/dist/Loader.svelte +12 -12
- package/dist/MessageModal.svelte +54 -54
- package/dist/ProgressBar/ProgressBar.svelte +48 -48
- package/dist/ProgressBar/ProgressBarProps.svelte +145 -145
- package/dist/Select/Select.svelte +191 -187
- package/dist/Select/SelectProps.svelte +260 -260
- package/dist/Slider/Slider.svelte +260 -260
- package/dist/Slider/SliderProps.svelte +161 -161
- package/dist/Switch/Switch.svelte +83 -83
- package/dist/Switch/SwitchProps.svelte +144 -144
- package/dist/Table/Table.svelte +276 -276
- package/dist/Table/TableProps.svelte +286 -286
- package/dist/TextField/TextField.svelte +22 -22
- package/dist/TextField/TextFieldProps.svelte +92 -92
- package/dist/{appIcons → libIcons}/ButtonAdd.svelte +10 -10
- package/dist/{appIcons → libIcons}/ButtonDelete.svelte +13 -13
- package/dist/{appIcons → libIcons}/LoaderRotate.svelte +9 -9
- package/dist/locales/CircleFlagsEn.svelte +14 -14
- package/dist/locales/CircleFlagsRu.svelte +8 -8
- package/dist/locales/CircleFlagsZh.svelte +8 -8
- package/package.json +49 -47
- /package/dist/{appIcons → libIcons}/ButtonAdd.svelte.d.ts +0 -0
- /package/dist/{appIcons → libIcons}/ButtonDelete.svelte.d.ts +0 -0
- /package/dist/{appIcons → libIcons}/LoaderRotate.svelte.d.ts +0 -0
|
@@ -1,286 +1,286 @@
|
|
|
1
|
-
<!-- $lib/ElementsUI/TableProps.svelte -->
|
|
2
|
-
<script lang="ts">
|
|
3
|
-
import { getContext } from 'svelte'
|
|
4
|
-
import { t } from '../locales/i18n'
|
|
5
|
-
import type { UIComponent, ITableProps, ITableHeader } from '../types'
|
|
6
|
-
import * as UI from '../index'
|
|
7
|
-
import ButtonDelete from '../
|
|
8
|
-
import ButtonAdd from '../
|
|
9
|
-
import { optionsStore } from '../options'
|
|
10
|
-
|
|
11
|
-
const { component, onPropertyChange } = $props<{
|
|
12
|
-
component: UIComponent & { properties: Partial<ITableProps<object>> }
|
|
13
|
-
onPropertyChange: (value: string | object) => void
|
|
14
|
-
}>()
|
|
15
|
-
|
|
16
|
-
const DeviceVariables = getContext<{ value: string; name: string }[]>('DeviceVariables')
|
|
17
|
-
let VARIABLE_OPTIONS = $derived(
|
|
18
|
-
DeviceVariables.map((variable: { value: string; name: string }) => ({
|
|
19
|
-
id: variable.name,
|
|
20
|
-
value: variable.value,
|
|
21
|
-
name: `${variable.value} | ${variable.name}`,
|
|
22
|
-
})),
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
const initialColor = $derived(
|
|
26
|
-
$optionsStore.COLOR_OPTIONS.find((c) =>
|
|
27
|
-
(c.value as string).includes(component.properties.wrapperClass?.split(' ').find((cls: string) => cls.startsWith('bg-'))),
|
|
28
|
-
),
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
const initialAlign = $derived(
|
|
32
|
-
$optionsStore.ALIGN_OPTIONS.find((a) =>
|
|
33
|
-
(a.value as string).includes(component.properties.label?.class?.split(' ').find((cls: string) => cls.startsWith('text-'))),
|
|
34
|
-
),
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
/* Добавление цветов через селект */
|
|
38
|
-
const handleOptionColorChange = (color: string) => {
|
|
39
|
-
let componentClass = component.properties.componentClass || ''
|
|
40
|
-
componentClass = componentClass
|
|
41
|
-
.split(' ')
|
|
42
|
-
.filter((cls: string) => !cls.startsWith('bg-'))
|
|
43
|
-
.join(' ')
|
|
44
|
-
if (color) {
|
|
45
|
-
componentClass += ` ${color}`
|
|
46
|
-
}
|
|
47
|
-
updateProperty('wrapperClass', componentClass)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const handleLabelAlign = (align: string) => {
|
|
51
|
-
let labelClass = component.properties.label.class || ''
|
|
52
|
-
labelClass = labelClass
|
|
53
|
-
.split(' ')
|
|
54
|
-
.filter((cls: string) => !cls.startsWith('text-'))
|
|
55
|
-
.join(' ')
|
|
56
|
-
if (align) {
|
|
57
|
-
labelClass += ` ${align}`
|
|
58
|
-
}
|
|
59
|
-
updateProperty('label.class', labelClass)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/* Обновление свойства */
|
|
63
|
-
const updateProperty = (path: string, value: string | object) => {
|
|
64
|
-
const newProperties = JSON.parse(JSON.stringify(component.properties))
|
|
65
|
-
const parts = path.split('.')
|
|
66
|
-
let obj = newProperties
|
|
67
|
-
|
|
68
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
69
|
-
const part = parts[i]
|
|
70
|
-
if (!obj[part]) obj[part] = {}
|
|
71
|
-
obj = obj[part]
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
obj[parts[parts.length - 1]] = value
|
|
75
|
-
onPropertyChange(newProperties)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const updateTableHeader = (index: number, field: keyof ITableHeader<any>, value: any) => {
|
|
79
|
-
const headers = [...component.properties.tableHeader]
|
|
80
|
-
headers[index] = { ...headers[index], [field]: value }
|
|
81
|
-
updateProperty('tableHeader', headers)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const updateButtonProperty = (columnIndex: number, buttonIndex: number, field: string, value: any) => {
|
|
85
|
-
const headers = [...component.properties.tableHeader]
|
|
86
|
-
const buttons = [...headers[columnIndex].buttons]
|
|
87
|
-
buttons[buttonIndex] = { ...buttons[buttonIndex], [field]: value }
|
|
88
|
-
headers[columnIndex].buttons = buttons
|
|
89
|
-
updateProperty('tableHeader', headers)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const removeButtonFromColumn = (columnIndex: number, buttonIndex: number) => {
|
|
93
|
-
const headers = [...component.properties.tableHeader]
|
|
94
|
-
const buttons = [...headers[columnIndex].buttons]
|
|
95
|
-
buttons.splice(buttonIndex, 1)
|
|
96
|
-
headers[columnIndex].buttons = buttons.length ? buttons : undefined
|
|
97
|
-
updateProperty('tableHeader', headers)
|
|
98
|
-
}
|
|
99
|
-
</script>
|
|
100
|
-
|
|
101
|
-
{#if component && component.properties}
|
|
102
|
-
<div class="relative flex flex-row items-start justify-center">
|
|
103
|
-
<div class="flex w-1/3 flex-col items-center px-2">
|
|
104
|
-
<UI.Select
|
|
105
|
-
label={{ name: $t('service.constructor.props.variable') }}
|
|
106
|
-
options={VARIABLE_OPTIONS}
|
|
107
|
-
value={VARIABLE_OPTIONS.find((opt) => opt.value === component.properties.id.value)}
|
|
108
|
-
onUpdate={(value) => {
|
|
109
|
-
updateProperty('id.name', (value.name as string).split('|')[1].trim())
|
|
110
|
-
updateProperty('id.value', value.value as string)
|
|
111
|
-
updateProperty('eventHandler.Variables', value.value as string)
|
|
112
|
-
}}
|
|
113
|
-
/>
|
|
114
|
-
</div>
|
|
115
|
-
<div class="flex w-1/3 flex-col px-2">
|
|
116
|
-
<UI.Select
|
|
117
|
-
wrapperClass="!h-14"
|
|
118
|
-
label={{ name: $t('service.constructor.props.colors') }}
|
|
119
|
-
type="buttons"
|
|
120
|
-
options={$optionsStore.COLOR_OPTIONS}
|
|
121
|
-
value={initialColor}
|
|
122
|
-
onUpdate={(option) => handleOptionColorChange(option.value as string)}
|
|
123
|
-
/>
|
|
124
|
-
</div>
|
|
125
|
-
<div class="flex w-1/3 flex-col px-2">
|
|
126
|
-
<UI.Input
|
|
127
|
-
wrapperClass="w-full"
|
|
128
|
-
label={{ name: $t('service.constructor.props.label') }}
|
|
129
|
-
value={component.properties.label.name}
|
|
130
|
-
type="text"
|
|
131
|
-
componentClass="w-full"
|
|
132
|
-
onUpdate={(value) => updateProperty('label.name', value as string)}
|
|
133
|
-
/>
|
|
134
|
-
<UI.Select
|
|
135
|
-
wrapperClass="w-full"
|
|
136
|
-
label={{ name: $t('service.constructor.props.align') }}
|
|
137
|
-
type="buttons"
|
|
138
|
-
value={initialAlign}
|
|
139
|
-
options={$optionsStore.ALIGN_OPTIONS}
|
|
140
|
-
onUpdate={(option) => handleLabelAlign(option.value as string)}
|
|
141
|
-
/>
|
|
142
|
-
</div>
|
|
143
|
-
</div>
|
|
144
|
-
|
|
145
|
-
<hr class="border-gray-400" />
|
|
146
|
-
|
|
147
|
-
<!-- Настройки столбцов таблицы -->
|
|
148
|
-
<div class="space-y-4">
|
|
149
|
-
<div class="m-0 flex items-center justify-center gap-2">
|
|
150
|
-
<h4>{$t('service.constructor.props.table.columns')}</h4>
|
|
151
|
-
<UI.Button
|
|
152
|
-
wrapperClass="!w-10"
|
|
153
|
-
icon={{ component: ButtonAdd, properties: { height: '1.5rem', width: '1.5rem' } }}
|
|
154
|
-
componentClass="h-10 border-none hover:shadow-none"
|
|
155
|
-
onClick={() => {
|
|
156
|
-
const newColumn: ITableHeader<any> = {
|
|
157
|
-
key: `column${(component.properties.tableHeader?.length || 0) + 1}`,
|
|
158
|
-
label: `Column ${(component.properties.tableHeader?.length || 0) + 1}`,
|
|
159
|
-
width: '100px',
|
|
160
|
-
sortable: false,
|
|
161
|
-
}
|
|
162
|
-
const headers = [...(component.properties.tableHeader || []), newColumn]
|
|
163
|
-
updateProperty('tableHeader', headers)
|
|
164
|
-
}}
|
|
165
|
-
/>
|
|
166
|
-
</div>
|
|
167
|
-
|
|
168
|
-
{#each component.properties.tableHeader as column, columnIndex}
|
|
169
|
-
<div class="m-0 flex items-end justify-around gap-2">
|
|
170
|
-
<UI.Input
|
|
171
|
-
label={{ name: $t('service.constructor.props.table.columns.key') }}
|
|
172
|
-
wrapperClass="!w-2/10"
|
|
173
|
-
value={column.key}
|
|
174
|
-
type="text"
|
|
175
|
-
regExp={/^[0-9a-zA-Z_-]{0,16}$/}
|
|
176
|
-
onUpdate={(value) => updateTableHeader(columnIndex, 'key', value)}
|
|
177
|
-
/>
|
|
178
|
-
<UI.Input
|
|
179
|
-
label={{ name: $t('service.constructor.props.table.columns.label') }}
|
|
180
|
-
wrapperClass="!w-2/10"
|
|
181
|
-
value={column.label}
|
|
182
|
-
type="text"
|
|
183
|
-
onUpdate={(value) => updateTableHeader(columnIndex, 'label', value)}
|
|
184
|
-
/>
|
|
185
|
-
<UI.Input
|
|
186
|
-
label={{ name: $t('service.constructor.props.table.columns.width') }}
|
|
187
|
-
wrapperClass="!w-2/10"
|
|
188
|
-
value={column.width}
|
|
189
|
-
type="text"
|
|
190
|
-
onUpdate={(value) => updateTableHeader(columnIndex, 'width', value)}
|
|
191
|
-
/>
|
|
192
|
-
<UI.Switch
|
|
193
|
-
wrapperClass="!w-1/10"
|
|
194
|
-
label={{ name: $t('service.constructor.props.table.columns.sortable') }}
|
|
195
|
-
value={column.sortable ? 2 : 1}
|
|
196
|
-
onChange={(value) => updateTableHeader(columnIndex, 'sortable', value === 2)}
|
|
197
|
-
/>
|
|
198
|
-
<UI.Button
|
|
199
|
-
wrapperClass="!w-1/20"
|
|
200
|
-
icon={{ component: ButtonAdd, properties: { height: '1.5rem', width: '1.5rem' } }}
|
|
201
|
-
componentClass="h-10 w-10 border-none hover:shadow-none"
|
|
202
|
-
info={$t('service.constructor.props.table.addaction')}
|
|
203
|
-
onClick={() => {
|
|
204
|
-
const newButton = {
|
|
205
|
-
name: `button${(component.properties.tableHeader[columnIndex].buttons || 0) + 1}`,
|
|
206
|
-
class: 'bg-blue',
|
|
207
|
-
eventHandler: { Header: 'SET', Argument: 'Save', Variables: [] },
|
|
208
|
-
onClick: () => {},
|
|
209
|
-
}
|
|
210
|
-
const buttons = [...(component.properties.tableHeader[columnIndex].buttons || []), newButton]
|
|
211
|
-
updateTableHeader(columnIndex, 'buttons', buttons)
|
|
212
|
-
}}
|
|
213
|
-
/>
|
|
214
|
-
<UI.Button
|
|
215
|
-
wrapperClass="!w-1/20"
|
|
216
|
-
icon={{ component: ButtonDelete, properties: { height: '1.5rem', width: '1.5rem' } }}
|
|
217
|
-
componentClass="h-10 w-10 border-none hover:shadow-none"
|
|
218
|
-
info={$t('service.constructor.props.table.deletecolumn')}
|
|
219
|
-
onClick={() => {
|
|
220
|
-
const headers = [...(component.properties.tableHeader || [])]
|
|
221
|
-
headers.splice(columnIndex, 1)
|
|
222
|
-
updateProperty('tableHeader', headers)
|
|
223
|
-
}}
|
|
224
|
-
/>
|
|
225
|
-
</div>
|
|
226
|
-
{#if column.buttons && column.buttons.length > 0}
|
|
227
|
-
<div class="m-2 rounded-lg bg-[var(--field-color)] p-2">
|
|
228
|
-
{#each column.buttons as button, buttonIndex}
|
|
229
|
-
<div class="flex items-end justify-around gap-2">
|
|
230
|
-
<UI.Input
|
|
231
|
-
label={{ name: $t('service.constructor.props.name') }}
|
|
232
|
-
wrapperClass="!w-2/10"
|
|
233
|
-
value={button.name}
|
|
234
|
-
type="text"
|
|
235
|
-
onUpdate={(value) => updateButtonProperty(columnIndex, buttonIndex, 'name', value)}
|
|
236
|
-
/>
|
|
237
|
-
<UI.Select
|
|
238
|
-
wrapperClass="!w-3/10"
|
|
239
|
-
label={{ name: $t('service.constructor.props.header') }}
|
|
240
|
-
type="buttons"
|
|
241
|
-
value={$optionsStore.HEADER_OPTIONS.find((h) => h.value === button.eventHandler?.Header)}
|
|
242
|
-
options={$optionsStore.HEADER_OPTIONS}
|
|
243
|
-
onUpdate={(option) => {
|
|
244
|
-
const handler = button.eventHandler
|
|
245
|
-
handler.Header = option.value as string
|
|
246
|
-
updateButtonProperty(columnIndex, buttonIndex, 'eventHandler', handler)
|
|
247
|
-
}}
|
|
248
|
-
/>
|
|
249
|
-
<UI.Input
|
|
250
|
-
wrapperClass="!w-2/10"
|
|
251
|
-
label={{ name: $t('service.constructor.props.argument') }}
|
|
252
|
-
value={button.eventHandler?.Argument}
|
|
253
|
-
type="text"
|
|
254
|
-
onUpdate={(value) => {
|
|
255
|
-
const handler = button.eventHandler
|
|
256
|
-
handler.Argument = value as string
|
|
257
|
-
updateButtonProperty(columnIndex, buttonIndex, 'eventHandler', handler)
|
|
258
|
-
}}
|
|
259
|
-
/>
|
|
260
|
-
<UI.Input
|
|
261
|
-
wrapperClass="!w-2/10"
|
|
262
|
-
label={{ name: $t('service.constructor.props.table.keys') }}
|
|
263
|
-
value={button.eventHandler?.Variables.join(' ')}
|
|
264
|
-
type="text"
|
|
265
|
-
maxlength={500}
|
|
266
|
-
regExp={/^[a-zA-Z0-9\-_ ]{0,500}$/}
|
|
267
|
-
help={{ info: $t('service.constructor.props.table.keys.info') }}
|
|
268
|
-
onUpdate={(value) => {
|
|
269
|
-
const handler = { ...button.eventHandler }
|
|
270
|
-
handler.Variables = (value as string).trim().split(/\s+/)
|
|
271
|
-
updateButtonProperty(columnIndex, buttonIndex, 'eventHandler', handler)
|
|
272
|
-
}}
|
|
273
|
-
/>
|
|
274
|
-
<UI.Button
|
|
275
|
-
wrapperClass="!w-1/20"
|
|
276
|
-
icon={{ component: ButtonDelete, properties: { height: '1.5rem', width: '1.5rem' } }}
|
|
277
|
-
componentClass="h-10 w-10 border-none hover:shadow-none"
|
|
278
|
-
onClick={() => removeButtonFromColumn(columnIndex, buttonIndex)}
|
|
279
|
-
/>
|
|
280
|
-
</div>
|
|
281
|
-
{/each}
|
|
282
|
-
</div>
|
|
283
|
-
{/if}
|
|
284
|
-
{/each}
|
|
285
|
-
</div>
|
|
286
|
-
{/if}
|
|
1
|
+
<!-- $lib/ElementsUI/TableProps.svelte -->
|
|
2
|
+
<script lang="ts">
|
|
3
|
+
import { getContext } from 'svelte'
|
|
4
|
+
import { t } from '../locales/i18n'
|
|
5
|
+
import type { UIComponent, ITableProps, ITableHeader } from '../types'
|
|
6
|
+
import * as UI from '../index'
|
|
7
|
+
import ButtonDelete from '../libIcons/ButtonDelete.svelte'
|
|
8
|
+
import ButtonAdd from '../libIcons/ButtonAdd.svelte'
|
|
9
|
+
import { optionsStore } from '../options'
|
|
10
|
+
|
|
11
|
+
const { component, onPropertyChange } = $props<{
|
|
12
|
+
component: UIComponent & { properties: Partial<ITableProps<object>> }
|
|
13
|
+
onPropertyChange: (value: string | object) => void
|
|
14
|
+
}>()
|
|
15
|
+
|
|
16
|
+
const DeviceVariables = getContext<{ value: string; name: string }[]>('DeviceVariables')
|
|
17
|
+
let VARIABLE_OPTIONS = $derived(
|
|
18
|
+
DeviceVariables.map((variable: { value: string; name: string }) => ({
|
|
19
|
+
id: variable.name,
|
|
20
|
+
value: variable.value,
|
|
21
|
+
name: `${variable.value} | ${variable.name}`,
|
|
22
|
+
})),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
const initialColor = $derived(
|
|
26
|
+
$optionsStore.COLOR_OPTIONS.find((c) =>
|
|
27
|
+
(c.value as string).includes(component.properties.wrapperClass?.split(' ').find((cls: string) => cls.startsWith('bg-'))),
|
|
28
|
+
),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
const initialAlign = $derived(
|
|
32
|
+
$optionsStore.ALIGN_OPTIONS.find((a) =>
|
|
33
|
+
(a.value as string).includes(component.properties.label?.class?.split(' ').find((cls: string) => cls.startsWith('text-'))),
|
|
34
|
+
),
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
/* Добавление цветов через селект */
|
|
38
|
+
const handleOptionColorChange = (color: string) => {
|
|
39
|
+
let componentClass = component.properties.componentClass || ''
|
|
40
|
+
componentClass = componentClass
|
|
41
|
+
.split(' ')
|
|
42
|
+
.filter((cls: string) => !cls.startsWith('bg-'))
|
|
43
|
+
.join(' ')
|
|
44
|
+
if (color) {
|
|
45
|
+
componentClass += ` ${color}`
|
|
46
|
+
}
|
|
47
|
+
updateProperty('wrapperClass', componentClass)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const handleLabelAlign = (align: string) => {
|
|
51
|
+
let labelClass = component.properties.label.class || ''
|
|
52
|
+
labelClass = labelClass
|
|
53
|
+
.split(' ')
|
|
54
|
+
.filter((cls: string) => !cls.startsWith('text-'))
|
|
55
|
+
.join(' ')
|
|
56
|
+
if (align) {
|
|
57
|
+
labelClass += ` ${align}`
|
|
58
|
+
}
|
|
59
|
+
updateProperty('label.class', labelClass)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Обновление свойства */
|
|
63
|
+
const updateProperty = (path: string, value: string | object) => {
|
|
64
|
+
const newProperties = JSON.parse(JSON.stringify(component.properties))
|
|
65
|
+
const parts = path.split('.')
|
|
66
|
+
let obj = newProperties
|
|
67
|
+
|
|
68
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
69
|
+
const part = parts[i]
|
|
70
|
+
if (!obj[part]) obj[part] = {}
|
|
71
|
+
obj = obj[part]
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
obj[parts[parts.length - 1]] = value
|
|
75
|
+
onPropertyChange(newProperties)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const updateTableHeader = (index: number, field: keyof ITableHeader<any>, value: any) => {
|
|
79
|
+
const headers = [...component.properties.tableHeader]
|
|
80
|
+
headers[index] = { ...headers[index], [field]: value }
|
|
81
|
+
updateProperty('tableHeader', headers)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const updateButtonProperty = (columnIndex: number, buttonIndex: number, field: string, value: any) => {
|
|
85
|
+
const headers = [...component.properties.tableHeader]
|
|
86
|
+
const buttons = [...headers[columnIndex].buttons]
|
|
87
|
+
buttons[buttonIndex] = { ...buttons[buttonIndex], [field]: value }
|
|
88
|
+
headers[columnIndex].buttons = buttons
|
|
89
|
+
updateProperty('tableHeader', headers)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const removeButtonFromColumn = (columnIndex: number, buttonIndex: number) => {
|
|
93
|
+
const headers = [...component.properties.tableHeader]
|
|
94
|
+
const buttons = [...headers[columnIndex].buttons]
|
|
95
|
+
buttons.splice(buttonIndex, 1)
|
|
96
|
+
headers[columnIndex].buttons = buttons.length ? buttons : undefined
|
|
97
|
+
updateProperty('tableHeader', headers)
|
|
98
|
+
}
|
|
99
|
+
</script>
|
|
100
|
+
|
|
101
|
+
{#if component && component.properties}
|
|
102
|
+
<div class="relative flex flex-row items-start justify-center">
|
|
103
|
+
<div class="flex w-1/3 flex-col items-center px-2">
|
|
104
|
+
<UI.Select
|
|
105
|
+
label={{ name: $t('service.constructor.props.variable') }}
|
|
106
|
+
options={VARIABLE_OPTIONS}
|
|
107
|
+
value={VARIABLE_OPTIONS.find((opt) => opt.value === component.properties.id.value)}
|
|
108
|
+
onUpdate={(value) => {
|
|
109
|
+
updateProperty('id.name', (value.name as string).split('|')[1].trim())
|
|
110
|
+
updateProperty('id.value', value.value as string)
|
|
111
|
+
updateProperty('eventHandler.Variables', value.value as string)
|
|
112
|
+
}}
|
|
113
|
+
/>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="flex w-1/3 flex-col px-2">
|
|
116
|
+
<UI.Select
|
|
117
|
+
wrapperClass="!h-14"
|
|
118
|
+
label={{ name: $t('service.constructor.props.colors') }}
|
|
119
|
+
type="buttons"
|
|
120
|
+
options={$optionsStore.COLOR_OPTIONS}
|
|
121
|
+
value={initialColor}
|
|
122
|
+
onUpdate={(option) => handleOptionColorChange(option.value as string)}
|
|
123
|
+
/>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="flex w-1/3 flex-col px-2">
|
|
126
|
+
<UI.Input
|
|
127
|
+
wrapperClass="w-full"
|
|
128
|
+
label={{ name: $t('service.constructor.props.label') }}
|
|
129
|
+
value={component.properties.label.name}
|
|
130
|
+
type="text"
|
|
131
|
+
componentClass="w-full"
|
|
132
|
+
onUpdate={(value) => updateProperty('label.name', value as string)}
|
|
133
|
+
/>
|
|
134
|
+
<UI.Select
|
|
135
|
+
wrapperClass="w-full"
|
|
136
|
+
label={{ name: $t('service.constructor.props.align') }}
|
|
137
|
+
type="buttons"
|
|
138
|
+
value={initialAlign}
|
|
139
|
+
options={$optionsStore.ALIGN_OPTIONS}
|
|
140
|
+
onUpdate={(option) => handleLabelAlign(option.value as string)}
|
|
141
|
+
/>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
<hr class="border-gray-400" />
|
|
146
|
+
|
|
147
|
+
<!-- Настройки столбцов таблицы -->
|
|
148
|
+
<div class="space-y-4">
|
|
149
|
+
<div class="m-0 flex items-center justify-center gap-2">
|
|
150
|
+
<h4>{$t('service.constructor.props.table.columns')}</h4>
|
|
151
|
+
<UI.Button
|
|
152
|
+
wrapperClass="!w-10"
|
|
153
|
+
icon={{ component: ButtonAdd, properties: { height: '1.5rem', width: '1.5rem' } }}
|
|
154
|
+
componentClass="h-10 border-none hover:shadow-none"
|
|
155
|
+
onClick={() => {
|
|
156
|
+
const newColumn: ITableHeader<any> = {
|
|
157
|
+
key: `column${(component.properties.tableHeader?.length || 0) + 1}`,
|
|
158
|
+
label: `Column ${(component.properties.tableHeader?.length || 0) + 1}`,
|
|
159
|
+
width: '100px',
|
|
160
|
+
sortable: false,
|
|
161
|
+
}
|
|
162
|
+
const headers = [...(component.properties.tableHeader || []), newColumn]
|
|
163
|
+
updateProperty('tableHeader', headers)
|
|
164
|
+
}}
|
|
165
|
+
/>
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
{#each component.properties.tableHeader as column, columnIndex}
|
|
169
|
+
<div class="m-0 flex items-end justify-around gap-2">
|
|
170
|
+
<UI.Input
|
|
171
|
+
label={{ name: $t('service.constructor.props.table.columns.key') }}
|
|
172
|
+
wrapperClass="!w-2/10"
|
|
173
|
+
value={column.key}
|
|
174
|
+
type="text"
|
|
175
|
+
regExp={/^[0-9a-zA-Z_-]{0,16}$/}
|
|
176
|
+
onUpdate={(value) => updateTableHeader(columnIndex, 'key', value)}
|
|
177
|
+
/>
|
|
178
|
+
<UI.Input
|
|
179
|
+
label={{ name: $t('service.constructor.props.table.columns.label') }}
|
|
180
|
+
wrapperClass="!w-2/10"
|
|
181
|
+
value={column.label}
|
|
182
|
+
type="text"
|
|
183
|
+
onUpdate={(value) => updateTableHeader(columnIndex, 'label', value)}
|
|
184
|
+
/>
|
|
185
|
+
<UI.Input
|
|
186
|
+
label={{ name: $t('service.constructor.props.table.columns.width') }}
|
|
187
|
+
wrapperClass="!w-2/10"
|
|
188
|
+
value={column.width}
|
|
189
|
+
type="text"
|
|
190
|
+
onUpdate={(value) => updateTableHeader(columnIndex, 'width', value)}
|
|
191
|
+
/>
|
|
192
|
+
<UI.Switch
|
|
193
|
+
wrapperClass="!w-1/10"
|
|
194
|
+
label={{ name: $t('service.constructor.props.table.columns.sortable') }}
|
|
195
|
+
value={column.sortable ? 2 : 1}
|
|
196
|
+
onChange={(value) => updateTableHeader(columnIndex, 'sortable', value === 2)}
|
|
197
|
+
/>
|
|
198
|
+
<UI.Button
|
|
199
|
+
wrapperClass="!w-1/20"
|
|
200
|
+
icon={{ component: ButtonAdd, properties: { height: '1.5rem', width: '1.5rem' } }}
|
|
201
|
+
componentClass="h-10 w-10 border-none hover:shadow-none"
|
|
202
|
+
info={$t('service.constructor.props.table.addaction')}
|
|
203
|
+
onClick={() => {
|
|
204
|
+
const newButton = {
|
|
205
|
+
name: `button${(component.properties.tableHeader[columnIndex].buttons || 0) + 1}`,
|
|
206
|
+
class: 'bg-blue',
|
|
207
|
+
eventHandler: { Header: 'SET', Argument: 'Save', Variables: [] },
|
|
208
|
+
onClick: () => {},
|
|
209
|
+
}
|
|
210
|
+
const buttons = [...(component.properties.tableHeader[columnIndex].buttons || []), newButton]
|
|
211
|
+
updateTableHeader(columnIndex, 'buttons', buttons)
|
|
212
|
+
}}
|
|
213
|
+
/>
|
|
214
|
+
<UI.Button
|
|
215
|
+
wrapperClass="!w-1/20"
|
|
216
|
+
icon={{ component: ButtonDelete, properties: { height: '1.5rem', width: '1.5rem' } }}
|
|
217
|
+
componentClass="h-10 w-10 border-none hover:shadow-none"
|
|
218
|
+
info={$t('service.constructor.props.table.deletecolumn')}
|
|
219
|
+
onClick={() => {
|
|
220
|
+
const headers = [...(component.properties.tableHeader || [])]
|
|
221
|
+
headers.splice(columnIndex, 1)
|
|
222
|
+
updateProperty('tableHeader', headers)
|
|
223
|
+
}}
|
|
224
|
+
/>
|
|
225
|
+
</div>
|
|
226
|
+
{#if column.buttons && column.buttons.length > 0}
|
|
227
|
+
<div class="m-2 rounded-lg bg-[var(--field-color)] p-2">
|
|
228
|
+
{#each column.buttons as button, buttonIndex}
|
|
229
|
+
<div class="flex items-end justify-around gap-2">
|
|
230
|
+
<UI.Input
|
|
231
|
+
label={{ name: $t('service.constructor.props.name') }}
|
|
232
|
+
wrapperClass="!w-2/10"
|
|
233
|
+
value={button.name}
|
|
234
|
+
type="text"
|
|
235
|
+
onUpdate={(value) => updateButtonProperty(columnIndex, buttonIndex, 'name', value)}
|
|
236
|
+
/>
|
|
237
|
+
<UI.Select
|
|
238
|
+
wrapperClass="!w-3/10"
|
|
239
|
+
label={{ name: $t('service.constructor.props.header') }}
|
|
240
|
+
type="buttons"
|
|
241
|
+
value={$optionsStore.HEADER_OPTIONS.find((h) => h.value === button.eventHandler?.Header)}
|
|
242
|
+
options={$optionsStore.HEADER_OPTIONS}
|
|
243
|
+
onUpdate={(option) => {
|
|
244
|
+
const handler = button.eventHandler
|
|
245
|
+
handler.Header = option.value as string
|
|
246
|
+
updateButtonProperty(columnIndex, buttonIndex, 'eventHandler', handler)
|
|
247
|
+
}}
|
|
248
|
+
/>
|
|
249
|
+
<UI.Input
|
|
250
|
+
wrapperClass="!w-2/10"
|
|
251
|
+
label={{ name: $t('service.constructor.props.argument') }}
|
|
252
|
+
value={button.eventHandler?.Argument}
|
|
253
|
+
type="text"
|
|
254
|
+
onUpdate={(value) => {
|
|
255
|
+
const handler = button.eventHandler
|
|
256
|
+
handler.Argument = value as string
|
|
257
|
+
updateButtonProperty(columnIndex, buttonIndex, 'eventHandler', handler)
|
|
258
|
+
}}
|
|
259
|
+
/>
|
|
260
|
+
<UI.Input
|
|
261
|
+
wrapperClass="!w-2/10"
|
|
262
|
+
label={{ name: $t('service.constructor.props.table.keys') }}
|
|
263
|
+
value={button.eventHandler?.Variables.join(' ')}
|
|
264
|
+
type="text"
|
|
265
|
+
maxlength={500}
|
|
266
|
+
regExp={/^[a-zA-Z0-9\-_ ]{0,500}$/}
|
|
267
|
+
help={{ info: $t('service.constructor.props.table.keys.info') }}
|
|
268
|
+
onUpdate={(value) => {
|
|
269
|
+
const handler = { ...button.eventHandler }
|
|
270
|
+
handler.Variables = (value as string).trim().split(/\s+/)
|
|
271
|
+
updateButtonProperty(columnIndex, buttonIndex, 'eventHandler', handler)
|
|
272
|
+
}}
|
|
273
|
+
/>
|
|
274
|
+
<UI.Button
|
|
275
|
+
wrapperClass="!w-1/20"
|
|
276
|
+
icon={{ component: ButtonDelete, properties: { height: '1.5rem', width: '1.5rem' } }}
|
|
277
|
+
componentClass="h-10 w-10 border-none hover:shadow-none"
|
|
278
|
+
onClick={() => removeButtonFromColumn(columnIndex, buttonIndex)}
|
|
279
|
+
/>
|
|
280
|
+
</div>
|
|
281
|
+
{/each}
|
|
282
|
+
</div>
|
|
283
|
+
{/if}
|
|
284
|
+
{/each}
|
|
285
|
+
</div>
|
|
286
|
+
{/if}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { ITextFieldProps } from '../types'
|
|
3
|
-
|
|
4
|
-
let {
|
|
5
|
-
id = { value: crypto.randomUUID(), name: '' },
|
|
6
|
-
wrapperClass = '',
|
|
7
|
-
label = { name: '', class: '' },
|
|
8
|
-
type = 'small',
|
|
9
|
-
bold = false,
|
|
10
|
-
italic = false,
|
|
11
|
-
}: ITextFieldProps = $props()
|
|
12
|
-
|
|
13
|
-
const textSize = {
|
|
14
|
-
small: 'text-base',
|
|
15
|
-
medium: 'text-xl',
|
|
16
|
-
xlarge: 'text-2xl',
|
|
17
|
-
}
|
|
18
|
-
</script>
|
|
19
|
-
|
|
20
|
-
<div id={id.value} class="relative flex w-full flex-col items-center {wrapperClass}">
|
|
21
|
-
<p class="w-full text-center {label.class} {textSize[type]} {bold ? 'font-bold' : ''} {italic ? 'italic' : ''}">{label.name}</p>
|
|
22
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ITextFieldProps } from '../types'
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
id = { value: crypto.randomUUID(), name: '' },
|
|
6
|
+
wrapperClass = '',
|
|
7
|
+
label = { name: '', class: '' },
|
|
8
|
+
type = 'small',
|
|
9
|
+
bold = false,
|
|
10
|
+
italic = false,
|
|
11
|
+
}: ITextFieldProps = $props()
|
|
12
|
+
|
|
13
|
+
const textSize = {
|
|
14
|
+
small: 'text-base',
|
|
15
|
+
medium: 'text-xl',
|
|
16
|
+
xlarge: 'text-2xl',
|
|
17
|
+
}
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<div id={id.value} class="relative flex w-full flex-col items-center {wrapperClass}">
|
|
21
|
+
<p class="w-full text-center {label.class} {textSize[type]} {bold ? 'font-bold' : ''} {italic ? 'italic' : ''}">{label.name}</p>
|
|
22
|
+
</div>
|