diff --git a/packages/ui/eslint.config.mjs b/packages/ui/eslint.config.mjs new file mode 100644 index 000000000..98f3d9f5a --- /dev/null +++ b/packages/ui/eslint.config.mjs @@ -0,0 +1,13 @@ +import {config} from "eslint-config-custom/vue" + +export default [ + ...config, + { + "rules": { + "@typescript-eslint/no-explicit-any": "warn", + "vue/require-prop-types": "warn", + "vue/valid-v-for": "warn", + "no-prototype-builtins": "warn" + } + } +]; diff --git a/packages/ui/package.json b/packages/ui/package.json index 801928c11..67becd435 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -30,7 +30,9 @@ "test:unit": "vitest --ui --coverage", "build": "vite build", "build:watch": "vite build --watch", - "preview": "vite preview" + "preview": "vite preview", + "lint": "eslint src", + "lint:fix": "eslint src --fix" }, "dependencies": { "@azure/abort-controller": "^2.0.0", diff --git a/packages/ui/src/components/ForgeActionButton.vue b/packages/ui/src/components/ForgeActionButton.vue index f9dbfb5cf..a35e2114e 100644 --- a/packages/ui/src/components/ForgeActionButton.vue +++ b/packages/ui/src/components/ForgeActionButton.vue @@ -11,8 +11,8 @@ import { ref } from "vue"; const loading = ref(false) export interface ForgeActionButtonProps extends /* @vue-ignore */ ButtonProps { - action: Function, - errorAction: Function, + action: (...param: any[]) => Promise, + errorAction: (...param: any[]) => Promise, errorParams?: Array, params?: Array } diff --git a/packages/ui/src/components/ForgeAlert.vue b/packages/ui/src/components/ForgeAlert.vue index 5fbf00e36..3761e6f47 100644 --- a/packages/ui/src/components/ForgeAlert.vue +++ b/packages/ui/src/components/ForgeAlert.vue @@ -2,10 +2,10 @@ - + @@ -17,7 +17,7 @@ import { Icon } from '@iconify/vue' import { MessageProps } from "primevue/message"; const props = withDefaults( - defineProps(), + defineProps(), { life: undefined, closable: false, diff --git a/packages/ui/src/components/ForgeAutoComplete.vue b/packages/ui/src/components/ForgeAutoComplete.vue index 51f850390..4fa2d47d1 100644 --- a/packages/ui/src/components/ForgeAutoComplete.vue +++ b/packages/ui/src/components/ForgeAutoComplete.vue @@ -1,6 +1,8 @@ diff --git a/packages/ui/src/components/ForgeCheckbox.vue b/packages/ui/src/components/ForgeCheckbox.vue index a2675e3af..6169c9a99 100644 --- a/packages/ui/src/components/ForgeCheckbox.vue +++ b/packages/ui/src/components/ForgeCheckbox.vue @@ -1,33 +1,33 @@ @@ -50,19 +50,19 @@ const props = withDefaults(defineProps(), { const value = defineModel({ required: true }); const { handleChange, errors, errorMessage } = useField( - () => props.name ?? "", - undefined, - { - type: "checkbox", - checkedValue: value.value, - } + () => props.name ?? "", + undefined, + { + type: "checkbox", + checkedValue: value.value, + } ); const onChange = (event: MouseEvent, checkValue: boolean) => { - if(props.disabled || props.readonly) { + if (props.disabled || props.readonly) { event.preventDefault(); } - if(props.name) handleChange(checkValue) + if (props.name) handleChange(checkValue) else value.value = checkValue } diff --git a/packages/ui/src/components/ForgeChip.vue b/packages/ui/src/components/ForgeChip.vue index b94a12d3b..e4ea0cb94 100644 --- a/packages/ui/src/components/ForgeChip.vue +++ b/packages/ui/src/components/ForgeChip.vue @@ -1,6 +1,8 @@ @@ -10,7 +12,7 @@ import { Severity } from "../types/forge-types"; import { computed } from "vue"; export interface ForgeChipProps - extends /* vue-ignore */ Omit { + extends /* vue-ignore */ Omit { chipSeverity?: Severity; pill?: boolean; } @@ -28,16 +30,16 @@ const chipPt = computed(() => ({ }, { "bg-primary-subtle border-primary text-primary": - props.chipSeverity === undefined || props.chipSeverity === "primary", + props.chipSeverity === undefined || props.chipSeverity === "primary", "bg-brand-subtle border-brand text-brand": props.chipSeverity === "brand", "bg-secondary-subtle border-secondary text-secondary": - props.chipSeverity === "secondary", + props.chipSeverity === "secondary", "bg-success-subtle border-success text-success": - props.chipSeverity === "success", + props.chipSeverity === "success", "bg-warning-subtle border-warning text-warning": - props.chipSeverity === "warning", + props.chipSeverity === "warning", "bg-danger-subtle border-danger text-danger": - props.chipSeverity === "danger", + props.chipSeverity === "danger", "bg-info-subtle border-info text-info": props.chipSeverity === "info", "bg-info-success-alternate border-success-alternate text-success-alternate": props.chipSeverity === "success-alternate" }, diff --git a/packages/ui/src/components/ForgeConfirmPopup.vue b/packages/ui/src/components/ForgeConfirmPopup.vue index 0b1865fb1..b72c08e81 100644 --- a/packages/ui/src/components/ForgeConfirmPopup.vue +++ b/packages/ui/src/components/ForgeConfirmPopup.vue @@ -1,6 +1,8 @@ @@ -16,7 +18,7 @@ const pt = computed(() => ({ class: ["modal-footer gap-1 p-2"], }), content: 'pt-2 px-2', - pcRejectButton: {root: 'btn btn-outline-primary btn-sm'}, - pcAcceptButton: {root: 'btn btn-primary btn-sm'} + pcRejectButton: { root: 'btn btn-outline-primary btn-sm' }, + pcAcceptButton: { root: 'btn btn-primary btn-sm' } })) \ No newline at end of file diff --git a/packages/ui/src/components/ForgeDatepicker.vue b/packages/ui/src/components/ForgeDatepicker.vue index 1cf9ab294..7dc96d393 100644 --- a/packages/ui/src/components/ForgeDatepicker.vue +++ b/packages/ui/src/components/ForgeDatepicker.vue @@ -5,15 +5,18 @@
- - + - +
@@ -22,7 +25,7 @@ - {{ errorMessage }} + {{ errorMessage }} \ No newline at end of file diff --git a/packages/ui/src/components/ForgePageHeader.vue b/packages/ui/src/components/ForgePageHeader.vue index 12f1a5b43..1d9578fbe 100644 --- a/packages/ui/src/components/ForgePageHeader.vue +++ b/packages/ui/src/components/ForgePageHeader.vue @@ -2,7 +2,7 @@

{{ props.title }}

- +
diff --git a/packages/ui/src/components/ForgePanel.vue b/packages/ui/src/components/ForgePanel.vue index 1dd3f071f..9be65f48a 100644 --- a/packages/ui/src/components/ForgePanel.vue +++ b/packages/ui/src/components/ForgePanel.vue @@ -1,8 +1,8 @@ @@ -50,7 +50,7 @@ const { acceptedFileTypes, maxFileInput, showDragDropArea } = defineProps(() => maxFileInput <= files.value.length) -const addUploadedFiles = (filesToUpload : File[]) => { +const addUploadedFiles = (filesToUpload: File[]) => { files.value = addFiles(filesToUpload, files.value, acceptedFileTypes.map(ft => ft.fileType), maxFileInput) } \ No newline at end of file diff --git a/packages/ui/src/components/file-uploader/components/UploadStatus.vue b/packages/ui/src/components/file-uploader/components/UploadStatus.vue index ae649fa1f..fa128d7fd 100644 --- a/packages/ui/src/components/file-uploader/components/UploadStatus.vue +++ b/packages/ui/src/components/file-uploader/components/UploadStatus.vue @@ -1,8 +1,9 @@ diff --git a/packages/ui/src/components/file-uploader/utilities/utilities.ts b/packages/ui/src/components/file-uploader/utilities/utilities.ts index 2f9200ef3..85411a8e0 100644 --- a/packages/ui/src/components/file-uploader/utilities/utilities.ts +++ b/packages/ui/src/components/file-uploader/utilities/utilities.ts @@ -1,6 +1,6 @@ import { ForgeFileStatus } from "../../../types/forge-types"; import { BlockBlobClient } from "@azure/storage-blob"; -import { Mime } from "mime"; +import { Mime } from "mime"; import standardTypes from "mime/types/standard.js"; import otherTypes from "mime/types/other.js"; @@ -15,14 +15,15 @@ export type FileUploadStatus = | "DeleteFileFailed" | "InvalidFileType" | "InvalidFileSize"; -export function addFiles(filesToUpload: File[], files : ForgeFileStatus[], acceptedFileTypes: string[], maxFileSize: number) { - + +export function addFiles(filesToUpload: File[], files: ForgeFileStatus[], acceptedFileTypes: string[], maxFileSize: number) { + // Get local version of the currently uploaded files. const uploadedFiles = files.flatMap(fileStatus => fileStatus.file) // Reset all the duplicate warnings. files = files.map(file => ({ ...file, status: file.status == 'Duplicate' ? 'Not Uploaded' : file.status })) - + // Add any new files to Files array filesToUpload.forEach((file) => { const fileIndex = uploadedFiles.findIndex(uploadedFile => uploadedFile.name === file.name) @@ -31,7 +32,7 @@ export function addFiles(filesToUpload: File[], files : ForgeFileStatus[], accep if (!acceptedFileTypes.includes(file.type) || !(file.size <= maxFileSize)) { status = !acceptedFileTypes.includes(file.type) ? 'InvalidFileType' : 'InvalidFileSize' } - + files.unshift({ file: file, status: status, @@ -41,11 +42,11 @@ export function addFiles(filesToUpload: File[], files : ForgeFileStatus[], accep files[fileIndex].status = 'Duplicate'; } }) - + return files } -export async function deleteFile(uploadStatus : FileUploadStatus, blobUploadUrl : string) { +export async function deleteFile(uploadStatus: FileUploadStatus, blobUploadUrl: string) { if (uploadStatus === 'Uploaded') { if (blobUploadUrl !== null) { try { diff --git a/packages/ui/src/components/table/ForgeColumnCustomiser.vue b/packages/ui/src/components/table/ForgeColumnCustomiser.vue index 903b353ad..58f5a7de4 100644 --- a/packages/ui/src/components/table/ForgeColumnCustomiser.vue +++ b/packages/ui/src/components/table/ForgeColumnCustomiser.vue @@ -1,5 +1,5 @@ - \ No newline at end of file