1
+ /* eslint-disable max-lines */
2
+ /* eslint-disable arrow-body-style */
1
3
import type { JSONSchema7 } from 'json-schema' ;
2
4
import { html } from 'lit' ;
3
5
@@ -13,43 +15,108 @@ import type { Jsf, Path, UiSchema } from '../json-schema-form.js';
13
15
14
16
export const arrayField = (
15
17
schema : JSONSchema7 ,
16
- dataLevel : any [ ] ,
18
+ dataLevel : unknown ,
17
19
path : Path ,
18
- uiState : any ,
20
+ uiState : unknown ,
19
21
uiSchema : UiSchema ,
20
22
handleChange : Jsf [ '_handleChange' ] ,
21
23
dig : Jsf [ '_dig' ] ,
24
+ schemaPath : Path ,
22
25
) => {
26
+ if ( ! Array . isArray ( dataLevel ) ) return html `` ;
27
+
23
28
return html ` <!-- -->
24
- < fieldset part ="array ">
29
+ < fieldset part ="array " class ="array ">
30
+ ${ JSON . stringify ( schemaPath ) } arr
25
31
<!-- -->
26
32
< legend > ${ schema . title } </ legend >
27
33
${ dataLevel ?. map ?.( ( _item , index ) => {
28
- if ( typeof schema . items !== 'object' || Array . isArray ( schema . items ) )
29
- return ;
30
- return html ` < sl-card >
34
+ if (
35
+ typeof schema . items !== 'object' ||
36
+ Array . isArray ( schema . items ) ||
37
+ ! Array . isArray ( dataLevel )
38
+ )
39
+ return '' ;
40
+ return html ` < sl-card
41
+ @dragover =${ ( event : DragEvent ) => {
42
+ event . preventDefault ( ) ;
43
+ // event.stopPropagation();
44
+ const dataTransfer = event . dataTransfer ;
45
+ if ( dataTransfer ) dataTransfer . dropEffect = 'move' ;
46
+
47
+ // (event.target as HTMLElement)
48
+ // .closest('sl-card')
49
+ // ?.setAttribute('data-dropzone', '');
50
+ } }
51
+ @dragenter =${ ( event : DragEvent ) => {
52
+ // event.stopPropagation();
53
+ ( event . target as HTMLElement )
54
+ . closest ( 'sl-card' )
55
+ ?. setAttribute ( 'data-dropzone' , '' ) ;
56
+ } }
57
+ @dragleave=${ ( event : DragEvent ) => {
58
+ // event.stopPropagation();
59
+ ( event . target as HTMLElement )
60
+ . closest ( 'sl-card' )
61
+ ?. removeAttribute ( 'data-dropzone' ) ;
62
+ } }
63
+ @drop=${ ( event : DragEvent ) => {
64
+ // event.stopPropagation();
65
+ const idx = event . dataTransfer ?. getData ( 'integer' ) ;
66
+ if ( ! idx ) return ;
67
+ const originIndex = Number . parseInt ( idx , 10 ) ;
68
+ if ( ! Array . isArray ( dataLevel ) ) return ;
69
+ const hold = dataLevel [ index ] as unknown ;
70
+ // eslint-disable-next-line no-param-reassign
71
+ dataLevel [ index ] = dataLevel [ originIndex ] as unknown ;
72
+ // eslint-disable-next-line no-param-reassign
73
+ dataLevel [ originIndex ] = hold ;
74
+ handleChange ( [ ...path ] , dataLevel , schemaPath ) ;
75
+
76
+ ( event . target as HTMLElement )
77
+ . closest ( 'sl-card' )
78
+ ?. removeAttribute ( 'data-dropzone' ) ;
79
+ } }
80
+ >
31
81
${ dig (
32
82
schema . items ,
33
83
dataLevel [ index ] ,
34
- [ ...path , String ( index ) ] ,
84
+ [ ...path , index ] ,
35
85
uiState ,
36
86
uiSchema ,
87
+ schemaPath ,
37
88
) }
38
89
39
90
< div slot ="header " class ="array-card-header ">
40
- < div >
41
- < sl-tag size ="medium " pill > ${ index + 1 } </ sl-tag >
42
- </ div >
43
- < div class ="handle ">
44
- < sl-icon name ="grip-horizontal " label ="Settings "> </ sl-icon >
91
+ <!-- <div></div> -->
92
+ < div
93
+ class ="handle "
94
+ .draggable =${ true }
95
+ @mousedown =${ ( _event : MouseEvent ) => {
96
+ // FIXME:
97
+ // event.target!.style.cursor = 'grab';
98
+ } }
99
+ @dragstart=${ ( event : DragEvent ) => {
100
+ console . log ( event ) ;
101
+ if ( ! event . dataTransfer ) return ;
102
+ event . dataTransfer . setData ( 'integer' , String ( index ) ) ;
103
+ } }
104
+ >
105
+ < sl-tag size ="small " pill > ${ index + 1 } </ sl-tag >
106
+ < div class ="grip ">
107
+ < sl-icon name ="grip-horizontal " label ="Settings "> </ sl-icon >
108
+ </ div >
45
109
</ div >
46
110
< div >
47
111
< sl-tooltip content ="Delete ">
48
112
< sl-button
49
113
size ="small "
50
114
@click =${ ( _event : Event ) => {
115
+ if ( ! Array . isArray ( dataLevel ) ) return ;
116
+
117
+ // eslint-disable-next-line no-param-reassign
51
118
dataLevel = dataLevel . filter ( ( _ , i ) => i !== index ) ;
52
- handleChange ( [ ...path ] , dataLevel ) ;
119
+ handleChange ( [ ...path ] , dataLevel , schemaPath ) ;
53
120
} }
54
121
>
55
122
< sl-icon name ="trash3 " label ="Settings "> </ sl-icon >
@@ -59,31 +126,41 @@ export const arrayField = (
59
126
< sl-divider vertical > </ sl-divider >
60
127
61
128
< sl-button-group >
62
- < sl-button
63
- size ="small "
64
- @click =${ ( _event : Event ) => {
65
- const hold = dataLevel [ index ] ;
66
- dataLevel [ index ] = dataLevel [ index - 1 ] ;
67
- dataLevel [ index - 1 ] = hold ;
68
- handleChange ( [ ...path ] , dataLevel ) ;
69
- } }
70
- .disabled =${ typeof dataLevel ?. [ index - 1 ] === 'undefined' }
71
- >
72
- < sl-icon name ="arrow-up " label ="Up "> </ sl-icon >
73
- </ sl-button >
74
- < sl-button
75
- size ="small "
76
- @click =${ ( _event : Event ) => {
77
- const hold = dataLevel [ index ] ;
129
+ < sl-tooltip content ="Move item up ">
130
+ < sl-button
131
+ size ="small "
132
+ @click =${ ( _event : Event ) => {
133
+ if ( ! Array . isArray ( dataLevel ) ) return ;
134
+ const hold = dataLevel [ index ] as unknown ;
135
+ // eslint-disable-next-line no-param-reassign
136
+ dataLevel [ index ] = dataLevel [ index - 1 ] as unknown ;
137
+ // eslint-disable-next-line no-param-reassign
138
+ dataLevel [ index - 1 ] = hold ;
139
+ handleChange ( [ ...path ] , dataLevel , schemaPath ) ;
140
+ } }
141
+ .disabled =${ typeof dataLevel ?. [ index - 1 ] === 'undefined' }
142
+ >
143
+ < sl-icon name ="arrow-up " label ="Up "> </ sl-icon >
144
+ </ sl-button >
145
+ </ sl-tooltip >
146
+ < sl-tooltip content ="Move item down ">
147
+ < sl-button
148
+ size ="small "
149
+ @click =${ ( _event : Event ) => {
150
+ if ( ! Array . isArray ( dataLevel ) ) return ;
151
+ const hold = dataLevel [ index ] as unknown ;
78
152
79
- dataLevel [ index ] = dataLevel [ index + 1 ] ;
80
- dataLevel [ index + 1 ] = hold ;
81
- handleChange ( [ ...path ] , dataLevel ) ;
82
- } }
83
- .disabled =${ typeof dataLevel ?. [ index + 1 ] === 'undefined' }
84
- >
85
- < sl-icon name ="arrow-down " label ="Down "> </ sl-icon >
86
- </ sl-button >
153
+ // eslint-disable-next-line no-param-reassign
154
+ dataLevel [ index ] = dataLevel [ index + 1 ] as unknown ;
155
+ // eslint-disable-next-line no-param-reassign
156
+ dataLevel [ index + 1 ] = hold ;
157
+ handleChange ( [ ...path ] , dataLevel , schemaPath ) ;
158
+ } }
159
+ .disabled =${ typeof dataLevel ?. [ index + 1 ] === 'undefined' }
160
+ >
161
+ < sl-icon name ="arrow-down " label ="Down "> </ sl-icon >
162
+ </ sl-button >
163
+ </ sl-tooltip >
87
164
</ sl-button-group >
88
165
</ div >
89
166
</ div >
@@ -93,17 +170,21 @@ export const arrayField = (
93
170
< div class ="add-zone ">
94
171
< sl-button
95
172
@click =${ ( _event : Event ) => {
173
+ // eslint-disable-next-line no-param-reassign
96
174
dataLevel ||= [ ] ;
175
+ if ( ! Array . isArray ( dataLevel ) ) return ;
97
176
98
177
if ( typeof schema . items !== 'object' || Array . isArray ( schema . items ) )
99
178
return ;
100
179
if ( schema . items ?. type === 'string' ) {
101
180
dataLevel . push ( schema . items ?. default || '' ) ;
102
181
} else if ( schema . items . properties ) {
103
182
dataLevel . push ( schema . items ?. default || { } ) ;
183
+ } else if ( schema . items ?. type === 'array' ) {
184
+ dataLevel . push ( schema . items ?. default || [ ] ) ;
104
185
}
105
186
106
- handleChange ( [ ...path ] , dataLevel ) ;
187
+ handleChange ( [ ...path ] , dataLevel , schemaPath ) ;
107
188
} }
108
189
size ="large"
109
190
>
0 commit comments