@chayns-components/person-finder 5.4.0 → 5.4.4

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 (35) hide show
  1. package/lib/cjs/api/person/get.js +5 -3
  2. package/lib/cjs/api/person/get.js.map +1 -1
  3. package/lib/cjs/api/site/get.js +5 -3
  4. package/lib/cjs/api/site/get.js.map +1 -1
  5. package/lib/cjs/components/PersonFinderProvider.js +60 -15
  6. package/lib/cjs/components/PersonFinderProvider.js.map +1 -1
  7. package/lib/cjs/components/person-finder/PersonFinder.js +2 -0
  8. package/lib/cjs/components/person-finder/PersonFinder.js.map +1 -1
  9. package/lib/cjs/components/person-finder/person-finder-wrapper/PersonFinderWrapper.js +7 -5
  10. package/lib/cjs/components/person-finder/person-finder-wrapper/PersonFinderWrapper.js.map +1 -1
  11. package/lib/cjs/constants/url.js +9 -0
  12. package/lib/cjs/constants/url.js.map +1 -0
  13. package/lib/cjs/utils/personFinder.js +6 -3
  14. package/lib/cjs/utils/personFinder.js.map +1 -1
  15. package/lib/esm/api/person/get.js +5 -3
  16. package/lib/esm/api/person/get.js.map +1 -1
  17. package/lib/esm/api/site/get.js +5 -3
  18. package/lib/esm/api/site/get.js.map +1 -1
  19. package/lib/esm/components/PersonFinderProvider.js +59 -15
  20. package/lib/esm/components/PersonFinderProvider.js.map +1 -1
  21. package/lib/esm/components/person-finder/PersonFinder.js +2 -0
  22. package/lib/esm/components/person-finder/PersonFinder.js.map +1 -1
  23. package/lib/esm/components/person-finder/person-finder-wrapper/PersonFinderWrapper.js +7 -5
  24. package/lib/esm/components/person-finder/person-finder-wrapper/PersonFinderWrapper.js.map +1 -1
  25. package/lib/esm/constants/url.js +3 -0
  26. package/lib/esm/constants/url.js.map +1 -0
  27. package/lib/esm/utils/personFinder.js +6 -3
  28. package/lib/esm/utils/personFinder.js.map +1 -1
  29. package/lib/types/api/person/get.d.ts +2 -1
  30. package/lib/types/api/site/get.d.ts +2 -1
  31. package/lib/types/components/PersonFinderProvider.d.ts +1 -0
  32. package/lib/types/components/person-finder/PersonFinder.d.ts +8 -0
  33. package/lib/types/constants/url.d.ts +2 -0
  34. package/lib/types/utils/personFinder.d.ts +2 -1
  35. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"PersonFinderWrapper.js","names":["_core","require","_chaynsApi","_react","_interopRequireWildcard","_uuid","_personFinder","_PersonFinderWrapper","_PersonFinderBody","_interopRequireDefault","_PersonFinderProvider","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","PersonFinderWrapper","forwardRef","container","dropdownDirection","filterTypes","friendsPriority","leftElement","leftElementProp","maxEntries","Infinity","onAdd","onDropdownHide","onDropdownShow","shouldDisableRemove","onRemove","placeholder","shouldAllowMultiple","shouldHideResultsOnAdd","shouldRenderInline","relationMode","ref","data","updateSearch","setTags","tags","search","usePersonFinder","isFocused","setIsFocused","useState","shouldShowBody","setShouldShowBody","boxRef","useRef","contentRef","keyRef","uuidV4","tagInputRef","isTouch","useDevice","createElement","StyledPersonFinderLeftElement","Icon","icons","handleTagInputBlur","useCallback","handleTagInputFocus","handleRemove","id","prevState","filter","entry","handleClose","handleOpen","handleClear","_tagInputRef$current","current","resetValue","handleDropdownOutsideClick","_tagInputRef$current2","blur","handleAdd","selectedEntry","values","flat","map","entries","find","toString","name","firstName","lastName","tag","text","_tagInputRef$current3","some","length","handleChange","event","target","value","useImperativeHandle","clear","useEffect","showBody","useMemo","extraMobileCheck","check","RelationMode","SITE","includes","PersonFinderFilterTypes","PERSON","Priority","HIGH","content","body","DropdownBodyWrapper","anchorElement","direction","onClose","onOutsideClick","shouldShowDropdown","StyledPersonFinder","onFocus","key","TagInput","onBlur","onChange","shouldPreventEnter","displayName","_default","exports"],"sources":["../../../../../src/components/person-finder/person-finder-wrapper/PersonFinderWrapper.tsx"],"sourcesContent":["import {\n DropdownBodyWrapper,\n DropdownDirection,\n Icon,\n type Tag,\n TagInput,\n type TagInputRef,\n} from '@chayns-components/core';\nimport { useDevice } from 'chayns-api';\nimport React, {\n type ChangeEvent,\n forwardRef,\n type ReactElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { v4 as uuidV4 } from 'uuid';\nimport {\n PersonEntry,\n PersonFinderEntry,\n PersonFinderFilterTypes,\n Priority,\n RelationMode,\n SiteEntry,\n} from '../../../types/personFinder';\nimport { StyledPersonFinder, StyledPersonFinderLeftElement } from './PersonFinderWrapper.styles';\nimport PersonFinderBody from './person-finder-body/PersonFinderBody';\nimport { usePersonFinder } from '../../PersonFinderProvider';\n\nexport type PersonFinderRef = {\n clear: () => void;\n};\n\nexport type PersonFinderWrapperProps = {\n /**\n * The element where the content of the `PersonFinder` should be rendered via React Portal.\n */\n container?: Element;\n /**\n * The direction in which the dropdown should be displayed. By default, it is displayed below the input.\n */\n dropdownDirection?: DropdownDirection;\n /**\n * The filter options of the component.\n */\n filterTypes?: PersonFinderFilterTypes[];\n /**\n * Determines the priority level for displaying friends in search results.\n */\n friendsPriority?: Priority;\n /**\n * An element that should be displayed on the left side of the input.\n */\n leftElement?: ReactElement;\n /**\n * The maximum number of entries that can be selected.\n */\n maxEntries?: number;\n /**\n * Function to be executed if a person or site is added.\n */\n onAdd?: (entry: PersonFinderEntry) => void;\n /**\n * Function to be executed if the dropdown is hidden.\n */\n onDropdownHide?: () => void;\n /**\n * Function to be executed if the dropdown is shown.\n */\n onDropdownShow?: () => void;\n /**\n * Function to be executed if a person or site is removed.\n */\n onRemove?: (id: PersonFinderEntry['id']) => void;\n /**\n * The placeholder that should be displayed.\n */\n placeholder?: string;\n /**\n * Whether multiple persons and sites should be selected.\n */\n shouldAllowMultiple?: boolean;\n /**\n * Whether the dropdown should be hidden after adding an entry. By default, it is not hidden.\n */\n shouldHideResultsOnAdd?: boolean;\n /**\n * Whether the `PersonFinder` should be rendered inline without a dropdown.\n * @description\n * If set to `true`, the `PersonFinder` will display the results below the input field, without\n * using a dropdown. This is useful for scenarios where the `PersonFinder` is part of a larger\n * form and should always be visible.\n * @default false\n * @example\n * <PersonFinder shouldRenderInline />\n * @optional\n */\n shouldRenderInline?: boolean;\n /**\n * Whether the remove action should be disabled.\n */\n shouldDisableRemove?: boolean;\n /**\n * Determines whether persons are searched and sorted from the user's perspective or from a site's perspective.\n */\n relationMode?: RelationMode;\n};\n\nconst PersonFinderWrapper = forwardRef<PersonFinderRef, PersonFinderWrapperProps>(\n (\n {\n container,\n dropdownDirection,\n filterTypes,\n friendsPriority,\n leftElement: leftElementProp,\n maxEntries = Infinity,\n onAdd,\n onDropdownHide,\n onDropdownShow,\n shouldDisableRemove,\n onRemove,\n placeholder,\n shouldAllowMultiple,\n shouldHideResultsOnAdd,\n shouldRenderInline,\n relationMode,\n },\n ref,\n ) => {\n const { data, updateSearch, setTags, tags, search } = usePersonFinder();\n\n const [isFocused, setIsFocused] = useState(false);\n const [shouldShowBody, setShouldShowBody] = useState(false);\n\n const boxRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const keyRef = useRef(`person-finder-${uuidV4()}`);\n const tagInputRef = useRef<TagInputRef>(null);\n\n const { isTouch } = useDevice();\n\n const leftElement = leftElementProp ?? (\n <StyledPersonFinderLeftElement>\n <Icon icons={['fa fa-search']} />\n </StyledPersonFinderLeftElement>\n );\n\n const handleTagInputBlur = useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const handleTagInputFocus = useCallback(() => {\n setIsFocused(true);\n }, []);\n\n const handleRemove = useCallback(\n (id: string) => {\n if (typeof setTags !== 'function' || shouldDisableRemove) {\n return;\n }\n\n setTags((prevState) => prevState.filter((entry) => entry.id !== id));\n\n if (typeof onRemove === 'function') {\n onRemove(id);\n }\n },\n [onRemove, setTags, shouldDisableRemove],\n );\n\n const handleClose = useCallback(() => {\n setShouldShowBody(false);\n }, []);\n\n const handleOpen = useCallback(() => {\n setShouldShowBody(true);\n }, []);\n\n const handleClear = useCallback(() => {\n if (typeof setTags !== 'function' || shouldDisableRemove) {\n return;\n }\n\n tagInputRef.current?.resetValue();\n\n setTags([]);\n }, [setTags, shouldDisableRemove]);\n\n const handleDropdownOutsideClick = useCallback(() => {\n tagInputRef.current?.blur();\n\n return isFocused && isTouch;\n }, [isFocused, isTouch]);\n\n const handleAdd = useCallback(\n (id: string) => {\n if (typeof setTags !== 'function') {\n return;\n }\n\n const selectedEntry = Object.values(data ?? {})\n .flat()\n .map(({ entries }) => entries)\n .flat()\n .find(\n (entry) =>\n (typeof entry.id === 'string' ? entry.id : entry.id.toString()) === id,\n );\n\n if (!selectedEntry) {\n return;\n }\n\n const { name, firstName, lastName } = selectedEntry as PersonEntry & SiteEntry;\n\n const tag: Tag = {\n id,\n text: name ?? `${(firstName as string) ?? ''} ${(lastName as string) ?? ''}`,\n };\n\n setTags((prevState) => {\n if (prevState.some((t) => t.id === id) || prevState.length >= maxEntries) {\n return prevState;\n }\n\n tagInputRef.current?.resetValue();\n\n if (typeof onAdd === 'function') {\n onAdd(selectedEntry);\n }\n\n if (shouldHideResultsOnAdd) {\n setShouldShowBody(false);\n }\n\n return [...prevState, tag];\n });\n },\n [data, maxEntries, onAdd, setTags, shouldHideResultsOnAdd],\n );\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (typeof updateSearch === 'function') {\n updateSearch(event.target.value);\n }\n },\n [updateSearch],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n clear: () => handleClear(),\n }),\n [handleClear],\n );\n\n useEffect(() => {\n if (shouldShowBody) {\n if (typeof onDropdownShow === 'function') {\n onDropdownShow();\n }\n } else if (typeof onDropdownHide === 'function') {\n onDropdownHide();\n }\n }, [onDropdownHide, onDropdownShow, shouldShowBody]);\n\n const showBody = useMemo(() => {\n const extraMobileCheck = isTouch ? isFocused : true;\n\n const check = shouldShowBody && extraMobileCheck;\n\n if (relationMode === RelationMode.SITE) {\n return check;\n }\n\n if (\n filterTypes?.length === 1 &&\n (filterTypes.includes(PersonFinderFilterTypes.SITE) ||\n (filterTypes.includes(PersonFinderFilterTypes.PERSON) &&\n friendsPriority !== Priority.HIGH))\n ) {\n return check && !!search && search?.length > 2;\n }\n\n return check;\n }, [\n filterTypes,\n friendsPriority,\n isFocused,\n isTouch,\n search,\n shouldShowBody,\n relationMode,\n ]);\n\n const content = useMemo(() => {\n const body = (\n <PersonFinderBody\n filterTypes={filterTypes}\n onAdd={handleAdd}\n onRemove={handleRemove}\n ref={contentRef}\n shouldRenderInline={shouldRenderInline}\n />\n );\n\n if (shouldRenderInline) {\n return body;\n }\n\n if (boxRef.current) {\n return (\n <DropdownBodyWrapper\n anchorElement={boxRef.current}\n container={container}\n direction={dropdownDirection}\n onClose={handleClose}\n onOutsideClick={handleDropdownOutsideClick}\n shouldShowDropdown={showBody}\n >\n {body}\n </DropdownBodyWrapper>\n );\n }\n\n return null;\n }, [\n container,\n dropdownDirection,\n filterTypes,\n handleAdd,\n handleClose,\n handleDropdownOutsideClick,\n handleRemove,\n shouldRenderInline,\n showBody,\n ]);\n\n return (\n <StyledPersonFinder ref={boxRef} onFocus={handleOpen} key={keyRef.current}>\n <TagInput\n leftElement={leftElement}\n onBlur={handleTagInputBlur}\n onChange={handleChange}\n onFocus={handleTagInputFocus}\n onRemove={handleRemove}\n placeholder={placeholder}\n ref={tagInputRef}\n shouldAllowMultiple={shouldAllowMultiple}\n shouldPreventEnter\n tags={tags}\n />\n {content}\n </StyledPersonFinder>\n );\n },\n);\n\nPersonFinderWrapper.displayName = 'PersonFinderWrapper';\n\nexport default PersonFinderWrapper;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"PersonFinderWrapper.js","names":["_core","require","_chaynsApi","_react","_interopRequireWildcard","_uuid","_personFinder","_PersonFinderWrapper","_PersonFinderBody","_interopRequireDefault","_PersonFinderProvider","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","PersonFinderWrapper","forwardRef","container","dropdownDirection","filterTypes","friendsPriority","leftElement","leftElementProp","maxEntries","Infinity","onAdd","onDropdownHide","onDropdownShow","shouldDisableRemove","onRemove","placeholder","shouldAllowMultiple","shouldHideResultsOnAdd","shouldRenderInline","relationMode","ref","data","updateSearch","setTags","tags","search","usePersonFinder","isFocused","setIsFocused","useState","shouldShowBody","setShouldShowBody","boxRef","useRef","contentRef","keyRef","uuidV4","tagInputRef","hasFocusRef","isTouch","useDevice","createElement","StyledPersonFinderLeftElement","Icon","icons","handleTagInputBlur","useCallback","current","handleTagInputFocus","handleRemove","id","prevState","filter","entry","handleClose","handleOpen","handleClear","_tagInputRef$current","resetValue","handleDropdownOutsideClick","_tagInputRef$current2","blur","handleAdd","selectedEntry","values","flat","map","entries","find","toString","name","firstName","lastName","tag","text","_tagInputRef$current3","some","length","handleChange","event","target","value","useImperativeHandle","clear","useEffect","showBody","useMemo","check","RelationMode","SITE","includes","PersonFinderFilterTypes","PERSON","Priority","HIGH","content","body","DropdownBodyWrapper","anchorElement","direction","onClose","onOutsideClick","shouldShowDropdown","StyledPersonFinder","onFocus","key","TagInput","onBlur","onChange","shouldPreventEnter","displayName","_default","exports"],"sources":["../../../../../src/components/person-finder/person-finder-wrapper/PersonFinderWrapper.tsx"],"sourcesContent":["import {\n DropdownBodyWrapper,\n DropdownDirection,\n Icon,\n type Tag,\n TagInput,\n type TagInputRef,\n} from '@chayns-components/core';\nimport { useDevice } from 'chayns-api';\nimport React, {\n type ChangeEvent,\n forwardRef,\n type ReactElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { v4 as uuidV4 } from 'uuid';\nimport {\n PersonEntry,\n PersonFinderEntry,\n PersonFinderFilterTypes,\n Priority,\n RelationMode,\n SiteEntry,\n} from '../../../types/personFinder';\nimport { StyledPersonFinder, StyledPersonFinderLeftElement } from './PersonFinderWrapper.styles';\nimport PersonFinderBody from './person-finder-body/PersonFinderBody';\nimport { usePersonFinder } from '../../PersonFinderProvider';\n\nexport type PersonFinderRef = {\n clear: () => void;\n};\n\nexport type PersonFinderWrapperProps = {\n /**\n * The element where the content of the `PersonFinder` should be rendered via React Portal.\n */\n container?: Element;\n /**\n * The direction in which the dropdown should be displayed. By default, it is displayed below the input.\n */\n dropdownDirection?: DropdownDirection;\n /**\n * The filter options of the component.\n */\n filterTypes?: PersonFinderFilterTypes[];\n /**\n * Determines the priority level for displaying friends in search results.\n */\n friendsPriority?: Priority;\n /**\n * An element that should be displayed on the left side of the input.\n */\n leftElement?: ReactElement;\n /**\n * The maximum number of entries that can be selected.\n */\n maxEntries?: number;\n /**\n * Function to be executed if a person or site is added.\n */\n onAdd?: (entry: PersonFinderEntry) => void;\n /**\n * Function to be executed if the dropdown is hidden.\n */\n onDropdownHide?: () => void;\n /**\n * Function to be executed if the dropdown is shown.\n */\n onDropdownShow?: () => void;\n /**\n * Function to be executed if a person or site is removed.\n */\n onRemove?: (id: PersonFinderEntry['id']) => void;\n /**\n * The placeholder that should be displayed.\n */\n placeholder?: string;\n /**\n * Whether multiple persons and sites should be selected.\n */\n shouldAllowMultiple?: boolean;\n /**\n * Whether the dropdown should be hidden after adding an entry. By default, it is not hidden.\n */\n shouldHideResultsOnAdd?: boolean;\n /**\n * Whether the `PersonFinder` should be rendered inline without a dropdown.\n * @description\n * If set to `true`, the `PersonFinder` will display the results below the input field, without\n * using a dropdown. This is useful for scenarios where the `PersonFinder` is part of a larger\n * form and should always be visible.\n * @default false\n * @example\n * <PersonFinder shouldRenderInline />\n * @optional\n */\n shouldRenderInline?: boolean;\n /**\n * Whether the remove action should be disabled.\n */\n shouldDisableRemove?: boolean;\n /**\n * Determines whether persons are searched and sorted from the user's perspective or from a site's perspective.\n */\n relationMode?: RelationMode;\n};\n\nconst PersonFinderWrapper = forwardRef<PersonFinderRef, PersonFinderWrapperProps>(\n (\n {\n container,\n dropdownDirection,\n filterTypes,\n friendsPriority,\n leftElement: leftElementProp,\n maxEntries = Infinity,\n onAdd,\n onDropdownHide,\n onDropdownShow,\n shouldDisableRemove,\n onRemove,\n placeholder,\n shouldAllowMultiple,\n shouldHideResultsOnAdd,\n shouldRenderInline,\n relationMode,\n },\n ref,\n ) => {\n const { data, updateSearch, setTags, tags, search } = usePersonFinder();\n\n const [isFocused, setIsFocused] = useState(false);\n const [shouldShowBody, setShouldShowBody] = useState(false);\n\n const boxRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const keyRef = useRef(`person-finder-${uuidV4()}`);\n const tagInputRef = useRef<TagInputRef>(null);\n const hasFocusRef = useRef<boolean>(false);\n\n const { isTouch } = useDevice();\n\n const leftElement = leftElementProp ?? (\n <StyledPersonFinderLeftElement>\n <Icon icons={['fa fa-search']} />\n </StyledPersonFinderLeftElement>\n );\n\n const handleTagInputBlur = useCallback(() => {\n hasFocusRef.current = false;\n\n setIsFocused(false);\n }, []);\n\n const handleTagInputFocus = useCallback(() => {\n hasFocusRef.current = true;\n\n setIsFocused(true);\n }, []);\n\n const handleRemove = useCallback(\n (id: string) => {\n if (typeof setTags !== 'function' || shouldDisableRemove) {\n return;\n }\n\n setTags((prevState) => prevState.filter((entry) => entry.id !== id));\n\n if (typeof onRemove === 'function') {\n onRemove(id);\n }\n },\n [onRemove, setTags, shouldDisableRemove],\n );\n\n const handleClose = useCallback(() => {\n setShouldShowBody(false);\n }, []);\n\n const handleOpen = useCallback(() => {\n setShouldShowBody(true);\n }, []);\n\n const handleClear = useCallback(() => {\n if (typeof setTags !== 'function' || shouldDisableRemove) {\n return;\n }\n\n tagInputRef.current?.resetValue();\n\n setTags([]);\n }, [setTags, shouldDisableRemove]);\n\n const handleDropdownOutsideClick = useCallback(() => {\n tagInputRef.current?.blur();\n\n return hasFocusRef.current && isTouch;\n }, [isTouch]);\n\n const handleAdd = useCallback(\n (id: string) => {\n if (typeof setTags !== 'function') {\n return;\n }\n\n const selectedEntry = Object.values(data ?? {})\n .flat()\n .map(({ entries }) => entries)\n .flat()\n .find(\n (entry) =>\n (typeof entry.id === 'string' ? entry.id : entry.id.toString()) === id,\n );\n\n if (!selectedEntry) {\n return;\n }\n\n const { name, firstName, lastName } = selectedEntry as PersonEntry & SiteEntry;\n\n const tag: Tag = {\n id,\n text: name ?? `${(firstName as string) ?? ''} ${(lastName as string) ?? ''}`,\n };\n\n setTags((prevState) => {\n if (prevState.some((t) => t.id === id) || prevState.length >= maxEntries) {\n return prevState;\n }\n\n tagInputRef.current?.resetValue();\n\n if (typeof onAdd === 'function') {\n onAdd(selectedEntry);\n }\n\n if (shouldHideResultsOnAdd) {\n setShouldShowBody(false);\n }\n\n return [...prevState, tag];\n });\n },\n [data, maxEntries, onAdd, setTags, shouldHideResultsOnAdd],\n );\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (typeof updateSearch === 'function') {\n updateSearch(event.target.value);\n }\n },\n [updateSearch],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n clear: () => handleClear(),\n }),\n [handleClear],\n );\n\n useEffect(() => {\n if (shouldShowBody) {\n if (typeof onDropdownShow === 'function') {\n onDropdownShow();\n }\n } else if (typeof onDropdownHide === 'function') {\n onDropdownHide();\n }\n }, [onDropdownHide, onDropdownShow, shouldShowBody]);\n\n const showBody = useMemo(() => {\n const check = shouldShowBody;\n\n if (relationMode === RelationMode.SITE) {\n return check;\n }\n\n if (\n filterTypes?.length === 1 &&\n (filterTypes.includes(PersonFinderFilterTypes.SITE) ||\n (filterTypes.includes(PersonFinderFilterTypes.PERSON) &&\n friendsPriority !== Priority.HIGH))\n ) {\n return check && !!search && search?.length > 2;\n }\n\n return check;\n }, [filterTypes, friendsPriority, search, shouldShowBody, relationMode]);\n\n const content = useMemo(() => {\n const body = (\n <PersonFinderBody\n filterTypes={filterTypes}\n onAdd={handleAdd}\n onRemove={handleRemove}\n ref={contentRef}\n shouldRenderInline={shouldRenderInline}\n />\n );\n\n if (shouldRenderInline) {\n return body;\n }\n\n if (boxRef.current) {\n return (\n <DropdownBodyWrapper\n anchorElement={boxRef.current}\n container={container}\n direction={dropdownDirection}\n onClose={handleClose}\n onOutsideClick={handleDropdownOutsideClick}\n shouldShowDropdown={showBody}\n >\n {body}\n </DropdownBodyWrapper>\n );\n }\n\n return null;\n }, [\n container,\n dropdownDirection,\n filterTypes,\n handleAdd,\n handleClose,\n handleDropdownOutsideClick,\n handleRemove,\n shouldRenderInline,\n showBody,\n ]);\n\n return (\n <StyledPersonFinder ref={boxRef} onFocus={handleOpen} key={keyRef.current}>\n <TagInput\n leftElement={leftElement}\n onBlur={handleTagInputBlur}\n onChange={handleChange}\n onFocus={handleTagInputFocus}\n onRemove={handleRemove}\n placeholder={placeholder}\n ref={tagInputRef}\n shouldAllowMultiple={shouldAllowMultiple}\n shouldPreventEnter\n tags={tags}\n />\n {content}\n </StyledPersonFinder>\n );\n },\n);\n\nPersonFinderWrapper.displayName = 'PersonFinderWrapper';\n\nexport default PersonFinderWrapper;\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAQA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAC,uBAAA,CAAAH,OAAA;AAWA,IAAAI,KAAA,GAAAJ,OAAA;AACA,IAAAK,aAAA,GAAAL,OAAA;AAQA,IAAAM,oBAAA,GAAAN,OAAA;AACA,IAAAO,iBAAA,GAAAC,sBAAA,CAAAR,OAAA;AACA,IAAAS,qBAAA,GAAAT,OAAA;AAA6D,SAAAQ,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAP,wBAAAO,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAX,uBAAA,YAAAA,CAAAO,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AAiF7D,MAAMgB,mBAAmB,gBAAG,IAAAC,iBAAU,EAClC,CACI;EACIC,SAAS;EACTC,iBAAiB;EACjBC,WAAW;EACXC,eAAe;EACfC,WAAW,EAAEC,eAAe;EAC5BC,UAAU,GAAGC,QAAQ;EACrBC,KAAK;EACLC,cAAc;EACdC,cAAc;EACdC,mBAAmB;EACnBC,QAAQ;EACRC,WAAW;EACXC,mBAAmB;EACnBC,sBAAsB;EACtBC,kBAAkB;EAClBC;AACJ,CAAC,EACDC,GAAG,KACF;EACD,MAAM;IAAEC,IAAI;IAAEC,YAAY;IAAEC,OAAO;IAAEC,IAAI;IAAEC;EAAO,CAAC,GAAG,IAAAC,qCAAe,EAAC,CAAC;EAEvE,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAG,IAAAC,eAAQ,EAAC,KAAK,CAAC;EACjD,MAAM,CAACC,cAAc,EAAEC,iBAAiB,CAAC,GAAG,IAAAF,eAAQ,EAAC,KAAK,CAAC;EAE3D,MAAMG,MAAM,GAAG,IAAAC,aAAM,EAAiB,IAAI,CAAC;EAC3C,MAAMC,UAAU,GAAG,IAAAD,aAAM,EAAiB,IAAI,CAAC;EAC/C,MAAME,MAAM,GAAG,IAAAF,aAAM,EAAC,iBAAiB,IAAAG,QAAM,EAAC,CAAC,EAAE,CAAC;EAClD,MAAMC,WAAW,GAAG,IAAAJ,aAAM,EAAc,IAAI,CAAC;EAC7C,MAAMK,WAAW,GAAG,IAAAL,aAAM,EAAU,KAAK,CAAC;EAE1C,MAAM;IAAEM;EAAQ,CAAC,GAAG,IAAAC,oBAAS,EAAC,CAAC;EAE/B,MAAMlC,WAAW,GAAGC,eAAe,iBAC/BlC,MAAA,CAAAU,OAAA,CAAA0D,aAAA,CAAChE,oBAAA,CAAAiE,6BAA6B,qBAC1BrE,MAAA,CAAAU,OAAA,CAAA0D,aAAA,CAACvE,KAAA,CAAAyE,IAAI;IAACC,KAAK,EAAE,CAAC,cAAc;EAAE,CAAE,CACL,CAClC;EAED,MAAMC,kBAAkB,GAAG,IAAAC,kBAAW,EAAC,MAAM;IACzCR,WAAW,CAACS,OAAO,GAAG,KAAK;IAE3BnB,YAAY,CAAC,KAAK,CAAC;EACvB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMoB,mBAAmB,GAAG,IAAAF,kBAAW,EAAC,MAAM;IAC1CR,WAAW,CAACS,OAAO,GAAG,IAAI;IAE1BnB,YAAY,CAAC,IAAI,CAAC;EACtB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMqB,YAAY,GAAG,IAAAH,kBAAW,EAC3BI,EAAU,IAAK;IACZ,IAAI,OAAO3B,OAAO,KAAK,UAAU,IAAIV,mBAAmB,EAAE;MACtD;IACJ;IAEAU,OAAO,CAAE4B,SAAS,IAAKA,SAAS,CAACC,MAAM,CAAEC,KAAK,IAAKA,KAAK,CAACH,EAAE,KAAKA,EAAE,CAAC,CAAC;IAEpE,IAAI,OAAOpC,QAAQ,KAAK,UAAU,EAAE;MAChCA,QAAQ,CAACoC,EAAE,CAAC;IAChB;EACJ,CAAC,EACD,CAACpC,QAAQ,EAAES,OAAO,EAAEV,mBAAmB,CAC3C,CAAC;EAED,MAAMyC,WAAW,GAAG,IAAAR,kBAAW,EAAC,MAAM;IAClCf,iBAAiB,CAAC,KAAK,CAAC;EAC5B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMwB,UAAU,GAAG,IAAAT,kBAAW,EAAC,MAAM;IACjCf,iBAAiB,CAAC,IAAI,CAAC;EAC3B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMyB,WAAW,GAAG,IAAAV,kBAAW,EAAC,MAAM;IAAA,IAAAW,oBAAA;IAClC,IAAI,OAAOlC,OAAO,KAAK,UAAU,IAAIV,mBAAmB,EAAE;MACtD;IACJ;IAEA,CAAA4C,oBAAA,GAAApB,WAAW,CAACU,OAAO,cAAAU,oBAAA,eAAnBA,oBAAA,CAAqBC,UAAU,CAAC,CAAC;IAEjCnC,OAAO,CAAC,EAAE,CAAC;EACf,CAAC,EAAE,CAACA,OAAO,EAAEV,mBAAmB,CAAC,CAAC;EAElC,MAAM8C,0BAA0B,GAAG,IAAAb,kBAAW,EAAC,MAAM;IAAA,IAAAc,qBAAA;IACjD,CAAAA,qBAAA,GAAAvB,WAAW,CAACU,OAAO,cAAAa,qBAAA,eAAnBA,qBAAA,CAAqBC,IAAI,CAAC,CAAC;IAE3B,OAAOvB,WAAW,CAACS,OAAO,IAAIR,OAAO;EACzC,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EAEb,MAAMuB,SAAS,GAAG,IAAAhB,kBAAW,EACxBI,EAAU,IAAK;IACZ,IAAI,OAAO3B,OAAO,KAAK,UAAU,EAAE;MAC/B;IACJ;IAEA,MAAMwC,aAAa,GAAGlE,MAAM,CAACmE,MAAM,CAAC3C,IAAI,IAAI,CAAC,CAAC,CAAC,CAC1C4C,IAAI,CAAC,CAAC,CACNC,GAAG,CAAC,CAAC;MAAEC;IAAQ,CAAC,KAAKA,OAAO,CAAC,CAC7BF,IAAI,CAAC,CAAC,CACNG,IAAI,CACAf,KAAK,IACF,CAAC,OAAOA,KAAK,CAACH,EAAE,KAAK,QAAQ,GAAGG,KAAK,CAACH,EAAE,GAAGG,KAAK,CAACH,EAAE,CAACmB,QAAQ,CAAC,CAAC,MAAMnB,EAC5E,CAAC;IAEL,IAAI,CAACa,aAAa,EAAE;MAChB;IACJ;IAEA,MAAM;MAAEO,IAAI;MAAEC,SAAS;MAAEC;IAAS,CAAC,GAAGT,aAAwC;IAE9E,MAAMU,GAAQ,GAAG;MACbvB,EAAE;MACFwB,IAAI,EAAEJ,IAAI,IAAI,GAAIC,SAAS,IAAe,EAAE,IAAKC,QAAQ,IAAe,EAAE;IAC9E,CAAC;IAEDjD,OAAO,CAAE4B,SAAS,IAAK;MAAA,IAAAwB,qBAAA;MACnB,IAAIxB,SAAS,CAACyB,IAAI,CAAE5F,CAAC,IAAKA,CAAC,CAACkE,EAAE,KAAKA,EAAE,CAAC,IAAIC,SAAS,CAAC0B,MAAM,IAAIrE,UAAU,EAAE;QACtE,OAAO2C,SAAS;MACpB;MAEA,CAAAwB,qBAAA,GAAAtC,WAAW,CAACU,OAAO,cAAA4B,qBAAA,eAAnBA,qBAAA,CAAqBjB,UAAU,CAAC,CAAC;MAEjC,IAAI,OAAOhD,KAAK,KAAK,UAAU,EAAE;QAC7BA,KAAK,CAACqD,aAAa,CAAC;MACxB;MAEA,IAAI9C,sBAAsB,EAAE;QACxBc,iBAAiB,CAAC,KAAK,CAAC;MAC5B;MAEA,OAAO,CAAC,GAAGoB,SAAS,EAAEsB,GAAG,CAAC;IAC9B,CAAC,CAAC;EACN,CAAC,EACD,CAACpD,IAAI,EAAEb,UAAU,EAAEE,KAAK,EAAEa,OAAO,EAAEN,sBAAsB,CAC7D,CAAC;EAED,MAAM6D,YAAY,GAAG,IAAAhC,kBAAW,EAC3BiC,KAAoC,IAAK;IACtC,IAAI,OAAOzD,YAAY,KAAK,UAAU,EAAE;MACpCA,YAAY,CAACyD,KAAK,CAACC,MAAM,CAACC,KAAK,CAAC;IACpC;EACJ,CAAC,EACD,CAAC3D,YAAY,CACjB,CAAC;EAED,IAAA4D,0BAAmB,EACf9D,GAAG,EACH,OAAO;IACH+D,KAAK,EAAEA,CAAA,KAAM3B,WAAW,CAAC;EAC7B,CAAC,CAAC,EACF,CAACA,WAAW,CAChB,CAAC;EAED,IAAA4B,gBAAS,EAAC,MAAM;IACZ,IAAItD,cAAc,EAAE;MAChB,IAAI,OAAOlB,cAAc,KAAK,UAAU,EAAE;QACtCA,cAAc,CAAC,CAAC;MACpB;IACJ,CAAC,MAAM,IAAI,OAAOD,cAAc,KAAK,UAAU,EAAE;MAC7CA,cAAc,CAAC,CAAC;IACpB;EACJ,CAAC,EAAE,CAACA,cAAc,EAAEC,cAAc,EAAEkB,cAAc,CAAC,CAAC;EAEpD,MAAMuD,QAAQ,GAAG,IAAAC,cAAO,EAAC,MAAM;IAC3B,MAAMC,KAAK,GAAGzD,cAAc;IAE5B,IAAIX,YAAY,KAAKqE,0BAAY,CAACC,IAAI,EAAE;MACpC,OAAOF,KAAK;IAChB;IAEA,IACI,CAAAnF,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEyE,MAAM,MAAK,CAAC,KACxBzE,WAAW,CAACsF,QAAQ,CAACC,qCAAuB,CAACF,IAAI,CAAC,IAC9CrF,WAAW,CAACsF,QAAQ,CAACC,qCAAuB,CAACC,MAAM,CAAC,IACjDvF,eAAe,KAAKwF,sBAAQ,CAACC,IAAK,CAAC,EAC7C;MACE,OAAOP,KAAK,IAAI,CAAC,CAAC9D,MAAM,IAAI,CAAAA,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEoD,MAAM,IAAG,CAAC;IAClD;IAEA,OAAOU,KAAK;EAChB,CAAC,EAAE,CAACnF,WAAW,EAAEC,eAAe,EAAEoB,MAAM,EAAEK,cAAc,EAAEX,YAAY,CAAC,CAAC;EAExE,MAAM4E,OAAO,GAAG,IAAAT,cAAO,EAAC,MAAM;IAC1B,MAAMU,IAAI,gBACN3H,MAAA,CAAAU,OAAA,CAAA0D,aAAA,CAAC/D,iBAAA,CAAAK,OAAgB;MACbqB,WAAW,EAAEA,WAAY;MACzBM,KAAK,EAAEoD,SAAU;MACjBhD,QAAQ,EAAEmC,YAAa;MACvB7B,GAAG,EAAEc,UAAW;MAChBhB,kBAAkB,EAAEA;IAAmB,CAC1C,CACJ;IAED,IAAIA,kBAAkB,EAAE;MACpB,OAAO8E,IAAI;IACf;IAEA,IAAIhE,MAAM,CAACe,OAAO,EAAE;MAChB,oBACI1E,MAAA,CAAAU,OAAA,CAAA0D,aAAA,CAACvE,KAAA,CAAA+H,mBAAmB;QAChBC,aAAa,EAAElE,MAAM,CAACe,OAAQ;QAC9B7C,SAAS,EAAEA,SAAU;QACrBiG,SAAS,EAAEhG,iBAAkB;QAC7BiG,OAAO,EAAE9C,WAAY;QACrB+C,cAAc,EAAE1C,0BAA2B;QAC3C2C,kBAAkB,EAAEjB;MAAS,GAE5BW,IACgB,CAAC;IAE9B;IAEA,OAAO,IAAI;EACf,CAAC,EAAE,CACC9F,SAAS,EACTC,iBAAiB,EACjBC,WAAW,EACX0D,SAAS,EACTR,WAAW,EACXK,0BAA0B,EAC1BV,YAAY,EACZ/B,kBAAkB,EAClBmE,QAAQ,CACX,CAAC;EAEF,oBACIhH,MAAA,CAAAU,OAAA,CAAA0D,aAAA,CAAChE,oBAAA,CAAA8H,kBAAkB;IAACnF,GAAG,EAAEY,MAAO;IAACwE,OAAO,EAAEjD,UAAW;IAACkD,GAAG,EAAEtE,MAAM,CAACY;EAAQ,gBACtE1E,MAAA,CAAAU,OAAA,CAAA0D,aAAA,CAACvE,KAAA,CAAAwI,QAAQ;IACLpG,WAAW,EAAEA,WAAY;IACzBqG,MAAM,EAAE9D,kBAAmB;IAC3B+D,QAAQ,EAAE9B,YAAa;IACvB0B,OAAO,EAAExD,mBAAoB;IAC7BlC,QAAQ,EAAEmC,YAAa;IACvBlC,WAAW,EAAEA,WAAY;IACzBK,GAAG,EAAEiB,WAAY;IACjBrB,mBAAmB,EAAEA,mBAAoB;IACzC6F,kBAAkB;IAClBrF,IAAI,EAAEA;EAAK,CACd,CAAC,EACDuE,OACe,CAAC;AAE7B,CACJ,CAAC;AAED/F,mBAAmB,CAAC8G,WAAW,GAAG,qBAAqB;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAjI,OAAA,GAEzCiB,mBAAmB","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RELATIONS_BASE_URL = exports.QA_RELATIONS_BASE_URL = void 0;
7
+ const QA_RELATIONS_BASE_URL = exports.QA_RELATIONS_BASE_URL = 'https://cube-dev.tobit.com/relations-gateway/relations/';
8
+ const RELATIONS_BASE_URL = exports.RELATIONS_BASE_URL = 'https://relations.chayns.net/relations/';
9
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","names":["QA_RELATIONS_BASE_URL","exports","RELATIONS_BASE_URL"],"sources":["../../../src/constants/url.ts"],"sourcesContent":["export const QA_RELATIONS_BASE_URL = 'https://cube-dev.tobit.com/relations-gateway/relations/';\nexport const RELATIONS_BASE_URL = 'https://relations.chayns.net/relations/';\n"],"mappings":";;;;;;AAAO,MAAMA,qBAAqB,GAAAC,OAAA,CAAAD,qBAAA,GAAG,yDAAyD;AACvF,MAAME,kBAAkB,GAAAD,OAAA,CAAAC,kBAAA,GAAG,yCAAyC","ignoreList":[]}
@@ -114,7 +114,8 @@ const loadData = async ({
114
114
  skipMap,
115
115
  searchString,
116
116
  filter,
117
- relationMode
117
+ relationMode,
118
+ shouldUseQa
118
119
  }) => {
119
120
  const promises = filter.map(async filterType => {
120
121
  const skip = skipMap[filterType] ?? 0;
@@ -134,7 +135,8 @@ const loadData = async ({
134
135
  const data = await (0, _get.getPersons)({
135
136
  search: searchString,
136
137
  skip,
137
- relationMode
138
+ relationMode,
139
+ shouldUseQa
138
140
  });
139
141
  return {
140
142
  key: _personFinder.PersonFinderFilterTypes.PERSON,
@@ -162,7 +164,8 @@ const loadData = async ({
162
164
  }
163
165
  const data = await (0, _get2.getSites)({
164
166
  search: searchString,
165
- skip
167
+ skip,
168
+ shouldUseQa
166
169
  });
167
170
  const filteredList = data === null || data === void 0 ? void 0 : data.list.filter(({
168
171
  siteId
@@ -1 +1 @@
1
- {"version":3,"file":"personFinder.js","names":["_personFinder","require","_textstring","_get","_get2","_convert","_chaynsApi","_textStrings","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","normalizeTextstringReplacements","replacements","undefined","entries","reduce","acc","key","value","toString","getPersonFinderTextstringValue","textstring","getTextstringValue","libraryName","PERSON_FINDER_TEXTSTRING_LIBRARY_NAME","ttsToITextString","exports","getGroupName","groupNames","PersonFinderFilterTypes","PERSON","textStrings","components","personFinder","groupName","person","SITE","site","UAC","uac","isSiteEntry","entry","filterDataByKeys","data","keys","options","filterSingle","filteredEntries","excludedEntryIds","Array","isArray","length","filter","includes","id","excludedCount","count","Math","max","relevantKeys","original","searchString","skip","filteredEntry","shouldShowOwnUser","user","getUser","personId","ownUserEntry","commonSites","firstName","isVerified","lastName","type","fullName","Boolean","join","trim","toLowerCase","capitalizeFirstLetter","str","charAt","toUpperCase","slice","destructureData","filterType","_data$filterType","_data$filterType2","_data$filterType3","_data$filterType4","loadData","skipMap","relationMode","promises","map","_data$list","getPersons","search","list","convertPersonEntry","shouldShowLastOnlineTime","RelationMode","getSites","filteredList","siteId","convertSiteEntry","results","Promise","all","item","formatLastOnline","date","ts","lastOnline","now","Date","diffMs","getTime","minutes","floor","hours","days","months","years","isSameDay","getDate","getMonth","getFullYear","yesterday","setDate","isYesterday","time","toLocaleTimeString","hour","minute","fewMinutes","today"],"sources":["../../../src/utils/personFinder.ts"],"sourcesContent":["import {\n PersonEntry,\n PersonFinderData,\n PersonFinderDataMap,\n PersonFinderEntry,\n PersonFinderFilterTypes,\n RelationMode,\n SiteEntry,\n} from '../types/personFinder';\nimport { getTextstringValue, ttsToITextString } from '@chayns-components/textstring';\nimport { getPersons } from '../api/person/get';\nimport { getSites } from '../api/site/get';\nimport { convertPersonEntry, convertSiteEntry } from './convert';\nimport { getUser } from 'chayns-api';\nimport textStrings, { PERSON_FINDER_TEXTSTRING_LIBRARY_NAME } from '../constants/textStrings';\n\ninterface GetPersonFinderTextstringValueOptions {\n textstring: {\n stringName: string;\n fallback: string;\n };\n replacements?: Record<string, number | string | undefined>;\n}\n\nconst normalizeTextstringReplacements = (\n replacements?: GetPersonFinderTextstringValueOptions['replacements'],\n) => {\n if (!replacements) {\n return undefined;\n }\n\n return Object.entries(replacements).reduce<Record<string, string>>((acc, [key, value]) => {\n acc[`##${key}##`] = value?.toString() ?? '';\n\n return acc;\n }, {});\n};\n\nexport const getPersonFinderTextstringValue = ({\n textstring,\n replacements,\n}: GetPersonFinderTextstringValueOptions) =>\n getTextstringValue({\n libraryName: PERSON_FINDER_TEXTSTRING_LIBRARY_NAME,\n textstring: ttsToITextString(textstring),\n replacements: normalizeTextstringReplacements(replacements),\n });\n\nexport const getGroupName = (key: string) => {\n const groupNames: Partial<\n Record<PersonFinderFilterTypes, { stringName: string; fallback: string }>\n > = {\n [PersonFinderFilterTypes.PERSON]: textStrings.components.personFinder.groupName.person,\n [PersonFinderFilterTypes.SITE]: textStrings.components.personFinder.groupName.site,\n [PersonFinderFilterTypes.UAC]: textStrings.components.personFinder.groupName.uac,\n };\n\n const textstring = groupNames[key as PersonFinderFilterTypes];\n\n if (!textstring) {\n return key;\n }\n\n return getPersonFinderTextstringValue({ textstring });\n};\n\nexport const isSiteEntry = (entry: PersonEntry | SiteEntry): entry is SiteEntry =>\n 'name' in entry && !('firstName' in entry);\n\ninterface FilterDataByKeysOptions {\n excludedEntryIds?: PersonFinderEntry['id'][];\n shouldShowOwnUser?: boolean;\n}\n\nexport const filterDataByKeys = (\n data: { [key: string]: PersonFinderData } = {},\n keys: PersonFinderFilterTypes[] = [],\n options: FilterDataByKeysOptions = {},\n): { [key: string]: PersonFinderData } => {\n const filterSingle = (entry: PersonFinderData): PersonFinderData => {\n let filteredEntries = entry.entries;\n\n const { excludedEntryIds } = options;\n\n if (Array.isArray(excludedEntryIds) && excludedEntryIds.length > 0) {\n filteredEntries = filteredEntries.filter((e) => !excludedEntryIds.includes(e.id));\n }\n\n const excludedCount = entry.entries.length - filteredEntries.length;\n\n return {\n ...entry,\n entries: filteredEntries,\n count: Math.max(0, entry.count - excludedCount),\n };\n };\n\n const relevantKeys = keys.length > 0 ? keys : Object.keys(data);\n\n return relevantKeys.reduce((acc, key) => {\n const original = data[key] ?? { searchString: '', count: 0, skip: 0, entries: [] };\n\n const filteredEntry = filterSingle(original);\n\n if (options.shouldShowOwnUser && key === PersonFinderFilterTypes.PERSON) {\n const user = getUser();\n\n if (typeof user?.personId === 'string') {\n // Ensure that the own user is always included in the person filter\n const ownUserEntry: PersonEntry = {\n commonSites: 0,\n firstName: user.firstName ?? '',\n id: user.personId,\n isVerified: false,\n lastName: user.lastName ?? '',\n type: PersonFinderFilterTypes.PERSON,\n };\n\n const fullName = [ownUserEntry.firstName, ownUserEntry.lastName]\n .filter(Boolean)\n .join(' ')\n .trim();\n\n if (\n original.searchString.length < 3 ||\n fullName.toLowerCase().includes(original.searchString.toLowerCase())\n ) {\n filteredEntry.entries = [ownUserEntry, ...filteredEntry.entries];\n filteredEntry.count += 1; // Increment count to account for the own user\n }\n }\n }\n\n return { ...acc, [key]: filteredEntry };\n }, {});\n};\n\nexport const capitalizeFirstLetter = (str: string) => str.charAt(0).toUpperCase() + str.slice(1);\n\nexport const destructureData = (\n data: Record<string, PersonFinderData> | undefined,\n filterType: string,\n) => ({\n count: data?.[filterType]?.count ?? 0,\n skip: data?.[filterType]?.skip ?? 0,\n searchString: data?.[filterType]?.searchString ?? '',\n entries: data?.[filterType]?.entries ?? [],\n});\n\ninterface LoadDataOptions {\n searchString: string;\n filter: PersonFinderFilterTypes[];\n skipMap: Partial<Record<PersonFinderFilterTypes, number>>;\n relationMode?: RelationMode;\n}\n\nexport const loadData = async ({\n skipMap,\n searchString,\n filter,\n relationMode,\n}: LoadDataOptions): Promise<PersonFinderDataMap> => {\n const promises = filter.map(async (filterType) => {\n const skip = skipMap[filterType] ?? 0;\n\n if (filterType === PersonFinderFilterTypes.PERSON) {\n if (searchString.length <= 2) {\n return {\n key: PersonFinderFilterTypes.PERSON,\n value: {\n searchString,\n count: 0,\n skip: 0,\n entries: [],\n },\n };\n }\n\n const data = await getPersons({ search: searchString, skip, relationMode });\n\n return {\n key: PersonFinderFilterTypes.PERSON,\n value: {\n searchString,\n count: data?.count ?? 0,\n skip: skip + (data?.list?.length ?? 0),\n entries: convertPersonEntry(data?.list ?? [], {\n shouldShowLastOnlineTime: relationMode === RelationMode.SITE,\n }),\n },\n };\n }\n\n if (filterType === PersonFinderFilterTypes.SITE) {\n if (searchString.length <= 2) {\n return {\n key: PersonFinderFilterTypes.SITE,\n value: {\n searchString,\n count: 0,\n skip: 0,\n entries: [],\n },\n };\n }\n\n const data = await getSites({ search: searchString, skip });\n\n const filteredList = data?.list.filter(({ siteId }) => siteId !== null);\n\n return {\n key: PersonFinderFilterTypes.SITE,\n value: {\n searchString,\n count: data?.count ?? 0,\n skip: skip + (filteredList?.length ?? 0),\n entries: convertSiteEntry(filteredList ?? []),\n },\n };\n }\n\n return null;\n });\n\n const results = await Promise.all(promises);\n\n return results.reduce<PersonFinderDataMap>((acc, item) => {\n if (!item) return acc;\n\n return {\n ...acc,\n [item.key]: item.value,\n };\n }, {});\n};\n\nexport const formatLastOnline = (date: Date): string => {\n const ts = textStrings.components.personFinder.lastOnline;\n const now = new Date();\n\n const diffMs = now.getTime() - date.getTime();\n\n const minutes = Math.floor(diffMs / 1000 / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const months = Math.floor(days / 30);\n const years = Math.floor(days / 365);\n\n const isSameDay =\n date.getDate() === now.getDate() &&\n date.getMonth() === now.getMonth() &&\n date.getFullYear() === now.getFullYear();\n\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n\n const isYesterday =\n date.getDate() === yesterday.getDate() &&\n date.getMonth() === yesterday.getMonth() &&\n date.getFullYear() === yesterday.getFullYear();\n\n const time = date.toLocaleTimeString('de-DE', {\n hour: '2-digit',\n minute: '2-digit',\n });\n\n if (minutes < 5) {\n return getPersonFinderTextstringValue({ textstring: ts.fewMinutes });\n }\n\n if (minutes < 60) {\n return getPersonFinderTextstringValue({\n textstring: ts.minutes,\n replacements: { minutes },\n });\n }\n\n if (hours < 24 && isSameDay) {\n return getPersonFinderTextstringValue({\n textstring: ts.today,\n replacements: { time },\n });\n }\n\n if (isYesterday) {\n return getPersonFinderTextstringValue({\n textstring: ts.yesterday,\n replacements: { time },\n });\n }\n\n if (days < 30) {\n return getPersonFinderTextstringValue({\n textstring: ts.days,\n replacements: { days },\n });\n }\n\n if (months < 12) {\n return getPersonFinderTextstringValue({\n textstring: ts.months,\n replacements: { months },\n });\n }\n\n return getPersonFinderTextstringValue({\n textstring: ts.years,\n replacements: { years },\n });\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"personFinder.js","names":["_personFinder","require","_textstring","_get","_get2","_convert","_chaynsApi","_textStrings","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","normalizeTextstringReplacements","replacements","undefined","entries","reduce","acc","key","value","toString","getPersonFinderTextstringValue","textstring","getTextstringValue","libraryName","PERSON_FINDER_TEXTSTRING_LIBRARY_NAME","ttsToITextString","exports","getGroupName","groupNames","PersonFinderFilterTypes","PERSON","textStrings","components","personFinder","groupName","person","SITE","site","UAC","uac","isSiteEntry","entry","filterDataByKeys","data","keys","options","filterSingle","filteredEntries","excludedEntryIds","Array","isArray","length","filter","includes","id","excludedCount","count","Math","max","relevantKeys","original","searchString","skip","filteredEntry","shouldShowOwnUser","user","getUser","personId","ownUserEntry","commonSites","firstName","isVerified","lastName","type","fullName","Boolean","join","trim","toLowerCase","capitalizeFirstLetter","str","charAt","toUpperCase","slice","destructureData","filterType","_data$filterType","_data$filterType2","_data$filterType3","_data$filterType4","loadData","skipMap","relationMode","shouldUseQa","promises","map","_data$list","getPersons","search","list","convertPersonEntry","shouldShowLastOnlineTime","RelationMode","getSites","filteredList","siteId","convertSiteEntry","results","Promise","all","item","formatLastOnline","date","ts","lastOnline","now","Date","diffMs","getTime","minutes","floor","hours","days","months","years","isSameDay","getDate","getMonth","getFullYear","yesterday","setDate","isYesterday","time","toLocaleTimeString","hour","minute","fewMinutes","today"],"sources":["../../../src/utils/personFinder.ts"],"sourcesContent":["import {\n PersonEntry,\n PersonFinderData,\n PersonFinderDataMap,\n PersonFinderEntry,\n PersonFinderFilterTypes,\n RelationMode,\n SiteEntry,\n} from '../types/personFinder';\nimport { getTextstringValue, ttsToITextString } from '@chayns-components/textstring';\nimport { getPersons } from '../api/person/get';\nimport { getSites } from '../api/site/get';\nimport { convertPersonEntry, convertSiteEntry } from './convert';\nimport { getUser } from 'chayns-api';\nimport textStrings, { PERSON_FINDER_TEXTSTRING_LIBRARY_NAME } from '../constants/textStrings';\n\ninterface GetPersonFinderTextstringValueOptions {\n textstring: {\n stringName: string;\n fallback: string;\n };\n replacements?: Record<string, number | string | undefined>;\n}\n\nconst normalizeTextstringReplacements = (\n replacements?: GetPersonFinderTextstringValueOptions['replacements'],\n) => {\n if (!replacements) {\n return undefined;\n }\n\n return Object.entries(replacements).reduce<Record<string, string>>((acc, [key, value]) => {\n acc[`##${key}##`] = value?.toString() ?? '';\n\n return acc;\n }, {});\n};\n\nexport const getPersonFinderTextstringValue = ({\n textstring,\n replacements,\n}: GetPersonFinderTextstringValueOptions) =>\n getTextstringValue({\n libraryName: PERSON_FINDER_TEXTSTRING_LIBRARY_NAME,\n textstring: ttsToITextString(textstring),\n replacements: normalizeTextstringReplacements(replacements),\n });\n\nexport const getGroupName = (key: string) => {\n const groupNames: Partial<\n Record<PersonFinderFilterTypes, { stringName: string; fallback: string }>\n > = {\n [PersonFinderFilterTypes.PERSON]: textStrings.components.personFinder.groupName.person,\n [PersonFinderFilterTypes.SITE]: textStrings.components.personFinder.groupName.site,\n [PersonFinderFilterTypes.UAC]: textStrings.components.personFinder.groupName.uac,\n };\n\n const textstring = groupNames[key as PersonFinderFilterTypes];\n\n if (!textstring) {\n return key;\n }\n\n return getPersonFinderTextstringValue({ textstring });\n};\n\nexport const isSiteEntry = (entry: PersonEntry | SiteEntry): entry is SiteEntry =>\n 'name' in entry && !('firstName' in entry);\n\ninterface FilterDataByKeysOptions {\n excludedEntryIds?: PersonFinderEntry['id'][];\n shouldShowOwnUser?: boolean;\n}\n\nexport const filterDataByKeys = (\n data: { [key: string]: PersonFinderData } = {},\n keys: PersonFinderFilterTypes[] = [],\n options: FilterDataByKeysOptions = {},\n): { [key: string]: PersonFinderData } => {\n const filterSingle = (entry: PersonFinderData): PersonFinderData => {\n let filteredEntries = entry.entries;\n\n const { excludedEntryIds } = options;\n\n if (Array.isArray(excludedEntryIds) && excludedEntryIds.length > 0) {\n filteredEntries = filteredEntries.filter((e) => !excludedEntryIds.includes(e.id));\n }\n\n const excludedCount = entry.entries.length - filteredEntries.length;\n\n return {\n ...entry,\n entries: filteredEntries,\n count: Math.max(0, entry.count - excludedCount),\n };\n };\n\n const relevantKeys = keys.length > 0 ? keys : Object.keys(data);\n\n return relevantKeys.reduce((acc, key) => {\n const original = data[key] ?? { searchString: '', count: 0, skip: 0, entries: [] };\n\n const filteredEntry = filterSingle(original);\n\n if (options.shouldShowOwnUser && key === PersonFinderFilterTypes.PERSON) {\n const user = getUser();\n\n if (typeof user?.personId === 'string') {\n // Ensure that the own user is always included in the person filter\n const ownUserEntry: PersonEntry = {\n commonSites: 0,\n firstName: user.firstName ?? '',\n id: user.personId,\n isVerified: false,\n lastName: user.lastName ?? '',\n type: PersonFinderFilterTypes.PERSON,\n };\n\n const fullName = [ownUserEntry.firstName, ownUserEntry.lastName]\n .filter(Boolean)\n .join(' ')\n .trim();\n\n if (\n original.searchString.length < 3 ||\n fullName.toLowerCase().includes(original.searchString.toLowerCase())\n ) {\n filteredEntry.entries = [ownUserEntry, ...filteredEntry.entries];\n filteredEntry.count += 1; // Increment count to account for the own user\n }\n }\n }\n\n return { ...acc, [key]: filteredEntry };\n }, {});\n};\n\nexport const capitalizeFirstLetter = (str: string) => str.charAt(0).toUpperCase() + str.slice(1);\n\nexport const destructureData = (\n data: Record<string, PersonFinderData> | undefined,\n filterType: string,\n) => ({\n count: data?.[filterType]?.count ?? 0,\n skip: data?.[filterType]?.skip ?? 0,\n searchString: data?.[filterType]?.searchString ?? '',\n entries: data?.[filterType]?.entries ?? [],\n});\n\ninterface LoadDataOptions {\n searchString: string;\n filter: PersonFinderFilterTypes[];\n skipMap: Partial<Record<PersonFinderFilterTypes, number>>;\n relationMode?: RelationMode;\n shouldUseQa: boolean;\n}\n\nexport const loadData = async ({\n skipMap,\n searchString,\n filter,\n relationMode,\n shouldUseQa,\n}: LoadDataOptions): Promise<PersonFinderDataMap> => {\n const promises = filter.map(async (filterType) => {\n const skip = skipMap[filterType] ?? 0;\n\n if (filterType === PersonFinderFilterTypes.PERSON) {\n if (searchString.length <= 2) {\n return {\n key: PersonFinderFilterTypes.PERSON,\n value: {\n searchString,\n count: 0,\n skip: 0,\n entries: [],\n },\n };\n }\n\n const data = await getPersons({\n search: searchString,\n skip,\n relationMode,\n shouldUseQa,\n });\n\n return {\n key: PersonFinderFilterTypes.PERSON,\n value: {\n searchString,\n count: data?.count ?? 0,\n skip: skip + (data?.list?.length ?? 0),\n entries: convertPersonEntry(data?.list ?? [], {\n shouldShowLastOnlineTime: relationMode === RelationMode.SITE,\n }),\n },\n };\n }\n\n if (filterType === PersonFinderFilterTypes.SITE) {\n if (searchString.length <= 2) {\n return {\n key: PersonFinderFilterTypes.SITE,\n value: {\n searchString,\n count: 0,\n skip: 0,\n entries: [],\n },\n };\n }\n\n const data = await getSites({ search: searchString, skip, shouldUseQa });\n\n const filteredList = data?.list.filter(({ siteId }) => siteId !== null);\n\n return {\n key: PersonFinderFilterTypes.SITE,\n value: {\n searchString,\n count: data?.count ?? 0,\n skip: skip + (filteredList?.length ?? 0),\n entries: convertSiteEntry(filteredList ?? []),\n },\n };\n }\n\n return null;\n });\n\n const results = await Promise.all(promises);\n\n return results.reduce<PersonFinderDataMap>((acc, item) => {\n if (!item) return acc;\n\n return {\n ...acc,\n [item.key]: item.value,\n };\n }, {});\n};\n\nexport const formatLastOnline = (date: Date): string => {\n const ts = textStrings.components.personFinder.lastOnline;\n const now = new Date();\n\n const diffMs = now.getTime() - date.getTime();\n\n const minutes = Math.floor(diffMs / 1000 / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const months = Math.floor(days / 30);\n const years = Math.floor(days / 365);\n\n const isSameDay =\n date.getDate() === now.getDate() &&\n date.getMonth() === now.getMonth() &&\n date.getFullYear() === now.getFullYear();\n\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n\n const isYesterday =\n date.getDate() === yesterday.getDate() &&\n date.getMonth() === yesterday.getMonth() &&\n date.getFullYear() === yesterday.getFullYear();\n\n const time = date.toLocaleTimeString('de-DE', {\n hour: '2-digit',\n minute: '2-digit',\n });\n\n if (minutes < 5) {\n return getPersonFinderTextstringValue({ textstring: ts.fewMinutes });\n }\n\n if (minutes < 60) {\n return getPersonFinderTextstringValue({\n textstring: ts.minutes,\n replacements: { minutes },\n });\n }\n\n if (hours < 24 && isSameDay) {\n return getPersonFinderTextstringValue({\n textstring: ts.today,\n replacements: { time },\n });\n }\n\n if (isYesterday) {\n return getPersonFinderTextstringValue({\n textstring: ts.yesterday,\n replacements: { time },\n });\n }\n\n if (days < 30) {\n return getPersonFinderTextstringValue({\n textstring: ts.days,\n replacements: { days },\n });\n }\n\n if (months < 12) {\n return getPersonFinderTextstringValue({\n textstring: ts.months,\n replacements: { months },\n });\n }\n\n return getPersonFinderTextstringValue({\n textstring: ts.years,\n replacements: { years },\n });\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +1,12 @@
1
1
  import { getAccessToken } from 'chayns-api';
2
2
  import { RelationMode } from '../../types/personFinder';
3
- const URL = 'https://relations.chayns.net/relations/v2/person?skip=##skip##&take=##take##&query=##search##&scoreForSite=##scoreForSite##';
3
+ import { QA_RELATIONS_BASE_URL, RELATIONS_BASE_URL } from '../../constants/url';
4
4
  export const getPersons = async ({
5
5
  search,
6
6
  skip,
7
7
  take = 20,
8
- relationMode = RelationMode.PERSON
8
+ relationMode = RelationMode.PERSON,
9
+ shouldUseQa
9
10
  }) => {
10
11
  const {
11
12
  accessToken
@@ -19,7 +20,8 @@ export const getPersons = async ({
19
20
  },
20
21
  method: 'GET'
21
22
  };
22
- const response = await fetch(URL.replace('##search##', search).replace('##skip##', skip.toString()).replace('##take##', take?.toString()).replace('##scoreForSite##', relationMode === RelationMode.SITE ? '1' : '0'), requestInit);
23
+ const url = `${shouldUseQa ? QA_RELATIONS_BASE_URL : RELATIONS_BASE_URL}v2/person?skip=##skip##&take=##take##&query=##search##&scoreForSite=##scoreForSite##`;
24
+ const response = await fetch(url.replace('##search##', search).replace('##skip##', skip.toString()).replace('##take##', take?.toString()).replace('##scoreForSite##', relationMode === RelationMode.SITE ? '1' : '0'), requestInit);
23
25
  if (response.status === 200) {
24
26
  return await response.json();
25
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get.js","names":["getAccessToken","RelationMode","URL","getPersons","search","skip","take","relationMode","PERSON","accessToken","undefined","requestInit","headers","Authorization","method","response","fetch","replace","toString","SITE","status","json"],"sources":["../../../../src/api/person/get.ts"],"sourcesContent":["import { getAccessToken } from 'chayns-api';\nimport { PersonEntryResult, RelationMode } from '../../types/personFinder';\n\nconst URL =\n 'https://relations.chayns.net/relations/v2/person?skip=##skip##&take=##take##&query=##search##&scoreForSite=##scoreForSite##';\n\ninterface GetPersonResult {\n list: PersonEntryResult[];\n count: number;\n}\n\ninterface GetPersonsOptions {\n search: string;\n skip: number;\n take?: number;\n relationMode?: RelationMode;\n}\n\nexport const getPersons = async ({\n search,\n skip,\n take = 20,\n relationMode = RelationMode.PERSON,\n}: GetPersonsOptions) => {\n const { accessToken } = await getAccessToken();\n\n if (!accessToken) {\n return undefined;\n }\n\n const requestInit: RequestInit = {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n method: 'GET',\n };\n\n const response = await fetch(\n URL.replace('##search##', search)\n .replace('##skip##', skip.toString())\n .replace('##take##', take?.toString())\n .replace('##scoreForSite##', relationMode === RelationMode.SITE ? '1' : '0'),\n requestInit,\n );\n\n if (response.status === 200) {\n return (await response.json()) as GetPersonResult;\n }\n\n return undefined;\n};\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,YAAY;AAC3C,SAA4BC,YAAY,QAAQ,0BAA0B;AAE1E,MAAMC,GAAG,GACL,6HAA6H;AAcjI,OAAO,MAAMC,UAAU,GAAG,MAAAA,CAAO;EAC7BC,MAAM;EACNC,IAAI;EACJC,IAAI,GAAG,EAAE;EACTC,YAAY,GAAGN,YAAY,CAACO;AACb,CAAC,KAAK;EACrB,MAAM;IAAEC;EAAY,CAAC,GAAG,MAAMT,cAAc,CAAC,CAAC;EAE9C,IAAI,CAACS,WAAW,EAAE;IACd,OAAOC,SAAS;EACpB;EAEA,MAAMC,WAAwB,GAAG;IAC7BC,OAAO,EAAE;MACLC,aAAa,EAAE,UAAUJ,WAAW;IACxC,CAAC;IACDK,MAAM,EAAE;EACZ,CAAC;EAED,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CACxBd,GAAG,CAACe,OAAO,CAAC,YAAY,EAAEb,MAAM,CAAC,CAC5Ba,OAAO,CAAC,UAAU,EAAEZ,IAAI,CAACa,QAAQ,CAAC,CAAC,CAAC,CACpCD,OAAO,CAAC,UAAU,EAAEX,IAAI,EAAEY,QAAQ,CAAC,CAAC,CAAC,CACrCD,OAAO,CAAC,kBAAkB,EAAEV,YAAY,KAAKN,YAAY,CAACkB,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,EAChFR,WACJ,CAAC;EAED,IAAII,QAAQ,CAACK,MAAM,KAAK,GAAG,EAAE;IACzB,OAAQ,MAAML,QAAQ,CAACM,IAAI,CAAC,CAAC;EACjC;EAEA,OAAOX,SAAS;AACpB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"get.js","names":["getAccessToken","RelationMode","QA_RELATIONS_BASE_URL","RELATIONS_BASE_URL","getPersons","search","skip","take","relationMode","PERSON","shouldUseQa","accessToken","undefined","requestInit","headers","Authorization","method","url","response","fetch","replace","toString","SITE","status","json"],"sources":["../../../../src/api/person/get.ts"],"sourcesContent":["import { getAccessToken } from 'chayns-api';\nimport { PersonEntryResult, RelationMode } from '../../types/personFinder';\nimport { QA_RELATIONS_BASE_URL, RELATIONS_BASE_URL } from '../../constants/url';\n\ninterface GetPersonResult {\n list: PersonEntryResult[];\n count: number;\n}\n\ninterface GetPersonsOptions {\n search: string;\n skip: number;\n take?: number;\n relationMode?: RelationMode;\n shouldUseQa: boolean;\n}\n\nexport const getPersons = async ({\n search,\n skip,\n take = 20,\n relationMode = RelationMode.PERSON,\n shouldUseQa,\n}: GetPersonsOptions) => {\n const { accessToken } = await getAccessToken();\n\n if (!accessToken) {\n return undefined;\n }\n\n const requestInit: RequestInit = {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n method: 'GET',\n };\n\n const url = `${shouldUseQa ? QA_RELATIONS_BASE_URL : RELATIONS_BASE_URL}v2/person?skip=##skip##&take=##take##&query=##search##&scoreForSite=##scoreForSite##`;\n\n const response = await fetch(\n url\n .replace('##search##', search)\n .replace('##skip##', skip.toString())\n .replace('##take##', take?.toString())\n .replace('##scoreForSite##', relationMode === RelationMode.SITE ? '1' : '0'),\n requestInit,\n );\n\n if (response.status === 200) {\n return (await response.json()) as GetPersonResult;\n }\n\n return undefined;\n};\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,YAAY;AAC3C,SAA4BC,YAAY,QAAQ,0BAA0B;AAC1E,SAASC,qBAAqB,EAAEC,kBAAkB,QAAQ,qBAAqB;AAe/E,OAAO,MAAMC,UAAU,GAAG,MAAAA,CAAO;EAC7BC,MAAM;EACNC,IAAI;EACJC,IAAI,GAAG,EAAE;EACTC,YAAY,GAAGP,YAAY,CAACQ,MAAM;EAClCC;AACe,CAAC,KAAK;EACrB,MAAM;IAAEC;EAAY,CAAC,GAAG,MAAMX,cAAc,CAAC,CAAC;EAE9C,IAAI,CAACW,WAAW,EAAE;IACd,OAAOC,SAAS;EACpB;EAEA,MAAMC,WAAwB,GAAG;IAC7BC,OAAO,EAAE;MACLC,aAAa,EAAE,UAAUJ,WAAW;IACxC,CAAC;IACDK,MAAM,EAAE;EACZ,CAAC;EAED,MAAMC,GAAG,GAAG,GAAGP,WAAW,GAAGR,qBAAqB,GAAGC,kBAAkB,sFAAsF;EAE7J,MAAMe,QAAQ,GAAG,MAAMC,KAAK,CACxBF,GAAG,CACEG,OAAO,CAAC,YAAY,EAAEf,MAAM,CAAC,CAC7Be,OAAO,CAAC,UAAU,EAAEd,IAAI,CAACe,QAAQ,CAAC,CAAC,CAAC,CACpCD,OAAO,CAAC,UAAU,EAAEb,IAAI,EAAEc,QAAQ,CAAC,CAAC,CAAC,CACrCD,OAAO,CAAC,kBAAkB,EAAEZ,YAAY,KAAKP,YAAY,CAACqB,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,EAChFT,WACJ,CAAC;EAED,IAAIK,QAAQ,CAACK,MAAM,KAAK,GAAG,EAAE;IACzB,OAAQ,MAAML,QAAQ,CAACM,IAAI,CAAC,CAAC;EACjC;EAEA,OAAOZ,SAAS;AACpB,CAAC","ignoreList":[]}
@@ -1,9 +1,10 @@
1
1
  import { getAccessToken } from 'chayns-api';
2
- const URL = 'https://relations.chayns.net/relations/location/?query=##search##&skip=##skip##&take=##take##&includeDomains=true';
2
+ import { QA_RELATIONS_BASE_URL, RELATIONS_BASE_URL } from '../../constants/url';
3
3
  export const getSites = async ({
4
4
  search,
5
5
  skip,
6
- take = 20
6
+ take = 20,
7
+ shouldUseQa
7
8
  }) => {
8
9
  const {
9
10
  accessToken
@@ -17,7 +18,8 @@ export const getSites = async ({
17
18
  },
18
19
  method: 'GET'
19
20
  };
20
- const response = await fetch(URL.replace('##search##', search).replace('##skip##', skip.toString()).replace('##take##', take?.toString()), requestInit);
21
+ const url = `${shouldUseQa ? QA_RELATIONS_BASE_URL : RELATIONS_BASE_URL}location/?query=##search##&skip=##skip##&take=##take##&includeDomains=true`;
22
+ const response = await fetch(url.replace('##search##', search).replace('##skip##', skip.toString()).replace('##take##', take?.toString()), requestInit);
21
23
  if (response.status === 200) {
22
24
  return await response.json();
23
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get.js","names":["getAccessToken","URL","getSites","search","skip","take","accessToken","undefined","requestInit","headers","Authorization","method","response","fetch","replace","toString","status","json"],"sources":["../../../../src/api/site/get.ts"],"sourcesContent":["import { getAccessToken } from 'chayns-api';\nimport { SiteEntryResult } from '../../types/personFinder';\n\nconst URL =\n 'https://relations.chayns.net/relations/location/?query=##search##&skip=##skip##&take=##take##&includeDomains=true';\n\ninterface GetSiteResult {\n count: number;\n list: SiteEntryResult[];\n}\n\ninterface GetSitesOptions {\n search: string;\n skip: number;\n take?: number;\n}\n\nexport const getSites = async ({ search, skip, take = 20 }: GetSitesOptions) => {\n const { accessToken } = await getAccessToken();\n\n if (!accessToken) {\n return undefined;\n }\n\n const requestInit: RequestInit = {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n method: 'GET',\n };\n\n const response = await fetch(\n URL.replace('##search##', search)\n .replace('##skip##', skip.toString())\n .replace('##take##', take?.toString()),\n requestInit,\n );\n\n if (response.status === 200) {\n return (await response.json()) as GetSiteResult;\n }\n\n return undefined;\n};\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,YAAY;AAG3C,MAAMC,GAAG,GACL,mHAAmH;AAavH,OAAO,MAAMC,QAAQ,GAAG,MAAAA,CAAO;EAAEC,MAAM;EAAEC,IAAI;EAAEC,IAAI,GAAG;AAAoB,CAAC,KAAK;EAC5E,MAAM;IAAEC;EAAY,CAAC,GAAG,MAAMN,cAAc,CAAC,CAAC;EAE9C,IAAI,CAACM,WAAW,EAAE;IACd,OAAOC,SAAS;EACpB;EAEA,MAAMC,WAAwB,GAAG;IAC7BC,OAAO,EAAE;MACLC,aAAa,EAAE,UAAUJ,WAAW;IACxC,CAAC;IACDK,MAAM,EAAE;EACZ,CAAC;EAED,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CACxBZ,GAAG,CAACa,OAAO,CAAC,YAAY,EAAEX,MAAM,CAAC,CAC5BW,OAAO,CAAC,UAAU,EAAEV,IAAI,CAACW,QAAQ,CAAC,CAAC,CAAC,CACpCD,OAAO,CAAC,UAAU,EAAET,IAAI,EAAEU,QAAQ,CAAC,CAAC,CAAC,EAC1CP,WACJ,CAAC;EAED,IAAII,QAAQ,CAACI,MAAM,KAAK,GAAG,EAAE;IACzB,OAAQ,MAAMJ,QAAQ,CAACK,IAAI,CAAC,CAAC;EACjC;EAEA,OAAOV,SAAS;AACpB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"get.js","names":["getAccessToken","QA_RELATIONS_BASE_URL","RELATIONS_BASE_URL","getSites","search","skip","take","shouldUseQa","accessToken","undefined","requestInit","headers","Authorization","method","url","response","fetch","replace","toString","status","json"],"sources":["../../../../src/api/site/get.ts"],"sourcesContent":["import { getAccessToken } from 'chayns-api';\nimport { SiteEntryResult } from '../../types/personFinder';\nimport { QA_RELATIONS_BASE_URL, RELATIONS_BASE_URL } from '../../constants/url';\n\ninterface GetSiteResult {\n count: number;\n list: SiteEntryResult[];\n}\n\ninterface GetSitesOptions {\n search: string;\n skip: number;\n take?: number;\n shouldUseQa: boolean;\n}\n\nexport const getSites = async ({ search, skip, take = 20, shouldUseQa }: GetSitesOptions) => {\n const { accessToken } = await getAccessToken();\n\n if (!accessToken) {\n return undefined;\n }\n\n const requestInit: RequestInit = {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n method: 'GET',\n };\n\n const url = `${shouldUseQa ? QA_RELATIONS_BASE_URL : RELATIONS_BASE_URL}location/?query=##search##&skip=##skip##&take=##take##&includeDomains=true`;\n\n const response = await fetch(\n url\n .replace('##search##', search)\n .replace('##skip##', skip.toString())\n .replace('##take##', take?.toString()),\n requestInit,\n );\n\n if (response.status === 200) {\n return (await response.json()) as GetSiteResult;\n }\n\n return undefined;\n};\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,YAAY;AAE3C,SAASC,qBAAqB,EAAEC,kBAAkB,QAAQ,qBAAqB;AAc/E,OAAO,MAAMC,QAAQ,GAAG,MAAAA,CAAO;EAAEC,MAAM;EAAEC,IAAI;EAAEC,IAAI,GAAG,EAAE;EAAEC;AAA6B,CAAC,KAAK;EACzF,MAAM;IAAEC;EAAY,CAAC,GAAG,MAAMR,cAAc,CAAC,CAAC;EAE9C,IAAI,CAACQ,WAAW,EAAE;IACd,OAAOC,SAAS;EACpB;EAEA,MAAMC,WAAwB,GAAG;IAC7BC,OAAO,EAAE;MACLC,aAAa,EAAE,UAAUJ,WAAW;IACxC,CAAC;IACDK,MAAM,EAAE;EACZ,CAAC;EAED,MAAMC,GAAG,GAAG,GAAGP,WAAW,GAAGN,qBAAqB,GAAGC,kBAAkB,4EAA4E;EAEnJ,MAAMa,QAAQ,GAAG,MAAMC,KAAK,CACxBF,GAAG,CACEG,OAAO,CAAC,YAAY,EAAEb,MAAM,CAAC,CAC7Ba,OAAO,CAAC,UAAU,EAAEZ,IAAI,CAACa,QAAQ,CAAC,CAAC,CAAC,CACpCD,OAAO,CAAC,UAAU,EAAEX,IAAI,EAAEY,QAAQ,CAAC,CAAC,CAAC,EAC1CR,WACJ,CAAC;EAED,IAAIK,QAAQ,CAACI,MAAM,KAAK,GAAG,EAAE;IACzB,OAAQ,MAAMJ,QAAQ,CAACK,IAAI,CAAC,CAAC;EACjC;EAEA,OAAOX,SAAS;AACpB,CAAC","ignoreList":[]}
@@ -36,6 +36,7 @@ const PersonFinderProvider = ({
36
36
  defaultEntries,
37
37
  excludedEntryIds,
38
38
  shouldShowOwnUser = false,
39
+ shouldUseQa,
39
40
  uacFilter,
40
41
  entries,
41
42
  relationMode
@@ -125,7 +126,8 @@ const PersonFinderProvider = ({
125
126
  skipMap: {
126
127
  [key]: current.skip
127
128
  },
128
- relationMode
129
+ relationMode,
130
+ shouldUseQa
129
131
  }).then(result => {
130
132
  const newData = result?.[key];
131
133
  if (newData) {
@@ -134,7 +136,7 @@ const PersonFinderProvider = ({
134
136
  }).finally(() => {
135
137
  updateLoadingState(key, LoadingState.Success);
136
138
  });
137
- }, [appendData, data, getPagedUsersByGroups, relationMode, search, updateLoadingState]);
139
+ }, [appendData, data, getPagedUsersByGroups, relationMode, search, shouldUseQa, updateLoadingState]);
138
140
  const addFriend = useCallback(personId => {
139
141
  void postFriends(personId).then(result => {
140
142
  if (result) {
@@ -187,6 +189,8 @@ const PersonFinderProvider = ({
187
189
  }, [filterTypes]);
188
190
  const latestArgsRef = useRef(null);
189
191
  const latestHandledRequestRef = useRef(0);
192
+ const searchLocalRef = useRef(() => {});
193
+ const searchDataRef = useRef(() => {});
190
194
  const throttledRequest = useRef(throttle(async () => {
191
195
  const args = latestArgsRef.current;
192
196
  if (!args) return;
@@ -202,7 +206,8 @@ const PersonFinderProvider = ({
202
206
  searchString,
203
207
  filter,
204
208
  skipMap: {},
205
- relationMode
209
+ relationMode,
210
+ shouldUseQa
206
211
  });
207
212
  if (requestTimestamp < latestHandledRequestRef.current) {
208
213
  return;
@@ -229,10 +234,7 @@ const PersonFinderProvider = ({
229
234
  }, THROTTLE_INTERVAL, {
230
235
  leading: false,
231
236
  trailing: true
232
- })).current;
233
- useEffect(() => {
234
- dataRef.current = data;
235
- }, [data]);
237
+ }));
236
238
  const searchData = useCallback(({
237
239
  filter
238
240
  }) => {
@@ -275,26 +277,68 @@ const PersonFinderProvider = ({
275
277
  });
276
278
  updateLoadingState(PersonFinderFilterTypes.PERSON, searchedUsers.length === 0 ? LoadingState.Error : LoadingState.Success);
277
279
  }, [entries, search, uacUsers, updateData, updateLoadingState]);
280
+ useEffect(() => {
281
+ dataRef.current = data;
282
+ }, [data]);
283
+ useEffect(() => {
284
+ searchLocalRef.current = searchLocal;
285
+ }, [searchLocal]);
286
+ useEffect(() => {
287
+ searchDataRef.current = searchData;
288
+ }, [searchData]);
278
289
  useEffect(() => {
279
290
  if (!search) return;
280
- const active = activeFilter ?? filterTypes;
291
+ const active = activeFilter && activeFilter.length > 0 ? activeFilter : filterTypes;
292
+ const currentData = dataRef.current;
281
293
  if (uacFilter || entries) {
282
- searchLocal();
294
+ searchLocalRef.current();
283
295
  } else if (active?.includes(PersonFinderFilterTypes.UAC)) {
284
- searchData({
296
+ searchDataRef.current({
285
297
  filter: [PersonFinderFilterTypes.UAC]
286
298
  });
287
299
  } else {
300
+ // Only load filters that don't have data for this search yet
301
+ const filtersToLoad = active.filter(filter => {
302
+ const filterData = currentData?.[filter];
303
+ return !filterData || filterData.searchString !== search;
304
+ });
305
+
306
+ // If we have filters to load, use them; otherwise use all active filters
307
+ const filterList = filtersToLoad.length > 0 ? filtersToLoad : active;
288
308
  latestArgsRef.current = {
289
309
  search,
290
- filter: active
310
+ filter: filterList
291
311
  };
292
- throttledRequest();
312
+ throttledRequest.current();
293
313
  }
294
- }, [filterTypes, search, activeFilter, friends, friendsPriority, updateData, updateLoadingState, throttledRequest, searchData, uacFilter, searchLocal, entries]);
314
+ }, [search, uacFilter, entries]);
315
+
316
+ // Handle filter changes - load missing data for newly selected filters
317
+ useEffect(() => {
318
+ if (!search) return;
319
+ const active = activeFilter && activeFilter.length > 0 ? activeFilter : filterTypes;
320
+ const currentData = dataRef.current;
321
+
322
+ // Check which filters need to be loaded (don't have data for current search)
323
+ const missingFilters = active.filter(filter => {
324
+ const filterData = currentData?.[filter];
325
+ // If no data or data is from a different search, we need to load it
326
+ return !filterData || filterData.searchString !== search;
327
+ });
328
+ if (missingFilters.length === 0) return;
329
+ if (uacFilter || entries) return;
330
+ if (active?.includes(PersonFinderFilterTypes.UAC)) return;
331
+
332
+ // Load only the missing filters
333
+ latestArgsRef.current = {
334
+ search,
335
+ filter: missingFilters
336
+ };
337
+ throttledRequest.current();
338
+ }, [activeFilter, search, uacFilter, entries, filterTypes]);
295
339
  useEffect(() => () => {
296
- throttledRequest.cancel();
297
- }, [throttledRequest]);
340
+ throttledRequest.current?.cancel();
341
+ }, []);
298
342
 
299
343
  // load initial data
300
344
  useEffect(() => {