Skip to content

Commit fdf1bdb

Browse files
Merge with develop
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2 parents 0a7e0e5 + f561318 commit fdf1bdb

238 files changed

Lines changed: 7709 additions & 1809 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/main.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ jobs:
9797
node common/scripts/install-run-rush.js install
9898
fi
9999
100-
- name: Checking model version is updated...
101-
run: node common/scripts/check_model_version.js
100+
# - name: Checking model version is updated...
101+
# run: node common/scripts/check_model_version.js
102102

103103
- name: Checking for mis-matching dependencies...
104104
run: node common/scripts/install-run-rush.js check

common/config/rush/pnpm-lock.yaml

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/scripts/version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
"0.7.419"
1+
"0.7.422"

desktop/src/main/findInPage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const pagesWithFoundInPageListener = new WeakSet<WebContents>()
2727
const overlayViewsByWindowId = new Map<number, BrowserView>()
2828
const overlayVisibleByWindowId = new Map<number, boolean>()
2929

30-
const OVERLAY_WIDTH = 392
30+
const OVERLAY_WIDTH = 432
3131
const OVERLAY_HEIGHT = 64
3232

3333
function resolveFindTarget (sender: WebContents): WebContents {

desktop/src/ui/findInPageBar.ts

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ const DEBOUNCE_MS = 300
2020
/**
2121
* Find UI is loaded in a separate BrowserView (see `findInPageOverlayHost.ts`) so
2222
* `findInPage` on the page webContents does not search the query in this input.
23-
* Shadow DOM keeps chrome text minimal. Match counts are not shown.
23+
* Shadow DOM keeps chrome text minimal. Match count / current index come from
24+
* `found-in-page` forwarded as `onFindInPageResult`.
2425
*
2526
* Chromium moves focus to the matched text in the **page** webContents after
2627
* `findInPage`, so the overlay stops receiving keystrokes unless we put focus back
@@ -49,6 +50,11 @@ export function setupDesktopFindInPageBar (electronApi: IPCMainExposed): void {
4950
input.spellcheck = false
5051
input.setAttribute('aria-label', 'Find in page')
5152

53+
const matchCount = document.createElement('span')
54+
matchCount.className = 'match-count'
55+
matchCount.setAttribute('aria-live', 'polite')
56+
matchCount.setAttribute('aria-atomic', 'true')
57+
5258
const nav = document.createElement('div')
5359
nav.className = 'nav'
5460
nav.setAttribute('role', 'group')
@@ -76,6 +82,7 @@ export function setupDesktopFindInPageBar (electronApi: IPCMainExposed): void {
7682
closeBtn.title = 'Close'
7783

7884
root.appendChild(input)
85+
root.appendChild(matchCount)
7986
root.appendChild(nav)
8087
root.appendChild(closeBtn)
8188
shadow.appendChild(style)
@@ -89,6 +96,19 @@ export function setupDesktopFindInPageBar (electronApi: IPCMainExposed): void {
8996
return input.value.trim()
9097
}
9198

99+
function clearMatchCount (): void {
100+
matchCount.textContent = ''
101+
matchCount.removeAttribute('title')
102+
}
103+
104+
function describeMatchCount (matches: number, activeOrdinal: number): { label: string, title: string } {
105+
if (matches <= 0) {
106+
return { label: '0/0', title: 'No matches' }
107+
}
108+
const cur = activeOrdinal > 0 ? Math.min(activeOrdinal, matches) : 1
109+
return { label: `${cur}/${matches}`, title: `Match ${cur} of ${matches}` }
110+
}
111+
92112
function updateNavState (): void {
93113
const q = getQuery()
94114
prevBtn.disabled = q === ''
@@ -114,6 +134,7 @@ export function setupDesktopFindInPageBar (electronApi: IPCMainExposed): void {
114134
function hide (): void {
115135
visible = false
116136
host.style.display = 'none'
137+
clearMatchCount()
117138
prevBtn.disabled = true
118139
nextBtn.disabled = true
119140
try {
@@ -165,6 +186,7 @@ export function setupDesktopFindInPageBar (electronApi: IPCMainExposed): void {
165186
debounceTimer = undefined
166187
const q = getQuery()
167188
if (q === '') {
189+
clearMatchCount()
168190
void electronApi.stopFindInPage('clearSelection').catch(() => {})
169191
updateNavState()
170192
return
@@ -226,6 +248,20 @@ export function setupDesktopFindInPageBar (electronApi: IPCMainExposed): void {
226248
},
227249
true
228250
)
251+
252+
electronApi.onFindInPageResult((result) => {
253+
if (!visible) {
254+
return
255+
}
256+
const q = getQuery()
257+
if (q === '') {
258+
clearMatchCount()
259+
return
260+
}
261+
const { label, title } = describeMatchCount(result.matches, result.activeMatchOrdinal)
262+
matchCount.textContent = label
263+
matchCount.title = title
264+
})
229265
}
230266

231267
/** Left-pointing chevron; `.next::after` mirrors with `scaleX(-1)` for identical vertical alignment. */
@@ -314,6 +350,28 @@ const shadowStyles = `
314350
color: transparent;
315351
}
316352
353+
.match-count {
354+
min-width: 1.5rem;
355+
padding: 0 2px;
356+
font-size: 12px;
357+
line-height: 1.35;
358+
font-variant-numeric: tabular-nums;
359+
text-align: right;
360+
color: rgba(0, 0, 0, 0.52);
361+
user-select: none;
362+
flex-shrink: 0;
363+
}
364+
365+
@media (prefers-color-scheme: dark) {
366+
.match-count {
367+
color: rgba(255, 255, 255, 0.48);
368+
}
369+
}
370+
371+
:host-context([data-theme='theme-dark']) .match-count {
372+
color: rgba(255, 255, 255, 0.48);
373+
}
374+
317375
.nav {
318376
display: flex;
319377
align-items: center;

desktop/src/ui/platform.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ export async function configurePlatform (onWorkbenchConnect?: () => Promise<void
412412
const languages =
413413
myBranding.languages !== undefined && myBranding.languages !== ''
414414
? myBranding.languages.split(',').map((l) => l.trim())
415-
: ['en', 'ru', 'es', 'pt', 'pt-br', 'zh', 'fr', 'cs', 'it', 'de', 'ja', 'tr']
415+
: ['en', 'ru', 'es', 'pt', 'pt-br', 'zh', 'fr', 'cs', 'it', 'de', 'ja', 'ko', 'tr']
416416

417417
setMetadata(uiPlugin.metadata.Languages, languages)
418418

dev/docker-compose.yaml

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -210,23 +210,6 @@ services:
210210
- SERVER_SECRET=secret
211211
- OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318/v1/traces
212212
restart: unless-stopped
213-
payment:
214-
image: hardcoreeng/payment
215-
extra_hosts:
216-
- 'huly.local:host-gateway'
217-
ports:
218-
- 3040:3040
219-
environment:
220-
- SECRET=secret
221-
- PORT=3040
222-
- ACCOUNTS_URL=http://huly.local:3000
223-
- FRONT_URL=http://huly.local:8087
224-
- USE_SANDBOX=true
225-
- POLAR_ACCESS_TOKEN=${POLAR_ACCESS_TOKEN}
226-
- POLAR_WEBHOOK_SECRET=${POLAR_WEBHOOK_SECRET}
227-
- POLAR_SUBSCRIPTION_PLANS=${POLAR_SUBSCRIPTION_PLANS}
228-
- OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318/v1/traces
229-
restart: unless-stopped
230213
workspace_cockroach:
231214
image: hardcoreeng/workspace
232215
extra_hosts:
@@ -311,6 +294,7 @@ services:
311294
- COMMUNICATION_API_ENABLED=true
312295
- BACKUP_URL=http://huly.local:4039/api/backup,
313296
- EXCLUDED_APPLICATIONS_FOR_ANONYMOUS=[]
297+
- DISABLED_FEATURES=auto-translate,mailboxes
314298
# - DISABLE_SIGNUP=true
315299
- OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318/v1/traces
316300
- PULSE_URL=ws://huly.local:8099/ws

dev/prod/public/branding.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"huly.local:8080": {
33
"title": "Huly",
4-
"languages": "en,ru,pt,pt-br,es,zh,fr,de,ja,tr",
4+
"languages": "en,ru,pt,pt-br,es,zh,fr,de,ja,ko,tr",
55
"defaultLanguage": "en",
66
"defaultApplication": "tracker",
77
"defaultSpace": "tracker:project:DefaultProject",
@@ -30,7 +30,7 @@
3030
},
3131
"huly.local:8087": {
3232
"title": "Huly",
33-
"languages": "en,ru,pt,pt-br,es,zh,fr,de,ja,tr",
33+
"languages": "en,ru,pt,pt-br,es,zh,fr,de,ja,ko,tr",
3434
"defaultLanguage": "en",
3535
"defaultApplication": "tracker",
3636
"defaultSpace": "tracker:project:DefaultProject",

dev/prod/src/platform.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ export async function configurePlatform() {
545545

546546
const languages = myBranding.languages
547547
? myBranding.languages.split(',').map((l) => l.trim())
548-
: ['en', 'ru', 'es', 'pt', 'pt-br', 'zh', 'fr', 'cs', 'it', 'de', 'ja', 'tr']
548+
: ['en', 'ru', 'es', 'pt', 'pt-br', 'zh', 'fr', 'cs', 'it', 'de', 'ja', 'ko', 'tr']
549549

550550
setMetadata(uiPlugin.metadata.Languages, languages)
551551

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
{
2+
"string": {
3+
"Id": "ID",
4+
"Space": "스페이스",
5+
"Spaces": "스페이스",
6+
"SpacesDescription": "모든 스페이스의 스페이스 타입을 관리합니다",
7+
"TypedSpace": "타입이 지정된 스페이스",
8+
"SpaceType": "스페이스 타입",
9+
"Modified": "수정됨",
10+
"ModifiedDate": "수정일",
11+
"ModifiedBy": "수정자",
12+
"Class": "클래스",
13+
"AttachedTo": "연결 대상",
14+
"AttachedToClass": "연결된 클래스",
15+
"Name": "이름",
16+
"Description": "설명",
17+
"ShortDescription": "간단한 설명",
18+
"Descriptor": "식별자",
19+
"TargetClass": "대상 클래스",
20+
"Role": "역할",
21+
"Roles": "역할",
22+
"Private": "비공개",
23+
"Archived": "보관됨",
24+
"ClassLabel": "타입",
25+
"ClassPropertyLabel": "라벨",
26+
"String": "텍스트",
27+
"Markup": "마크업",
28+
"Number": "숫자",
29+
"Boolean": "체크박스",
30+
"Timestamp": "타임스탬프",
31+
"Date": "날짜",
32+
"IntlString": "다국어 텍스트",
33+
"Ref": "참조",
34+
"Collection": "컬렉션",
35+
"Array": "다중 선택",
36+
"Enum": "선택",
37+
"Members": "멤버",
38+
"Hyperlink": "URL",
39+
"MarkupBlobRef": "공동 편집",
40+
"Object": "객체",
41+
"System": "시스템",
42+
"CreatedBy": "생성자",
43+
"CreatedDate": "생성일",
44+
"Status": "상태",
45+
"StatusCategory": "상태 카테고리",
46+
"Account": "계정",
47+
"Rank": "순위",
48+
"Owners": "소유자",
49+
"Permission": "권한",
50+
"CreateObject": "객체 만들기",
51+
"UpdateObject": "객체 업데이트",
52+
"DeleteObject": "객체 삭제",
53+
"ForbidDeleteObject": "객체 삭제 금지",
54+
"UpdateSpace": "스페이스 업데이트",
55+
"ArchiveSpace": "스페이스 보관",
56+
"CreateObjectDescription": "스페이스에서 객체를 만들 수 있는 권한을 부여합니다",
57+
"UpdateObjectDescription": "스페이스에서 객체를 업데이트할 수 있는 권한을 부여합니다",
58+
"DeleteObjectDescription": "스페이스에서 객체를 삭제할 수 있는 권한을 부여합니다",
59+
"ForbidDeleteObjectDescription": "스페이스에서 객체 삭제를 금지합니다",
60+
"UpdateSpaceDescription": "스페이스를 업데이트할 수 있는 권한을 부여합니다",
61+
"ArchiveSpaceDescription": "스페이스를 보관할 수 있는 권한을 부여합니다",
62+
"AutoJoin": "자동 참여",
63+
"AutoJoinDescr": "신규 직원을 이 스페이스에 자동으로 참여시킵니다",
64+
"AutoJoinGuests": "게스트 자동 참여",
65+
"AutoJoinGuestsDescr": "활성화하면 활성화 시점에 워크스페이스 게스트가 이 스페이스에 추가됩니다",
66+
"RBAC": "역할 기반 접근 제어",
67+
"RBACDescr": "이 스페이스에서 작업을 수행하려면 역할 기반 접근 권한이 필요합니다",
68+
"BlobSize": "크기",
69+
"BlobContentType": "콘텐츠 타입",
70+
"Relation": "관계",
71+
"Relations": "관계",
72+
"AddRelation": "관계 추가",
73+
"PersonId": "인물",
74+
"AccountId": "계정",
75+
"Version": "버전"
76+
}
77+
}

0 commit comments

Comments
 (0)