@chayns-components/person-finder 5.3.0 → 5.3.1

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 (56) 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/components/PersonFinderProvider.js +12 -5
  4. package/lib/cjs/components/PersonFinderProvider.js.map +1 -1
  5. package/lib/cjs/components/person-finder/PersonFinder.js +4 -2
  6. package/lib/cjs/components/person-finder/PersonFinder.js.map +1 -1
  7. package/lib/cjs/components/person-finder/person-finder-wrapper/PersonFinderWrapper.js.map +1 -1
  8. package/lib/cjs/components/person-finder/person-finder-wrapper/person-finder-body/PersonFinderBody.js +1 -3
  9. package/lib/cjs/components/person-finder/person-finder-wrapper/person-finder-body/PersonFinderBody.js.map +1 -1
  10. package/lib/cjs/components/person-finder/person-finder-wrapper/person-finder-body/person-finder-group/PersonFinderGroup.js +3 -6
  11. package/lib/cjs/components/person-finder/person-finder-wrapper/person-finder-body/person-finder-group/PersonFinderGroup.js.map +1 -1
  12. package/lib/cjs/constants/textStrings.js +70 -1
  13. package/lib/cjs/constants/textStrings.js.map +1 -1
  14. package/lib/cjs/hooks/personFinder.js +43 -7
  15. package/lib/cjs/hooks/personFinder.js.map +1 -1
  16. package/lib/cjs/index.js +6 -0
  17. package/lib/cjs/index.js.map +1 -1
  18. package/lib/cjs/types/personFinder.js +6 -1
  19. package/lib/cjs/types/personFinder.js.map +1 -1
  20. package/lib/cjs/utils/convert.js +5 -2
  21. package/lib/cjs/utils/convert.js.map +1 -1
  22. package/lib/cjs/utils/personFinder.js +110 -9
  23. package/lib/cjs/utils/personFinder.js.map +1 -1
  24. package/lib/esm/api/person/get.js +5 -3
  25. package/lib/esm/api/person/get.js.map +1 -1
  26. package/lib/esm/components/PersonFinderProvider.js +12 -5
  27. package/lib/esm/components/PersonFinderProvider.js.map +1 -1
  28. package/lib/esm/components/person-finder/PersonFinder.js +5 -3
  29. package/lib/esm/components/person-finder/PersonFinder.js.map +1 -1
  30. package/lib/esm/components/person-finder/person-finder-wrapper/PersonFinderWrapper.js.map +1 -1
  31. package/lib/esm/components/person-finder/person-finder-wrapper/person-finder-body/PersonFinderBody.js +1 -3
  32. package/lib/esm/components/person-finder/person-finder-wrapper/person-finder-body/PersonFinderBody.js.map +1 -1
  33. package/lib/esm/components/person-finder/person-finder-wrapper/person-finder-body/person-finder-group/PersonFinderGroup.js +4 -7
  34. package/lib/esm/components/person-finder/person-finder-wrapper/person-finder-body/person-finder-group/PersonFinderGroup.js.map +1 -1
  35. package/lib/esm/constants/textStrings.js +69 -0
  36. package/lib/esm/constants/textStrings.js.map +1 -1
  37. package/lib/esm/hooks/personFinder.js +43 -8
  38. package/lib/esm/hooks/personFinder.js.map +1 -1
  39. package/lib/esm/index.js +1 -1
  40. package/lib/esm/index.js.map +1 -1
  41. package/lib/esm/types/personFinder.js +5 -0
  42. package/lib/esm/types/personFinder.js.map +1 -1
  43. package/lib/esm/utils/convert.js +5 -2
  44. package/lib/esm/utils/convert.js.map +1 -1
  45. package/lib/esm/utils/personFinder.js +107 -9
  46. package/lib/esm/utils/personFinder.js.map +1 -1
  47. package/lib/types/api/person/get.d.ts +3 -2
  48. package/lib/types/components/PersonFinderProvider.d.ts +2 -1
  49. package/lib/types/components/person-finder/PersonFinder.d.ts +9 -1
  50. package/lib/types/components/person-finder/person-finder-wrapper/person-finder-body/person-finder-group/PersonFinderGroup.d.ts +0 -1
  51. package/lib/types/constants/textStrings.d.ts +69 -0
  52. package/lib/types/index.d.ts +1 -1
  53. package/lib/types/types/personFinder.d.ts +5 -0
  54. package/lib/types/utils/convert.d.ts +5 -1
  55. package/lib/types/utils/personFinder.d.ts +13 -3
  56. package/package.json +2 -2
@@ -1,3 +1,4 @@
1
+ export const PERSON_FINDER_TEXTSTRING_LIBRARY_NAME = '@chayns-components-person-finder';
1
2
  export default {
2
3
  components: {
3
4
  personFinder: {
@@ -7,8 +8,76 @@ export default {
7
8
  loadMore: {
8
9
  stringName: 'txt_chayns_components_person_finder_components_personFinder_wrapper_body_group_loadMore',
9
10
  fallback: 'Mehr'
11
+ },
12
+ errorMessage: {
13
+ minSearchLength: {
14
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_wrapper_body_group_errorMessage_minSearchLength',
15
+ fallback: 'Gib einen Suchbegriff mit mindestens drei Zeichen ein.'
16
+ },
17
+ noResults: {
18
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_wrapper_body_group_errorMessage_noResults',
19
+ fallback: 'Es konnten keine ##groupName## zu der Suche "##search##" gefunden werden.'
20
+ },
21
+ emptySearch: {
22
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_wrapper_body_group_errorMessage_emptySearch',
23
+ fallback: 'Gib einen Suchbegriff ein, um nach ##groupName## zu suchen.'
24
+ }
10
25
  }
11
26
  }
27
+ },
28
+ item: {
29
+ chaynsId: {
30
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_wrapper_item_chaynsId',
31
+ fallback: 'chaynsID: ##id##'
32
+ },
33
+ commonSites: {
34
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_wrapper_item_commonSites',
35
+ fallback: '##count## gemeinsame Sites'
36
+ }
37
+ }
38
+ },
39
+ groupName: {
40
+ person: {
41
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_groupName_person',
42
+ fallback: 'Personen'
43
+ },
44
+ site: {
45
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_groupName_site',
46
+ fallback: 'Sites'
47
+ },
48
+ uac: {
49
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_groupName_uac',
50
+ fallback: 'UAC Gruppen'
51
+ }
52
+ },
53
+ lastOnline: {
54
+ fewMinutes: {
55
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_lastOnline_fewMinutes',
56
+ fallback: 'zul. online vor wenigen Minuten'
57
+ },
58
+ minutes: {
59
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_lastOnline_minutes',
60
+ fallback: 'zul. online vor ##minutes## Minuten'
61
+ },
62
+ today: {
63
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_lastOnline_today',
64
+ fallback: 'zul. online heute um ##time## Uhr'
65
+ },
66
+ yesterday: {
67
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_lastOnline_yesterday',
68
+ fallback: 'zul. online gestern um ##time## Uhr'
69
+ },
70
+ days: {
71
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_lastOnline_days',
72
+ fallback: 'zul. online vor ##days## Tagen'
73
+ },
74
+ months: {
75
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_lastOnline_months',
76
+ fallback: 'zul. online vor ##months## Monaten'
77
+ },
78
+ years: {
79
+ stringName: 'txt_chayns_components_person_finder_components_personFinder_lastOnline_years',
80
+ fallback: 'zul. online vor ##years## Jahren'
12
81
  }
13
82
  }
14
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"textStrings.js","names":["components","personFinder","wrapper","body","group","loadMore","stringName","fallback"],"sources":["../../../src/constants/textStrings.ts"],"sourcesContent":["export default {\n components: {\n personFinder: {\n wrapper: {\n body: {\n group: {\n loadMore: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_wrapper_body_group_loadMore',\n fallback: 'Mehr',\n },\n },\n },\n },\n },\n },\n} as const;\n"],"mappings":"AAAA,eAAe;EACXA,UAAU,EAAE;IACRC,YAAY,EAAE;MACVC,OAAO,EAAE;QACLC,IAAI,EAAE;UACFC,KAAK,EAAE;YACHC,QAAQ,EAAE;cACNC,UAAU,EACN,yFAAyF;cAC7FC,QAAQ,EAAE;YACd;UACJ;QACJ;MACJ;IACJ;EACJ;AACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"textStrings.js","names":["PERSON_FINDER_TEXTSTRING_LIBRARY_NAME","components","personFinder","wrapper","body","group","loadMore","stringName","fallback","errorMessage","minSearchLength","noResults","emptySearch","item","chaynsId","commonSites","groupName","person","site","uac","lastOnline","fewMinutes","minutes","today","yesterday","days","months","years"],"sources":["../../../src/constants/textStrings.ts"],"sourcesContent":["export const PERSON_FINDER_TEXTSTRING_LIBRARY_NAME = '@chayns-components-person-finder';\n\nexport default {\n components: {\n personFinder: {\n wrapper: {\n body: {\n group: {\n loadMore: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_wrapper_body_group_loadMore',\n fallback: 'Mehr',\n },\n errorMessage: {\n minSearchLength: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_wrapper_body_group_errorMessage_minSearchLength',\n fallback: 'Gib einen Suchbegriff mit mindestens drei Zeichen ein.',\n },\n noResults: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_wrapper_body_group_errorMessage_noResults',\n fallback:\n 'Es konnten keine ##groupName## zu der Suche \"##search##\" gefunden werden.',\n },\n emptySearch: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_wrapper_body_group_errorMessage_emptySearch',\n fallback:\n 'Gib einen Suchbegriff ein, um nach ##groupName## zu suchen.',\n },\n },\n },\n },\n item: {\n chaynsId: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_wrapper_item_chaynsId',\n fallback: 'chaynsID: ##id##',\n },\n commonSites: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_wrapper_item_commonSites',\n fallback: '##count## gemeinsame Sites',\n },\n },\n },\n groupName: {\n person: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_groupName_person',\n fallback: 'Personen',\n },\n site: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_groupName_site',\n fallback: 'Sites',\n },\n uac: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_groupName_uac',\n fallback: 'UAC Gruppen',\n },\n },\n lastOnline: {\n fewMinutes: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_lastOnline_fewMinutes',\n fallback: 'zul. online vor wenigen Minuten',\n },\n minutes: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_lastOnline_minutes',\n fallback: 'zul. online vor ##minutes## Minuten',\n },\n today: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_lastOnline_today',\n fallback: 'zul. online heute um ##time## Uhr',\n },\n yesterday: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_lastOnline_yesterday',\n fallback: 'zul. online gestern um ##time## Uhr',\n },\n days: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_lastOnline_days',\n fallback: 'zul. online vor ##days## Tagen',\n },\n months: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_lastOnline_months',\n fallback: 'zul. online vor ##months## Monaten',\n },\n years: {\n stringName:\n 'txt_chayns_components_person_finder_components_personFinder_lastOnline_years',\n fallback: 'zul. online vor ##years## Jahren',\n },\n },\n },\n },\n} as const;\n"],"mappings":"AAAA,OAAO,MAAMA,qCAAqC,GAAG,kCAAkC;AAEvF,eAAe;EACXC,UAAU,EAAE;IACRC,YAAY,EAAE;MACVC,OAAO,EAAE;QACLC,IAAI,EAAE;UACFC,KAAK,EAAE;YACHC,QAAQ,EAAE;cACNC,UAAU,EACN,yFAAyF;cAC7FC,QAAQ,EAAE;YACd,CAAC;YACDC,YAAY,EAAE;cACVC,eAAe,EAAE;gBACbH,UAAU,EACN,6GAA6G;gBACjHC,QAAQ,EAAE;cACd,CAAC;cACDG,SAAS,EAAE;gBACPJ,UAAU,EACN,uGAAuG;gBAC3GC,QAAQ,EACJ;cACR,CAAC;cACDI,WAAW,EAAE;gBACTL,UAAU,EACN,yGAAyG;gBAC7GC,QAAQ,EACJ;cACR;YACJ;UACJ;QACJ,CAAC;QACDK,IAAI,EAAE;UACFC,QAAQ,EAAE;YACNP,UAAU,EACN,mFAAmF;YACvFC,QAAQ,EAAE;UACd,CAAC;UACDO,WAAW,EAAE;YACTR,UAAU,EACN,sFAAsF;YAC1FC,QAAQ,EAAE;UACd;QACJ;MACJ,CAAC;MACDQ,SAAS,EAAE;QACPC,MAAM,EAAE;UACJV,UAAU,EACN,8EAA8E;UAClFC,QAAQ,EAAE;QACd,CAAC;QACDU,IAAI,EAAE;UACFX,UAAU,EACN,4EAA4E;UAChFC,QAAQ,EAAE;QACd,CAAC;QACDW,GAAG,EAAE;UACDZ,UAAU,EACN,2EAA2E;UAC/EC,QAAQ,EAAE;QACd;MACJ,CAAC;MACDY,UAAU,EAAE;QACRC,UAAU,EAAE;UACRd,UAAU,EACN,mFAAmF;UACvFC,QAAQ,EAAE;QACd,CAAC;QACDc,OAAO,EAAE;UACLf,UAAU,EACN,gFAAgF;UACpFC,QAAQ,EAAE;QACd,CAAC;QACDe,KAAK,EAAE;UACHhB,UAAU,EACN,8EAA8E;UAClFC,QAAQ,EAAE;QACd,CAAC;QACDgB,SAAS,EAAE;UACPjB,UAAU,EACN,kFAAkF;UACtFC,QAAQ,EAAE;QACd,CAAC;QACDiB,IAAI,EAAE;UACFlB,UAAU,EACN,6EAA6E;UACjFC,QAAQ,EAAE;QACd,CAAC;QACDkB,MAAM,EAAE;UACJnB,UAAU,EACN,+EAA+E;UACnFC,QAAQ,EAAE;QACd,CAAC;QACDmB,KAAK,EAAE;UACHpB,UAAU,EACN,8EAA8E;UAClFC,QAAQ,EAAE;QACd;MACJ;IACJ;EACJ;AACJ,CAAC","ignoreList":[]}
@@ -1,9 +1,10 @@
1
1
  import React, { useEffect, useMemo, useState } from 'react';
2
2
  import { LoadingState } from '../types/personFinder';
3
- import { isSiteEntry } from '../utils/personFinder';
3
+ import { formatLastOnline, getPersonFinderTextstringValue, isSiteEntry } from '../utils/personFinder';
4
4
  import { VerificationBadge } from '@chayns-components/core';
5
5
  import { usePersonFinder } from '../components/PersonFinderProvider';
6
6
  import { StyledPersonFinderGroupErrorMessage } from '../components/person-finder/person-finder-wrapper/person-finder-body/person-finder-group/PersonFinderGroup.styles';
7
+ import textStrings from '../constants/textStrings';
7
8
  export const useClosestElementAbove = (containerRef, itemClass) => {
8
9
  const [closestElement, setClosestElement] = useState(null);
9
10
  useEffect(() => {
@@ -37,6 +38,7 @@ export const useClosestElementAbove = (containerRef, itemClass) => {
37
38
  };
38
39
  export const usePersonFinderItem = entry => {
39
40
  const isSite = isSiteEntry(entry);
41
+ const ts = textStrings.components.personFinder;
40
42
  const {
41
43
  url,
42
44
  commonSites,
@@ -44,12 +46,31 @@ export const usePersonFinderItem = entry => {
44
46
  firstName,
45
47
  lastName,
46
48
  id,
47
- isVerified
49
+ isVerified,
50
+ lastOnlineTime
48
51
  } = entry;
49
52
  const imageUrl = `https://sub60.tobit.com/${isSite ? 'l' : 'u'}/${id}?size=120`;
50
53
  const titleElement = isVerified && /*#__PURE__*/React.createElement(VerificationBadge, null);
51
54
  const title = isSite ? name : `${firstName ?? ''} ${lastName ?? ''}`;
52
- const subtitle = isSite ? url : `chaynsID: ${id}${commonSites ? ` - ${commonSites} gemeinsame Sites` : ''}`;
55
+ let subtitle = getPersonFinderTextstringValue({
56
+ textstring: ts.wrapper.item.chaynsId,
57
+ replacements: {
58
+ id: id
59
+ }
60
+ });
61
+ if (lastOnlineTime) {
62
+ subtitle += ` - ${formatLastOnline(new Date(lastOnlineTime))}`;
63
+ } else if (commonSites) {
64
+ subtitle += ` - ${getPersonFinderTextstringValue({
65
+ textstring: ts.wrapper.item.commonSites,
66
+ replacements: {
67
+ count: commonSites
68
+ }
69
+ })}`;
70
+ }
71
+ if (isSite) {
72
+ subtitle = url;
73
+ }
53
74
  return {
54
75
  isSite,
55
76
  title,
@@ -96,18 +117,32 @@ export const useErrorMessage = ({
96
117
  entries,
97
118
  groupName,
98
119
  areOnlyFriendsGiven
99
- }) => useMemo(() => {
120
+ }) => {
121
+ const ts = textStrings.components.personFinder.wrapper.body.group.errorMessage;
100
122
  if (search.length <= 2 && !areOnlyFriendsGiven) {
101
- return /*#__PURE__*/React.createElement(StyledPersonFinderGroupErrorMessage, null, "Gib einen Suchbegriff mit mindestens drei Zeichen ein.");
123
+ return /*#__PURE__*/React.createElement(StyledPersonFinderGroupErrorMessage, null, getPersonFinderTextstringValue({
124
+ textstring: ts.minSearchLength
125
+ }));
102
126
  }
103
127
  if (entries.length === 0) {
104
128
  if (loadingState === LoadingState.Error && search.length) {
105
- return /*#__PURE__*/React.createElement(StyledPersonFinderGroupErrorMessage, null, "Es konnten keine ", groupName, " zu der Suche \"", search, "\" gefunden werden.");
129
+ return /*#__PURE__*/React.createElement(StyledPersonFinderGroupErrorMessage, null, getPersonFinderTextstringValue({
130
+ textstring: ts.noResults,
131
+ replacements: {
132
+ groupName,
133
+ search
134
+ }
135
+ }));
106
136
  }
107
137
  if (search.length === 0) {
108
- return /*#__PURE__*/React.createElement(StyledPersonFinderGroupErrorMessage, null, "Gib einen Suchbegriff ein, um nach ", groupName, " zu suchen.");
138
+ return /*#__PURE__*/React.createElement(StyledPersonFinderGroupErrorMessage, null, getPersonFinderTextstringValue({
139
+ textstring: ts.emptySearch,
140
+ replacements: {
141
+ groupName
142
+ }
143
+ }));
109
144
  }
110
145
  }
111
146
  return null;
112
- }, [areOnlyFriendsGiven, entries.length, groupName, loadingState, search]);
147
+ };
113
148
  //# sourceMappingURL=personFinder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"personFinder.js","names":["React","useEffect","useMemo","useState","LoadingState","isSiteEntry","VerificationBadge","usePersonFinder","StyledPersonFinderGroupErrorMessage","useClosestElementAbove","containerRef","itemClass","closestElement","setClosestElement","updateClosestElement","current","container","items","Array","from","getElementsByClassName","containerRect","getBoundingClientRect","closest","minDistance","Infinity","forEach","item","rect","distance","Math","abs","bottom","top","addEventListener","removeEventListener","textContent","usePersonFinderItem","entry","isSite","url","commonSites","name","firstName","lastName","id","isVerified","imageUrl","titleElement","createElement","title","subtitle","usePersonFinderSmallItem","useFriends","personId","friends","removeFriend","addFriend","isFriend","map","includes","useOnlyFriends","entries","length","friendIds","Set","friend","every","has","useErrorMessage","loadingState","search","groupName","areOnlyFriendsGiven","Error"],"sources":["../../../src/hooks/personFinder.tsx"],"sourcesContent":["import React, { RefObject, useEffect, useMemo, useState } from 'react';\nimport {\n LoadingState,\n PersonEntry,\n PersonFinderEntry,\n SiteEntry,\n UACEntry,\n} from '../types/personFinder';\nimport { isSiteEntry } from '../utils/personFinder';\nimport { VerificationBadge } from '@chayns-components/core';\nimport { usePersonFinder } from '../components/PersonFinderProvider';\nimport { StyledPersonFinderGroupErrorMessage } from '../components/person-finder/person-finder-wrapper/person-finder-body/person-finder-group/PersonFinderGroup.styles';\n\nexport const useClosestElementAbove = (containerRef: RefObject<HTMLElement>, itemClass: string) => {\n const [closestElement, setClosestElement] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n const updateClosestElement = () => {\n if (!containerRef.current) return;\n\n const container = containerRef.current;\n const items = Array.from(container.getElementsByClassName(itemClass)) as HTMLElement[];\n const containerRect = container.getBoundingClientRect();\n\n let closest: HTMLElement | null = null;\n let minDistance = Infinity;\n\n items.forEach((item) => {\n const rect = item.getBoundingClientRect();\n const distance = Math.abs(rect.bottom - containerRect.top);\n\n if (rect.bottom < containerRect.top && distance < minDistance) {\n minDistance = distance;\n closest = item;\n }\n });\n\n setClosestElement(closest);\n };\n\n const container = containerRef.current;\n if (container) {\n container.addEventListener('scroll', updateClosestElement);\n updateClosestElement();\n }\n\n return () => {\n container?.removeEventListener('scroll', updateClosestElement);\n };\n }, [containerRef, itemClass]);\n\n return closestElement?.textContent;\n};\n\nexport const usePersonFinderItem = (entry: PersonFinderEntry) => {\n const isSite = isSiteEntry(entry as PersonEntry | SiteEntry);\n\n const { url, commonSites, name, firstName, lastName, id, isVerified } = entry as PersonEntry &\n SiteEntry;\n\n const imageUrl = `https://sub60.tobit.com/${isSite ? 'l' : 'u'}/${id as string}?size=120`;\n const titleElement = isVerified && <VerificationBadge />;\n const title = isSite ? name : `${(firstName as string) ?? ''} ${(lastName as string) ?? ''}`;\n const subtitle = isSite\n ? url\n : `chaynsID: ${id as string}${commonSites ? ` - ${commonSites as number} gemeinsame Sites` : ''}`;\n\n return {\n isSite,\n title,\n subtitle,\n imageUrl,\n titleElement,\n };\n};\n\nexport const usePersonFinderSmallItem = (entry: PersonFinderEntry) => {\n const { name } = entry as UACEntry;\n\n return {\n title: name,\n };\n};\n\nexport const useFriends = (personId: string) => {\n const { friends, removeFriend, addFriend } = usePersonFinder();\n\n const isFriend = friends?.map((entry) => entry.id).includes(personId);\n\n return {\n isFriend,\n addFriend,\n removeFriend,\n };\n};\n\nexport const useOnlyFriends = (entries: PersonFinderEntry[]) => {\n const { friends } = usePersonFinder();\n\n return useMemo(() => {\n if (!entries?.length) return false;\n if (!friends?.length) return false;\n\n const friendIds = new Set(friends.map((friend) => friend.id));\n\n return entries.every((entry) => friendIds.has(entry.id as string));\n }, [entries, friends]);\n};\n\ninterface UseErrorMessageOptions {\n loadingState: LoadingState;\n search: string;\n entries: PersonFinderEntry[];\n groupName?: string;\n areOnlyFriendsGiven?: boolean;\n}\n\nexport const useErrorMessage = ({\n loadingState,\n search,\n entries,\n groupName,\n areOnlyFriendsGiven,\n}: UseErrorMessageOptions) =>\n useMemo(() => {\n if (search.length <= 2 && !areOnlyFriendsGiven) {\n return (\n <StyledPersonFinderGroupErrorMessage>\n Gib einen Suchbegriff mit mindestens drei Zeichen ein.\n </StyledPersonFinderGroupErrorMessage>\n );\n }\n\n if (entries.length === 0) {\n if (loadingState === LoadingState.Error && search.length) {\n return (\n <StyledPersonFinderGroupErrorMessage>\n Es konnten keine {groupName} zu der Suche &#34;\n {search}&#34; gefunden werden.\n </StyledPersonFinderGroupErrorMessage>\n );\n }\n\n if (search.length === 0) {\n return (\n <StyledPersonFinderGroupErrorMessage>\n Gib einen Suchbegriff ein, um nach {groupName} zu suchen.\n </StyledPersonFinderGroupErrorMessage>\n );\n }\n }\n\n return null;\n }, [areOnlyFriendsGiven, entries.length, groupName, loadingState, search]);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"personFinder.js","names":["React","useEffect","useMemo","useState","LoadingState","formatLastOnline","getPersonFinderTextstringValue","isSiteEntry","VerificationBadge","usePersonFinder","StyledPersonFinderGroupErrorMessage","textStrings","useClosestElementAbove","containerRef","itemClass","closestElement","setClosestElement","updateClosestElement","current","container","items","Array","from","getElementsByClassName","containerRect","getBoundingClientRect","closest","minDistance","Infinity","forEach","item","rect","distance","Math","abs","bottom","top","addEventListener","removeEventListener","textContent","usePersonFinderItem","entry","isSite","ts","components","personFinder","url","commonSites","name","firstName","lastName","id","isVerified","lastOnlineTime","imageUrl","titleElement","createElement","title","subtitle","textstring","wrapper","chaynsId","replacements","Date","count","usePersonFinderSmallItem","useFriends","personId","friends","removeFriend","addFriend","isFriend","map","includes","useOnlyFriends","entries","length","friendIds","Set","friend","every","has","useErrorMessage","loadingState","search","groupName","areOnlyFriendsGiven","body","group","errorMessage","minSearchLength","Error","noResults","emptySearch"],"sources":["../../../src/hooks/personFinder.tsx"],"sourcesContent":["import React, { RefObject, useEffect, useMemo, useState } from 'react';\nimport {\n LoadingState,\n PersonEntry,\n PersonFinderEntry,\n SiteEntry,\n UACEntry,\n} from '../types/personFinder';\nimport {\n formatLastOnline,\n getPersonFinderTextstringValue,\n isSiteEntry,\n} from '../utils/personFinder';\nimport { VerificationBadge } from '@chayns-components/core';\nimport { usePersonFinder } from '../components/PersonFinderProvider';\nimport { StyledPersonFinderGroupErrorMessage } from '../components/person-finder/person-finder-wrapper/person-finder-body/person-finder-group/PersonFinderGroup.styles';\nimport textStrings from '../constants/textStrings';\n\nexport const useClosestElementAbove = (containerRef: RefObject<HTMLElement>, itemClass: string) => {\n const [closestElement, setClosestElement] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n const updateClosestElement = () => {\n if (!containerRef.current) return;\n\n const container = containerRef.current;\n const items = Array.from(container.getElementsByClassName(itemClass)) as HTMLElement[];\n const containerRect = container.getBoundingClientRect();\n\n let closest: HTMLElement | null = null;\n let minDistance = Infinity;\n\n items.forEach((item) => {\n const rect = item.getBoundingClientRect();\n const distance = Math.abs(rect.bottom - containerRect.top);\n\n if (rect.bottom < containerRect.top && distance < minDistance) {\n minDistance = distance;\n closest = item;\n }\n });\n\n setClosestElement(closest);\n };\n\n const container = containerRef.current;\n if (container) {\n container.addEventListener('scroll', updateClosestElement);\n updateClosestElement();\n }\n\n return () => {\n container?.removeEventListener('scroll', updateClosestElement);\n };\n }, [containerRef, itemClass]);\n\n return closestElement?.textContent;\n};\n\nexport const usePersonFinderItem = (entry: PersonFinderEntry) => {\n const isSite = isSiteEntry(entry as PersonEntry | SiteEntry);\n const ts = textStrings.components.personFinder;\n\n const { url, commonSites, name, firstName, lastName, id, isVerified, lastOnlineTime } =\n entry as PersonEntry & SiteEntry;\n\n const imageUrl = `https://sub60.tobit.com/${isSite ? 'l' : 'u'}/${id as string}?size=120`;\n const titleElement = isVerified && <VerificationBadge />;\n const title = isSite ? name : `${(firstName as string) ?? ''} ${(lastName as string) ?? ''}`;\n\n let subtitle = getPersonFinderTextstringValue({\n textstring: ts.wrapper.item.chaynsId,\n replacements: { id: id as string },\n });\n\n if (lastOnlineTime) {\n subtitle += ` - ${formatLastOnline(new Date(lastOnlineTime))}`;\n } else if (commonSites) {\n subtitle += ` - ${getPersonFinderTextstringValue({\n textstring: ts.wrapper.item.commonSites,\n replacements: { count: commonSites as number },\n })}`;\n }\n\n if (isSite) {\n subtitle = url;\n }\n\n return {\n isSite,\n title,\n subtitle,\n imageUrl,\n titleElement,\n };\n};\n\nexport const usePersonFinderSmallItem = (entry: PersonFinderEntry) => {\n const { name } = entry as UACEntry;\n\n return {\n title: name,\n };\n};\n\nexport const useFriends = (personId: string) => {\n const { friends, removeFriend, addFriend } = usePersonFinder();\n\n const isFriend = friends?.map((entry) => entry.id).includes(personId);\n\n return {\n isFriend,\n addFriend,\n removeFriend,\n };\n};\n\nexport const useOnlyFriends = (entries: PersonFinderEntry[]) => {\n const { friends } = usePersonFinder();\n\n return useMemo(() => {\n if (!entries?.length) return false;\n if (!friends?.length) return false;\n\n const friendIds = new Set(friends.map((friend) => friend.id));\n\n return entries.every((entry) => friendIds.has(entry.id as string));\n }, [entries, friends]);\n};\n\ninterface UseErrorMessageOptions {\n loadingState: LoadingState;\n search: string;\n entries: PersonFinderEntry[];\n groupName?: string;\n areOnlyFriendsGiven?: boolean;\n}\n\nexport const useErrorMessage = ({\n loadingState,\n search,\n entries,\n groupName,\n areOnlyFriendsGiven,\n}: UseErrorMessageOptions) => {\n const ts = textStrings.components.personFinder.wrapper.body.group.errorMessage;\n\n if (search.length <= 2 && !areOnlyFriendsGiven) {\n return (\n <StyledPersonFinderGroupErrorMessage>\n {getPersonFinderTextstringValue({ textstring: ts.minSearchLength })}\n </StyledPersonFinderGroupErrorMessage>\n );\n }\n\n if (entries.length === 0) {\n if (loadingState === LoadingState.Error && search.length) {\n return (\n <StyledPersonFinderGroupErrorMessage>\n {getPersonFinderTextstringValue({\n textstring: ts.noResults,\n replacements: {\n groupName,\n search,\n },\n })}\n </StyledPersonFinderGroupErrorMessage>\n );\n }\n\n if (search.length === 0) {\n return (\n <StyledPersonFinderGroupErrorMessage>\n {getPersonFinderTextstringValue({\n textstring: ts.emptySearch,\n replacements: { groupName },\n })}\n </StyledPersonFinderGroupErrorMessage>\n );\n }\n }\n\n return null;\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAeC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACtE,SACIC,YAAY,QAKT,uBAAuB;AAC9B,SACIC,gBAAgB,EAChBC,8BAA8B,EAC9BC,WAAW,QACR,uBAAuB;AAC9B,SAASC,iBAAiB,QAAQ,yBAAyB;AAC3D,SAASC,eAAe,QAAQ,oCAAoC;AACpE,SAASC,mCAAmC,QAAQ,mHAAmH;AACvK,OAAOC,WAAW,MAAM,0BAA0B;AAElD,OAAO,MAAMC,sBAAsB,GAAGA,CAACC,YAAoC,EAAEC,SAAiB,KAAK;EAC/F,MAAM,CAACC,cAAc,EAAEC,iBAAiB,CAAC,GAAGb,QAAQ,CAAqB,IAAI,CAAC;EAE9EF,SAAS,CAAC,MAAM;IACZ,MAAMgB,oBAAoB,GAAGA,CAAA,KAAM;MAC/B,IAAI,CAACJ,YAAY,CAACK,OAAO,EAAE;MAE3B,MAAMC,SAAS,GAAGN,YAAY,CAACK,OAAO;MACtC,MAAME,KAAK,GAAGC,KAAK,CAACC,IAAI,CAACH,SAAS,CAACI,sBAAsB,CAACT,SAAS,CAAC,CAAkB;MACtF,MAAMU,aAAa,GAAGL,SAAS,CAACM,qBAAqB,CAAC,CAAC;MAEvD,IAAIC,OAA2B,GAAG,IAAI;MACtC,IAAIC,WAAW,GAAGC,QAAQ;MAE1BR,KAAK,CAACS,OAAO,CAAEC,IAAI,IAAK;QACpB,MAAMC,IAAI,GAAGD,IAAI,CAACL,qBAAqB,CAAC,CAAC;QACzC,MAAMO,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAACH,IAAI,CAACI,MAAM,GAAGX,aAAa,CAACY,GAAG,CAAC;QAE1D,IAAIL,IAAI,CAACI,MAAM,GAAGX,aAAa,CAACY,GAAG,IAAIJ,QAAQ,GAAGL,WAAW,EAAE;UAC3DA,WAAW,GAAGK,QAAQ;UACtBN,OAAO,GAAGI,IAAI;QAClB;MACJ,CAAC,CAAC;MAEFd,iBAAiB,CAACU,OAAO,CAAC;IAC9B,CAAC;IAED,MAAMP,SAAS,GAAGN,YAAY,CAACK,OAAO;IACtC,IAAIC,SAAS,EAAE;MACXA,SAAS,CAACkB,gBAAgB,CAAC,QAAQ,EAAEpB,oBAAoB,CAAC;MAC1DA,oBAAoB,CAAC,CAAC;IAC1B;IAEA,OAAO,MAAM;MACTE,SAAS,EAAEmB,mBAAmB,CAAC,QAAQ,EAAErB,oBAAoB,CAAC;IAClE,CAAC;EACL,CAAC,EAAE,CAACJ,YAAY,EAAEC,SAAS,CAAC,CAAC;EAE7B,OAAOC,cAAc,EAAEwB,WAAW;AACtC,CAAC;AAED,OAAO,MAAMC,mBAAmB,GAAIC,KAAwB,IAAK;EAC7D,MAAMC,MAAM,GAAGnC,WAAW,CAACkC,KAAgC,CAAC;EAC5D,MAAME,EAAE,GAAGhC,WAAW,CAACiC,UAAU,CAACC,YAAY;EAE9C,MAAM;IAAEC,GAAG;IAAEC,WAAW;IAAEC,IAAI;IAAEC,SAAS;IAAEC,QAAQ;IAAEC,EAAE;IAAEC,UAAU;IAAEC;EAAe,CAAC,GACjFZ,KAAgC;EAEpC,MAAMa,QAAQ,GAAG,2BAA2BZ,MAAM,GAAG,GAAG,GAAG,GAAG,IAAIS,EAAE,WAAqB;EACzF,MAAMI,YAAY,GAAGH,UAAU,iBAAIpD,KAAA,CAAAwD,aAAA,CAAChD,iBAAiB,MAAE,CAAC;EACxD,MAAMiD,KAAK,GAAGf,MAAM,GAAGM,IAAI,GAAG,GAAIC,SAAS,IAAe,EAAE,IAAKC,QAAQ,IAAe,EAAE,EAAE;EAE5F,IAAIQ,QAAQ,GAAGpD,8BAA8B,CAAC;IAC1CqD,UAAU,EAAEhB,EAAE,CAACiB,OAAO,CAAC9B,IAAI,CAAC+B,QAAQ;IACpCC,YAAY,EAAE;MAAEX,EAAE,EAAEA;IAAa;EACrC,CAAC,CAAC;EAEF,IAAIE,cAAc,EAAE;IAChBK,QAAQ,IAAI,MAAMrD,gBAAgB,CAAC,IAAI0D,IAAI,CAACV,cAAc,CAAC,CAAC,EAAE;EAClE,CAAC,MAAM,IAAIN,WAAW,EAAE;IACpBW,QAAQ,IAAI,MAAMpD,8BAA8B,CAAC;MAC7CqD,UAAU,EAAEhB,EAAE,CAACiB,OAAO,CAAC9B,IAAI,CAACiB,WAAW;MACvCe,YAAY,EAAE;QAAEE,KAAK,EAAEjB;MAAsB;IACjD,CAAC,CAAC,EAAE;EACR;EAEA,IAAIL,MAAM,EAAE;IACRgB,QAAQ,GAAGZ,GAAG;EAClB;EAEA,OAAO;IACHJ,MAAM;IACNe,KAAK;IACLC,QAAQ;IACRJ,QAAQ;IACRC;EACJ,CAAC;AACL,CAAC;AAED,OAAO,MAAMU,wBAAwB,GAAIxB,KAAwB,IAAK;EAClE,MAAM;IAAEO;EAAK,CAAC,GAAGP,KAAiB;EAElC,OAAO;IACHgB,KAAK,EAAET;EACX,CAAC;AACL,CAAC;AAED,OAAO,MAAMkB,UAAU,GAAIC,QAAgB,IAAK;EAC5C,MAAM;IAAEC,OAAO;IAAEC,YAAY;IAAEC;EAAU,CAAC,GAAG7D,eAAe,CAAC,CAAC;EAE9D,MAAM8D,QAAQ,GAAGH,OAAO,EAAEI,GAAG,CAAE/B,KAAK,IAAKA,KAAK,CAACU,EAAE,CAAC,CAACsB,QAAQ,CAACN,QAAQ,CAAC;EAErE,OAAO;IACHI,QAAQ;IACRD,SAAS;IACTD;EACJ,CAAC;AACL,CAAC;AAED,OAAO,MAAMK,cAAc,GAAIC,OAA4B,IAAK;EAC5D,MAAM;IAAEP;EAAQ,CAAC,GAAG3D,eAAe,CAAC,CAAC;EAErC,OAAOP,OAAO,CAAC,MAAM;IACjB,IAAI,CAACyE,OAAO,EAAEC,MAAM,EAAE,OAAO,KAAK;IAClC,IAAI,CAACR,OAAO,EAAEQ,MAAM,EAAE,OAAO,KAAK;IAElC,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAACV,OAAO,CAACI,GAAG,CAAEO,MAAM,IAAKA,MAAM,CAAC5B,EAAE,CAAC,CAAC;IAE7D,OAAOwB,OAAO,CAACK,KAAK,CAAEvC,KAAK,IAAKoC,SAAS,CAACI,GAAG,CAACxC,KAAK,CAACU,EAAY,CAAC,CAAC;EACtE,CAAC,EAAE,CAACwB,OAAO,EAAEP,OAAO,CAAC,CAAC;AAC1B,CAAC;AAUD,OAAO,MAAMc,eAAe,GAAGA,CAAC;EAC5BC,YAAY;EACZC,MAAM;EACNT,OAAO;EACPU,SAAS;EACTC;AACoB,CAAC,KAAK;EAC1B,MAAM3C,EAAE,GAAGhC,WAAW,CAACiC,UAAU,CAACC,YAAY,CAACe,OAAO,CAAC2B,IAAI,CAACC,KAAK,CAACC,YAAY;EAE9E,IAAIL,MAAM,CAACR,MAAM,IAAI,CAAC,IAAI,CAACU,mBAAmB,EAAE;IAC5C,oBACItF,KAAA,CAAAwD,aAAA,CAAC9C,mCAAmC,QAC/BJ,8BAA8B,CAAC;MAAEqD,UAAU,EAAEhB,EAAE,CAAC+C;IAAgB,CAAC,CACjC,CAAC;EAE9C;EAEA,IAAIf,OAAO,CAACC,MAAM,KAAK,CAAC,EAAE;IACtB,IAAIO,YAAY,KAAK/E,YAAY,CAACuF,KAAK,IAAIP,MAAM,CAACR,MAAM,EAAE;MACtD,oBACI5E,KAAA,CAAAwD,aAAA,CAAC9C,mCAAmC,QAC/BJ,8BAA8B,CAAC;QAC5BqD,UAAU,EAAEhB,EAAE,CAACiD,SAAS;QACxB9B,YAAY,EAAE;UACVuB,SAAS;UACTD;QACJ;MACJ,CAAC,CACgC,CAAC;IAE9C;IAEA,IAAIA,MAAM,CAACR,MAAM,KAAK,CAAC,EAAE;MACrB,oBACI5E,KAAA,CAAAwD,aAAA,CAAC9C,mCAAmC,QAC/BJ,8BAA8B,CAAC;QAC5BqD,UAAU,EAAEhB,EAAE,CAACkD,WAAW;QAC1B/B,YAAY,EAAE;UAAEuB;QAAU;MAC9B,CAAC,CACgC,CAAC;IAE9C;EACJ;EAEA,OAAO,IAAI;AACf,CAAC","ignoreList":[]}
package/lib/esm/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export { default as PersonFinder } from './components/person-finder/PersonFinder';
2
- export { PersonFinderFilterTypes, Priority } from './types/personFinder';
2
+ export { PersonFinderFilterTypes, Priority, RelationMode } from './types/personFinder';
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["default","PersonFinder","PersonFinderFilterTypes","Priority"],"sources":["../../src/index.ts"],"sourcesContent":["export { default as PersonFinder } from './components/person-finder/PersonFinder';\nexport { type PersonFinderRef } from './components/person-finder/person-finder-wrapper/PersonFinderWrapper';\nexport {\n PersonFinderFilterTypes,\n Priority,\n type PersonEntry,\n type DefaultEntry,\n type SiteEntry,\n type PersonFinderEntry,\n type UACFilter,\n type UACEntry,\n} from './types/personFinder';\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,YAAY,QAAQ,yCAAyC;AAEjF,SACIC,uBAAuB,EACvBC,QAAQ,QAOL,sBAAsB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["default","PersonFinder","PersonFinderFilterTypes","Priority","RelationMode"],"sources":["../../src/index.ts"],"sourcesContent":["export { default as PersonFinder } from './components/person-finder/PersonFinder';\nexport { type PersonFinderRef } from './components/person-finder/person-finder-wrapper/PersonFinderWrapper';\nexport {\n PersonFinderFilterTypes,\n Priority,\n RelationMode,\n type PersonEntry,\n type DefaultEntry,\n type SiteEntry,\n type PersonFinderEntry,\n type UACFilter,\n type UACEntry,\n} from './types/personFinder';\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,YAAY,QAAQ,yCAAyC;AAEjF,SACIC,uBAAuB,EACvBC,QAAQ,EACRC,YAAY,QAOT,sBAAsB","ignoreList":[]}
@@ -9,6 +9,11 @@ export let Priority = /*#__PURE__*/function (Priority) {
9
9
  Priority[Priority["NORMAL"] = 1] = "NORMAL";
10
10
  return Priority;
11
11
  }({});
12
+ export let RelationMode = /*#__PURE__*/function (RelationMode) {
13
+ RelationMode["PERSON"] = "person";
14
+ RelationMode["SITE"] = "site";
15
+ return RelationMode;
16
+ }({});
12
17
  export let LoadingState = /*#__PURE__*/function (LoadingState) {
13
18
  LoadingState["None"] = "none";
14
19
  LoadingState["Pending"] = "pending";
@@ -1 +1 @@
1
- {"version":3,"file":"personFinder.js","names":["PersonFinderFilterTypes","Priority","LoadingState"],"sources":["../../../src/types/personFinder.ts"],"sourcesContent":["export enum PersonFinderFilterTypes {\n PERSON = 'person',\n SITE = 'site',\n UAC = 'uac',\n}\n\nexport enum Priority {\n HIGH,\n NORMAL,\n}\n\nexport interface PersonFinderData {\n searchString: string;\n count: number;\n skip: number;\n entries: PersonFinderEntry[];\n}\n\nexport type PersonFinderDataMap = {\n [K in PersonFinderFilterTypes]?: PersonFinderData;\n};\n\nexport interface UACFilter {\n groupId: number;\n}\n\nexport enum LoadingState {\n None = 'none',\n Pending = 'pending',\n Success = 'success',\n Error = 'error',\n}\n\nexport type LoadingStateMap = { [K in PersonFinderFilterTypes]?: LoadingState };\n\nexport interface DefaultEntry {\n id: string;\n name: string;\n}\n\nexport type PersonFinderEntry = PersonEntry | SiteEntry | UACEntry;\n\nexport interface PersonEntry {\n id: string;\n firstName: string;\n lastName: string;\n commonSites: number;\n isVerified: boolean;\n type: PersonFinderFilterTypes.PERSON;\n}\n\nexport interface SiteEntry {\n id: string;\n url: string;\n name: string;\n type: PersonFinderFilterTypes.SITE;\n}\n\nexport interface UACEntry {\n id: number;\n name: string;\n isSystemGroup: boolean;\n}\n\nexport interface SiteEntryResult {\n name: string;\n siteId: string;\n locationId: number;\n lastLogin: number | null;\n score: number;\n domain: string;\n}\n\nexport interface PersonEntryResult {\n personId: string;\n userId: number;\n firstName: string;\n lastName: string;\n relationCount: number;\n score: number;\n signOfLife: Date;\n verified: boolean;\n}\n\nexport type ThrottledFunction<T extends (...args: any[]) => any> = {\n (...args: Parameters<T>): ReturnType<T>;\n cancel: () => void;\n flush: () => void;\n};\n"],"mappings":"AAAA,WAAYA,uBAAuB,0BAAvBA,uBAAuB;EAAvBA,uBAAuB;EAAvBA,uBAAuB;EAAvBA,uBAAuB;EAAA,OAAvBA,uBAAuB;AAAA;AAMnC,WAAYC,QAAQ,0BAARA,QAAQ;EAARA,QAAQ,CAARA,QAAQ;EAARA,QAAQ,CAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA;AAoBpB,WAAYC,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"personFinder.js","names":["PersonFinderFilterTypes","Priority","RelationMode","LoadingState"],"sources":["../../../src/types/personFinder.ts"],"sourcesContent":["export enum PersonFinderFilterTypes {\n PERSON = 'person',\n SITE = 'site',\n UAC = 'uac',\n}\n\nexport enum Priority {\n HIGH,\n NORMAL,\n}\n\nexport enum RelationMode {\n PERSON = 'person',\n SITE = 'site',\n}\n\nexport interface PersonFinderData {\n searchString: string;\n count: number;\n skip: number;\n entries: PersonFinderEntry[];\n}\n\nexport type PersonFinderDataMap = {\n [K in PersonFinderFilterTypes]?: PersonFinderData;\n};\n\nexport interface UACFilter {\n groupId: number;\n}\n\nexport enum LoadingState {\n None = 'none',\n Pending = 'pending',\n Success = 'success',\n Error = 'error',\n}\n\nexport type LoadingStateMap = { [K in PersonFinderFilterTypes]?: LoadingState };\n\nexport interface DefaultEntry {\n id: string;\n name: string;\n}\n\nexport type PersonFinderEntry = PersonEntry | SiteEntry | UACEntry;\n\nexport interface PersonEntry {\n id: string;\n firstName: string;\n lastName: string;\n commonSites: number;\n isVerified: boolean;\n type: PersonFinderFilterTypes.PERSON;\n lastOnlineTime?: Date;\n}\n\nexport interface SiteEntry {\n id: string;\n url: string;\n name: string;\n type: PersonFinderFilterTypes.SITE;\n}\n\nexport interface UACEntry {\n id: number;\n name: string;\n isSystemGroup: boolean;\n}\n\nexport interface SiteEntryResult {\n name: string;\n siteId: string;\n locationId: number;\n lastLogin: number | null;\n score: number;\n domain: string;\n}\n\nexport interface PersonEntryResult {\n personId: string;\n userId: number;\n firstName: string;\n lastName: string;\n relationCount: number;\n score: number;\n signOfLife: Date;\n verified: boolean;\n}\n\nexport type ThrottledFunction<T extends (...args: any[]) => any> = {\n (...args: Parameters<T>): ReturnType<T>;\n cancel: () => void;\n flush: () => void;\n};\n"],"mappings":"AAAA,WAAYA,uBAAuB,0BAAvBA,uBAAuB;EAAvBA,uBAAuB;EAAvBA,uBAAuB;EAAvBA,uBAAuB;EAAA,OAAvBA,uBAAuB;AAAA;AAMnC,WAAYC,QAAQ,0BAARA,QAAQ;EAARA,QAAQ,CAARA,QAAQ;EAARA,QAAQ,CAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA;AAKpB,WAAYC,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA;AAoBxB,WAAYC,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA","ignoreList":[]}
@@ -5,12 +5,15 @@ export const convertSiteEntry = entries => entries.map(entry => ({
5
5
  url: `https://${entry.domain}`,
6
6
  type: PersonFinderFilterTypes.SITE
7
7
  }));
8
- export const convertPersonEntry = entries => entries.map(entry => ({
8
+ export const convertPersonEntry = (entries, {
9
+ shouldShowLastOnlineTime
10
+ } = {}) => entries.map(entry => ({
9
11
  id: entry.personId,
10
12
  firstName: entry.firstName,
11
13
  lastName: entry.lastName,
12
14
  commonSites: entry.relationCount,
13
15
  isVerified: entry.verified,
14
- type: PersonFinderFilterTypes.PERSON
16
+ type: PersonFinderFilterTypes.PERSON,
17
+ lastOnlineTime: shouldShowLastOnlineTime ? entry.signOfLife : undefined
15
18
  }));
16
19
  //# sourceMappingURL=convert.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","names":["PersonFinderFilterTypes","convertSiteEntry","entries","map","entry","id","siteId","name","url","domain","type","SITE","convertPersonEntry","personId","firstName","lastName","commonSites","relationCount","isVerified","verified","PERSON"],"sources":["../../../src/utils/convert.ts"],"sourcesContent":["import {\n PersonEntry,\n PersonEntryResult,\n PersonFinderFilterTypes,\n SiteEntry,\n SiteEntryResult,\n} from '../types/personFinder';\n\nexport const convertSiteEntry = (entries: SiteEntryResult[]): SiteEntry[] =>\n entries.map((entry) => ({\n id: entry.siteId,\n name: entry.name,\n url: `https://${entry.domain}`,\n type: PersonFinderFilterTypes.SITE,\n }));\n\nexport const convertPersonEntry = (entries: PersonEntryResult[]): PersonEntry[] =>\n entries.map((entry) => ({\n id: entry.personId,\n firstName: entry.firstName,\n lastName: entry.lastName,\n commonSites: entry.relationCount,\n isVerified: entry.verified,\n type: PersonFinderFilterTypes.PERSON,\n }));\n"],"mappings":"AAAA,SAGIA,uBAAuB,QAGpB,uBAAuB;AAE9B,OAAO,MAAMC,gBAAgB,GAAIC,OAA0B,IACvDA,OAAO,CAACC,GAAG,CAAEC,KAAK,KAAM;EACpBC,EAAE,EAAED,KAAK,CAACE,MAAM;EAChBC,IAAI,EAAEH,KAAK,CAACG,IAAI;EAChBC,GAAG,EAAE,WAAWJ,KAAK,CAACK,MAAM,EAAE;EAC9BC,IAAI,EAAEV,uBAAuB,CAACW;AAClC,CAAC,CAAC,CAAC;AAEP,OAAO,MAAMC,kBAAkB,GAAIV,OAA4B,IAC3DA,OAAO,CAACC,GAAG,CAAEC,KAAK,KAAM;EACpBC,EAAE,EAAED,KAAK,CAACS,QAAQ;EAClBC,SAAS,EAAEV,KAAK,CAACU,SAAS;EAC1BC,QAAQ,EAAEX,KAAK,CAACW,QAAQ;EACxBC,WAAW,EAAEZ,KAAK,CAACa,aAAa;EAChCC,UAAU,EAAEd,KAAK,CAACe,QAAQ;EAC1BT,IAAI,EAAEV,uBAAuB,CAACoB;AAClC,CAAC,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"convert.js","names":["PersonFinderFilterTypes","convertSiteEntry","entries","map","entry","id","siteId","name","url","domain","type","SITE","convertPersonEntry","shouldShowLastOnlineTime","personId","firstName","lastName","commonSites","relationCount","isVerified","verified","PERSON","lastOnlineTime","signOfLife","undefined"],"sources":["../../../src/utils/convert.ts"],"sourcesContent":["import {\n PersonEntry,\n PersonEntryResult,\n PersonFinderFilterTypes,\n SiteEntry,\n SiteEntryResult,\n} from '../types/personFinder';\n\nexport const convertSiteEntry = (entries: SiteEntryResult[]): SiteEntry[] =>\n entries.map((entry) => ({\n id: entry.siteId,\n name: entry.name,\n url: `https://${entry.domain}`,\n type: PersonFinderFilterTypes.SITE,\n }));\n\ninterface ConvertPersonEntryOptions {\n shouldShowLastOnlineTime?: boolean;\n}\n\nexport const convertPersonEntry = (\n entries: PersonEntryResult[],\n { shouldShowLastOnlineTime }: ConvertPersonEntryOptions = {},\n): PersonEntry[] =>\n entries.map((entry) => ({\n id: entry.personId,\n firstName: entry.firstName,\n lastName: entry.lastName,\n commonSites: entry.relationCount,\n isVerified: entry.verified,\n type: PersonFinderFilterTypes.PERSON,\n lastOnlineTime: shouldShowLastOnlineTime ? entry.signOfLife : undefined,\n }));\n"],"mappings":"AAAA,SAGIA,uBAAuB,QAGpB,uBAAuB;AAE9B,OAAO,MAAMC,gBAAgB,GAAIC,OAA0B,IACvDA,OAAO,CAACC,GAAG,CAAEC,KAAK,KAAM;EACpBC,EAAE,EAAED,KAAK,CAACE,MAAM;EAChBC,IAAI,EAAEH,KAAK,CAACG,IAAI;EAChBC,GAAG,EAAE,WAAWJ,KAAK,CAACK,MAAM,EAAE;EAC9BC,IAAI,EAAEV,uBAAuB,CAACW;AAClC,CAAC,CAAC,CAAC;AAMP,OAAO,MAAMC,kBAAkB,GAAGA,CAC9BV,OAA4B,EAC5B;EAAEW;AAAoD,CAAC,GAAG,CAAC,CAAC,KAE5DX,OAAO,CAACC,GAAG,CAAEC,KAAK,KAAM;EACpBC,EAAE,EAAED,KAAK,CAACU,QAAQ;EAClBC,SAAS,EAAEX,KAAK,CAACW,SAAS;EAC1BC,QAAQ,EAAEZ,KAAK,CAACY,QAAQ;EACxBC,WAAW,EAAEb,KAAK,CAACc,aAAa;EAChCC,UAAU,EAAEf,KAAK,CAACgB,QAAQ;EAC1BV,IAAI,EAAEV,uBAAuB,CAACqB,MAAM;EACpCC,cAAc,EAAET,wBAAwB,GAAGT,KAAK,CAACmB,UAAU,GAAGC;AAClE,CAAC,CAAC,CAAC","ignoreList":[]}
@@ -1,15 +1,40 @@
1
- import { PersonFinderFilterTypes } from '../types/personFinder';
1
+ import { PersonFinderFilterTypes, RelationMode } from '../types/personFinder';
2
+ import { getTextstringValue, ttsToITextString } from '@chayns-components/textstring';
2
3
  import { getPersons } from '../api/person/get';
3
4
  import { getSites } from '../api/site/get';
4
5
  import { convertPersonEntry, convertSiteEntry } from './convert';
5
6
  import { getUser } from 'chayns-api';
7
+ import textStrings, { PERSON_FINDER_TEXTSTRING_LIBRARY_NAME } from '../constants/textStrings';
8
+ const normalizeTextstringReplacements = replacements => {
9
+ if (!replacements) {
10
+ return undefined;
11
+ }
12
+ return Object.entries(replacements).reduce((acc, [key, value]) => {
13
+ acc[`##${key}##`] = value?.toString() ?? '';
14
+ return acc;
15
+ }, {});
16
+ };
17
+ export const getPersonFinderTextstringValue = ({
18
+ textstring,
19
+ replacements
20
+ }) => getTextstringValue({
21
+ libraryName: PERSON_FINDER_TEXTSTRING_LIBRARY_NAME,
22
+ textstring: ttsToITextString(textstring),
23
+ replacements: normalizeTextstringReplacements(replacements)
24
+ });
6
25
  export const getGroupName = key => {
7
- const names = {
8
- person: 'Personen',
9
- site: 'Sites',
10
- uac: 'UAC Gruppen'
26
+ const groupNames = {
27
+ [PersonFinderFilterTypes.PERSON]: textStrings.components.personFinder.groupName.person,
28
+ [PersonFinderFilterTypes.SITE]: textStrings.components.personFinder.groupName.site,
29
+ [PersonFinderFilterTypes.UAC]: textStrings.components.personFinder.groupName.uac
11
30
  };
12
- return names[key];
31
+ const textstring = groupNames[key];
32
+ if (!textstring) {
33
+ return key;
34
+ }
35
+ return getPersonFinderTextstringValue({
36
+ textstring
37
+ });
13
38
  };
14
39
  export const isSiteEntry = entry => 'name' in entry && !('firstName' in entry);
15
40
  export const filterDataByKeys = (data = {}, keys = [], options = {}) => {
@@ -72,7 +97,8 @@ export const destructureData = (data, filterType) => ({
72
97
  export const loadData = async ({
73
98
  skipMap,
74
99
  searchString,
75
- filter
100
+ filter,
101
+ relationMode
76
102
  }) => {
77
103
  const promises = filter.map(async filterType => {
78
104
  const skip = skipMap[filterType] ?? 0;
@@ -90,7 +116,8 @@ export const loadData = async ({
90
116
  }
91
117
  const data = await getPersons({
92
118
  search: searchString,
93
- skip
119
+ skip,
120
+ relationMode
94
121
  });
95
122
  return {
96
123
  key: PersonFinderFilterTypes.PERSON,
@@ -98,7 +125,9 @@ export const loadData = async ({
98
125
  searchString,
99
126
  count: data?.count ?? 0,
100
127
  skip: skip + (data?.list?.length ?? 0),
101
- entries: convertPersonEntry(data?.list ?? [])
128
+ entries: convertPersonEntry(data?.list ?? [], {
129
+ shouldShowLastOnlineTime: relationMode === RelationMode.SITE
130
+ })
102
131
  }
103
132
  };
104
133
  }
@@ -142,4 +171,73 @@ export const loadData = async ({
142
171
  };
143
172
  }, {});
144
173
  };
174
+ export const formatLastOnline = date => {
175
+ const ts = textStrings.components.personFinder.lastOnline;
176
+ const now = new Date();
177
+ const diffMs = now.getTime() - date.getTime();
178
+ const minutes = Math.floor(diffMs / 1000 / 60);
179
+ const hours = Math.floor(minutes / 60);
180
+ const days = Math.floor(hours / 24);
181
+ const months = Math.floor(days / 30);
182
+ const years = Math.floor(days / 365);
183
+ const isSameDay = date.getDate() === now.getDate() && date.getMonth() === now.getMonth() && date.getFullYear() === now.getFullYear();
184
+ const yesterday = new Date(now);
185
+ yesterday.setDate(now.getDate() - 1);
186
+ const isYesterday = date.getDate() === yesterday.getDate() && date.getMonth() === yesterday.getMonth() && date.getFullYear() === yesterday.getFullYear();
187
+ const time = date.toLocaleTimeString('de-DE', {
188
+ hour: '2-digit',
189
+ minute: '2-digit'
190
+ });
191
+ if (minutes < 5) {
192
+ return getPersonFinderTextstringValue({
193
+ textstring: ts.fewMinutes
194
+ });
195
+ }
196
+ if (minutes < 60) {
197
+ return getPersonFinderTextstringValue({
198
+ textstring: ts.minutes,
199
+ replacements: {
200
+ minutes
201
+ }
202
+ });
203
+ }
204
+ if (hours < 24 && isSameDay) {
205
+ return getPersonFinderTextstringValue({
206
+ textstring: ts.today,
207
+ replacements: {
208
+ time
209
+ }
210
+ });
211
+ }
212
+ if (isYesterday) {
213
+ return getPersonFinderTextstringValue({
214
+ textstring: ts.yesterday,
215
+ replacements: {
216
+ time
217
+ }
218
+ });
219
+ }
220
+ if (days < 30) {
221
+ return getPersonFinderTextstringValue({
222
+ textstring: ts.days,
223
+ replacements: {
224
+ days
225
+ }
226
+ });
227
+ }
228
+ if (months < 12) {
229
+ return getPersonFinderTextstringValue({
230
+ textstring: ts.months,
231
+ replacements: {
232
+ months
233
+ }
234
+ });
235
+ }
236
+ return getPersonFinderTextstringValue({
237
+ textstring: ts.years,
238
+ replacements: {
239
+ years
240
+ }
241
+ });
242
+ };
145
243
  //# sourceMappingURL=personFinder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"personFinder.js","names":["PersonFinderFilterTypes","getPersons","getSites","convertPersonEntry","convertSiteEntry","getUser","getGroupName","key","names","person","site","uac","isSiteEntry","entry","filterDataByKeys","data","keys","options","filterSingle","filteredEntries","entries","excludedEntryIds","Array","isArray","length","filter","e","includes","id","excludedCount","count","Math","max","relevantKeys","Object","reduce","acc","original","searchString","skip","filteredEntry","shouldShowOwnUser","PERSON","user","personId","ownUserEntry","commonSites","firstName","isVerified","lastName","type","fullName","Boolean","join","trim","toLowerCase","capitalizeFirstLetter","str","charAt","toUpperCase","slice","destructureData","filterType","loadData","skipMap","promises","map","value","search","list","SITE","filteredList","siteId","results","Promise","all","item"],"sources":["../../../src/utils/personFinder.ts"],"sourcesContent":["import {\n PersonEntry,\n PersonFinderData,\n PersonFinderDataMap,\n PersonFinderEntry,\n PersonFinderFilterTypes,\n SiteEntry,\n} from '../types/personFinder';\nimport { getPersons } from '../api/person/get';\nimport { getSites } from '../api/site/get';\nimport { convertPersonEntry, convertSiteEntry } from './convert';\nimport { getUser } from 'chayns-api';\n\nexport const getGroupName = (key: string) => {\n const names: { [key: string]: string } = {\n person: 'Personen',\n site: 'Sites',\n uac: 'UAC Gruppen',\n };\n\n return names[key];\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}\n\nexport const loadData = async ({\n skipMap,\n searchString,\n filter,\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 });\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 },\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"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"personFinder.js","names":["PersonFinderFilterTypes","RelationMode","getTextstringValue","ttsToITextString","getPersons","getSites","convertPersonEntry","convertSiteEntry","getUser","textStrings","PERSON_FINDER_TEXTSTRING_LIBRARY_NAME","normalizeTextstringReplacements","replacements","undefined","Object","entries","reduce","acc","key","value","toString","getPersonFinderTextstringValue","textstring","libraryName","getGroupName","groupNames","PERSON","components","personFinder","groupName","person","SITE","site","UAC","uac","isSiteEntry","entry","filterDataByKeys","data","keys","options","filterSingle","filteredEntries","excludedEntryIds","Array","isArray","length","filter","e","includes","id","excludedCount","count","Math","max","relevantKeys","original","searchString","skip","filteredEntry","shouldShowOwnUser","user","personId","ownUserEntry","commonSites","firstName","isVerified","lastName","type","fullName","Boolean","join","trim","toLowerCase","capitalizeFirstLetter","str","charAt","toUpperCase","slice","destructureData","filterType","loadData","skipMap","relationMode","promises","map","search","list","shouldShowLastOnlineTime","filteredList","siteId","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,4 +1,4 @@
1
- import { PersonEntryResult } from '../../types/personFinder';
1
+ import { PersonEntryResult, RelationMode } from '../../types/personFinder';
2
2
  interface GetPersonResult {
3
3
  list: PersonEntryResult[];
4
4
  count: number;
@@ -7,6 +7,7 @@ interface GetPersonsOptions {
7
7
  search: string;
8
8
  skip: number;
9
9
  take?: number;
10
+ relationMode?: RelationMode;
10
11
  }
11
- export declare const getPersons: ({ search, skip, take }: GetPersonsOptions) => Promise<GetPersonResult | undefined>;
12
+ export declare const getPersons: ({ search, skip, take, relationMode, }: GetPersonsOptions) => Promise<GetPersonResult | undefined>;
12
13
  export {};
@@ -1,5 +1,5 @@
1
1
  import React, { Dispatch, FC, ReactNode, SetStateAction } from 'react';
2
- import { DefaultEntry, LoadingState, LoadingStateMap, PersonEntry, PersonFinderData, PersonFinderEntry, PersonFinderFilterTypes, Priority, UACFilter } from '../types/personFinder';
2
+ import { DefaultEntry, LoadingState, LoadingStateMap, PersonEntry, PersonFinderData, PersonFinderEntry, PersonFinderFilterTypes, Priority, RelationMode, UACFilter } from '../types/personFinder';
3
3
  import { Tag } from '@chayns-components/core/lib/types/types/tagInput';
4
4
  interface IPersonFinderContext {
5
5
  data?: {
@@ -30,6 +30,7 @@ type PersonFinderProviderProps = {
30
30
  shouldShowOwnUser?: boolean;
31
31
  uacFilter?: UACFilter[];
32
32
  entries?: PersonEntry[];
33
+ relationMode?: RelationMode;
33
34
  };
34
35
  declare const PersonFinderProvider: FC<PersonFinderProviderProps>;
35
36
  export default PersonFinderProvider;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { DefaultEntry, PersonEntry, PersonFinderEntry, UACFilter } from '../../types/personFinder';
2
+ import { DefaultEntry, PersonEntry, PersonFinderEntry, RelationMode, UACFilter } from '../../types/personFinder';
3
3
  import { PersonFinderWrapperProps, PersonFinderRef } from './person-finder-wrapper/PersonFinderWrapper';
4
4
  export type PersonFinderProps = PersonFinderWrapperProps & {
5
5
  /**
@@ -22,6 +22,10 @@ export type PersonFinderProps = PersonFinderWrapperProps & {
22
22
  * A list of entries that should be searched.
23
23
  */
24
24
  entries?: PersonEntry[];
25
+ /**
26
+ * Determines whether persons are searched and sorted from the user's perspective or from a site's perspective.
27
+ */
28
+ relationMode?: RelationMode;
25
29
  };
26
30
  declare const PersonFinder: React.ForwardRefExoticComponent<PersonFinderWrapperProps & {
27
31
  /**
@@ -44,5 +48,9 @@ declare const PersonFinder: React.ForwardRefExoticComponent<PersonFinderWrapperP
44
48
  * A list of entries that should be searched.
45
49
  */
46
50
  entries?: PersonEntry[];
51
+ /**
52
+ * Determines whether persons are searched and sorted from the user's perspective or from a site's perspective.
53
+ */
54
+ relationMode?: RelationMode;
47
55
  } & React.RefAttributes<PersonFinderRef>>;
48
56
  export default PersonFinder;
@@ -4,7 +4,6 @@ export type PersonFinderGroupProps = {
4
4
  filterKey: PersonFinderFilterTypes;
5
5
  entries: PersonFinderEntry[];
6
6
  count: number;
7
- search: string;
8
7
  shouldShowGroupName: boolean;
9
8
  onAdd: (id: string) => void;
10
9
  onRemove: (id: string) => void;