Browse Source

fix: user sort config validator fun

pull/7342/head
Ramesh Mane 8 months ago
parent
commit
14c9a7e688
  1. 31
      packages/nc-gui/composables/useUserSorts.ts
  2. 33
      packages/nc-gui/helpers/parsers/parserHelpers.ts

31
packages/nc-gui/composables/useUserSorts.ts

@ -2,7 +2,6 @@ import rfdc from 'rfdc'
import { OrgUserRoles, ProjectRoles, WorkspaceUserRoles } from 'nocodb-sdk'
import type { UsersSortType } from '~/lib'
import { useGlobal } from '#imports'
import { isValidObjectType } from '~/helpers/parsers/parserHelpers'
/**
* Hook for managing user sorts and sort configurations.
@ -43,16 +42,17 @@ export function useUserSorts(roleType: 'Workspace' | 'Org' | 'Project') {
const storedConfig = localStorage.getItem(userSortConfigKey)
const sortConfig = storedConfig ? JSON.parse(storedConfig) : ({} as Record<string, UsersSortType>)
if (isValidObjectType(sortConfig, {} as Record<string, UsersSortType>)) {
sorts.value = sortConfig
if (sortConfig && isValidSortConfig(sortConfig)) {
sorts.value = sortConfig
// Load user-specific sort configurations or default configurations
sorts.value = user.value?.id ? sortConfig[user.value.id] || {} : sortConfig[defaultUserId] || {}
} else {
// remove sortConfig from localStorage if it's invalid
localStorage.removeItem(userSortConfigKey)
sorts.value = {}
}
} catch (error) {
console.error('Error while retrieving sort configuration from local storage:', error)
} catch {
// Set sorts to an empty obj in case of an error
sorts.value = {}
}
@ -150,5 +150,26 @@ export function useUserSorts(roleType: 'Workspace' | 'Org' | 'Project') {
return sortedData
}
/**
* Checks if the provided sort configuration has the expected structure.
* @param sortConfig - The sort configuration to validate.
* @param expectedStructure - The expected structure for the sort configuration.
* Defaults to { field: 'email', direction: 'asc' }.
* @returns `true` if the sort configuration is valid, otherwise `false`.
*/
function isValidSortConfig(
sortConfig: Record<string, any>,
expectedStructure: UsersSortType = { field: 'email', direction: 'asc' },
): boolean {
// Check if the sortConfig has the expected keys
for (const key in sortConfig) {
const isValidConfig = Object.keys(sortConfig[key]).every((key) =>
Object.prototype.hasOwnProperty.call(expectedStructure, key),
)
if (!isValidConfig) return false
}
return true
}
return { sorts, sortDirection, loadSorts, saveOrUpdate, handleGetSortsData }
}

33
packages/nc-gui/helpers/parsers/parserHelpers.ts

@ -225,36 +225,3 @@ export const extractNextDefaultName = (namesData: string[], defaultName: string,
? `${defaultName}${splitOperator}${extractedSortedNumbers[extractedSortedNumbers.length - 1] + 1}`
: `${defaultName}${splitOperator}1`
}
/**
* Validates whether an object matches the expected type.
*
* @param obj - The object to be validated.
* @param expectedType - The expected type of the object.
* @returns `true` if the object matches the expected type, `false` otherwise.
*
* @template T - The type representing the expected structure of the object.
*
* @example
* // Define a type representing the expected structure.
* interface MyType {
* id: number;
* name: string;
* }
*
* // Object to validate
* const objToValidate = {
* id: 1,
* name: 'John Doe',
* };
*
* // Check if the object matches the expected type.
* const isValid = isValidObjectType(objToValidate, {} as MyType);
* console.log(isValid); // Should print true
*/
export const isValidObjectType = <T extends Record<string, any>>(obj: Record<string, any>, expectedType: T): boolean => {
// Check if the obj has the expected keys and values
return Object.entries(expectedType).every(([key, expectedValue]) => {
return Object.prototype.hasOwnProperty.call(obj, key) && typeof obj[key] === typeof expectedValue
})
}

Loading…
Cancel
Save