@koumoul/vjsf 3.0.0-alpha.3 → 3.0.0-alpha.5

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.
Files changed (107) hide show
  1. package/package.json +27 -6
  2. package/src/compile/index.js +18 -4
  3. package/src/compile/options.js +19 -0
  4. package/src/compile/v-jsf-compiled.vue.ejs +28 -10
  5. package/src/components/fragments/help-message.vue +3 -2
  6. package/src/components/fragments/node-slot.vue +3 -3
  7. package/src/components/fragments/section-header.vue +2 -1
  8. package/src/components/fragments/text-field-menu.vue +3 -3
  9. package/src/components/node.vue +27 -10
  10. package/src/components/nodes/autocomplete.vue +3 -10
  11. package/src/components/nodes/checkbox.vue +3 -3
  12. package/src/components/nodes/color-picker.vue +3 -3
  13. package/src/components/nodes/combobox.vue +3 -4
  14. package/src/components/nodes/date-picker.vue +3 -4
  15. package/src/components/nodes/date-time-picker.vue +2 -2
  16. package/src/components/nodes/expansion-panels.vue +4 -4
  17. package/src/components/nodes/file-input.vue +43 -0
  18. package/src/components/nodes/list.vue +14 -11
  19. package/src/components/nodes/number-combobox.vue +3 -4
  20. package/src/components/nodes/number-field.vue +3 -4
  21. package/src/components/nodes/one-of-select.vue +4 -4
  22. package/src/components/nodes/section.vue +4 -3
  23. package/src/components/nodes/select.vue +3 -4
  24. package/src/components/nodes/slider.vue +3 -3
  25. package/src/components/nodes/stepper.vue +4 -6
  26. package/src/components/nodes/switch.vue +3 -3
  27. package/src/components/nodes/tabs.vue +4 -4
  28. package/src/components/nodes/text-field.vue +9 -4
  29. package/src/components/nodes/textarea.vue +26 -6
  30. package/src/components/nodes/vertical-tabs.vue +4 -4
  31. package/src/components/options.js +9 -6
  32. package/src/components/tree.vue +2 -2
  33. package/src/components/vjsf.vue +9 -13
  34. package/src/composables/use-dnd.js +16 -1
  35. package/src/composables/use-vjsf.js +11 -9
  36. package/src/index.js +1 -0
  37. package/src/{components/types.ts → types.ts} +18 -2
  38. package/src/utils/global-register.js +10 -0
  39. package/src/utils/index.js +5 -0
  40. package/src/utils/props.js +4 -4
  41. package/src/utils/slots.js +2 -3
  42. package/types/compile/index.d.ts +3 -2
  43. package/types/compile/index.d.ts.map +1 -1
  44. package/types/compile/options.d.ts +4 -0
  45. package/types/compile/options.d.ts.map +1 -0
  46. package/types/components/fragments/help-message.vue.d.ts +2 -2
  47. package/types/components/fragments/node-slot.vue.d.ts +8 -8
  48. package/types/components/fragments/node-slot.vue.d.ts.map +1 -1
  49. package/types/components/fragments/section-header.vue.d.ts +2 -2
  50. package/types/components/fragments/select-item.vue.d.ts +2 -2
  51. package/types/components/fragments/text-field-menu.vue.d.ts +4 -4
  52. package/types/components/fragments/text-field-menu.vue.d.ts.map +1 -1
  53. package/types/components/global-register.d.ts +8 -0
  54. package/types/components/global-register.d.ts.map +1 -0
  55. package/types/components/node.vue.d.ts +4 -4
  56. package/types/components/nodes/autocomplete.vue.d.ts +8 -8
  57. package/types/components/nodes/autocomplete.vue.d.ts.map +1 -1
  58. package/types/components/nodes/checkbox.vue.d.ts +4 -4
  59. package/types/components/nodes/color-picker.vue.d.ts +4 -4
  60. package/types/components/nodes/combobox.vue.d.ts +8 -8
  61. package/types/components/nodes/combobox.vue.d.ts.map +1 -1
  62. package/types/components/nodes/date-picker.vue.d.ts +4 -4
  63. package/types/components/nodes/date-time-picker.vue.d.ts +4 -4
  64. package/types/components/nodes/expansion-panels.vue.d.ts +4 -4
  65. package/types/components/nodes/file-input.vue.d.ts +27 -0
  66. package/types/components/nodes/file-input.vue.d.ts.map +1 -0
  67. package/types/components/nodes/list.vue.d.ts +4 -4
  68. package/types/components/nodes/number-combobox.vue.d.ts +8 -8
  69. package/types/components/nodes/number-combobox.vue.d.ts.map +1 -1
  70. package/types/components/nodes/number-field.vue.d.ts +8 -8
  71. package/types/components/nodes/number-field.vue.d.ts.map +1 -1
  72. package/types/components/nodes/one-of-select.vue.d.ts +4 -4
  73. package/types/components/nodes/section.vue.d.ts +4 -4
  74. package/types/components/nodes/select.vue.d.ts +8 -8
  75. package/types/components/nodes/select.vue.d.ts.map +1 -1
  76. package/types/components/nodes/slider.vue.d.ts +4 -4
  77. package/types/components/nodes/stepper.vue.d.ts +4 -4
  78. package/types/components/nodes/switch.vue.d.ts +4 -4
  79. package/types/components/nodes/tabs.vue.d.ts +4 -4
  80. package/types/components/nodes/text-field.vue.d.ts +8 -8
  81. package/types/components/nodes/text-field.vue.d.ts.map +1 -1
  82. package/types/components/nodes/textarea.vue.d.ts +8 -8
  83. package/types/components/nodes/textarea.vue.d.ts.map +1 -1
  84. package/types/components/nodes/vertical-tabs.vue.d.ts +4 -4
  85. package/types/components/options.d.ts +3 -3
  86. package/types/components/options.d.ts.map +1 -1
  87. package/types/components/tree.vue.d.ts +2 -2
  88. package/types/components/types.d.ts +14 -2
  89. package/types/components/types.d.ts.map +1 -1
  90. package/types/components/vjsf.vue.d.ts +3 -3
  91. package/types/composables/use-dnd.d.ts +5 -1
  92. package/types/composables/use-dnd.d.ts.map +1 -1
  93. package/types/composables/use-vjsf.d.ts +4 -5
  94. package/types/composables/use-vjsf.d.ts.map +1 -1
  95. package/types/index.d.ts +1 -0
  96. package/types/index.d.ts.map +1 -1
  97. package/types/types.d.ts +95 -0
  98. package/types/types.d.ts.map +1 -0
  99. package/types/utils/global-register.d.ts +8 -0
  100. package/types/utils/global-register.d.ts.map +1 -0
  101. package/types/utils/index.d.ts +6 -0
  102. package/types/utils/index.d.ts.map +1 -0
  103. package/types/utils/props.d.ts +3 -3
  104. package/types/utils/props.d.ts.map +1 -1
  105. package/types/utils/slots.d.ts +3 -3
  106. package/types/utils/slots.d.ts.map +1 -1
  107. package/src/components/nodes/markdown.vue +0 -242
@@ -1,242 +0,0 @@
1
- <script>
2
- import { defineComponent, h, computed, onMounted, ref, onUnmounted, watch } from 'vue'
3
- import { VInput, VLabel } from 'vuetify/components'
4
- import { getInputProps } from '../../utils/props.js'
5
- import { getCompSlots } from '../../utils/slots.js'
6
- import 'easymde/dist/easymde.min.css'
7
-
8
- export default defineComponent({
9
- props: {
10
- modelValue: {
11
- /** @type import('vue').PropType<import('../types.js').VjsfTextareaNode> */
12
- type: Object,
13
- required: true
14
- },
15
- statefulLayout: {
16
- /** @type import('vue').PropType<import('@json-layout/core').StatefulLayout> */
17
- type: Object,
18
- required: true
19
- }
20
- },
21
- setup (props) {
22
- /** @type {import('vue').Ref<null | HTMLElement>} */
23
- const element = ref(null)
24
-
25
- const fieldProps = computed(() => getInputProps(props.modelValue, props.statefulLayout))
26
- const fieldSlots = computed(() => {
27
- const fieldSlots = getCompSlots(props.modelValue, props.statefulLayout)
28
- fieldSlots.default = () => [
29
- h('div', { style: 'width:100%' }, [
30
- h(VLabel, { text: fieldProps.value.label }),
31
- h('textarea', { ref: element, style: 'display:none' })
32
- ])
33
- ]
34
- return fieldSlots
35
- })
36
-
37
- /** @type {EasyMDE | null} */
38
- let easymde = null
39
-
40
- const initEasyMDE = async () => {
41
- if (!element.value) throw new Error('component was not mounted for markdown editor')
42
-
43
- const EasyMDE = (await import('easymde')).default
44
-
45
- const messages = props.modelValue.messages
46
-
47
- const config = {
48
- element: element.value,
49
- initialValue: props.modelValue.data ?? '',
50
- renderingConfig: {},
51
- status: false,
52
- autoDownloadFontAwesome: false,
53
- spellChecker: false,
54
- minHeight: '300px',
55
- insertTexts: {
56
- link: [messages.mdeLink1, messages.mdeLink2],
57
- image: [messages.mdeImg1, messages.mdeImg2],
58
- table: [messages.mdeTable1, messages.mdeTable2],
59
- horizontalRule: ['', '\n\n-----\n\n']
60
- },
61
- // cf https://github.com/Ionaru/easy-markdown-editor/blob/master/src/js/easymde.js#L1380
62
- toolbar: [{
63
- name: 'bold',
64
- action: EasyMDE.toggleBold,
65
- className: 'mdi mdi-format-bold',
66
- title: messages.bold
67
- }, {
68
- name: 'italic',
69
- action: EasyMDE.toggleItalic,
70
- className: 'mdi mdi-format-italic',
71
- title: messages.italic
72
- }, {
73
- name: 'heading',
74
- action: EasyMDE.toggleHeadingSmaller,
75
- className: 'mdi mdi-format-title',
76
- title: messages.heading
77
- }, /* {
78
- name: 'heading-1',
79
- action: EasyMDE.toggleHeading1,
80
- className: 'mdi mdi-format-title',
81
- title: 'Titre 1'
82
- }, {
83
- name: 'heading-2',
84
- action: EasyMDE.toggleHeading2,
85
- className: 'mdi mdi-format-title',
86
- title: 'Titre 2'
87
- }, {
88
- name: 'heading-3',
89
- action: EasyMDE.toggleHeading3,
90
- className: 'mdi mdi-format-title',
91
- title: 'Titre 3'
92
- }, */
93
- '|',
94
- {
95
- name: 'quote',
96
- action: EasyMDE.toggleBlockquote,
97
- className: 'mdi mdi-format-quote-open',
98
- title: messages.quote
99
- },
100
- {
101
- name: 'unordered-list',
102
- action: EasyMDE.toggleUnorderedList,
103
- className: 'mdi mdi-format-list-bulleted',
104
- title: messages.unorderedList
105
- },
106
- {
107
- name: 'ordered-list',
108
- action: EasyMDE.toggleOrderedList,
109
- className: 'mdi mdi-format-list-numbered',
110
- title: messages.orderedList
111
- },
112
- '|',
113
- {
114
- name: 'link',
115
- action: EasyMDE.drawLink,
116
- className: 'mdi mdi-link',
117
- title: messages.createLink
118
- },
119
- {
120
- name: 'image',
121
- action: EasyMDE.drawImage,
122
- className: 'mdi mdi-image',
123
- title: messages.insertImage
124
- },
125
- {
126
- name: 'table',
127
- action: EasyMDE.drawTable,
128
- className: 'mdi mdi-table',
129
- title: messages.createTable
130
- },
131
- '|',
132
- {
133
- name: 'preview',
134
- action: EasyMDE.togglePreview,
135
- className: 'mdi mdi-eye text-accent',
136
- title: messages.preview,
137
- noDisable: true
138
- },
139
- '|',
140
- {
141
- name: 'undo',
142
- action: EasyMDE.undo,
143
- className: 'mdi mdi-undo',
144
- title: messages.undo,
145
- noDisable: true
146
- },
147
- {
148
- name: 'redo',
149
- action: EasyMDE.redo,
150
- className: 'mdi mdi-redo',
151
- title: messages.redo,
152
- noDisable: true
153
- },
154
- '|',
155
- {
156
- name: 'guide',
157
- action: 'https://simplemde.com/markdown-guide',
158
- className: 'mdi mdi-help-circle text-success',
159
- title: messages.mdeGuide,
160
- noDisable: true
161
- }
162
- ],
163
- ...props.modelValue.options.easyMDEOptions
164
- }
165
-
166
- if (easymde) easymde.toTextArea()
167
- // @ts-ignore
168
- easymde = new EasyMDE(config)
169
-
170
- let changed = false
171
- easymde.codemirror.on('change', () => {
172
- changed = true
173
- if (easymde) props.statefulLayout.input(props.modelValue, easymde.value())
174
- })
175
- /** @type {ReturnType<typeof setTimeout> | null} */
176
- let blurTimeout = null
177
- easymde.codemirror.on('blur', () => {
178
- // timeout to prevent triggering save when clicking on a menu button
179
- blurTimeout = setTimeout(() => {
180
- if (changed) props.statefulLayout.blur(props.modelValue)
181
- changed = false
182
- }, 500)
183
- })
184
- easymde.codemirror.on('focus', () => {
185
- if (blurTimeout) clearTimeout(blurTimeout)
186
- })
187
-
188
- if (props.modelValue.autofocus) {
189
- easymde.codemirror.focus()
190
- }
191
- }
192
-
193
- onMounted(initEasyMDE)
194
-
195
- onUnmounted(() => {
196
- if (easymde) easymde.toTextArea()
197
- })
198
-
199
- // update data from outside
200
- watch(() => props.modelValue, () => {
201
- if (easymde && (easymde.value() !== props.modelValue.data ?? '')) {
202
- easymde.value(props.modelValue.data ?? '')
203
- }
204
- })
205
-
206
- // update easymde config from outside
207
- watch(() => [props.modelValue.messages, props.modelValue.options.easyMDEOptions], (newValues, oldValues) => {
208
- if (newValues[0] !== oldValues[0] || newValues[1] !== oldValues[1]) {
209
- initEasyMDE()
210
- }
211
- })
212
-
213
- props.statefulLayout.events.on('autofocus', () => {
214
- if (props.modelValue.autofocus && easymde) {
215
- easymde.codemirror.focus()
216
- }
217
- })
218
-
219
- return () => h(VInput, fieldProps.value, fieldSlots.value)
220
- }
221
- })
222
-
223
- </script>
224
-
225
- <style>
226
- .vjsf-node-markdown .v-input--density-compact .editor-toolbar {
227
- padding: 0;
228
- }
229
- .vjsf-node-markdown .v-input--density-comfortable .editor-toolbar {
230
- padding: 4px;
231
- }
232
-
233
- .vjsf-node-markdown .v-input--density-compact .CodeMirror-wrap {
234
- padding-top: 2px;
235
- padding-bottom: 2px;
236
- }
237
- .vjsf-node-markdown .v-input--density-comfortable .CodeMirror-wrap {
238
- padding-top: 6px;
239
- padding-bottom: 6px;
240
- }
241
-
242
- </style>