@bagelink/vue 1.5.17 → 1.5.22

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 (133) hide show
  1. package/bin/experimentalGenTypedRoutes.ts +15 -15
  2. package/bin/generateFormSchema.ts +12 -12
  3. package/bin/utils.ts +4 -4
  4. package/dist/components/Dropdown.vue.d.ts.map +1 -1
  5. package/dist/components/calendar/CalendarPopover.vue.d.ts.map +1 -1
  6. package/dist/components/form/BagelForm.vue.d.ts.map +1 -1
  7. package/dist/components/form/FieldArray.vue.d.ts +5 -4
  8. package/dist/components/form/FieldArray.vue.d.ts.map +1 -1
  9. package/dist/components/form/inputs/CheckInput.vue.d.ts.map +1 -1
  10. package/dist/components/form/inputs/RichText/index.vue.d.ts +1 -0
  11. package/dist/components/form/inputs/RichText/index.vue.d.ts.map +1 -1
  12. package/dist/components/form/inputs/SelectInput.vue.d.ts.map +1 -1
  13. package/dist/components/form/inputs/ToggleInput.vue.d.ts.map +1 -1
  14. package/dist/components/form/inputs/Upload/UploadInput.vue.d.ts.map +1 -1
  15. package/dist/composables/useFormField.d.ts.map +1 -1
  16. package/dist/composables/useSchemaField.d.ts.map +1 -1
  17. package/dist/index.cjs +17 -14
  18. package/dist/index.mjs +511 -422
  19. package/dist/style.css +1 -1
  20. package/package.json +1 -1
  21. package/src/components/AccordionItem.vue +2 -2
  22. package/src/components/AddToCalendar.vue +1 -1
  23. package/src/components/BglVideo.vue +8 -8
  24. package/src/components/Btn.vue +9 -9
  25. package/src/components/Card.vue +4 -4
  26. package/src/components/Carousel.vue +44 -44
  27. package/src/components/DataPreview.vue +1 -1
  28. package/src/components/DragOver.vue +6 -6
  29. package/src/components/Dropdown.vue +14 -14
  30. package/src/components/Flag.vue +3 -3
  31. package/src/components/Icon/Icon.vue +13 -13
  32. package/src/components/Image.vue +4 -4
  33. package/src/components/ImportData.vue +79 -79
  34. package/src/components/ListItem.vue +7 -7
  35. package/src/components/MapEmbed/Index.vue +6 -6
  36. package/src/components/Modal.vue +10 -10
  37. package/src/components/ModalForm.vue +4 -4
  38. package/src/components/NavBar.vue +2 -2
  39. package/src/components/Pagination.vue +9 -9
  40. package/src/components/Pill.vue +1 -1
  41. package/src/components/Rating.vue +2 -2
  42. package/src/components/Slider.vue +77 -77
  43. package/src/components/Spreadsheet/Index.vue +34 -34
  44. package/src/components/Spreadsheet/SpreadsheetTable.vue +3 -3
  45. package/src/components/Zoomer.vue +28 -28
  46. package/src/components/analytics/BarChart.vue +6 -6
  47. package/src/components/analytics/KpiCard.vue +2 -2
  48. package/src/components/analytics/LineChart.vue +14 -14
  49. package/src/components/analytics/PieChart.vue +11 -11
  50. package/src/components/calendar/CalendarPopover.vue +1 -1
  51. package/src/components/calendar/Index.vue +1 -1
  52. package/src/components/calendar/views/AgendaView.vue +2 -2
  53. package/src/components/calendar/views/DayView.vue +6 -6
  54. package/src/components/calendar/views/MonthView.vue +2 -2
  55. package/src/components/calendar/views/WeekView.vue +18 -18
  56. package/src/components/dataTable/DataTable.vue +3 -3
  57. package/src/components/dataTable/useSorting.ts +1 -1
  58. package/src/components/dataTable/useTableData.ts +15 -15
  59. package/src/components/dataTable/useTableSelection.ts +8 -8
  60. package/src/components/dataTable/useTableVirtualization.ts +1 -1
  61. package/src/components/draggable/useDraggable.ts +42 -42
  62. package/src/components/form/BagelForm.vue +66 -23
  63. package/src/components/form/BglMultiStepForm.vue +18 -18
  64. package/src/components/form/FieldArray.vue +177 -67
  65. package/src/components/form/inputs/CheckInput.vue +2 -1
  66. package/src/components/form/inputs/CodeEditor/Index.vue +1 -1
  67. package/src/components/form/inputs/CodeEditor/format.ts +7 -7
  68. package/src/components/form/inputs/CodeEditor/useHighlight.ts +6 -6
  69. package/src/components/form/inputs/DateInput.vue +6 -6
  70. package/src/components/form/inputs/DatePicker.vue +19 -19
  71. package/src/components/form/inputs/EmailInput.vue +14 -14
  72. package/src/components/form/inputs/NumberInput.vue +6 -6
  73. package/src/components/form/inputs/OTP.vue +3 -3
  74. package/src/components/form/inputs/RadioGroup.vue +1 -1
  75. package/src/components/form/inputs/RadioPillsInput.vue +8 -8
  76. package/src/components/form/inputs/RichText/components/EditorToolbar.vue +10 -10
  77. package/src/components/form/inputs/RichText/components/TableGridSelector.vue +1 -1
  78. package/src/components/form/inputs/RichText/composables/useCommands.ts +1 -1
  79. package/src/components/form/inputs/RichText/composables/useEditor.ts +12 -12
  80. package/src/components/form/inputs/RichText/composables/useEditorKeyboard.ts +1 -1
  81. package/src/components/form/inputs/RichText/index.vue +143 -134
  82. package/src/components/form/inputs/RichText/utils/commands.ts +69 -69
  83. package/src/components/form/inputs/RichText/utils/debug.ts +1 -1
  84. package/src/components/form/inputs/RichText/utils/formatting.ts +39 -39
  85. package/src/components/form/inputs/RichText/utils/media.ts +6 -6
  86. package/src/components/form/inputs/RichText/utils/selection.ts +28 -28
  87. package/src/components/form/inputs/RichText/utils/table.ts +19 -19
  88. package/src/components/form/inputs/SelectBtn.vue +1 -1
  89. package/src/components/form/inputs/SelectInput.vue +50 -26
  90. package/src/components/form/inputs/SignaturePad.vue +15 -15
  91. package/src/components/form/inputs/TableField.vue +1 -1
  92. package/src/components/form/inputs/TelInput.vue +6 -6
  93. package/src/components/form/inputs/TextInput.vue +5 -5
  94. package/src/components/form/inputs/ToggleInput.vue +2 -1
  95. package/src/components/form/inputs/Upload/UploadInput.vue +155 -102
  96. package/src/components/form/inputs/Upload/upload.ts +1 -1
  97. package/src/components/form/inputs/Upload/useFileUpload.ts +6 -6
  98. package/src/components/form/useBagelFormState.ts +5 -5
  99. package/src/components/layout/AppContent.vue +1 -1
  100. package/src/components/layout/AppLayout.vue +1 -1
  101. package/src/components/layout/Layout.vue +4 -4
  102. package/src/components/layout/TabbedLayout.vue +1 -1
  103. package/src/components/layout/Tabs.vue +2 -2
  104. package/src/components/layout/TabsNav.vue +7 -7
  105. package/src/components/lightbox/Lightbox.vue +8 -8
  106. package/src/components/lightbox/index.ts +8 -8
  107. package/src/composables/index.ts +2 -2
  108. package/src/composables/useAddToCalendar.ts +13 -13
  109. package/src/composables/useDevice.ts +2 -2
  110. package/src/composables/useExcel.ts +6 -6
  111. package/src/composables/useFormField.ts +5 -9
  112. package/src/composables/usePolling.ts +8 -8
  113. package/src/composables/useSchemaField.ts +53 -38
  114. package/src/composables/useTheme.ts +9 -9
  115. package/src/composables/useValidateFieldValue.ts +2 -2
  116. package/src/directives/pattern.ts +25 -25
  117. package/src/directives/ripple.ts +4 -4
  118. package/src/directives/vResize.ts +6 -6
  119. package/src/plugins/bagel.ts +4 -4
  120. package/src/plugins/useModal.ts +3 -3
  121. package/src/styles/layout.css +7 -1
  122. package/src/utils/BagelFormUtils.ts +7 -7
  123. package/src/utils/calendar/Helpers.ts +8 -8
  124. package/src/utils/calendar/dateUtils.ts +22 -22
  125. package/src/utils/calendar/time.ts +25 -25
  126. package/src/utils/calendar/week.ts +25 -25
  127. package/src/utils/elementUtils.ts +27 -27
  128. package/src/utils/index.ts +22 -22
  129. package/src/utils/sizeParsing.ts +2 -2
  130. package/src/utils/strings.ts +5 -5
  131. package/src/utils/tapDetector.ts +11 -11
  132. package/src/utils/useSearch.ts +29 -29
  133. package/vite.config.ts +1 -1
@@ -30,9 +30,9 @@ const computedSize = $computed(() => {
30
30
  })
31
31
 
32
32
  const iconRenderType = $computed(() => {
33
- if (props.fontAwesome && (FONT_AWESOME_ICONS.includes(iconRender) || FONT_AWESOME_BRANDS_ICONS.includes(iconRender))) return 'font-awesome'
34
- if (MATERIAL_ICONS.includes(iconRender)) return 'material'
35
- if (FONT_AWESOME_ICONS.includes(iconRender) || FONT_AWESOME_BRANDS_ICONS.includes(iconRender)) return 'font-awesome'
33
+ if (props.fontAwesome && (FONT_AWESOME_ICONS.includes(iconRender) || FONT_AWESOME_BRANDS_ICONS.includes(iconRender))) {return 'font-awesome'}
34
+ if (MATERIAL_ICONS.includes(iconRender)) {return 'material'}
35
+ if (FONT_AWESOME_ICONS.includes(iconRender) || FONT_AWESOME_BRANDS_ICONS.includes(iconRender)) {return 'font-awesome'}
36
36
  return 'material'
37
37
  })
38
38
 
@@ -44,22 +44,22 @@ const isFAFreeReady = ref(true)
44
44
  const isFABrandsReady = ref(true)
45
45
 
46
46
  function getFontFaceSet(): FontFaceSet | null {
47
- if (typeof document === 'undefined') return null
47
+ if ('undefined' === typeof document) {return null}
48
48
  const maybeFonts = (document as unknown as { fonts?: FontFaceSet }).fonts
49
49
  return maybeFonts ?? null
50
50
  }
51
51
 
52
52
  function supportsFontLoading(): boolean {
53
53
  const fonts = getFontFaceSet()
54
- return fonts !== null && typeof fonts.load === 'function'
54
+ return null !== fonts && 'function' === typeof fonts.load
55
55
  }
56
56
 
57
57
  async function ensureFontLoaded(family: string): Promise<boolean> {
58
- if (!supportsFontLoading()) return true
58
+ if (!supportsFontLoading()) {return true}
59
59
  try {
60
60
  const fonts = getFontFaceSet()
61
- if (!fonts) return true
62
- if (fonts.check(`1em "${family}"`)) return true
61
+ if (!fonts) {return true}
62
+ if (fonts.check(`1em "${family}"`)) {return true}
63
63
  await fonts.load(`1em "${family}"`)
64
64
  return fonts.check(`1em "${family}"`)
65
65
  } catch {
@@ -83,8 +83,8 @@ async function loadFABrandsIfNeeded() {
83
83
  }
84
84
 
85
85
  onMounted(() => {
86
- if (!supportsFontLoading()) return
87
- if (iconRenderType === 'material') {
86
+ if (!supportsFontLoading()) {return}
87
+ if ('material' === iconRenderType) {
88
88
  const fonts = getFontFaceSet()
89
89
  isMaterialReady.value = fonts ? fonts.check('1em "Material Symbols Outlined"') : true
90
90
  void loadMaterialIfNeeded()
@@ -100,8 +100,8 @@ onMounted(() => {
100
100
  })
101
101
 
102
102
  watchEffect(() => {
103
- if (!supportsFontLoading()) return
104
- if (iconRenderType === 'material') {
103
+ if (!supportsFontLoading()) {return}
104
+ if ('material' === iconRenderType) {
105
105
  void loadMaterialIfNeeded()
106
106
  } else if (isFaBrand) {
107
107
  void loadFABrandsIfNeeded()
@@ -111,7 +111,7 @@ watchEffect(() => {
111
111
  })
112
112
 
113
113
  const isCurrentFontReady = $computed(() => {
114
- if (iconRenderType === 'material') return isMaterialReady.value
114
+ if ('material' === iconRenderType) {return isMaterialReady.value}
115
115
  return isFaBrand ? isFABrandsReady.value : isFAFreeReady.value
116
116
  })
117
117
  </script>
@@ -24,12 +24,12 @@ let imageSrc = $ref<string | undefined>(undefined)
24
24
  let loadingError = $ref(false)
25
25
 
26
26
  function getImageUrl(): string | undefined {
27
- if (!props.src && !props.pathKey && !props.modelValue) return
27
+ if (!props.src && !props.pathKey && !props.modelValue) {return}
28
28
  return pathKeyToURL(props.src || props.pathKey || props.modelValue)
29
29
  }
30
30
 
31
31
  async function getCachedImage(url: string): Promise<string | undefined> {
32
- if (!('caches' in window)) return undefined
32
+ if (!('caches' in window)) {return undefined}
33
33
  try {
34
34
  const imgCache = await window.caches.open('img-cache')
35
35
  const cachedResponse = await imgCache.match(url)
@@ -43,7 +43,7 @@ async function getCachedImage(url: string): Promise<string | undefined> {
43
43
  }
44
44
 
45
45
  async function cacheImage(url: string, blob: Blob) {
46
- if (!('caches' in window)) return
46
+ if (!('caches' in window)) {return}
47
47
  try {
48
48
  const imgCache = await window.caches.open('img-cache')
49
49
  await imgCache.put(url, new Response(blob))
@@ -72,7 +72,7 @@ async function loadImage() {
72
72
  try {
73
73
  const ext = url.split('.').pop()?.toLowerCase().split('?')[0]
74
74
 
75
- if (ext === 'heic') {
75
+ if ('heic' === ext) {
76
76
  const cachedSrc = await getCachedImage(url)
77
77
  if (cachedSrc) {
78
78
  imageSrc = cachedSrc
@@ -130,7 +130,7 @@ const { renderField } = useSchemaField<any>({
130
130
  mode: 'form',
131
131
  getFormData: () => formData.value,
132
132
  onUpdateModelValue: (field: Field<any>, value: any) => {
133
- if (!field.id) return
133
+ if (!field.id) {return}
134
134
 
135
135
  if (field.id.includes('.')) {
136
136
  const [parentId, childId] = field.id.split('.')
@@ -145,16 +145,16 @@ const { renderField } = useSchemaField<any>({
145
145
  })
146
146
 
147
147
  function getUniqueSourceValues(fieldId: string): any[] {
148
- if (!fieldMapping[fieldId] || !fileData.value || fileData.value.length === 0) {
148
+ if (!fieldMapping[fieldId] || !fileData.value || 0 === fileData.value.length) {
149
149
  return []
150
150
  }
151
151
  const allValues = fileData.value
152
152
  .map(row => row[fieldMapping[fieldId]])
153
- .filter(value => value !== undefined && value !== null && value !== '')
153
+ .filter(value => value !== undefined && null !== value && '' !== value)
154
154
  const uniqueValues = [...new Set(allValues)]
155
155
 
156
156
  return uniqueValues.filter((value) => {
157
- if (!transformations[fieldId] || transformations[fieldId].length === 0) {
157
+ if (!transformations[fieldId] || 0 === transformations[fieldId].length) {
158
158
  return true
159
159
  }
160
160
  return !transformations[fieldId].some(t => t.sourceValue == value || t.sourceValue === value.toString()
@@ -177,17 +177,17 @@ const sourceValueOptions = computed(() => {
177
177
  })
178
178
 
179
179
  function findMatchingTargetValue(sourceValue: string, options: Option[]): string | null {
180
- if (!sourceValue || !options || !Array.isArray(options) || options.length === 0) return null
180
+ if (!sourceValue || !options || !Array.isArray(options) || 0 === options.length) {return null}
181
181
  const lowerSourceValue = String(sourceValue).toLowerCase().trim()
182
182
  const exactMatch = options.find((option) => {
183
- const optionObj = typeof option === 'object' && option !== null ? option : { value: String(option), label: String(option) }
184
- if (!optionObj) return false
183
+ const optionObj = 'object' === typeof option && null !== option ? option : { value: String(option), label: String(option) }
184
+ if (!optionObj) {return false}
185
185
  const optionLabel = `${optionObj.label}`.toLowerCase().trim()
186
186
  return optionLabel === lowerSourceValue
187
187
  })
188
188
 
189
189
  if (exactMatch) {
190
- const optionObj = typeof exactMatch === 'object' && exactMatch !== null
190
+ const optionObj = 'object' === typeof exactMatch && null !== exactMatch
191
191
  ? exactMatch
192
192
  : { value: String(exactMatch), label: String(exactMatch) }
193
193
  return String(optionObj.value)
@@ -195,8 +195,8 @@ function findMatchingTargetValue(sourceValue: string, options: Option[]): string
195
195
 
196
196
  // Try more flexible matching if exact match fails
197
197
  const fuzzyMatch = options.find((option) => {
198
- const optionObj = typeof option === 'object' && option !== null ? option : { value: String(option), label: String(option) }
199
- if (!optionObj || typeof optionObj.label !== 'string') return false
198
+ const optionObj = 'object' === typeof option && null !== option ? option : { value: String(option), label: String(option) }
199
+ if (!optionObj || 'string' !== typeof optionObj.label) {return false}
200
200
 
201
201
  const optionLabel = `${optionObj.label}`.toLowerCase().trim()
202
202
 
@@ -204,7 +204,7 @@ function findMatchingTargetValue(sourceValue: string, options: Option[]): string
204
204
  })
205
205
 
206
206
  if (fuzzyMatch) {
207
- const optionObj = typeof fuzzyMatch === 'object' && fuzzyMatch !== null
207
+ const optionObj = 'object' === typeof fuzzyMatch && null !== fuzzyMatch
208
208
  ? fuzzyMatch
209
209
  : { value: String(fuzzyMatch), label: String(fuzzyMatch) }
210
210
  return String(optionObj.value)
@@ -231,7 +231,7 @@ function addTransformation(fieldId: string) {
231
231
  const existingIndex = transformations[fieldId].findIndex(t => t.sourceValue === selectedSourceValue.value
232
232
  )
233
233
 
234
- if (existingIndex >= 0) {
234
+ if (0 <= existingIndex) {
235
235
  transformations[fieldId][existingIndex].targetValue = selectedTargetValue.value
236
236
  } else {
237
237
  transformations[fieldId].push({
@@ -246,7 +246,7 @@ function addTransformation(fieldId: string) {
246
246
  }
247
247
 
248
248
  function getAllFields(schema: any[]): any[] {
249
- if (!schema || !Array.isArray(schema)) return []
249
+ if (!schema || !Array.isArray(schema)) {return []}
250
250
 
251
251
  const allFields: any[] = []
252
252
  const seenIds = new Set() // Keep track of field IDs we've already added
@@ -262,7 +262,7 @@ function getAllFields(schema: any[]): any[] {
262
262
  }
263
263
 
264
264
  // Extract options if they exist in attrs
265
- if (field.attrs && field.attrs.options && field.attrs.options.length > 0) {
265
+ if (field.attrs && field.attrs.options && 0 < field.attrs.options.length) {
266
266
  field.options = field.attrs.options
267
267
  }
268
268
 
@@ -279,7 +279,7 @@ function getAllFields(schema: any[]): any[] {
279
279
  if (item && item.children && Array.isArray(item.children)) {
280
280
  item.children.forEach((child: any) => {
281
281
  if (child && child.id && child.label) {
282
- if (child.$el === 'array' && child.attrs && child.attrs.schema) {
282
+ if ('array' === child.$el && child.attrs && child.attrs.schema) {
283
283
  addFieldIfNew(child)
284
284
  if (Array.isArray(child.attrs.schema)) {
285
285
  child.attrs.schema.forEach((schemaItem: SchemaItem) => {
@@ -318,9 +318,9 @@ function isFieldRequired(field: any): boolean {
318
318
  return false
319
319
  }
320
320
 
321
- return (field.attrs && field.attrs.required === true)
322
- || (field.required === true)
323
- || (field.attrs && field.attrs.attrs && field.attrs.attrs.required === true)
321
+ return (field.attrs && true === field.attrs.required)
322
+ || (true === field.required)
323
+ || (field.attrs && field.attrs.attrs && true === field.attrs.attrs.required)
324
324
  }
325
325
 
326
326
  function getFieldDescription(field: any): { description: string, isConditional: boolean } {
@@ -353,7 +353,7 @@ async function parseFile(file: File) {
353
353
  }
354
354
 
355
355
  async function loadSheetData() {
356
- if (!file.value || !selectedSheet.value) return
356
+ if (!file.value || !selectedSheet.value) {return}
357
357
  isLoading.value = true
358
358
  try {
359
359
  const { headers, data } = await readSheetData(file.value, selectedSheet.value, hasHeaders.value)
@@ -376,7 +376,7 @@ function checkArrayFieldConflicts() {
376
376
  Object.keys(fieldMapping).forEach((fieldId: string) => {
377
377
  const field = schemaFields.value.find(f => f.id === fieldId)
378
378
  if (field) {
379
- if (field.$el === 'array') {
379
+ if ('array' === field.$el) {
380
380
  mappedArrayParents.add(field.id)
381
381
  } else if (field.isArrayField && field.parentField) {
382
382
  if (!mappedArrayChildren.has(field.parentField)) {
@@ -396,7 +396,7 @@ function checkArrayFieldConflicts() {
396
396
  }
397
397
 
398
398
  for (const [parentId, childIds] of mappedArrayChildren.entries()) {
399
- if (childIds.size > 0) {
399
+ if (0 < childIds.size) {
400
400
  const parentField = schemaFields.value.find(f => f.id === parentId)
401
401
  if (parentField) {
402
402
  parentField.disabled = true
@@ -417,7 +417,7 @@ function resetMapping() {
417
417
  })
418
418
 
419
419
  // Try to auto-map fields based on similar names
420
- if (fileHeaders.value.length > 0) {
420
+ if (0 < fileHeaders.value.length) {
421
421
  schemaFields.value.forEach((field: any) => {
422
422
  // Format variations of field id and label for comparison
423
423
  const fieldIdCamel = formatString(field.id, 'camel')
@@ -462,22 +462,22 @@ function resetMapping() {
462
462
  }
463
463
 
464
464
  function checkMappingComplete() {
465
- if (!file.value || (Object.keys(fieldMapping).length === 0 && Object.keys(defaultValues).length === 0)) {
465
+ if (!file.value || (0 === Object.keys(fieldMapping).length && 0 === Object.keys(defaultValues).length)) {
466
466
  mappingComplete.value = false
467
467
  return
468
468
  }
469
469
 
470
470
  const requiredFields = schemaFields.value.filter((field) => {
471
- if (field.isArrayField && field.parentField) return false
471
+ if (field.isArrayField && field.parentField) {return false}
472
472
 
473
- return (field.attrs && field.attrs.required === true)
474
- || (field.required === true)
475
- || (field.attrs && field.attrs.attrs && field.attrs.attrs.required === true)
473
+ return (field.attrs && true === field.attrs.required)
474
+ || (true === field.required)
475
+ || (field.attrs && field.attrs.attrs && true === field.attrs.attrs.required)
476
476
  })
477
477
 
478
- if (requiredFields.length === 0) {
478
+ if (0 === requiredFields.length) {
479
479
  mappingComplete.value = Object.keys(fieldMapping).some(key => !!fieldMapping[key])
480
- || Object.keys(defaultValues).length > 0
480
+ || 0 < Object.keys(defaultValues).length
481
481
  return
482
482
  }
483
483
  mappingComplete.value = requiredFields.every(field => !!fieldMapping[field.id] || hasDefaultValue(field.id))
@@ -492,13 +492,13 @@ function showPreview() {
492
492
  const mappedRow: MappedRow = {}
493
493
 
494
494
  schemaFields.value.forEach((field) => {
495
- if (field.isArrayField || field.$el === 'array') return
495
+ if (field.isArrayField || 'array' === field.$el) {return}
496
496
  let value: any = null
497
497
  let useDefault = false
498
498
 
499
499
  if (fieldMapping[field.id] && sourceRow[fieldMapping[field.id]] !== undefined) {
500
500
  value = sourceRow[fieldMapping[field.id]]
501
- if (value === '' && defaultValues[field.id] !== undefined) {
501
+ if ('' === value && defaultValues[field.id] !== undefined) {
502
502
  value = defaultValues[field.id]
503
503
  useDefault = true
504
504
  }
@@ -507,9 +507,9 @@ function showPreview() {
507
507
  useDefault = true
508
508
  }
509
509
 
510
- if (value === null) return
510
+ if (null === value) {return}
511
511
 
512
- if (!useDefault && transformations[field.id] && transformations[field.id].length > 0) {
512
+ if (!useDefault && transformations[field.id] && 0 < transformations[field.id].length) {
513
513
  const transform = transformations[field.id].find(t => t.sourceValue == value || t.sourceValue === String(value)
514
514
  )
515
515
  if (transform) {
@@ -546,14 +546,14 @@ function showPreview() {
546
546
 
547
547
  arrayChildFields.forEach((childField) => {
548
548
  const [parentId, childId] = childField.id.split('.')
549
- if (!parentId || !childId) return
549
+ if (!parentId || !childId) {return}
550
550
 
551
551
  let value: any = null
552
552
  let useDefault = false
553
553
 
554
554
  if (fieldMapping[childField.id] && sourceRow[fieldMapping[childField.id]] !== undefined) {
555
555
  value = sourceRow[fieldMapping[childField.id]]
556
- if (value === '' && defaultValues[childField.id] !== undefined) {
556
+ if ('' === value && defaultValues[childField.id] !== undefined) {
557
557
  value = defaultValues[childField.id]
558
558
  useDefault = true
559
559
  }
@@ -562,7 +562,7 @@ function showPreview() {
562
562
  useDefault = true
563
563
  }
564
564
 
565
- if (value === null) {
565
+ if (null === value) {
566
566
  return
567
567
  }
568
568
 
@@ -570,7 +570,7 @@ function showPreview() {
570
570
  mappedRow[parentId] = []
571
571
  }
572
572
 
573
- if (!useDefault && transformations[childField.id] && transformations[childField.id].length > 0) {
573
+ if (!useDefault && transformations[childField.id] && 0 < transformations[childField.id].length) {
574
574
  const transform = transformations[childField.id].find(t => t.sourceValue == value || t.sourceValue === String(value)
575
575
  )
576
576
  if (transform) {
@@ -592,7 +592,7 @@ function showPreview() {
592
592
  }
593
593
 
594
594
  const parentKeyValue = sourceRow[parentKeyField[fieldId]]
595
- if (!parentKeyValue) return
595
+ if (!parentKeyValue) {return}
596
596
 
597
597
  if (!mappedRow[fieldId]) {
598
598
  mappedRow[fieldId] = []
@@ -607,7 +607,7 @@ function showPreview() {
607
607
 
608
608
  if (selectedRelationField.value?.attrs?.schema) {
609
609
  selectedRelationField.value.attrs.schema.forEach((schemaItem: SchemaItem) => {
610
- if (!schemaItem.id) return
610
+ if (!schemaItem.id) {return}
611
611
 
612
612
  let value: any = null
613
613
  let useDefault = false
@@ -615,7 +615,7 @@ function showPreview() {
615
615
  if (relatedFileMappings[fieldId][schemaItem.id]
616
616
  && matchingRow[relatedFileMappings[fieldId][schemaItem.id]] !== undefined) {
617
617
  value = matchingRow[relatedFileMappings[fieldId][schemaItem.id]]
618
- if (value === '' && relatedDefaultValues[fieldId][schemaItem.id] !== undefined) {
618
+ if ('' === value && relatedDefaultValues[fieldId][schemaItem.id] !== undefined) {
619
619
  value = relatedDefaultValues[fieldId][schemaItem.id]
620
620
  useDefault = true
621
621
  }
@@ -624,11 +624,11 @@ function showPreview() {
624
624
  useDefault = true
625
625
  }
626
626
 
627
- if (value === null) return
627
+ if (null === value) {return}
628
628
 
629
629
  if (!useDefault
630
630
  && relatedTransformations[fieldId][schemaItem.id]
631
- && relatedTransformations[fieldId][schemaItem.id].length > 0) {
631
+ && 0 < relatedTransformations[fieldId][schemaItem.id].length) {
632
632
  const transform = relatedTransformations[fieldId][schemaItem.id].find(t => t.sourceValue == value || t.sourceValue === String(value)
633
633
  )
634
634
  if (transform) {
@@ -644,16 +644,16 @@ function showPreview() {
644
644
  })
645
645
  }
646
646
 
647
- if (Object.keys(mappedItem).length > 0) {
647
+ if (0 < Object.keys(mappedItem).length) {
648
648
  mappedRow[fieldId].push(mappedItem)
649
649
  }
650
650
  })
651
651
  })
652
652
 
653
653
  const hasData = Object.values(mappedRow).some((value) => {
654
- if (value === null || value === undefined) return false
655
- if (value === '') return false
656
- if (Array.isArray(value) && value.length === 0) return false
654
+ if (null === value || value === undefined) {return false}
655
+ if ('' === value) {return false}
656
+ if (Array.isArray(value) && 0 === value.length) {return false}
657
657
  return true
658
658
  })
659
659
 
@@ -669,7 +669,7 @@ function showPreview() {
669
669
  function createSpreadsheetColumns() {
670
670
  return schemaFields.value
671
671
  .filter((field) => {
672
- return field.$el !== 'array'
672
+ return 'array' !== field.$el
673
673
  })
674
674
  .map((field) => {
675
675
  return {
@@ -682,12 +682,12 @@ function createSpreadsheetColumns() {
682
682
 
683
683
  function formatArrayChildValue(value: any, row: any, fieldId: string): string {
684
684
  const field = schemaFields.value.find(f => f.id === fieldId)
685
- if (!field || !field.isArrayField || !field.parentField) return value
685
+ if (!field || !field.isArrayField || !field.parentField) {return value}
686
686
 
687
687
  const [parentId, childId] = fieldId.split('.')
688
688
  const parentArray = row[parentId]
689
689
 
690
- if (Array.isArray(parentArray) && parentArray.length > 0) {
690
+ if (Array.isArray(parentArray) && 0 < parentArray.length) {
691
691
  return parentArray
692
692
  .map(item => item[childId])
693
693
  .filter(val => val !== undefined)
@@ -717,7 +717,7 @@ function updateFieldMapping(fieldId: string, value: string) {
717
717
  fieldMapping[fieldId] = value
718
718
  const field = schemaFields.value.find(f => f.id === fieldId)
719
719
  if (field) {
720
- if (field.$el === 'array') {
720
+ if ('array' === field.$el) {
721
721
  const childFields = schemaFields.value.filter(f => f.parentField === field.id)
722
722
  childFields.forEach((child) => {
723
723
  child.disabled = true
@@ -747,7 +747,7 @@ function handleSelectChange(event: Event, fieldId: string) {
747
747
 
748
748
  async function handleFilesUploaded(files: FileList) {
749
749
  file.value = files[0]
750
- if (!file.value) return
750
+ if (!file.value) {return}
751
751
  isLoading.value = true
752
752
 
753
753
  try {
@@ -767,8 +767,8 @@ watchEffect(() => {
767
767
 
768
768
  function hasDefaultValue(fieldId: string): boolean {
769
769
  return defaultValues[fieldId] !== undefined
770
- && defaultValues[fieldId] !== null
771
- && defaultValues[fieldId] !== ''
770
+ && null !== defaultValues[fieldId]
771
+ && '' !== defaultValues[fieldId]
772
772
  }
773
773
 
774
774
  function openTransformDialog(field: SchemaItem) {
@@ -803,14 +803,14 @@ function openRelatedDialog(field: SchemaItem) {
803
803
  }
804
804
 
805
805
  async function processRelatedFile(fieldId: string, files: File[] | FileList) {
806
- if (!files) return
806
+ if (!files) {return}
807
807
  const file = files[0]
808
808
 
809
809
  relatedFiles[fieldId] = file
810
810
 
811
811
  try {
812
812
  const sheets = await getSheetNames(file)
813
- const selectedSheet = sheets.length > 0 ? sheets[0] : ''
813
+ const selectedSheet = 0 < sheets.length ? sheets[0] : ''
814
814
 
815
815
  const { data } = await readSheetData(file, selectedSheet, true)
816
816
  relatedFileData[fieldId] = data
@@ -833,7 +833,7 @@ function autoPopulateTransformations(fieldId: string) {
833
833
 
834
834
  let fieldOptions = field.options || (field.attrs && field.attrs.options)
835
835
 
836
- if (!fieldMapping[fieldId] || !fileData.value || fileData.value.length === 0) {
836
+ if (!fieldMapping[fieldId] || !fileData.value || 0 === fileData.value.length) {
837
837
  console.warn('No data or mapping found for field:', fieldId)
838
838
  return
839
839
  }
@@ -865,7 +865,7 @@ function autoPopulateTransformations(fieldId: string) {
865
865
  const existingIndex = transformations[fieldId].findIndex(t => t.sourceValue === strSourceValue
866
866
  )
867
867
 
868
- if (existingIndex >= 0) {
868
+ if (0 <= existingIndex) {
869
869
  transformations[fieldId][existingIndex].targetValue = matchedValue
870
870
  } else {
871
871
  transformations[fieldId].push({
@@ -881,7 +881,7 @@ function autoPopulateTransformations(fieldId: string) {
881
881
  }
882
882
  })
883
883
 
884
- if (matchCount === 0) {
884
+ if (0 === matchCount) {
885
885
  alert(`No automatic matches found. Try creating transformations manually.`)
886
886
  } else {
887
887
  alert(`Automatically created ${matchCount} transformations by matching source values to target labels.\n\n${unmatchedValues.length} values could not be automatically matched.`)
@@ -910,7 +910,7 @@ function detectDateFormat(value: string): RegExp | null {
910
910
  }
911
911
 
912
912
  function parseDate(value: string): Date | null {
913
- if (!value) return null
913
+ if (!value) {return null}
914
914
 
915
915
  const isoDate = new Date(value)
916
916
  if (!Number.isNaN(isoDate.getTime())) {
@@ -921,7 +921,7 @@ function parseDate(value: string): Date | null {
921
921
  if (/^\d{2}\/\d{2}\/\d{4}$/.test(value)) {
922
922
  const [month, day, year] = value.split('/').map(Number)
923
923
  return new Date(year, month - 1, day)
924
- } else if (/^\d{2}\.\d{2}\.\d{4}$/.test(value)) {
924
+ }if (/^\d{2}\.\d{2}\.\d{4}$/.test(value)) {
925
925
  const [day, month, year] = value.split('.').map(Number)
926
926
  return new Date(year, month - 1, day)
927
927
  } else if (/^\d{1,2}\s[a-z]{3,9}\s\d{4}$/i.test(value)) {
@@ -933,7 +933,7 @@ function parseDate(value: string): Date | null {
933
933
  }
934
934
 
935
935
  function convertValueByType(value: any, dataType: string): any {
936
- if (value === null || value === undefined || value === '') {
936
+ if (null === value || value === undefined || '' === value) {
937
937
  return null
938
938
  }
939
939
  try {
@@ -947,11 +947,11 @@ function convertValueByType(value: any, dataType: string): any {
947
947
  }
948
948
 
949
949
  case DATA_TYPES.BOOLEAN:
950
- if (typeof value === 'boolean') return value
951
- if (typeof value === 'string') {
950
+ if ('boolean' === typeof value) {return value}
951
+ if ('string' === typeof value) {
952
952
  const lowercased = value.toLowerCase().trim()
953
- if (['true', 'yes', '1', 'on'].includes(lowercased)) return true
954
- if (['false', 'no', '0', 'off'].includes(lowercased)) return false
953
+ if (['true', 'yes', '1', 'on'].includes(lowercased)) {return true}
954
+ if (['false', 'no', '0', 'off'].includes(lowercased)) {return false}
955
955
  }
956
956
  return Boolean(value)
957
957
  case DATA_TYPES.DATE:
@@ -960,7 +960,7 @@ function convertValueByType(value: any, dataType: string): any {
960
960
  const date = excelSerialDateToJSDate(value)
961
961
  return formatDate(date, dataType === DATA_TYPES.DATETIME)
962
962
  }
963
- if (typeof value === 'string') {
963
+ if ('string' === typeof value) {
964
964
  const dateObj = parseDate(value)
965
965
  if (dateObj) {
966
966
  return formatDate(dateObj, dataType === DATA_TYPES.DATETIME)
@@ -982,23 +982,23 @@ function convertValueByType(value: any, dataType: string): any {
982
982
  }
983
983
 
984
984
  function detectDataType(value: any): string {
985
- if (value === null || value === undefined) {
985
+ if (null === value || value === undefined) {
986
986
  return DATA_TYPES.STRING
987
987
  }
988
- if (typeof value === 'number' || (typeof value === 'string' && !Number.isNaN(Number(value)))) {
988
+ if ('number' === typeof value || ('string' === typeof value && !Number.isNaN(Number(value)))) {
989
989
  if (isExcelSerialDate(Number(value))) {
990
990
  return DATA_TYPES.DATE
991
991
  }
992
992
  return DATA_TYPES.NUMBER
993
993
  }
994
- if (typeof value === 'boolean' || (typeof value === 'string' && ['true', 'false', 'yes', 'no'].includes(value.toLowerCase()))) {
994
+ if ('boolean' === typeof value || ('string' === typeof value && ['true', 'false', 'yes', 'no'].includes(value.toLowerCase()))) {
995
995
  return DATA_TYPES.BOOLEAN
996
996
  }
997
997
  if (value instanceof Date) {
998
998
  return DATA_TYPES.DATETIME
999
999
  }
1000
1000
 
1001
- if (typeof value === 'string') {
1001
+ if ('string' === typeof value) {
1002
1002
  if (detectDateFormat(value) || !Number.isNaN(new Date(value).getTime())) {
1003
1003
  return DATA_TYPES.DATE
1004
1004
  }
@@ -1012,9 +1012,9 @@ function guessDataTypes(): void {
1012
1012
  const sampleValues = fileData.value
1013
1013
  .slice(0, 5)
1014
1014
  .map(row => row[fieldMapping[field.id]])
1015
- .filter(value => value !== undefined && value !== null && value !== '')
1015
+ .filter(value => value !== undefined && null !== value && '' !== value)
1016
1016
 
1017
- if (sampleValues.length > 0) {
1017
+ if (0 < sampleValues.length) {
1018
1018
  const types = sampleValues.map(detectDataType)
1019
1019
  const typeCount: Record<string, number> = {}
1020
1020
 
@@ -1077,19 +1077,19 @@ function openRelatedTransformDialog(parentId: string, field: SchemaItem) {
1077
1077
  function getRelatedUniqueSourceValues(parentId: string, fieldId: string): any[] {
1078
1078
  if (!relatedFileMappings[parentId][fieldId]
1079
1079
  || !relatedFileData[parentId]
1080
- || relatedFileData[parentId].length === 0) {
1080
+ || 0 === relatedFileData[parentId].length) {
1081
1081
  return []
1082
1082
  }
1083
1083
 
1084
1084
  const allValues = relatedFileData[parentId]
1085
1085
  .map(row => row[relatedFileMappings[parentId][fieldId]])
1086
- .filter(value => value !== undefined && value !== null && value !== '')
1086
+ .filter(value => value !== undefined && null !== value && '' !== value)
1087
1087
 
1088
1088
  const uniqueValues = [...new Set(allValues)]
1089
1089
 
1090
1090
  return uniqueValues.filter((value) => {
1091
1091
  if (!relatedTransformations[parentId][fieldId]
1092
- || relatedTransformations[parentId][fieldId].length === 0) {
1092
+ || 0 === relatedTransformations[parentId][fieldId].length) {
1093
1093
  return true
1094
1094
  }
1095
1095
  return !relatedTransformations[parentId][fieldId].some(t => t.sourceValue == value || t.sourceValue === value.toString()
@@ -1127,7 +1127,7 @@ function addRelatedTransformation(parentId: string, fieldId: string) {
1127
1127
  t => t.sourceValue === selectedRelatedSourceValue.value
1128
1128
  )
1129
1129
 
1130
- if (existingIndex >= 0) {
1130
+ if (0 <= existingIndex) {
1131
1131
  relatedTransformations[parentId][fieldId][existingIndex].targetValue = selectedRelatedTargetValue.value
1132
1132
  } else {
1133
1133
  relatedTransformations[parentId][fieldId].push({
@@ -1160,7 +1160,7 @@ function autoPopulateRelatedTransformations(parentId: string, fieldId: string) {
1160
1160
 
1161
1161
  if (!relatedFileMappings[parentId][fieldId]
1162
1162
  || !relatedFileData[parentId]
1163
- || relatedFileData[parentId].length === 0) {
1163
+ || 0 === relatedFileData[parentId].length) {
1164
1164
  console.warn('No data or mapping found for related field:', fieldId)
1165
1165
  return
1166
1166
  }
@@ -1198,7 +1198,7 @@ function autoPopulateRelatedTransformations(parentId: string, fieldId: string) {
1198
1198
  t => t.sourceValue === strSourceValue
1199
1199
  )
1200
1200
 
1201
- if (existingIndex >= 0) {
1201
+ if (0 <= existingIndex) {
1202
1202
  // Update existing transformation
1203
1203
  relatedTransformations[parentId][fieldId][existingIndex].targetValue = matchedValue
1204
1204
  } else {
@@ -1215,7 +1215,7 @@ function autoPopulateRelatedTransformations(parentId: string, fieldId: string) {
1215
1215
  unmatchedValues.push(strSourceValue)
1216
1216
  }
1217
1217
  })
1218
- if (matchCount === 0) {
1218
+ if (0 === matchCount) {
1219
1219
  alert(`No automatic matches found. Try creating transformations manually.`)
1220
1220
  } else {
1221
1221
  alert(`Automatically created ${matchCount} transformations by matching source values to target labels.\n\n${unmatchedValues.length} values could not be automatically matched.`)