From c03c57ae9df5de80c7aebe79ff30b9c1a1da3a50 Mon Sep 17 00:00:00 2001 From: Bilguun Ochirbat Date: Tue, 11 Feb 2025 12:15:35 +0800 Subject: [PATCH 01/12] Update mn-MN.json --- src/lang/mn-MN.json | 124 ++++++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/src/lang/mn-MN.json b/src/lang/mn-MN.json index 769c58a5..60797aef 100644 --- a/src/lang/mn-MN.json +++ b/src/lang/mn-MN.json @@ -4,14 +4,14 @@ "label.activity": "Үйл ажиллагааны бүртгэл", "label.add": "Нэмэх", "label.add-description": "Тайлбар нэмэх", - "label.add-member": "Add member", - "label.add-step": "Add step", + "label.add-member": "Гишүүн нэмэх", + "label.add-step": "Алхам нэмэх", "label.add-website": "Веб нэмэх", "label.admin": "Админ", "label.after": "Хойно", "label.all": "Бүх", "label.all-time": "Бүх цаг үеийн", - "label.analytics": "Analytics", + "label.analytics": "Аналитик", "label.average": "Дундаж", "label.back": "Буцах", "label.before": "Өмнө", @@ -24,12 +24,12 @@ "label.cities": "Хотууд", "label.city": "Хот", "label.clear-all": "Бүгдийг арилгах", - "label.compare": "Compare", + "label.compare": "Харьцуулах", "label.confirm": "Батлах", "label.confirm-password": "Шинэ нууц үгээ давтах", "label.contains": "Агуулах", "label.continue": "Үргэлжлүүлэх", - "label.count": "Count", + "label.count": "Тоо", "label.countries": "Улс", "label.country": "Улс", "label.create": "Үүсгэх", @@ -37,8 +37,8 @@ "label.create-team": "Баг үүсгэх", "label.create-user": "Хэрэглэгч үүсгэх", "label.created": "Үүсгэсэн", - "label.created-by": "Created By", - "label.current": "Current", + "label.created-by": "Үүсгэсэн", + "label.current": "Одоогийн", "label.current-password": "Ашиглаж буй нууц үг", "label.custom-range": "Дурын хугацаа", "label.dashboard": "Хянах самбар", @@ -48,7 +48,7 @@ "label.day": "Өдөр", "label.default-date-range": "Өгөгдмөл хугацааны муж", "label.delete": "Устгах", - "label.delete-report": "Delete report", + "label.delete-report": "Тайлан устгах", "label.delete-team": "Баг устгах", "label.delete-user": "Хэрэглэгч устгах", "label.delete-website": "Веб устгах", @@ -63,14 +63,14 @@ "label.dropoff": "Уналт", "label.edit": "Засах", "label.edit-dashboard": "Хянах самбар засах", - "label.edit-member": "Edit member", + "label.edit-member": "Гишүүн засах", "label.enable-share-url": "Хуваалцах холбоос идэвхжүүлэх", - "label.end-step": "End Step", - "label.entry": "Entry URL", + "label.end-step": "Төгсгөлийн алхам", + "label.entry": "Орох зам", "label.event": "Үйлдэл", "label.event-data": "Үйлдлийн өгөгдөл", "label.events": "Үйлдэл", - "label.exit": "Exit URL", + "label.exit": "Гарах зам", "label.false": "Худал", "label.field": "Талбар", "label.fields": "Талбар", @@ -78,16 +78,16 @@ "label.filter-combined": "Нэгтгэсэн", "label.filter-raw": "Түүхий", "label.filters": "Шүүлтүүр", - "label.first-seen": "First seen", + "label.first-seen": "Анх харсан", "label.funnel": "Цутгал", "label.funnel-description": "Хэрэглэгчдийн шилжилт, уналтын хэмжээг шинжлэх.", - "label.goal": "Goal", - "label.goals": "Goals", - "label.goals-description": "Track your goals for pageviews and events.", + "label.goal": "Зорилго", + "label.goals": "Зорилго", + "label.goals-description": "Хуудас үзсэн болон үйлдлийн зорилгыг мөрдөх.", "label.greater-than": "Их", "label.greater-than-equals": "Их буюу тэнцүү", - "label.host": "Host", - "label.hosts": "Hosts", + "label.host": "Хост", + "label.hosts": "Хост", "label.insights": "Шинжлэх", "label.insights-description": "Өгөгдлөө хэсэгчлэн хуваах, шүүх байдлаар задлан шинжлэх.", "label.is": "Бол", @@ -96,36 +96,36 @@ "label.is-set": "Утга оноосон", "label.join": "Нэгдэх", "label.join-team": "Багт нэгдэх", - "label.journey": "Journey", - "label.journey-description": "Understand how users navigate through your website.", + "label.journey": "Аялал", + "label.journey-description": "Хэрэглэгчид таны цахим хуудсаар хэрхэн шилжиж явсныг шинжлэх.", "label.language": "Хэл", "label.languages": "Хэл", "label.laptop": "Зөөврийн компьютер", "label.last-days": "Сүүлийн {x} хоног", "label.last-hours": "Сүүлийн {x} цаг", - "label.last-months": "Last {x} months", - "label.last-seen": "Last seen", + "label.last-months": "Сүүлийн {x} сар", + "label.last-seen": "Сүүлд харагдсан", "label.leave": "Гарах", "label.leave-team": "Багаас гарах", "label.less-than": "Бага", "label.less-than-equals": "Бага буюу тэнцүү", "label.login": "Нэвтрэх", "label.logout": "Гарах", - "label.manage": "Manage", - "label.manager": "Manager", + "label.manage": "Удирдах", + "label.manager": "Удирдагч", "label.max": "Max", - "label.member": "Member", + "label.member": "Гишүүн", "label.members": "Гишүүд", "label.min": "Min", "label.mobile": "Утас", "label.more": "Цааш", - "label.my-account": "My account", + "label.my-account": "Миний бүртгэл", "label.my-websites": "Миний вебүүд", "label.name": "Нэр", "label.new-password": "Шинэ нууц үг", "label.none": "Байхгүй", - "label.number-of-records": "{x} {x, plural, one {record} other {records}}", - "label.ok": "OK", + "label.number-of-records": "{x} {x, plural, one {бичлэг} other {бичлэг}}", + "label.ok": "ЗА", "label.os": "OS", "label.overview": "Тойм", "label.owner": "Эзэмшигч", @@ -134,15 +134,15 @@ "label.pageTitle": "Хуудасны гарчиг", "label.pages": "Хуудас", "label.password": "Нууц үг", - "label.path": "Path", - "label.paths": "Paths", + "label.path": "Зам", + "label.paths": "Зам", "label.powered-by": "{name} дээр суурилсан", - "label.previous": "Previous", - "label.previous-period": "Previous period", - "label.previous-year": "Previous year", + "label.previous": "Өмнөх", + "label.previous-period": "Өмнөх үе", + "label.previous-year": "Өмнөх жил", "label.profile": "Бүртгэл", - "label.properties": "Properties", - "label.property": "Property", + "label.properties": "Шинж чанар", + "label.property": "Шинж чанар", "label.queries": "Query-нүүд", "label.query": "Query", "label.query-parameters": "Query параметр", @@ -154,22 +154,22 @@ "label.region": "Бүс", "label.regions": "Бүсүүд", "label.remove": "Устгах", - "label.remove-member": "Remove member", + "label.remove-member": "Гишүүн хасах", "label.reports": "Тайлан", "label.required": "Шаардлагатай", "label.reset": "Дахин эхлүүлэх", "label.reset-website": "Тоон үзүүлэлтийг дахин эхлүүлэх", "label.retention": "Барилт", "label.retention-description": "Хэрэглэгчид таны веб рүү дахин хандах буюу хэрэглэгчдээ хэр тогтоож буйг хэмжих.", - "label.revenue": "Revenue", - "label.revenue-description": "Look into your revenue across time.", - "label.revenue-property": "Revenue Property", + "label.revenue": "Орлого", + "label.revenue-description": "Цаг хугацааны туршид орлогын өөрчлөлтийг харах.", + "label.revenue-property": "Орлогын шинж чанар", "label.role": "Эрх", "label.run-query": "Query ажиллуулах", "label.save": "Хадгалах", "label.screens": "Дэлгэц", "label.search": "Хайх", - "label.select": "Select", + "label.select": "Сонгох", "label.select-date": "Огноо сонгох", "label.select-role": "Select role", "label.select-website": "Веб сонгох", @@ -178,13 +178,13 @@ "label.settings": "Тохиргоо", "label.share-url": "Хуваалцах холбоос", "label.single-day": "Нэг өдөр", - "label.start-step": "Start Step", - "label.steps": "Steps", + "label.start-step": "Эхлэх алхам", + "label.steps": "Алхам", "label.sum": "Нийлбэр", "label.tablet": "Таблет", "label.team": "Баг", "label.team-id": "Багийн ID", - "label.team-manager": "Team manager", + "label.team-manager": "Багийн удирдагч", "label.team-member": "Багийн гишүүн", "label.team-name": "Багийн нэр", "label.team-owner": "Багийн эзэмшигч", @@ -203,46 +203,46 @@ "label.total-records": "Нийт мөрийн тоо", "label.tracking-code": "Мөрдөх код", "label.transactions": "Transactions", - "label.transfer": "Transfer", - "label.transfer-website": "Transfer website", + "label.transfer": "Шилжүүлэх", + "label.transfer-website": "Вебийг шилжүүлэх", "label.true": "Үнэн", "label.type": "Төрөл", "label.unique": "Давхардаагүй", "label.unique-visitors": "Зочин", - "label.uniqueCustomers": "Unique Customers", + "label.uniqueCustomers": "Давтагдаагүй зочин", "label.unknown": "Тодорхойгүй", "label.untitled": "Гарчиггүй", - "label.update": "Update", + "label.update": "Шинэчлэх", "label.url": "URL", - "label.urls": "URLs", + "label.urls": "URL-ууд", "label.user": "Хэрэглэгч", - "label.user-property": "User Property", + "label.user-property": "Хэрэглэгчийн шинж", "label.username": "Хэрэглэгчийн нэр", "label.users": "Хэрэглэгчид", "label.utm": "UTM", - "label.utm-description": "Track your campaigns through UTM parameters.", + "label.utm-description": "UTM параметраар кампанит ажлаа мөрдөх.", "label.value": "Утга", "label.view": "Харах", "label.view-details": "Дэлгэрүүлж харах", "label.view-only": "Зөвхөн үзэх", "label.views": "Үзсэн", - "label.views-per-visit": "Views per visit", + "label.views-per-visit": "Зочдын хуудас үзсэн тоо", "label.visit-duration": "Зочилсон дундаж хугацаа", "label.visitors": "Зочин", - "label.visits": "Visits", + "label.visits": "Зочилсон", "label.website": "Веб", "label.website-id": "Вебийн ID", "label.websites": "Вебүүд", "label.window": "Цонх", "label.yesterday": "Өчигдөр", - "message.action-confirmation": "Type {confirmation} in the box below to confirm.", + "message.action-confirmation": "Доорх хэсэгт {confirmation} гэж бичин баталгаажуулна уу.", "message.active-users": "одоо {x} {x, plural, one {зочин} other {зочин}} байна", - "message.collected-data": "Collected data", + "message.collected-data": "Цуглуулсан өгөгдөл", "message.confirm-delete": "Та {target}-г устгахдаа итгэлтэй байна уу?", "message.confirm-leave": "Та {target}-с гарахдаа итгэлтэй байна уу?", - "message.confirm-remove": "Are you sure you want to remove {target}?", + "message.confirm-remove": "Та {target}-г устгахдаа итгэлтэй байна уу?", "message.confirm-reset": "Та {target}-н тоон үзүүлэлтүүдийг устгахдаа итгэлтэй байна уу?", - "message.delete-team-warning": "Deleting a team will also delete all team websites.", + "message.delete-team-warning": "Баг устгах нь мөн түүнд харъяалагдах вебүүдийг устгах болно.", "message.delete-website-warning": "Энэ вебтэй холбоотой бүх өгөгдөл устах болно.", "message.error": "Ямар нэг зүйл буруу боллоо.", "message.event-log": "{url}-д {event}", @@ -268,12 +268,12 @@ "message.team-not-found": "Баг олдсонгүй.", "message.team-websites-info": "Вебийг багийн бүх гишүүд үзэж болно.", "message.tracking-code": "Энэ вебийн хандалтуудыг мөрдөхийн тулд доорх кодыг HTML-нхээ ... хэсэгт байрлуулна уу.", - "message.transfer-team-website-to-user": "Transfer this website to your account?", - "message.transfer-user-website-to-team": "Select the team to transfer this website to.", - "message.transfer-website": "Transfer website ownership to your account or another team.", - "message.triggered-event": "Triggered event", + "message.transfer-team-website-to-user": "Энэ вебийг өөрийн бүртгэл рүү шилжүүлэх үү?", + "message.transfer-user-website-to-team": "Энэ вебийг шилжүүлж авах багийг сонгоно уу.", + "message.transfer-website": "Энэ вебийг өөрийн бүртгэл рүү эсвэл багт шилжүүлж авах.", + "message.triggered-event": "Өдөөсөн үйлдэл", "message.user-deleted": "Хэрэглэгч устсан.", - "message.viewed-page": "Viewed page", + "message.viewed-page": "Үзсэн хуудас", "message.visitor-log": "{country} улсаас {os} {device} дээр {browser} хөтөч ашиглан орсон", - "message.visitors-dropped-off": "Visitors dropped off" + "message.visitors-dropped-off": "Зочдын уналт" } From 0b8f251a2d8f70520793b9a80ce317731d84ffc2 Mon Sep 17 00:00:00 2001 From: Harry Oosterveen Date: Fri, 14 Feb 2025 20:08:17 +0100 Subject: [PATCH 02/12] Format time using dateLocale --- src/components/hooks/useTimezone.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/hooks/useTimezone.ts b/src/components/hooks/useTimezone.ts index c74f513f..f6cf79b5 100644 --- a/src/components/hooks/useTimezone.ts +++ b/src/components/hooks/useTimezone.ts @@ -2,11 +2,13 @@ import { setItem } from 'next-basics'; import { TIMEZONE_CONFIG } from 'lib/constants'; import { formatInTimeZone, zonedTimeToUtc, utcToZonedTime } from 'date-fns-tz'; import useStore, { setTimezone } from 'store/app'; +import useLocale from './useLocale'; const selector = (state: { timezone: string }) => state.timezone; export function useTimezone() { const timezone = useStore(selector); + const { dateLocale } = useLocale(); const saveTimezone = (value: string) => { setItem(TIMEZONE_CONFIG, value); @@ -20,6 +22,7 @@ export function useTimezone() { : date.split(' ').join('T') + 'Z', timezone, pattern, + { locale: dateLocale }, ); }; From b3f7694852b7275583d3ac217ddc6b23474de345 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 14 Feb 2025 12:42:33 -0800 Subject: [PATCH 03/12] Updated types. --- package.json | 4 +- src/app/share/[...shareId]/Header.module.css | 6 --- yarn.lock | 43 ++++++++++++++++---- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index b3c3a60f..275f1408 100644 --- a/package.json +++ b/package.json @@ -135,8 +135,8 @@ "@svgr/webpack": "^8.1.0", "@types/cypress": "^1.1.3", "@types/jest": "^29.5.14", - "@types/node": "^22.10.5", - "@types/react": "^19.0.4", + "@types/node": "^22.13.4", + "@types/react": "^19.0.8", "@types/react-dom": "^19.0.2", "@types/react-intl": "^3.0.0", "@types/react-window": "^1.8.8", diff --git a/src/app/share/[...shareId]/Header.module.css b/src/app/share/[...shareId]/Header.module.css index 04478199..9fc946c7 100644 --- a/src/app/share/[...shareId]/Header.module.css +++ b/src/app/share/[...shareId]/Header.module.css @@ -28,10 +28,4 @@ .header .buttons { flex: 1; } - - .links { - order: 2; - margin: 20px 0; - min-width: 100%; - } } diff --git a/yarn.lock b/yarn.lock index 24c194e6..bf1a180e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3079,10 +3079,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== -"@types/node@^22.10.5": - version "22.10.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" - integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== +"@types/node@^22.13.4": + version "22.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.4.tgz#3fe454d77cd4a2d73c214008b3e331bfaaf5038a" + integrity sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg== dependencies: undici-types "~6.20.0" @@ -3115,7 +3115,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^19.0.4": +"@types/react@*": version "19.0.4" resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.4.tgz#ad1270e090118ac3c5f0928a29fe0ddf164881df" integrity sha512-3O4QisJDYr1uTUMZHA2YswiQZRq+Pd8D+GdVFYikTutYsTz+QZgWkAPnP7rx9txoI6EXKcPiluMqWPFV3tT9Wg== @@ -3130,7 +3130,7 @@ "@types/prop-types" "*" csstype "^3.0.2" -"@types/react@16 || 17 || 18 || 19": +"@types/react@16 || 17 || 18 || 19", "@types/react@^19.0.8": version "19.0.8" resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.8.tgz#7098e6159f2a61e4f4cef2c1223c044a9bec590e" integrity sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw== @@ -10219,7 +10219,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -10314,7 +10323,14 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -11100,7 +11116,7 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -11118,6 +11134,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From e015ce8779ca74a998c59d4325853bb31585dfef Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 14 Feb 2025 12:47:17 -0800 Subject: [PATCH 04/12] Fixed team member lookup. --- src/app/api/teams/[teamId]/users/route.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/api/teams/[teamId]/users/route.ts b/src/app/api/teams/[teamId]/users/route.ts index 16b50fc7..19cd6153 100644 --- a/src/app/api/teams/[teamId]/users/route.ts +++ b/src/app/api/teams/[teamId]/users/route.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; import { unauthorized, json, badRequest } from '@/lib/response'; -import { canAddUserToTeam, canUpdateTeam } from '@/lib/auth'; +import { canAddUserToTeam, canViewTeam } from '@/lib/auth'; import { parseRequest } from '@/lib/request'; import { pagingParams, roleParam } from '@/lib/schema'; import { createTeamUser, getTeamUser, getTeamUsers } from '@/queries'; @@ -18,7 +18,7 @@ export async function GET(request: Request, { params }: { params: Promise<{ team const { teamId } = await params; - if (!(await canUpdateTeam(auth, teamId))) { + if (!(await canViewTeam(auth, teamId))) { return unauthorized('You must be the owner of this team.'); } From 14ee3990cd2f6f1ba6b9e1fb206822c897d50f1c Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Fri, 14 Feb 2025 13:40:17 -0800 Subject: [PATCH 05/12] clean-up post route for team user --- src/app/api/teams/[teamId]/users/route.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/app/api/teams/[teamId]/users/route.ts b/src/app/api/teams/[teamId]/users/route.ts index 19cd6153..57460b89 100644 --- a/src/app/api/teams/[teamId]/users/route.ts +++ b/src/app/api/teams/[teamId]/users/route.ts @@ -45,12 +45,9 @@ export async function GET(request: Request, { params }: { params: Promise<{ team return json(users); } -export async function POST( - request: Request, - { params }: { params: Promise<{ teamId: string; userId: string }> }, -) { +export async function POST(request: Request, { params }: { params: Promise<{ teamId: string }> }) { const schema = z.object({ - userId: z.string(), + userId: z.string().uuid(), role: roleParam, }); From 96138a39a2a45d045f9d8c4254710f61b975830a Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 14 Feb 2025 16:47:52 -0800 Subject: [PATCH 06/12] Fixed validation for journey report. --- src/app/api/reports/journey/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/api/reports/journey/route.ts b/src/app/api/reports/journey/route.ts index b8a0a0a4..a1bc6290 100644 --- a/src/app/api/reports/journey/route.ts +++ b/src/app/api/reports/journey/route.ts @@ -8,7 +8,7 @@ import { reportParms } from '@/lib/schema'; export async function POST(request: Request) { const schema = z.object({ ...reportParms, - steps: z.number().min(3).max(7), + steps: z.coerce.number().min(3).max(7), startStep: z.string(), endStep: z.string(), }); From c0c1138e2edd616d351199caabe4366806851548 Mon Sep 17 00:00:00 2001 From: Harry Oosterveen Date: Sat, 15 Feb 2025 10:57:12 +0100 Subject: [PATCH 07/12] Format hours in session week table --- .../(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx index 3e15ddfa..c59fd713 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx @@ -40,7 +40,9 @@ export function SessionsWeekly({ websiteId }: { websiteId: string }) { {Array(24) .fill(null) .map((_, i) => { - const label = format(addHours(startOfDay(new Date()), i), 'haaa'); + const label = format(addHours(startOfDay(new Date()), i), 'p', { locale: dateLocale }) + .replace(/\D00 ?/, '') + .toLowerCase(); return (
{label} From 68e2fe5d6f0902ba1070341db6f8ac3ce392794a Mon Sep 17 00:00:00 2001 From: Harry Oosterveen Date: Sat, 15 Feb 2025 18:35:39 +0100 Subject: [PATCH 08/12] Start of week according to locale in SessionsWeekly --- .../[websiteId]/sessions/SessionsWeekly.tsx | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx index c59fd713..038fb1ed 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx @@ -10,6 +10,10 @@ export function SessionsWeekly({ websiteId }: { websiteId: string }) { const { data, ...props } = useWebsiteSessionsWeekly(websiteId); const { dateLocale } = useLocale(); const { labels, formatMessage } = useMessages(); + const { weekStartsOn } = dateLocale.options; + const daysOfWeek = Array(7) + .fill(weekStartsOn) + .map((d, i) => (d + i) % 7); const [, max] = data ? data.reduce((arr: number[], hours: number[], index: number) => { @@ -50,33 +54,35 @@ export function SessionsWeekly({ websiteId }: { websiteId: string }) { ); })}
- {data?.map((day: number[], index: number) => { - return ( -
-
- {format(getDayOfWeekAsDate(index), 'EEE', { locale: dateLocale })} + {data && + daysOfWeek.map((index: number) => { + const day = data[index]; + return ( +
+
+ {format(getDayOfWeekAsDate(index), 'EEE', { locale: dateLocale })} +
+ {day?.map((hour: number) => { + const pct = hour / max; + return ( +
+ {hour > 0 && ( + +
+ + )} +
+ ); + })}
- {day?.map((hour: number) => { - const pct = hour / max; - return ( -
- {hour > 0 && ( - -
- - )} -
- ); - })} -
- ); - })} + ); + })}
); From 95259ee944529d0da1b18af715d8630de670e045 Mon Sep 17 00:00:00 2001 From: Harry Oosterveen Date: Sat, 15 Feb 2025 18:37:15 +0100 Subject: [PATCH 09/12] Always use localized format --- src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx | 2 +- .../[websiteId]/sessions/[sessionId]/SessionActivity.tsx | 2 +- .../websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx index f40be9db..5d85c9db 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx @@ -53,7 +53,7 @@ export function RealtimeLog({ data }: { data: RealtimeData }) { }, ]; - const getTime = ({ createdAt, firstAt }) => formatTimezoneDate(firstAt || createdAt, 'h:mm:ss'); + const getTime = ({ createdAt, firstAt }) => formatTimezoneDate(firstAt || createdAt, 'pp'); const getColor = ({ id, sessionId }) => stringToColor(sessionId || id); diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx index 642b93d9..defecc54 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx @@ -33,7 +33,7 @@ export function SessionActivity({ return ( <> {showHeader && ( -
{formatTimezoneDate(createdAt, 'EEEE, PPP')}
+
{formatTimezoneDate(createdAt, 'PPPP')}
)}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx index 6f9a8f3d..edd0353e 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx @@ -20,10 +20,10 @@ export default function SessionInfo({ data }) {
{formatMessage(labels.lastSeen)}
-
{formatTimezoneDate(data?.lastAt, 'EEEE, PPPpp')}
+
{formatTimezoneDate(data?.lastAt, 'PPPPpp')}
{formatMessage(labels.firstSeen)}
-
{formatTimezoneDate(data?.firstAt, 'EEEE, PPPpp')}
+
{formatTimezoneDate(data?.firstAt, 'PPPPpp')}
{formatMessage(labels.country)}
From d6fbbba2453fda9e07816994f46a207bb8c5da8e Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 20 Feb 2025 00:51:42 +0100 Subject: [PATCH 10/12] Fix store import --- src/components/hooks/useTimezone.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/hooks/useTimezone.ts b/src/components/hooks/useTimezone.ts index 364e3939..99c1f115 100644 --- a/src/components/hooks/useTimezone.ts +++ b/src/components/hooks/useTimezone.ts @@ -1,7 +1,7 @@ import { setItem } from '@/lib/storage'; import { TIMEZONE_CONFIG } from '@/lib/constants'; import { formatInTimeZone, zonedTimeToUtc, utcToZonedTime } from 'date-fns-tz'; -import useStore, { setTimezone } from 'store/app'; +import useStore, { setTimezone } from '@/store/app'; import useLocale from './useLocale'; const selector = (state: { timezone: string }) => state.timezone; From be319322c0188e3ad155a297741ea7b805d10ea3 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 19 Feb 2025 16:11:38 -0800 Subject: [PATCH 11/12] Fixed error messages. --- src/components/hooks/useApi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/hooks/useApi.ts b/src/components/hooks/useApi.ts index d8a05d92..dfa48e2f 100644 --- a/src/components/hooks/useApi.ts +++ b/src/components/hooks/useApi.ts @@ -9,7 +9,7 @@ const selector = (state: { shareToken: { token?: string } }) => state.shareToken async function handleResponse(res: FetchResponse): Promise { if (!res.ok) { - return Promise.reject(new Error(res.error)); + return Promise.reject(new Error(res.error?.error || res.error || 'Unexpectd error.')); } return Promise.resolve(res.data); } From 7bb89b28be3241589529d68d0b3bdbb60db334a5 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 19 Feb 2025 19:11:11 -0800 Subject: [PATCH 12/12] Removed getMessage from errors. --- src/app/(main)/settings/teams/TeamJoinForm.tsx | 4 ++-- src/app/login/LoginForm.tsx | 4 ++-- src/queries/prisma/user.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/app/(main)/settings/teams/TeamJoinForm.tsx b/src/app/(main)/settings/teams/TeamJoinForm.tsx index 0a82260c..78be872c 100644 --- a/src/app/(main)/settings/teams/TeamJoinForm.tsx +++ b/src/app/(main)/settings/teams/TeamJoinForm.tsx @@ -11,7 +11,7 @@ import { import { useApi, useMessages, useModified } from '@/components/hooks'; export function TeamJoinForm({ onSave, onClose }: { onSave: () => void; onClose: () => void }) { - const { formatMessage, labels, getMessage } = useMessages(); + const { formatMessage, labels } = useMessages(); const { post, useMutation } = useApi(); const { mutate, error } = useMutation({ mutationFn: (data: any) => post('/teams/join', data) }); const ref = useRef(null); @@ -28,7 +28,7 @@ export function TeamJoinForm({ onSave, onClose }: { onSave: () => void; onClose: }; return ( -
+ diff --git a/src/app/login/LoginForm.tsx b/src/app/login/LoginForm.tsx index a808c622..1da3106c 100644 --- a/src/app/login/LoginForm.tsx +++ b/src/app/login/LoginForm.tsx @@ -16,7 +16,7 @@ import Logo from '@/assets/logo.svg'; import styles from './LoginForm.module.css'; export function LoginForm() { - const { formatMessage, labels, getMessage } = useMessages(); + const { formatMessage, labels } = useMessages(); const router = useRouter(); const { post, useMutation } = useApi(); const { mutate, error, isPending } = useMutation({ @@ -40,7 +40,7 @@ export function LoginForm() {
umami
- + > { - const { query } = pageParams; + const { search } = pageParams; const where: Prisma.UserWhereInput = { ...criteria.where, - ...prisma.getSearchParameters(query, [{ username: 'contains' }]), + ...prisma.getSearchParameters(search, [{ username: 'contains' }]), deletedAt: null, };