Skip to content

Commit 2713574

Browse files
Merge pull request #1 from Skillbill/fix-build
Fix build and linter
2 parents d6b8222 + 95aadfe commit 2713574

File tree

22 files changed

+211
-65
lines changed

22 files changed

+211
-65
lines changed

.eslintrc.cjs

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,40 @@
11
/* eslint-env node */
2-
require('@rushstack/eslint-patch/modern-module-resolution')
3-
42
module.exports = {
53
root: true,
64
extends: [
7-
'plugin:vue/vue3-essential',
85
'eslint:recommended',
9-
'@vue/eslint-config-typescript',
10-
'@vue/eslint-config-prettier/skip-formatting',
6+
'plugin:@typescript-eslint/recommended',
7+
'plugin:react/recommended',
8+
'plugin:react-hooks/recommended',
119
'plugin:storybook/recommended'
1210
],
11+
parser: '@typescript-eslint/parser',
1312
parserOptions: {
14-
ecmaVersion: 'latest'
13+
ecmaVersion: 'latest',
14+
sourceType: 'module',
15+
ecmaFeatures: {
16+
jsx: true
17+
}
18+
},
19+
plugins: ['@typescript-eslint'],
20+
settings: {
21+
react: {
22+
version: 'detect'
23+
}
1524
},
1625
rules: {
17-
'vue/no-deprecated-slot-attribute': 0
26+
'react/react-in-jsx-scope': 'off', // Not needed in React 17+
27+
'react/prop-types': 'off', // Using TypeScript
28+
'react/display-name': 'off', // Allow anonymous components
29+
'@typescript-eslint/no-unused-vars': ['error', {
30+
argsIgnorePattern: '^_',
31+
varsIgnorePattern: '^_'
32+
}],
33+
'@typescript-eslint/no-explicit-any': 'off', // Allow any type
34+
'@typescript-eslint/no-namespace': 'off', // Allow namespaces for JSX augmentation
35+
'no-undef': 'off', // TypeScript handles this
36+
'no-console': 'warn', // Warn on console statements
37+
'storybook/no-renderer-packages': 'off' // Allow direct Storybook imports
1838
},
19-
ignorePatterns: ['src/components/examples/']
39+
ignorePatterns: ['src/components/examples/', 'dist/', 'node_modules/', 'src/stories/']
2040
}

package-lock.json

Lines changed: 91 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@
6969
"@types/node": "^18.19.3",
7070
"@types/react": "^18.2.0",
7171
"@types/react-dom": "^18.2.0",
72+
"@typescript-eslint/eslint-plugin": "^8.52.0",
73+
"@typescript-eslint/parser": "^8.52.0",
7274
"@vitejs/plugin-react": "^4.2.1",
7375
"autoprefixer": "^10.4.16",
7476
"eslint": "^8.49.0",

src/components/RLAutocomplete/RLAutocomplete.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export const RLAutocomplete = forwardRef<RLAutocompleteRef, RLAutocompleteProps>
3636
ref
3737
) => {
3838
const autocompleteRef = useRef<AutoComplete>(null)
39-
const [inputModel, setInputModel] = useState<RLSelectOptionType | string | null>(null)
39+
const [inputModel, setInputModel] = useState<RLSelectOptionType | string | undefined>(undefined)
4040
const { errorMessage, isValid, validate } = useValidation({ rules, externalError: error })
4141

4242
// Sync inputModel with value
@@ -45,7 +45,7 @@ export const RLAutocomplete = forwardRef<RLAutocompleteRef, RLAutocompleteProps>
4545
setInputModel({ value: '', text: '' })
4646
} else {
4747
const found = options.find((option) => value === option.value)
48-
setInputModel(found ?? (!forceSelection ? { value, text: value } : null))
48+
setInputModel(found ?? (!forceSelection ? { value, text: value } : undefined))
4949
}
5050
}, [value, options, forceSelection])
5151

@@ -60,9 +60,7 @@ export const RLAutocomplete = forwardRef<RLAutocompleteRef, RLAutocompleteProps>
6060
validate: () => validate(value)
6161
}))
6262

63-
const handleChange = (evt: { value: RLSelectOptionType | string | null }) => {
64-
console.log('handleChange evt.value:', evt.value)
65-
63+
const handleChange = (evt: { value: RLSelectOptionType | string | undefined }) => {
6664
setInputModel(evt.value)
6765

6866
if (!forceSelection) {
@@ -79,8 +77,6 @@ export const RLAutocomplete = forwardRef<RLAutocompleteRef, RLAutocompleteProps>
7977
}
8078

8179
const handleItemSelect = (evt: { value: RLSelectOptionType }) => {
82-
console.log('handleItemSelect evt.value:', evt.value)
83-
8480
setInputModel(evt.value)
8581
onChange?.(evt.value.value)
8682
onItemSelect?.(evt)
@@ -143,7 +139,7 @@ export const RLAutocomplete = forwardRef<RLAutocompleteRef, RLAutocompleteProps>
143139
completeMethod={handleComplete}
144140
onClick={handleClick}
145141
onFocus={handleFocus}
146-
onDropdownClick={(evt) => onDropdownClick?.(evt.originalEvent)}
142+
onDropdownClick={(evt) => onDropdownClick?.(evt.originalEvent.nativeEvent)}
147143
onClear={onClear}
148144
onShow={onShow}
149145
onHide={onHide}

src/components/RLCheckbox/RLCheckbox.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ declare global {
1818
form?: string
1919
required?: boolean
2020
class?: string
21+
onSlInput?: (event: Event) => void
22+
onSlChange?: (event: Event) => void
23+
onSlBlur?: (event: Event) => void
24+
onSlFocus?: (event: Event) => void
25+
onSlInvalid?: (event: Event) => void
2126
}
2227
}
2328
}

src/components/RLCrud/RLCrud.tsx

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'
1+
import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, type ComponentType } from 'react'
22
import type { RLCrudProps, RLCrudRef, RLCrudActionType } from './types'
33
import type { RLCrudFormFieldType } from '../RLCrudForm'
44
import type { RLCrudFiltersRef } from '../RLCrudFilters'
5+
import type { RLCrudInputValueType } from '../RLCrudInput'
56
import { RLCrudAction } from '../RLCrudAction'
67
import { RLPaginator } from '../RLPaginator'
78
import { RLDialog } from '../RLDialog'
@@ -43,7 +44,7 @@ export const RLCrud = forwardRef<RLCrudRef, RLCrudProps>(
4344
highlightLastEdited = true,
4445
highlightLastEditedClass = '!bg-row-selected',
4546
persistActionDialog = true,
46-
rowClass: externalRowClass,
47+
rowClassName: externalRowClassName,
4748
getItems,
4849
addItem,
4950
editItem,
@@ -55,7 +56,7 @@ export const RLCrud = forwardRef<RLCrudRef, RLCrudProps>(
5556
},
5657
ref
5758
) => {
58-
const [items, setItems] = useState<unknown[]>([])
59+
const [items, setItems] = useState<Record<string, unknown>[]>([])
5960
const [currentPage, setCurrentPage] = useState(0)
6061
const [rowsPerPage, setRowsPerPage] = useState(
6162
rowsPerPageOptions.includes(initialRowsPerPage)
@@ -91,7 +92,10 @@ export const RLCrud = forwardRef<RLCrudRef, RLCrudProps>(
9192
sortable: header.sortable,
9293
...(header.columnProps ? { columnProps: header.columnProps } : {}),
9394
...(header.type
94-
? { component: components?.[header.type], componentProps: header.componentProps }
95+
? {
96+
component: components?.[header.type] as ComponentType<{ data: unknown; field: string; [key: string]: unknown }>,
97+
componentProps: header.componentProps as Record<string, unknown>
98+
}
9599
: {})
96100
})),
97101
[headers, translationFn, components]
@@ -115,10 +119,11 @@ export const RLCrud = forwardRef<RLCrudRef, RLCrudProps>(
115119
return
116120
}
117121

118-
setItems(response.result)
122+
setItems(response.result as Record<string, unknown>[])
119123
setCurrentPage(response.page.currentPage)
120124
setTotalRows(response.page.totalRows)
121125
} catch (e) {
126+
// eslint-disable-next-line no-console
122127
console.error(e)
123128
onFetchError?.()
124129
}
@@ -171,29 +176,36 @@ export const RLCrud = forwardRef<RLCrudRef, RLCrudProps>(
171176
await fetchData()
172177
}, [fetchData])
173178

174-
const rowClass = useCallback(
179+
const rowClassName = useCallback(
175180
(row: unknown) => {
176-
const externalClasses = externalRowClass?.(row) || []
181+
const externalResult = externalRowClassName?.(row)
182+
const externalClasses = Array.isArray(externalResult)
183+
? externalResult
184+
: externalResult
185+
? [externalResult]
186+
: []
187+
177188
if ((row as Record<string, unknown>)[primary_key] === lastSelectedItem && highlightLastEdited) {
178-
return [...externalClasses, highlightLastEditedClass]
189+
return [...externalClasses, highlightLastEditedClass].join(' ')
179190
}
180-
return externalClasses
191+
return externalClasses.join(' ')
181192
},
182-
[externalRowClass, primary_key, lastSelectedItem, highlightLastEdited, highlightLastEditedClass]
193+
[externalRowClassName, primary_key, lastSelectedItem, highlightLastEdited, highlightLastEditedClass]
183194
)
184195

185196
const onAdd = useCallback(
186197
async (data: Record<string, unknown>) => {
187198
const response = await addItem?.(data)
199+
const responseRecord = response as Record<string, unknown>
188200
const newId =
189-
(response as Record<string, unknown>)?.result?.[primary_key] ??
190-
(response as Record<string, unknown>)?.[primary_key]
201+
((responseRecord?.result as Record<string, unknown>)?.[primary_key]) ??
202+
responseRecord?.[primary_key]
191203
setLastSelectedItem(newId)
192204

193205
if (goToInsertedRow) {
194206
skipWatchersRef.current = true
195-
setFiltersApplied({ [primary_key]: newId })
196-
filtersRef.current?.setFilterModel({ [primary_key]: newId })
207+
setFiltersApplied({ [primary_key]: newId as RLCrudInputValueType })
208+
filtersRef.current?.setFilterModel({ [primary_key]: newId as RLCrudInputValueType })
197209
filtersRef.current?.setOpen(true)
198210
setCurrentPage(1)
199211
await Promise.resolve() // Allow state to update
@@ -291,7 +303,7 @@ export const RLCrud = forwardRef<RLCrudRef, RLCrudProps>(
291303
actions={[]}
292304
paginator={false}
293305
actionHeaderLabel={translationFn(actionHeaderI18nKey)}
294-
rowClass={rowClass}
306+
rowClassName={rowClassName}
295307
actionsSlot={renderActions}
296308
emptySlot={<div className="flex justify-center p-4">Empty</div>}
297309
/>
@@ -348,7 +360,7 @@ export const RLCrud = forwardRef<RLCrudRef, RLCrudProps>(
348360
requiredRuleMessage={translationFn(requiredI18nKey)}
349361
cancelLabel={translationFn(cancelI18nKey)}
350362
confirmLabel={translationFn(editI18nKey)}
351-
value={selectedItem ?? undefined}
363+
value={(selectedItem as { [key: string]: RLCrudInputValueType }) ?? undefined}
352364
primaryKey={primary_key}
353365
onClose={closeDialog}
354366
onCancel={closeDialog}

src/components/RLCrud/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export interface RLCrudProps {
6464
highlightLastEdited?: boolean
6565
highlightLastEditedClass?: string
6666
persistActionDialog?: boolean
67-
rowClass?: (data: unknown) => (string | object)[] | undefined
67+
rowClassName?: (data: unknown) => string | string[] | undefined
6868
getItems: (
6969
page: number,
7070
rowsPerPage: number,

src/components/RLCrudFilters/RLCrudFilters.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const RLCrudFilters = forwardRef<RLCrudFiltersRef, RLCrudFiltersProps>(
1212
filters,
1313
applyLabel = 'apply',
1414
resetLabel = 'reset',
15+
className,
1516
onApply,
1617
onHide,
1718
onReset,
@@ -105,6 +106,7 @@ export const RLCrudFilters = forwardRef<RLCrudFiltersRef, RLCrudFiltersProps>(
105106
<RLExpansionCard
106107
ref={expansionCardRef}
107108
title={title}
109+
className={className}
108110
onHide={handleHide}
109111
onShow={handleShow}
110112
onKeyUp={handleKeyUp}

src/components/RLCrudFilters/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export interface RLCrudFiltersProps {
1717
filters: RLCrudFilterType[]
1818
applyLabel?: string
1919
resetLabel?: string
20+
className?: string
2021
onApply?: () => void
2122
onHide?: () => void
2223
onReset?: () => void

0 commit comments

Comments
 (0)