├── .csharpierrc.yaml ├── scripts └── db_tools │ └── .npmrc ├── src ├── RealtimeServer │ ├── .npmrc │ ├── .prettierignore │ ├── common │ │ ├── models │ │ │ ├── project-role.ts │ │ │ ├── owned-data.ts │ │ │ ├── writing-system.ts │ │ │ ├── schema-version.ts │ │ │ ├── system-role.ts │ │ │ ├── site.ts │ │ │ ├── project-data.ts │ │ │ ├── project.ts │ │ │ └── validation-schema.ts │ │ ├── utils │ │ │ └── type-utils.ts │ │ ├── connect-session.ts │ │ ├── tsconfig.build-esm.json │ │ └── tsconfig.build.json │ ├── typings │ │ ├── ot-json0.d.ts │ │ ├── json0-ot-diff.d.ts │ │ ├── sharedb-milestone-mongo.d.ts │ │ ├── websocket-json-stream.d.ts │ │ ├── sharedb-mongo.d.ts │ │ └── sharedb-mingo-memory.d.ts │ ├── scriptureforge │ │ ├── models │ │ │ ├── text-anchor.ts │ │ │ ├── like.ts │ │ │ ├── audio-timing.ts │ │ │ ├── text-info-permission.ts │ │ │ ├── biblical-terms-config.ts │ │ │ ├── paratext-user-profile.ts │ │ │ ├── biblical-term-definition.ts │ │ │ ├── biblical-term-note-heading-info.ts │ │ │ ├── lynx-config.ts │ │ │ ├── text-document.ts │ │ │ ├── comment.ts │ │ │ ├── editor-tab.ts │ │ │ ├── sync.ts │ │ │ ├── checking-config.ts │ │ │ ├── note-tag.ts │ │ │ ├── lynx-insight-user-data.ts │ │ │ ├── editor-tab-persist-data.ts │ │ │ ├── note.ts │ │ │ └── answer.ts │ │ ├── services │ │ │ ├── text-migrations.ts │ │ │ ├── text-audio-migrations.ts │ │ │ ├── biblical-term-migrations.ts │ │ │ ├── text-document-migrations.ts │ │ │ ├── training-data-migrations.ts │ │ │ └── sf-project-data-service.ts │ │ ├── tsconfig.build-esm.json │ │ └── tsconfig.build.json │ ├── tsconfig.build.json │ ├── tsconfig.build-esm.json │ └── jest.config.js ├── SIL.XForge.Scripture │ ├── ClientApp │ │ ├── e2e │ │ │ ├── components │ │ │ │ └── my-projects.ts │ │ │ ├── update-help-site-screenshots.sh │ │ │ └── test_characterization.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── project │ │ │ │ │ ├── project.component.scss │ │ │ │ │ └── project.component.html │ │ │ │ ├── event-metrics │ │ │ │ │ ├── event-metrics.component.scss │ │ │ │ │ ├── event-metric-dialog.component.scss │ │ │ │ │ ├── event-metrics.component.html │ │ │ │ │ ├── event-metrics-log.component.scss │ │ │ │ │ └── event-metrics.component.ts │ │ │ │ ├── shared │ │ │ │ │ ├── sf-tab-group │ │ │ │ │ │ ├── tab │ │ │ │ │ │ │ ├── tab.component.scss │ │ │ │ │ │ │ ├── tab-body │ │ │ │ │ │ │ │ ├── tab-body.component.html │ │ │ │ │ │ │ │ ├── tab-body.component.scss │ │ │ │ │ │ │ │ └── tab-body.component.ts │ │ │ │ │ │ │ └── tab.component.html │ │ │ │ │ │ ├── tab-group.component.scss │ │ │ │ │ │ ├── base-services │ │ │ │ │ │ │ ├── tab-factory.service.ts │ │ │ │ │ │ │ └── tab-menu.service.ts │ │ │ │ │ │ ├── tab-header │ │ │ │ │ │ │ ├── tab-header.directive.ts │ │ │ │ │ │ │ └── tab-header.component.html │ │ │ │ │ │ ├── sf-tabs-config.ts │ │ │ │ │ │ ├── sf-tabs.types.ts │ │ │ │ │ │ ├── tab-group-header │ │ │ │ │ │ │ └── tab-scroll-button │ │ │ │ │ │ │ │ └── tab-scroll-button.component.html │ │ │ │ │ │ └── sf-tabs-providers.ts │ │ │ │ │ ├── book-multi-select │ │ │ │ │ │ ├── book-multi-select.ts │ │ │ │ │ │ └── _book-multi-select-theme.scss │ │ │ │ │ ├── notice │ │ │ │ │ │ ├── notice.component.html │ │ │ │ │ │ └── notice.types.ts │ │ │ │ │ ├── copyright-banner │ │ │ │ │ │ ├── copyright-banner.component.scss │ │ │ │ │ │ └── copyright-banner.component.html │ │ │ │ │ ├── info │ │ │ │ │ │ ├── info.component.html │ │ │ │ │ │ └── info.stories.ts │ │ │ │ │ ├── text │ │ │ │ │ │ └── text-note-dialog │ │ │ │ │ │ │ ├── text-note-dialog.component.scss │ │ │ │ │ │ │ └── text-note-dialog.component.html │ │ │ │ │ ├── working-animated-indicator │ │ │ │ │ │ ├── working-animated-indicator.component.html │ │ │ │ │ │ └── working-animated-indicator.component.ts │ │ │ │ │ ├── mobile-not-supported │ │ │ │ │ │ ├── mobile-not-supported.component.html │ │ │ │ │ │ └── mobile-not-supported.component.ts │ │ │ │ │ ├── page-not-found │ │ │ │ │ │ ├── page-not-found.component.scss │ │ │ │ │ │ └── page-not-found.component.html │ │ │ │ │ ├── global-notices │ │ │ │ │ │ ├── global-notices.component.scss │ │ │ │ │ │ └── global-notices.stories.ts │ │ │ │ │ ├── audio │ │ │ │ │ │ ├── audio-player │ │ │ │ │ │ │ └── audio-player.component.scss │ │ │ │ │ │ └── audio-time-pipe.ts │ │ │ │ │ └── share │ │ │ │ │ │ └── share-button.component.html │ │ │ │ ├── translate │ │ │ │ │ ├── draft-generation │ │ │ │ │ │ ├── draft-download-button │ │ │ │ │ │ │ └── draft-download-button.component.scss │ │ │ │ │ │ ├── language-codes-confirmation │ │ │ │ │ │ │ └── language-codes-confirmation.component.scss │ │ │ │ │ │ ├── draft-history-list │ │ │ │ │ │ │ └── draft-history-list.component.scss │ │ │ │ │ │ ├── training-data │ │ │ │ │ │ │ └── training-data-multi-select.component.scss │ │ │ │ │ │ ├── confirm-sources │ │ │ │ │ │ │ └── _confirm-sources-theme.scss │ │ │ │ │ │ ├── draft-usfm-format │ │ │ │ │ │ │ └── _draft-usfm-format-theme.scss │ │ │ │ │ │ └── draft-source.ts │ │ │ │ │ ├── font-unsupported-message │ │ │ │ │ │ └── font-unsupported-message.component.scss │ │ │ │ │ ├── editor │ │ │ │ │ │ ├── lynx │ │ │ │ │ │ │ └── insights │ │ │ │ │ │ │ │ ├── lynx-insight-scroll-position-indicator │ │ │ │ │ │ │ │ └── lynx-insight-scroll-position-indicator.component.html │ │ │ │ │ │ │ │ ├── lynx-insight-editor-objects │ │ │ │ │ │ │ │ └── lynx-insight-editor-objects.component.html │ │ │ │ │ │ │ │ ├── base-services │ │ │ │ │ │ │ │ ├── editor-ready.service.ts │ │ │ │ │ │ │ │ └── editor-segment.service.ts │ │ │ │ │ │ │ │ └── lynx-insight-action-prompt │ │ │ │ │ │ │ │ └── lynx-insight-action-prompt.component.html │ │ │ │ │ │ ├── save-note-parameters.ts │ │ │ │ │ │ ├── editor-draft │ │ │ │ │ │ │ └── _editor-draft-theme.scss │ │ │ │ │ │ ├── _editor-theme.scss │ │ │ │ │ │ └── note-dialog │ │ │ │ │ │ │ └── _note-dialog-theme.scss │ │ │ │ │ └── biblical-terms │ │ │ │ │ │ ├── biblical-term-dialog.component.scss │ │ │ │ │ │ └── _biblical-terms-theme.scss │ │ │ │ ├── machine-api │ │ │ │ │ ├── resource-dto.ts │ │ │ │ │ ├── translation-source.ts │ │ │ │ │ ├── aligned-word-pair-dto.ts │ │ │ │ │ ├── quotation-denormalization.ts │ │ │ │ │ ├── translation-engine-stats.ts │ │ │ │ │ ├── phrase-dto.ts │ │ │ │ │ ├── segment-pair-dto.ts │ │ │ │ │ ├── word-graph-dto.ts │ │ │ │ │ ├── build-states.ts │ │ │ │ │ ├── engine-dto.ts │ │ │ │ │ ├── word-graph-arc-dto.ts │ │ │ │ │ └── translation-result-dto.ts │ │ │ │ ├── serval-administration │ │ │ │ │ ├── date-range-picker.component.scss │ │ │ │ │ ├── site-event-metrics.component.scss │ │ │ │ │ ├── site-event-metrics.component.html │ │ │ │ │ ├── serval-administration.component.scss │ │ │ │ │ ├── serval-projects.component.scss │ │ │ │ │ └── serval-project.component.scss │ │ │ │ ├── users │ │ │ │ │ ├── users.component.html │ │ │ │ │ └── users.component.ts │ │ │ │ ├── core │ │ │ │ │ └── models │ │ │ │ │ │ ├── sf-project-create-settings.ts │ │ │ │ │ │ ├── share-link-type.ts │ │ │ │ │ │ ├── texts-by-book-id.ts │ │ │ │ │ │ ├── invitee-status.ts │ │ │ │ │ │ ├── transcelerator-question.ts │ │ │ │ │ │ ├── paratext-project.ts │ │ │ │ │ │ ├── sf-project-doc.ts │ │ │ │ │ │ ├── text-audio-doc.ts │ │ │ │ │ │ ├── edited-segment-data.ts │ │ │ │ │ │ └── training-data-doc.ts │ │ │ │ ├── checking │ │ │ │ │ ├── checking │ │ │ │ │ │ ├── test-audio │ │ │ │ │ │ │ ├── test-audio-player.webm │ │ │ │ │ │ │ ├── test-audio-short.mp3 │ │ │ │ │ │ │ ├── test-audio-short.webm │ │ │ │ │ │ │ └── test-audio-player-b.webm │ │ │ │ │ │ ├── checking-text │ │ │ │ │ │ │ ├── checking-text.component.html │ │ │ │ │ │ │ └── checking-text.component.scss │ │ │ │ │ │ ├── checking-audio-player │ │ │ │ │ │ │ └── checking-audio-player.component.scss │ │ │ │ │ │ └── _checking-theme.scss │ │ │ │ │ ├── import-questions-dialog │ │ │ │ │ │ └── import-questions-confirmation-dialog │ │ │ │ │ │ │ └── import-questions-confirmation-dialog.component.scss │ │ │ │ │ └── attach-audio │ │ │ │ │ │ └── attach-audio.component.scss │ │ │ │ ├── project-select │ │ │ │ │ └── project-select.component.scss │ │ │ │ ├── settings │ │ │ │ │ └── delete-project-dialog │ │ │ │ │ │ └── delete-project-dialog.component.scss │ │ │ │ ├── scripture-chooser-dialog │ │ │ │ │ └── scripture-chooser-dialog.component.scss │ │ │ │ └── navigation │ │ │ │ │ └── _navigation-theme.scss │ │ │ ├── typings │ │ │ │ ├── process.d.ts │ │ │ │ └── rich-text.d.ts │ │ │ ├── assets │ │ │ │ ├── icons │ │ │ │ │ ├── sd.ico │ │ │ │ │ ├── sf-72x72.png │ │ │ │ │ ├── sf-96x96.png │ │ │ │ │ ├── sf-128x128.png │ │ │ │ │ ├── sf-144x144.png │ │ │ │ │ ├── sf-152x152.png │ │ │ │ │ ├── sf-192x192.png │ │ │ │ │ ├── sf-384x384.png │ │ │ │ │ ├── sf-512x512.png │ │ │ │ │ └── TagIcons │ │ │ │ │ │ ├── 02tag1.png │ │ │ │ │ │ ├── 02tag2.png │ │ │ │ │ │ ├── 02tag3.png │ │ │ │ │ │ ├── 02tag4.png │ │ │ │ │ │ ├── 02tag5.png │ │ │ │ │ │ ├── 01flag1.png │ │ │ │ │ │ ├── 01flag2.png │ │ │ │ │ │ ├── 01flag3.png │ │ │ │ │ │ ├── 01flag4.png │ │ │ │ │ │ ├── 01flag5.png │ │ │ │ │ │ ├── 06star1.png │ │ │ │ │ │ ├── 06star2.png │ │ │ │ │ │ ├── 06star3.png │ │ │ │ │ │ ├── 06star4.png │ │ │ │ │ │ ├── 06star5.png │ │ │ │ │ │ ├── 12square1.png │ │ │ │ │ │ ├── 12square2.png │ │ │ │ │ │ ├── 12square3.png │ │ │ │ │ │ ├── 12square4.png │ │ │ │ │ │ ├── 12square5.png │ │ │ │ │ │ ├── 14circle1.png │ │ │ │ │ │ ├── 14circle2.png │ │ │ │ │ │ ├── 14circle3.png │ │ │ │ │ │ ├── 14circle4.png │ │ │ │ │ │ ├── 14circle5.png │ │ │ │ │ │ ├── conflict1.png │ │ │ │ │ │ ├── conflict4.png │ │ │ │ │ │ ├── conflict5.png │ │ │ │ │ │ ├── spelling1.png │ │ │ │ │ │ ├── spelling2.png │ │ │ │ │ │ ├── spelling4.png │ │ │ │ │ │ ├── spelling5.png │ │ │ │ │ │ ├── spelling6.png │ │ │ │ │ │ ├── 03question1.png │ │ │ │ │ │ ├── 03question2.png │ │ │ │ │ │ ├── 03question3.png │ │ │ │ │ │ ├── 03question4.png │ │ │ │ │ │ ├── 03question5.png │ │ │ │ │ │ ├── 05asterisk1.png │ │ │ │ │ │ ├── 05asterisk2.png │ │ │ │ │ │ ├── 05asterisk3.png │ │ │ │ │ │ ├── 05asterisk4.png │ │ │ │ │ │ ├── 05asterisk5.png │ │ │ │ │ │ ├── 08refresh1.png │ │ │ │ │ │ ├── 08refresh2.png │ │ │ │ │ │ ├── 08refresh3.png │ │ │ │ │ │ ├── 08refresh4.png │ │ │ │ │ │ ├── 08refresh5.png │ │ │ │ │ │ ├── 09padlock1.png │ │ │ │ │ │ ├── 09padlock2.png │ │ │ │ │ │ ├── 09padlock3.png │ │ │ │ │ │ ├── 09padlock4.png │ │ │ │ │ │ ├── 09padlock5.png │ │ │ │ │ │ ├── 10picture1.png │ │ │ │ │ │ ├── 10picture2.png │ │ │ │ │ │ ├── 10picture3.png │ │ │ │ │ │ ├── 10picture4.png │ │ │ │ │ │ ├── 10picture5.png │ │ │ │ │ │ ├── 13diamond1.png │ │ │ │ │ │ ├── 13diamond2.png │ │ │ │ │ │ ├── 13diamond3.png │ │ │ │ │ │ ├── 13diamond4.png │ │ │ │ │ │ ├── 13diamond5.png │ │ │ │ │ │ ├── consultant1.png │ │ │ │ │ │ ├── consultant2.png │ │ │ │ │ │ ├── consultant3.png │ │ │ │ │ │ ├── 04exclamation1.png │ │ │ │ │ │ ├── 04exclamation2.png │ │ │ │ │ │ ├── 04exclamation3.png │ │ │ │ │ │ ├── 04exclamation4.png │ │ │ │ │ │ ├── 04exclamation5.png │ │ │ │ │ │ ├── 11rectangle1.png │ │ │ │ │ │ ├── 11rectangle2.png │ │ │ │ │ │ ├── 11rectangle3.png │ │ │ │ │ │ ├── 11rectangle4.png │ │ │ │ │ │ ├── 11rectangle5.png │ │ │ │ │ │ ├── 15triangleup1.png │ │ │ │ │ │ ├── 15triangleup2.png │ │ │ │ │ │ ├── 15triangleup3.png │ │ │ │ │ │ ├── 15triangleup4.png │ │ │ │ │ │ ├── 15triangleup5.png │ │ │ │ │ │ ├── ReattachNote.png │ │ │ │ │ │ ├── biblicalterm1.png │ │ │ │ │ │ ├── biblicalterm4.png │ │ │ │ │ │ ├── biblicalterm5.png │ │ │ │ │ │ ├── biblicalterm6.png │ │ │ │ │ │ ├── 07conversation1.png │ │ │ │ │ │ ├── 07conversation2.png │ │ │ │ │ │ ├── 07conversation3.png │ │ │ │ │ │ ├── 07conversation4.png │ │ │ │ │ │ ├── 07conversation5.png │ │ │ │ │ │ ├── 16triangledown1.png │ │ │ │ │ │ ├── 16triangledown2.png │ │ │ │ │ │ ├── 16triangledown3.png │ │ │ │ │ │ ├── 16triangledown4.png │ │ │ │ │ │ ├── 16triangledown5.png │ │ │ │ │ │ ├── 17triangleleft1.png │ │ │ │ │ │ ├── 17triangleleft2.png │ │ │ │ │ │ ├── 17triangleleft3.png │ │ │ │ │ │ ├── 17triangleleft4.png │ │ │ │ │ │ ├── 17triangleleft5.png │ │ │ │ │ │ ├── 18triangleright1.png │ │ │ │ │ │ ├── 18triangleright2.png │ │ │ │ │ │ ├── 18triangleright3.png │ │ │ │ │ │ ├── 18triangleright4.png │ │ │ │ │ │ ├── 18triangleright5.png │ │ │ │ │ │ ├── globalconsultant1.png │ │ │ │ │ │ ├── globalconsultant2.png │ │ │ │ │ │ └── globalconsultant3.png │ │ │ │ ├── images │ │ │ │ │ ├── sf.png │ │ │ │ │ └── logo-pt9.png │ │ │ │ └── fonts │ │ │ │ │ ├── language-picker.ttf │ │ │ │ │ ├── language-picker.woff │ │ │ │ │ ├── language-picker.woff2 │ │ │ │ │ ├── language-picker-fallback.ttf │ │ │ │ │ ├── language-picker-fallback.woff │ │ │ │ │ └── language-picker-fallback.woff2 │ │ │ ├── xforge-common │ │ │ │ ├── edit-name-dialog │ │ │ │ │ └── edit-name-dialog.component.scss │ │ │ │ ├── donut-chart │ │ │ │ │ └── donut-chart.component.scss │ │ │ │ ├── models │ │ │ │ │ ├── textsnapshot.ts │ │ │ │ │ ├── date-format.ts │ │ │ │ │ ├── snapshot.ts │ │ │ │ │ ├── project-doc.ts │ │ │ │ │ ├── i18n-locale.ts │ │ │ │ │ ├── realtime-offline-data.ts │ │ │ │ │ ├── project-role-info.ts │ │ │ │ │ ├── user-doc.ts │ │ │ │ │ └── user-profile-doc.ts │ │ │ │ ├── write-status │ │ │ │ │ ├── write-status.component.scss │ │ │ │ │ └── write-status.component.html │ │ │ │ ├── system-administration │ │ │ │ │ ├── sa-delete-dialog.component.scss │ │ │ │ │ ├── system-administration.component.scss │ │ │ │ │ └── system-administration.component.html │ │ │ │ ├── url-constants.ts │ │ │ │ ├── includes.pipe.ts │ │ │ │ ├── feature-flags │ │ │ │ │ └── feature-flags-dialog.component.scss │ │ │ │ ├── error-dialog │ │ │ │ │ └── error-dialog.component.scss │ │ │ │ ├── blur-on-click.directive.ts │ │ │ │ ├── media-breakpoints │ │ │ │ │ └── _css-vars.scss │ │ │ │ ├── supported-browsers-dialog │ │ │ │ │ └── supported-browsers-dialog.component.html │ │ │ │ └── owner │ │ │ │ │ └── owner.component.html │ │ │ ├── tsconfig.spec.json │ │ │ ├── tsconfig.app.json │ │ │ └── test.ts │ │ ├── .npmrc │ │ ├── .prettierignore │ │ ├── .storybook │ │ │ ├── jest-setup.ts │ │ │ ├── typings.d.ts │ │ │ └── preview-head.html │ │ ├── ngcc.config.js │ │ ├── tsconfig.worker.json │ │ ├── .husky │ │ │ └── pre-commit │ │ └── .editorconfig │ ├── version.json │ ├── Pages │ │ ├── _ViewStart.cshtml │ │ ├── Status │ │ │ ├── _CatchAll.cshtml │ │ │ └── _404.cshtml │ │ └── _ViewImports.cshtml │ ├── hosting.Testing.json │ ├── hosting.Development.json │ ├── hosting.json │ ├── wwwroot │ │ ├── favicon.ico │ │ ├── images │ │ │ ├── quoter.jpg │ │ │ ├── payap_logo.png │ │ │ ├── sil_logo.png │ │ │ ├── engage-banner.jpg │ │ │ ├── EarthLightsLarge.jpg │ │ │ ├── EarthLightsMedium.jpg │ │ │ ├── EarthLightsSmall.jpg │ │ │ ├── Settings_NLTTest.png │ │ │ ├── CollaborateOnScripture.gif │ │ │ ├── TranslateTool_TET_MRK_1.png │ │ │ ├── TranslateTool_NLT_JHN_1_Suggestion.png │ │ │ ├── ai-drafting.svg │ │ │ └── community-checking.svg │ │ └── scss │ │ │ ├── sf.scss │ │ │ └── _404.scss │ ├── AssemblyInfo.cs │ ├── hosting.Staging.json │ ├── Models │ │ ├── Like.cs │ │ ├── CheckShareKeyRequest.cs │ │ ├── PreTranslationDto.cs │ │ ├── ServalBuildState.cs │ │ ├── InviteeStatus.cs │ │ ├── PreTranslation.cs │ │ ├── DraftApplyState.cs │ │ ├── ISFText.cs │ │ ├── TextInfoPermission.cs │ │ ├── SyncErrorCodes.cs │ │ ├── SyncStatus.cs │ │ ├── GenerateAccountRequest.cs │ │ ├── TextSnapshot.cs │ │ ├── AnonymousShareKeyResponse.cs │ │ ├── AudioTiming.cs │ │ ├── SFParatextUser.cs │ │ ├── TextInfo.cs │ │ ├── ValidShareKey.cs │ │ ├── BiblicalTermNoteHeadingInfo.cs │ │ ├── BiblicalTermsConfig.cs │ │ ├── BiblicalTermDefinition.cs │ │ ├── Answer.cs │ │ ├── TransceleratorQuestion.cs │ │ ├── Operation.cs │ │ ├── ResourceConfig.cs │ │ ├── ServalResourceDto.cs │ │ ├── ServalBuildDto.cs │ │ ├── ProgressState.cs │ │ ├── AnswerStatus.cs │ │ ├── CheckingConfig.cs │ │ └── TrainingData.cs │ ├── Services │ │ ├── IGuidService.cs │ │ ├── IParatextDataHelper.cs │ │ ├── ITransceleratorService.cs │ │ ├── PersistedParatextDataSettings.cs │ │ ├── IParatextSyncRunner.cs │ │ ├── IInternetSharedRepositorySourceProvider.cs │ │ ├── PersistedPtxUtilsSettings.cs │ │ ├── SFApplicationBuilderExtensions.cs │ │ ├── GuidService.cs │ │ ├── IAnonymousService.cs │ │ ├── ISFProjectRights.cs │ │ ├── SFJsonRpcApplicationBuilderExtensions.cs │ │ ├── INotifier.cs │ │ ├── SFTrainingText.cs │ │ └── IScrTextCollection.cs │ ├── Controllers │ │ └── CookieConstants.cs │ ├── icu.net.dll.config │ ├── revisionStyle.sty │ ├── revisionTemplate.tem │ └── DataAccess │ │ └── SFDataAccessApplicationBuilderExtensions.cs ├── Migrations │ ├── BackoutCommits │ │ ├── run-dev │ │ ├── IProgramLogger.cs │ │ ├── BackoutCommits.csproj │ │ └── ISyncAllService.cs │ ├── PtdaSyncAll │ │ ├── build-dev │ │ ├── IProgramLogger.cs │ │ └── PtdaSyncAll.csproj │ ├── SyncCancel │ │ ├── build-dev │ │ ├── IProgramLogger.cs │ │ ├── SyncCancel.csproj │ │ └── ISyncCancelService.cs │ ├── SyncUserToPTUser │ │ ├── build-dev │ │ ├── IProgramLogger.cs │ │ ├── ISyncUserToPTUserService.cs │ │ └── SyncUserToPTUser.csproj │ ├── ServalMigration │ │ ├── Properties │ │ │ └── launchSettings.json │ │ └── ServalMigration.csproj │ ├── SourceTargetSplitting │ │ ├── Properties │ │ │ └── launchSettings.json │ │ └── SourceTargetSplitting.csproj │ ├── WhitespaceRestoreMigration │ │ └── Properties │ │ │ └── launchSettings.json │ ├── UsxFormat │ │ └── Migrations.csproj │ └── PTDDCloneAll │ │ ├── ICloneAllService.cs │ │ ├── PTDDCloneAll.csproj │ │ └── IPTDDSyncRunner.cs ├── SIL.XForge │ ├── AssemblyInfo.cs │ ├── Models │ │ ├── IIdentifiable.cs │ │ ├── IOwnedData.cs │ │ ├── ProjectRole.cs │ │ ├── ShareLinkType.cs │ │ ├── ProjectData.cs │ │ ├── WritingSystem.cs │ │ ├── TransparentAuthenticationCredentials.cs │ │ ├── SystemRole.cs │ │ ├── Site.cs │ │ ├── LanguageDirection.cs │ │ ├── Json0Snapshot.cs │ │ ├── ProjectSecret.cs │ │ ├── InterfaceLanguage.cs │ │ └── QueuedAction.cs │ ├── Services │ │ ├── ISecurityService.cs │ │ ├── IHttpRequestAccessor.cs │ │ ├── DataNotFoundException.cs │ │ ├── IAudioService.cs │ │ ├── IEmailService.cs │ │ ├── IUserAccessor.cs │ │ └── ForbiddenException.cs │ ├── Realtime │ │ ├── OTType.cs │ │ ├── ExistingNodeJSProcessFactory.cs │ │ ├── RealtimeApplicationBuilderExtensions.cs │ │ ├── Op.cs │ │ └── OpSource.cs │ ├── Utils │ │ ├── XFClaimTypes.cs │ │ └── ParameterRebinder.cs │ ├── Configuration │ │ ├── AudioOptions.cs │ │ ├── BugsnagOptions.cs │ │ ├── DataAccessOptions.cs │ │ ├── Options.cs │ │ ├── ParatextOptions.cs │ │ ├── ConfigurationExtensions.cs │ │ ├── PublicAuthOptions.cs │ │ ├── SiteOptions.cs │ │ └── ServalOptions.cs │ ├── Controllers │ │ └── UrlConstants.cs │ └── DataAccess │ │ └── DuplicateKeyException.cs ├── Help │ ├── UpdateHelp │ │ └── UpdateHelp.csproj │ └── menu_en.json ├── Docker │ ├── launchSettings.json │ ├── docker-compose.win.yml │ └── docker-compose.yml └── SIL.Converters.Usj │ ├── SIL.Converters.Usj.csproj │ └── LowerCaseNamingStrategy.cs ├── .grit ├── .gitignore ├── grit.yaml └── patterns │ ├── missed_nullish_assignment_opportunity.md │ ├── bare_when.md │ └── remove_non_null_assertion.md ├── deploy ├── hosts ├── ansible.cfg ├── vars │ └── os_defaults.yml └── files │ └── InternetSettings.xml ├── .csharpierignore ├── readme_images ├── bugsnag-logo.png └── browserstack-logo.png ├── test ├── SIL.XForge.Tests │ ├── Models │ │ ├── TestProject.cs │ │ ├── TestProjectSecret.cs │ │ ├── TestSimpleObject.cs │ │ └── TestProjectRole.cs │ └── GlobalUsings.cs └── SIL.XForge.Scripture.Tests │ ├── SampleData │ ├── heb_usfm.zip │ └── eng-asv_usfm-partial.zip │ ├── Models │ └── CharAttr.cs │ ├── Services │ ├── MockStaticDataSource.cs │ ├── MockScrStylesheet.cs │ ├── MockZippedResourcePasswordProvider.cs │ ├── TestGuidService.cs │ └── MockProjectSettings.cs │ └── GlobalUsings.cs ├── .github ├── codeql │ └── codeql-javascript-config.yml ├── workflows │ └── grit.yml └── dependabot.yml ├── .prettierignore ├── .prettierrc.yml ├── tools ├── Roundtrip │ ├── RoundtripMethod.cs │ └── SequentialGuidService.cs ├── ServalDownloader │ └── appsettings.json └── ServalBuildReport │ └── appsettings.json ├── after.xForge.sln.targets ├── Directory.Build.targets ├── .lintstagedrc.yml ├── Directory.Build.props ├── .config └── dotnet-tools.json ├── .buildpath ├── mongodb ├── Projects │ ├── FindProjectFromEngineId.mongodb │ ├── CountUserRoles.mongodb │ └── ProjectsWithInvalidDocs.mongodb ├── README.md ├── Users │ └── CountUsersByInterfaceLanguage.mongodb └── databases │ └── dropDBNonSF.mongodb ├── .git-blame-ignore-revs ├── .dockerignore └── codecov.yml /.csharpierrc.yaml: -------------------------------------------------------------------------------- 1 | printWidth: 120 2 | -------------------------------------------------------------------------------- /scripts/db_tools/.npmrc: -------------------------------------------------------------------------------- 1 | save=true 2 | 3 | -------------------------------------------------------------------------------- /src/RealtimeServer/.npmrc: -------------------------------------------------------------------------------- 1 | save=true 2 | -------------------------------------------------------------------------------- /.grit/.gitignore: -------------------------------------------------------------------------------- 1 | .gritmodules* 2 | *.log 3 | -------------------------------------------------------------------------------- /src/RealtimeServer/.prettierignore: -------------------------------------------------------------------------------- 1 | /lib 2 | /coverage 3 | -------------------------------------------------------------------------------- /deploy/hosts: -------------------------------------------------------------------------------- 1 | [all] 2 | localhost ansible_connection=local 3 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/e2e/components/my-projects.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.csharpierignore: -------------------------------------------------------------------------------- 1 | *.config 2 | *.csproj 3 | *.props 4 | *.targets 5 | *.xml 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/version.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "9.9.9" 3 | } 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/.npmrc: -------------------------------------------------------------------------------- 1 | save=true 2 | legacy-peer-deps=true 3 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/event-metrics/event-metrics.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/tab/tab.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.grit/grit.yaml: -------------------------------------------------------------------------------- 1 | version: 0.0.1 2 | patterns: 3 | - name: github.com/getgrit/stdlib#* 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/event-metrics/event-metric-dialog.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/typings/process.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'process' {} 2 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Pages/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /deploy/ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | stderr_callback = debug 3 | nocows = 1 4 | inventory = hosts 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/.prettierignore: -------------------------------------------------------------------------------- 1 | /coverage 2 | /dist 3 | /.angular/cache 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/hosting.Testing.json: -------------------------------------------------------------------------------- 1 | { 2 | "urls": "http://localhost:5000" 3 | } 4 | -------------------------------------------------------------------------------- /src/Migrations/BackoutCommits/run-dev: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ASPNETCORE_ENVIRONMENT=Development dotnet run 3 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/.storybook/jest-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/models/project-role.ts: -------------------------------------------------------------------------------- 1 | export enum ProjectRole { 2 | None = 'none' 3 | } 4 | -------------------------------------------------------------------------------- /src/Migrations/PtdaSyncAll/build-dev: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ASPNETCORE_ENVIRONMENT=Development dotnet watch build 3 | -------------------------------------------------------------------------------- /src/Migrations/SyncCancel/build-dev: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ASPNETCORE_ENVIRONMENT=Development dotnet watch build 3 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/models/owned-data.ts: -------------------------------------------------------------------------------- 1 | export interface OwnedData { 2 | ownerRef: string; 3 | } 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Pages/Status/_CatchAll.cshtml: -------------------------------------------------------------------------------- 1 | @model ErrorModel 2 |

@Model.ErrorStatusCode

3 | -------------------------------------------------------------------------------- /readme_images/bugsnag-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/readme_images/bugsnag-logo.png -------------------------------------------------------------------------------- /src/Migrations/SyncUserToPTUser/build-dev: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ASPNETCORE_ENVIRONMENT=Development dotnet watch build 3 | -------------------------------------------------------------------------------- /src/RealtimeServer/typings/ot-json0.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'ot-json0' { 2 | export const type: { name: string }; 3 | } 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/hosting.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "urls": "http://localhost:5000;https://localhost:5001" 3 | } 4 | -------------------------------------------------------------------------------- /readme_images/browserstack-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/readme_images/browserstack-logo.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-download-button/draft-download-button.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/SIL.XForge.Tests/Models/TestProject.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public class TestProject : Project { } 4 | -------------------------------------------------------------------------------- /.github/codeql/codeql-javascript-config.yml: -------------------------------------------------------------------------------- 1 | queries: 2 | - uses: security-and-quality 3 | paths-ignore: 4 | - "**/*.min.js" 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/tab/tab-body/tab-body.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/SIL.XForge/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.CompilerServices; 2 | 3 | [assembly: InternalsVisibleTo("SIL.XForge.Tests")] 4 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/text-anchor.ts: -------------------------------------------------------------------------------- 1 | export interface TextAnchor { 2 | start: number; 3 | length: number; 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/hosting.json: -------------------------------------------------------------------------------- 1 | { 2 | "urls": "http://unix:/var/run/scriptureforge-web-app/scriptureforge-web-app.sock" 3 | } 4 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/utils/type-utils.ts: -------------------------------------------------------------------------------- 1 | export type RecursivePartial = { 2 | [P in keyof T]?: RecursivePartial; 3 | }; 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/favicon.ico -------------------------------------------------------------------------------- /test/SIL.XForge.Tests/Models/TestProjectSecret.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public class TestProjectSecret : ProjectSecret { } 4 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # minified files aren't supposed to be Prettier 2 | *.min.* 3 | 4 | # mostly 3rd-party code 5 | /src/SIL.XForge*/wwwroot/lib 6 | -------------------------------------------------------------------------------- /.prettierrc.yml: -------------------------------------------------------------------------------- 1 | trailingComma: "none" 2 | arrowParens: "avoid" 3 | overrides: 4 | - files: "*.html" 5 | options: 6 | parser: angular 7 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/like.ts: -------------------------------------------------------------------------------- 1 | import { OwnedData } from '../../common/models/owned-data'; 2 | 3 | export type Like = OwnedData; 4 | -------------------------------------------------------------------------------- /src/RealtimeServer/typings/json0-ot-diff.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'json0-ot-diff' { 2 | const json0OtDiff: any; 3 | export default json0OtDiff; 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.CompilerServices; 2 | 3 | [assembly: InternalsVisibleTo("SIL.XForge.Scripture.Tests")] 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/.storybook/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.md' { 2 | const content: string; 3 | export default content; 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/resource-dto.ts: -------------------------------------------------------------------------------- 1 | export interface ResourceDto { 2 | id: string; 3 | href: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/serval-administration/date-range-picker.component.scss: -------------------------------------------------------------------------------- 1 | .date-range-field { 2 | min-width: 260px; 3 | } 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/hosting.Staging.json: -------------------------------------------------------------------------------- 1 | { 2 | "urls": "http://unix:/var/run/scriptureforge-web-app_qa/scriptureforge-web-app_qa.sock" 3 | } 4 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/models/writing-system.ts: -------------------------------------------------------------------------------- 1 | export interface WritingSystem { 2 | script?: string; 3 | region?: string; 4 | tag: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/audio-timing.ts: -------------------------------------------------------------------------------- 1 | export interface AudioTiming { 2 | textRef: string; 3 | from: number; 4 | to: number; 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/tab/tab.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/quoter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/quoter.jpg -------------------------------------------------------------------------------- /src/SIL.XForge/Models/IIdentifiable.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public interface IIdentifiable 4 | { 5 | string Id { get; set; } 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/IOwnedData.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public interface IOwnedData 4 | { 5 | string OwnerRef { get; set; } 6 | } 7 | -------------------------------------------------------------------------------- /tools/Roundtrip/RoundtripMethod.cs: -------------------------------------------------------------------------------- 1 | namespace Roundtrip; 2 | 3 | enum RoundtripMethod 4 | { 5 | Delta = 0, 6 | Usj = 1, 7 | Usx = 2, 8 | } 9 | -------------------------------------------------------------------------------- /deploy/vars/os_defaults.yml: -------------------------------------------------------------------------------- 1 | --- 2 | base_distribution: "{{ ansible_distribution | lower }}" 3 | base_distribution_release: "{{ ansible_distribution_release }}" 4 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/models/schema-version.ts: -------------------------------------------------------------------------------- 1 | export interface SchemaVersion { 2 | _id: string; 3 | collection: string; 4 | version: number; 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/payap_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/payap_logo.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/sil_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/sil_logo.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/Like.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class Like 4 | { 5 | public string OwnerRef { get; set; } 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/ProjectRole.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public static class ProjectRole 4 | { 5 | public const string None = "none"; 6 | } 7 | -------------------------------------------------------------------------------- /test/SIL.XForge.Scripture.Tests/SampleData/heb_usfm.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/test/SIL.XForge.Scripture.Tests/SampleData/heb_usfm.zip -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/text-info-permission.ts: -------------------------------------------------------------------------------- 1 | export enum TextInfoPermission { 2 | Write = 'write', 3 | Read = 'read', 4 | None = 'none' 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/serval-administration/site-event-metrics.component.scss: -------------------------------------------------------------------------------- 1 | /* Add any specific styles for the site event metrics component */ 2 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/book-multi-select/book-multi-select.ts: -------------------------------------------------------------------------------- 1 | export interface Book { 2 | number: number; 3 | selected: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sd.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sd.ico -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/images/sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/images/sf.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/engage-banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/engage-banner.jpg -------------------------------------------------------------------------------- /after.xForge.sln.targets: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-source.ts: -------------------------------------------------------------------------------- 1 | export enum TranslationSource { 2 | Primary = 0, 3 | Secondary = 1, 4 | Human = 2 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/edit-name-dialog/edit-name-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .mat-mdc-dialog-content .mat-mdc-form-field { 2 | width: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/EarthLightsLarge.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/EarthLightsLarge.jpg -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/EarthLightsMedium.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/EarthLightsMedium.jpg -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/EarthLightsSmall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/EarthLightsSmall.jpg -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/Settings_NLTTest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/Settings_NLTTest.png -------------------------------------------------------------------------------- /src/SIL.XForge/Services/ISecurityService.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Services; 2 | 3 | public interface ISecurityService 4 | { 5 | string GenerateKey(int length = 12); 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/aligned-word-pair-dto.ts: -------------------------------------------------------------------------------- 1 | export interface AlignedWordPairDto { 2 | sourceIndex: number; 3 | targetIndex: number; 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/tab-group.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-direction: column; 4 | position: relative; 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-72x72.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-96x96.png -------------------------------------------------------------------------------- /Directory.Build.targets: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/RealtimeServer/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [{ "path": "./common/tsconfig.build.json" }, { "path": "./scriptureforge/tsconfig.build.json" }] 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-128x128.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-144x144.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-152x152.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-192x192.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-384x384.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/sf-512x512.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/images/logo-pt9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/images/logo-pt9.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/CollaborateOnScripture.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/CollaborateOnScripture.gif -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/ngcc.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | packages: { 3 | 'ngx-avatar': { 4 | ignorableDeepImportMatchers: [/ts-md5\//] 5 | } 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/donut-chart/donut-chart.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | } 4 | 5 | svg { 6 | width: 100%; 7 | height: 100%; 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/TranslateTool_TET_MRK_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/TranslateTool_TET_MRK_1.png -------------------------------------------------------------------------------- /test/SIL.XForge.Scripture.Tests/SampleData/eng-asv_usfm-partial.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/test/SIL.XForge.Scripture.Tests/SampleData/eng-asv_usfm-partial.zip -------------------------------------------------------------------------------- /src/RealtimeServer/common/models/system-role.ts: -------------------------------------------------------------------------------- 1 | export enum SystemRole { 2 | ServalAdmin = 'serval_admin', 3 | SystemAdmin = 'system_admin', 4 | User = 'user', 5 | None = 'none' 6 | } 7 | -------------------------------------------------------------------------------- /src/RealtimeServer/tsconfig.build-esm.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [{ "path": "./common/tsconfig.build-esm.json" }, { "path": "./scriptureforge/tsconfig.build-esm.json" }] 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/quotation-denormalization.ts: -------------------------------------------------------------------------------- 1 | export enum QuotationAnalysis { 2 | Successful = 'successful', 3 | Unsuccessful = 'unsuccessful' 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-engine-stats.ts: -------------------------------------------------------------------------------- 1 | export interface TranslationEngineStats { 2 | confidence: number; 3 | trainedSegmentCount: number; 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker.ttf -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/02tag1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/02tag1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/02tag2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/02tag2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/02tag3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/02tag3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/02tag4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/02tag4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/02tag5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/02tag5.png -------------------------------------------------------------------------------- /.lintstagedrc.yml: -------------------------------------------------------------------------------- 1 | "*.{ts,mts,js,mjs,json,css,scss,less,html,md,yml}": "prettier --write" 2 | "*.cs": ["dotnet format analyzers --include", "dotnet format style --include", "dotnet csharpier format"] 3 | -------------------------------------------------------------------------------- /Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/language-codes-confirmation/language-codes-confirmation.component.scss: -------------------------------------------------------------------------------- 1 | h3 { 2 | font-weight: 500; 3 | margin-top: 0; 4 | } 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker.woff -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker.woff2 -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/01flag1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/01flag1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/01flag2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/01flag2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/01flag3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/01flag3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/01flag4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/01flag4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/01flag5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/01flag5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/06star1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/06star1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/06star2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/06star2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/06star3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/06star3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/06star4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/06star4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/06star5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/06star5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/12square1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/12square1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/12square2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/12square2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/12square3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/12square3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/12square4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/12square4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/12square5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/12square5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/14circle1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/14circle1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/14circle2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/14circle2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/14circle3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/14circle3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/14circle4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/14circle4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/14circle5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/14circle5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/conflict1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/conflict1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/conflict4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/conflict4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/conflict5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/conflict5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/spelling1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/spelling1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/spelling2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/spelling2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/spelling4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/spelling4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/spelling5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/spelling5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/spelling6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/spelling6.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Pages/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @namespace SIL.XForge.Scripture.Pages 2 | @using Microsoft.AspNetCore.Mvc.Localization 3 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 4 | 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/IGuidService.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Services; 2 | 3 | public interface IGuidService 4 | { 5 | string Generate(); 6 | string NewObjectId(); 7 | } 8 | -------------------------------------------------------------------------------- /src/SIL.XForge/Services/IHttpRequestAccessor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace SIL.XForge.Services; 4 | 5 | public interface IHttpRequestAccessor 6 | { 7 | public Uri SiteRoot { get; } 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/phrase-dto.ts: -------------------------------------------------------------------------------- 1 | export interface PhraseDto { 2 | sourceSegmentStart: number; 3 | sourceSegmentEnd: number; 4 | targetSegmentCut: number; 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/segment-pair-dto.ts: -------------------------------------------------------------------------------- 1 | export interface SegmentPairDto { 2 | sourceSegment: string; 3 | targetSegment: string; 4 | sentenceStart: boolean; 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-history-list/draft-history-list.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-direction: column; 4 | gap: 8px; 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/03question1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/03question1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/03question2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/03question2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/03question3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/03question3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/03question4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/03question4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/03question5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/03question5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/05asterisk1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/05asterisk1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/05asterisk2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/05asterisk2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/05asterisk3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/05asterisk3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/05asterisk4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/05asterisk4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/05asterisk5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/05asterisk5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/08refresh1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/08refresh1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/08refresh2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/08refresh2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/08refresh3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/08refresh3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/08refresh4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/08refresh4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/08refresh5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/08refresh5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/09padlock1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/09padlock1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/09padlock2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/09padlock2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/09padlock3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/09padlock3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/09padlock4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/09padlock4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/09padlock5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/09padlock5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/10picture1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/10picture1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/10picture2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/10picture2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/10picture3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/10picture3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/10picture4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/10picture4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/10picture5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/10picture5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/13diamond1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/13diamond1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/13diamond2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/13diamond2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/13diamond3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/13diamond3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/13diamond4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/13diamond4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/13diamond5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/13diamond5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/consultant1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/consultant1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/consultant2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/consultant2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/consultant3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/consultant3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/models/textsnapshot.ts: -------------------------------------------------------------------------------- 1 | import { Snapshot } from './snapshot'; 2 | 3 | export interface TextSnapshot extends Snapshot { 4 | isValid: boolean; 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/write-status/write-status.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | align-items: center; 4 | } 5 | 6 | .check-icon { 7 | color: green; 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge/Realtime/OTType.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Realtime; 2 | 3 | public class OTType 4 | { 5 | public const string RichText = "rich-text"; 6 | public const string Json0 = "json0"; 7 | } 8 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/biblical-terms-config.ts: -------------------------------------------------------------------------------- 1 | export interface BiblicalTermsConfig { 2 | biblicalTermsEnabled: boolean; 3 | errorMessage?: string; 4 | hasRenderings: boolean; 5 | } 6 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/paratext-user-profile.ts: -------------------------------------------------------------------------------- 1 | export interface ParatextUserProfile { 2 | username: string; 3 | opaqueUserId: string; 4 | sfUserId?: string; 5 | role?: string; 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/04exclamation1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/04exclamation1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/04exclamation2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/04exclamation2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/04exclamation3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/04exclamation3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/04exclamation4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/04exclamation4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/04exclamation5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/04exclamation5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/11rectangle1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/11rectangle1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/11rectangle2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/11rectangle2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/11rectangle3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/11rectangle3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/11rectangle4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/11rectangle4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/11rectangle5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/11rectangle5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/15triangleup1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/15triangleup1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/15triangleup2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/15triangleup2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/15triangleup3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/15triangleup3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/15triangleup4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/15triangleup4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/15triangleup5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/15triangleup5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/ReattachNote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/ReattachNote.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/biblicalterm1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/biblicalterm1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/biblicalterm4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/biblicalterm4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/biblicalterm5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/biblicalterm5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/biblicalterm6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/biblicalterm6.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/TranslateTool_NLT_JHN_1_Suggestion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/wwwroot/images/TranslateTool_NLT_JHN_1_Suggestion.png -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/biblical-term-definition.ts: -------------------------------------------------------------------------------- 1 | export interface BiblicalTermDefinition { 2 | categories: string[]; 3 | domains: string[]; 4 | gloss: string; 5 | notes: string; 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/font-unsupported-message/font-unsupported-message.component.scss: -------------------------------------------------------------------------------- 1 | app-notice { 2 | margin-bottom: 1em; 3 | } 4 | 5 | strong { 6 | font-weight: 500; 7 | } 8 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker-fallback.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker-fallback.ttf -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker-fallback.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker-fallback.woff -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/07conversation1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/07conversation1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/07conversation2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/07conversation2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/07conversation3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/07conversation3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/07conversation4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/07conversation4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/07conversation5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/07conversation5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/16triangledown1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/16triangledown1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/16triangledown2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/16triangledown2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/16triangledown3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/16triangledown3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/16triangledown4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/16triangledown4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/16triangledown5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/16triangledown5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/17triangleleft1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/17triangleleft1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/17triangleleft2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/17triangleleft2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/17triangleleft3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/17triangleleft3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/17triangleleft4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/17triangleleft4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/17triangleleft5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/17triangleleft5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/18triangleright1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/18triangleright1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/18triangleright2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/18triangleright2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/18triangleright3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/18triangleright3.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/18triangleright4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/18triangleright4.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/18triangleright5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/18triangleright5.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/CheckShareKeyRequest.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class CheckShareKeyRequest 4 | { 5 | public string ShareKey { get; set; } = string.Empty; 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/PreTranslationDto.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class PreTranslationDto 4 | { 5 | public PreTranslation[] PreTranslations { get; set; } = []; 6 | } 7 | -------------------------------------------------------------------------------- /src/RealtimeServer/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'ts-jest', 3 | testEnvironment: 'node', 4 | testResultsProcessor: 'jest-teamcity-reporter', 5 | setupFilesAfterEnv: ['jest-expect-message'] 6 | }; 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/users/users.component.html: -------------------------------------------------------------------------------- 1 | 2 |

{{ t("users") }}

3 | 4 |
5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker-fallback.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/fonts/language-picker-fallback.woff2 -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/globalconsultant1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/globalconsultant1.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/globalconsultant2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/globalconsultant2.png -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/globalconsultant3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/assets/icons/TagIcons/globalconsultant3.png -------------------------------------------------------------------------------- /test/SIL.XForge.Scripture.Tests/Models/CharAttr.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class CharAttr 4 | { 5 | public string Style { get; set; } 6 | public string CharID { get; set; } 7 | } 8 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/ShareLinkType.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public static class ShareLinkType 4 | { 5 | public const string Recipient = "recipient"; 6 | public const string Anyone = "anyone"; 7 | } 8 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/biblical-term-note-heading-info.ts: -------------------------------------------------------------------------------- 1 | export interface BiblicalTermNoteHeadingInfo { 2 | gloss: string; 3 | language: string; 4 | lemma: string; 5 | transliteration: string; 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/base-services/tab-factory.service.ts: -------------------------------------------------------------------------------- 1 | export abstract class TabFactoryService { 2 | abstract createTab(tabType: TType, tabOptions?: Partial): T; 3 | } 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/ServalBuildState.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class ServalBuildState 4 | { 5 | public string? BuildId { get; set; } 6 | public string? State { get; set; } 7 | } 8 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Pages/Status/_404.cshtml: -------------------------------------------------------------------------------- 1 | @model ErrorModel 2 |

@Model.Localizer["PageNotFound"]

3 |

@Model.Localizer["RedirectingInAFewMoments"]

4 |
5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/core/models/sf-project-create-settings.ts: -------------------------------------------------------------------------------- 1 | export interface SFProjectCreateSettings { 2 | paratextId: string; 3 | sourceParatextId: string | null; 4 | checkingEnabled: boolean; 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/core/models/share-link-type.ts: -------------------------------------------------------------------------------- 1 | /** Types of share links that can be generated for a project. */ 2 | export enum ShareLinkType { 3 | Anyone = 'anyone', 4 | Recipient = 'recipient' 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/notice/notice.component.html: -------------------------------------------------------------------------------- 1 | @if (icon) { 2 | {{ icon }} 3 | } 4 | 5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Controllers/CookieConstants.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture; 2 | 3 | public static class CookieConstants 4 | { 5 | public const string TransparentAuthentication = "sf.transparent.authentication"; 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/test-audio/test-audio-player.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/test-audio/test-audio-player.webm -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/test-audio/test-audio-short.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/test-audio/test-audio-short.mp3 -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/test-audio/test-audio-short.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/test-audio/test-audio-short.webm -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/project-select/project-select.component.scss: -------------------------------------------------------------------------------- 1 | :host, 2 | mat-form-field { 3 | width: 100%; 4 | } 5 | 6 | :host ::ng-deep .mat-mdc-form-field-subscript-wrapper { 7 | min-height: 0.75rem; 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/copyright-banner/copyright-banner.component.scss: -------------------------------------------------------------------------------- 1 | .copyright-more-info { 2 | cursor: pointer; 3 | font-weight: bold; 4 | &:hover { 5 | text-decoration: underline; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/info/info.component.html: -------------------------------------------------------------------------------- 1 | 2 | {{ icon }} 3 | 4 | -------------------------------------------------------------------------------- /test/SIL.XForge.Tests/Models/TestSimpleObject.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public class TestSimpleObject 4 | { 5 | public required string ProjectId { get; init; } 6 | public required string UserId { get; init; } 7 | } 8 | -------------------------------------------------------------------------------- /tools/ServalDownloader/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Serval": { 3 | "ApiServer": "https://qa.serval-api.org", 4 | "Audience": "https://serval-api.org/", 5 | "TokenUrl": "https://dev-sillsdev.auth0.com/oauth/token" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "csharpier": { 6 | "version": "1.1.2", 7 | "commands": ["csharpier"], 8 | "rollForward": false 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/test-audio/test-audio-player-b.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sillsdev/web-xforge/HEAD/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/test-audio/test-audio-player-b.webm -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/core/models/texts-by-book-id.ts: -------------------------------------------------------------------------------- 1 | import { TextInfo } from 'realtime-server/lib/esm/scriptureforge/models/text-info'; 2 | 3 | export interface TextsByBookId { 4 | [bookId: string]: TextInfo; 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/ProjectData.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public abstract class ProjectData : Json0Snapshot, IOwnedData 4 | { 5 | public string OwnerRef { get; set; } 6 | public string ProjectRef { get; set; } 7 | } 8 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/WritingSystem.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public class WritingSystem 4 | { 5 | public string? Region { get; set; } 6 | public string? Script { get; set; } 7 | public string? Tag { get; set; } 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge/Utils/XFClaimTypes.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Utils; 2 | 3 | public static class XFClaimTypes 4 | { 5 | public const string UserId = "http://xforge.org/userid"; 6 | public const string Role = "http://xforge.org/role"; 7 | } 8 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/text/text-note-dialog/text-note-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .mat-mdc-dialog-title { 2 | margin-bottom: 0.25em; 3 | display: flex; 4 | align-items: center; 5 | justify-content: space-between; 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/working-animated-indicator/working-animated-indicator.component.html: -------------------------------------------------------------------------------- 1 | settings 2 | settings 3 | settings 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/models/date-format.ts: -------------------------------------------------------------------------------- 1 | /** Date format options for internationalization */ 2 | export type DateFormat = Intl.DateTimeFormatOptions | ((date: Date, options: { showTimeZone?: boolean }) => string); 3 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/lynx-config.ts: -------------------------------------------------------------------------------- 1 | export interface LynxConfig { 2 | autoCorrectionsEnabled: boolean; 3 | assessmentsEnabled: boolean; 4 | punctuationCheckerEnabled: boolean; 5 | allowedCharacterCheckerEnabled: boolean; 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/core/models/invitee-status.ts: -------------------------------------------------------------------------------- 1 | /** Status information for a user who has been invited to a project. */ 2 | export interface InviteeStatus { 3 | email: string; 4 | role: string; 5 | expired?: boolean; 6 | } 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/event-metrics/event-metrics.component.html: -------------------------------------------------------------------------------- 1 | 2 |

{{ t("event_log") }}

3 | 4 |
5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/IParatextDataHelper.cs: -------------------------------------------------------------------------------- 1 | using Paratext.Data; 2 | 3 | namespace SIL.XForge.Scripture.Services; 4 | 5 | public interface IParatextDataHelper 6 | { 7 | void CommitVersionedText(ScrText scrText, string comment); 8 | } 9 | -------------------------------------------------------------------------------- /test/SIL.XForge.Tests/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | // Allow use of the classic NUnit assertions with NUnit 4.x 2 | // See https://docs.nunit.org/articles/nunit/release-notes/Nunit4.0-MigrationGuide.html 3 | global using Assert = NUnit.Framework.Legacy.ClassicAssert; 4 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/connect-session.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This interface represents the in-memory session state for a ShareDB connection. 3 | */ 4 | export interface ConnectSession { 5 | userId: string; 6 | roles: string[]; 7 | isServer: boolean; 8 | } 9 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/tsconfig.build-esm.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.build.json", 3 | "compilerOptions": { 4 | "module": "ES2020", 5 | "outDir": "../lib/esm/common" 6 | }, 7 | "exclude": ["index.ts", "**/*.spec.ts", "**/test-*.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/serval-administration/site-event-metrics.component.html: -------------------------------------------------------------------------------- 1 | 2 |

{{ t("site_wide_event_log") }}

3 | 4 |
5 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/InviteeStatus.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class InviteeStatus 4 | { 5 | public string Email { get; set; } 6 | public string Role { get; set; } 7 | public bool Expired { get; set; } 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/PreTranslation.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class PreTranslation 4 | { 5 | public string Reference { get; set; } = string.Empty; 6 | public string Translation { get; set; } = string.Empty; 7 | } 8 | -------------------------------------------------------------------------------- /.buildpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /deploy/files/InternetSettings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Development 4 | Enabled 5 | 0 6 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/services/text-migrations.ts: -------------------------------------------------------------------------------- 1 | import { MigrationConstructor, monotonicallyIncreasingMigrationList } from '../../common/migration'; 2 | 3 | export const TEXT_MIGRATIONS: MigrationConstructor[] = monotonicallyIncreasingMigrationList([]); 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/mobile-not-supported/mobile-not-supported.component.html: -------------------------------------------------------------------------------- 1 | 2 | This page is not supported on mobile and may be broken. 3 | 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/system-administration/sa-delete-dialog.component.scss: -------------------------------------------------------------------------------- 1 | mat-dialog-content { 2 | min-width: 280px; 3 | display: flex; 4 | align-items: center; 5 | } 6 | 7 | app-avatar { 8 | margin-right: 10px; 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/DraftApplyState.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class DraftApplyState 4 | { 5 | public bool Failed { get; set; } 6 | public string? State { get; set; } 7 | public bool Success { get; set; } 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/ISFText.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace SIL.XForge.Scripture.Models; 4 | 5 | public interface ISFText 6 | { 7 | public string Id { get; } 8 | IEnumerable Segments { get; } 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge/Services/DataNotFoundException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace SIL.XForge.Services; 4 | 5 | public class DataNotFoundException : Exception 6 | { 7 | public DataNotFoundException(string message) 8 | : base(message) { } 9 | } 10 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": false, 5 | "rootDir": ".", 6 | "outDir": "../lib/cjs/common" 7 | }, 8 | "exclude": ["**/*.spec.ts", "**/test-*.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/.storybook/preview-head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/SIL.XForge/Configuration/AudioOptions.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Configuration; 2 | 3 | /// 4 | /// This class defines the audio configuration. 5 | /// 6 | public class AudioOptions 7 | { 8 | public string FfmpegPath { get; set; } 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/models/snapshot.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This interface represents the snapshot of a real-time doc. 3 | */ 4 | export interface Snapshot { 5 | id: string; 6 | v?: number; 7 | data: T; 8 | type: string; 9 | } 10 | -------------------------------------------------------------------------------- /src/Migrations/ServalMigration/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "ServalMigration": { 4 | "commandName": "Project", 5 | "environmentVariables": { 6 | "ASPNETCORE_ENVIRONMENT": "Development" 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/services/text-audio-migrations.ts: -------------------------------------------------------------------------------- 1 | import { MigrationConstructor, monotonicallyIncreasingMigrationList } from '../../common/migration'; 2 | 3 | export const TEXT_AUDIO_MIGRATIONS: MigrationConstructor[] = monotonicallyIncreasingMigrationList([]); 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/page-not-found/page-not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | max-width: 50em; 4 | margin: 0 auto; 5 | } 6 | 7 | h2 { 8 | display: flex; 9 | align-items: center; 10 | column-gap: 4px; 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/tsconfig.worker.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/worker", 5 | "lib": ["es2018", "webworker"], 6 | "types": [] 7 | }, 8 | "include": ["src/**/*.worker.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/TextInfoPermission.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public static class TextInfoPermission 4 | { 5 | public const string Write = "write"; 6 | public const string Read = "read"; 7 | public const string None = "none"; 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/TransparentAuthenticationCredentials.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public class TransparentAuthenticationCredentials 4 | { 5 | public string Username { get; set; } = string.Empty; 6 | public string Password { get; set; } = string.Empty; 7 | } 8 | -------------------------------------------------------------------------------- /mongodb/Projects/FindProjectFromEngineId.mongodb: -------------------------------------------------------------------------------- 1 | use('xforge') 2 | 3 | const engineId = ''; 4 | 5 | const projectId = db.sf_project_secrets.findOne({ 6 | 'servalData.preTranslationEngineId': engineId 7 | })._id 8 | 9 | db.sf_projects.findOne({ 10 | _id: projectId 11 | }) 12 | -------------------------------------------------------------------------------- /src/Migrations/SourceTargetSplitting/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "SourceTargetSplitting": { 4 | "commandName": "Project", 5 | "environmentVariables": { 6 | "ASPNETCORE_ENVIRONMENT": "Development" 7 | } 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/services/biblical-term-migrations.ts: -------------------------------------------------------------------------------- 1 | import { MigrationConstructor, monotonicallyIncreasingMigrationList } from '../../common/migration'; 2 | 3 | export const BIBLICAL_TERM_MIGRATIONS: MigrationConstructor[] = monotonicallyIncreasingMigrationList([]); 4 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/services/text-document-migrations.ts: -------------------------------------------------------------------------------- 1 | import { MigrationConstructor, monotonicallyIncreasingMigrationList } from '../../common/migration'; 2 | 3 | export const TEXT_DOCUMENT_MIGRATIONS: MigrationConstructor[] = monotonicallyIncreasingMigrationList([]); 4 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/services/training-data-migrations.ts: -------------------------------------------------------------------------------- 1 | import { MigrationConstructor, monotonicallyIncreasingMigrationList } from '../../common/migration'; 2 | 3 | export const TRAINING_DATA_MIGRATIONS: MigrationConstructor[] = monotonicallyIncreasingMigrationList([]); 4 | -------------------------------------------------------------------------------- /src/SIL.XForge/Services/IAudioService.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | namespace SIL.XForge.Services; 4 | 5 | public interface IAudioService 6 | { 7 | Task ConvertToMp3Async(string inputPath, string outputPath); 8 | Task IsMp3FileAsync(string path); 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge/Services/IEmailService.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | namespace SIL.XForge.Services; 4 | 5 | public interface IEmailService 6 | { 7 | Task SendEmailAsync(string email, string subject, string body); 8 | bool ValidateEmail(string? email); 9 | } 10 | -------------------------------------------------------------------------------- /mongodb/README.md: -------------------------------------------------------------------------------- 1 | These mongo scripts can be run using the VSCode extension "mongodb.mongodb-vscode", or using mongosh. 2 | For example, mongosh --port PORT --file FOO.mongodb --quiet 3 | mongosh installation instructions: https://www.mongodb.com/docs/mongodb-shell/install/#install-mongosh 4 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/models/site.ts: -------------------------------------------------------------------------------- 1 | export interface Site { 2 | // The most recent project a user has navigated to, which may be different than the current open project 3 | // if a user is logged in on multiple browsers 4 | currentProjectId?: string; 5 | projects: string[]; 6 | } 7 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/text-document.ts: -------------------------------------------------------------------------------- 1 | import { Usj } from '@biblionexus-foundation/scripture-utilities'; 2 | 3 | export const TEXT_DOCUMENTS_COLLECTION = 'text_documents'; 4 | export const TEXT_DOCUMENT_INDEX_PATHS: string[] = []; 5 | 6 | export type TextDocument = Usj; 7 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/tab-header/tab-header.directive.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @angular-eslint/directive-selector */ 2 | import { Directive } from '@angular/core'; 3 | 4 | @Directive({ selector: '[sf-tab-header]' }) 5 | export class TabHeaderDirective {} 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/system-administration/system-administration.component.scss: -------------------------------------------------------------------------------- 1 | .body-content { 2 | max-width: 1800px; 3 | margin: 0 auto; 4 | } 5 | 6 | mat-tab-group { 7 | width: 100%; 8 | } 9 | 10 | app-sa-users { 11 | width: 100%; 12 | } 13 | -------------------------------------------------------------------------------- /.grit/patterns/missed_nullish_assignment_opportunity.md: -------------------------------------------------------------------------------- 1 | --- 2 | level: error 3 | --- 4 | 5 | # Missed opportunity to use nullish assignment 6 | 7 | ```grit 8 | language js 9 | 10 | `if ($expression == null) { 11 | $expression = $value; 12 | }` => `$expression ??= $value;` 13 | ``` 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/word-graph-dto.ts: -------------------------------------------------------------------------------- 1 | import { WordGraphArcDto } from './word-graph-arc-dto'; 2 | 3 | export interface WordGraphDto { 4 | sourceTokens: string[]; 5 | initialStateScore: number; 6 | finalStates: number[]; 7 | arcs: WordGraphArcDto[]; 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge/Realtime/ExistingNodeJSProcessFactory.cs: -------------------------------------------------------------------------------- 1 | using Jering.Javascript.NodeJS; 2 | 3 | namespace SIL.XForge.Realtime; 4 | 5 | public class ExistingNodeJSProcessFactory : INodeJSProcessFactory 6 | { 7 | public INodeJSProcess Create(string serverScript) => new ExistingNodeJSProcess(); 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge/Services/IUserAccessor.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Services; 2 | 3 | public interface IUserAccessor 4 | { 5 | bool IsAuthenticated { get; } 6 | string UserId { get; } 7 | string[] SystemRoles { get; } 8 | string Name { get; } 9 | string AuthId { get; } 10 | } 11 | -------------------------------------------------------------------------------- /src/Migrations/PtdaSyncAll/IProgramLogger.cs: -------------------------------------------------------------------------------- 1 | namespace PtdaSyncAll 2 | { 3 | /// 4 | /// Expected interface, to allow mocking. 5 | /// 6 | public interface IProgramLogger 7 | { 8 | void Log(string message, bool finalNewline = true); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Migrations/SyncCancel/IProgramLogger.cs: -------------------------------------------------------------------------------- 1 | namespace SyncCancel 2 | { 3 | /// 4 | /// Expected interface, to allow mocking. 5 | /// 6 | public interface IProgramLogger 7 | { 8 | void Log(string message, bool finalNewline = true); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Migrations/WhitespaceRestoreMigration/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "WhitespaceRestoreMigration": { 4 | "commandName": "Project", 5 | "environmentVariables": { 6 | "ASPNETCORE_ENVIRONMENT": "Development" 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/build-states.ts: -------------------------------------------------------------------------------- 1 | export enum BuildStates { 2 | Queued = 'QUEUED', 3 | Pending = 'PENDING', 4 | Active = 'ACTIVE', 5 | Finishing = 'FINISHING', 6 | Completed = 'COMPLETED', 7 | Faulted = 'FAULTED', 8 | Canceled = 'CANCELED' 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/url-constants.ts: -------------------------------------------------------------------------------- 1 | export const ANONYMOUS_URL = 'anonymous'; 2 | export const COMMAND_API_NAMESPACE = 'command-api'; 3 | export const PARATEXT_API_NAMESPACE = 'paratext-api'; 4 | export const USERS_URL = 'users'; 5 | export const PROJECTS_URL = 'projects'; 6 | -------------------------------------------------------------------------------- /src/Migrations/BackoutCommits/IProgramLogger.cs: -------------------------------------------------------------------------------- 1 | namespace BackoutCommits 2 | { 3 | /// 4 | /// Expected interface, to allow mocking. 5 | /// 6 | public interface IProgramLogger 7 | { 8 | void Log(string message, bool finalNewline = true); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Migrations/UsxFormat/Migrations.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0 6 | win-x64;linux-x64 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/tab/tab-body/tab-body.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | border: var(--sf-tab-group-border-width) solid var(--sf-tab-group-border-color); 3 | overflow-y: auto; 4 | height: 100%; 5 | 6 | &:not(.active) { 7 | display: none; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["test.ts", "polyfills.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /test/SIL.XForge.Scripture.Tests/Services/MockStaticDataSource.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using ICSharpCode.SharpZipLib.Zip; 3 | 4 | namespace SIL.XForge.Scripture.Services; 5 | 6 | internal class MockStaticDataSource : IStaticDataSource 7 | { 8 | public Stream GetSource() => new MemoryStream(); 9 | } 10 | -------------------------------------------------------------------------------- /src/Migrations/SyncUserToPTUser/IProgramLogger.cs: -------------------------------------------------------------------------------- 1 | namespace SyncUserToPTUser 2 | { 3 | /// 4 | /// Expected interface, to allow mocking. 5 | /// 6 | public interface IProgramLogger 7 | { 8 | void Log(string message, bool finalNewline = true); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/RealtimeServer/typings/sharedb-milestone-mongo.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'sharedb-milestone-mongo' { 2 | import ShareDB from 'sharedb'; 3 | 4 | class MongoMilestoneDB extends ShareDB.MilestoneDB { 5 | constructor(mongo: string | any, options?: any); 6 | } 7 | 8 | export = MongoMilestoneDB; 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/serval-administration/serval-administration.component.scss: -------------------------------------------------------------------------------- 1 | .body-content { 2 | max-width: 1800px; 3 | margin: 0 auto; 4 | } 5 | 6 | mat-tab-group { 7 | width: 100%; 8 | } 9 | 10 | app-serval-projects, 11 | app-site-event-metrics { 12 | width: 100%; 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/SyncErrorCodes.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | /// 4 | /// The error codes for returning errors to front end via LastSyncErrorCode . 5 | /// 6 | public enum SyncErrorCodes 7 | { 8 | UserPermissionError = -1, 9 | } 10 | -------------------------------------------------------------------------------- /test/SIL.XForge.Scripture.Tests/Services/MockScrStylesheet.cs: -------------------------------------------------------------------------------- 1 | namespace Paratext.Data; 2 | 3 | /// Mock for tests. 4 | public class MockScrStylesheet : ScrStylesheet 5 | { 6 | public MockScrStylesheet(string path, string alternatePath = null) 7 | : base(path, alternatePath) { } 8 | } 9 | -------------------------------------------------------------------------------- /src/Help/UpdateHelp/UpdateHelp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Exe 4 | net8.0 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/typings/rich-text.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'rich-text' { 2 | import { OTType } from 'sharedb/lib/client'; 3 | 4 | export let type: OTType; 5 | export { Op as DeltaOperation } from 'quill'; 6 | 7 | export interface StringMap { 8 | [key: string]: any; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge/Configuration/BugsnagOptions.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Configuration; 2 | 3 | public class BugsnagOptions 4 | { 5 | public string ApiKey { get; init; } = string.Empty; 6 | public string[] NotifyReleaseStages { get; init; } = []; 7 | public string ReleaseStage { get; init; } = string.Empty; 8 | } 9 | -------------------------------------------------------------------------------- /test/SIL.XForge.Scripture.Tests/Services/MockZippedResourcePasswordProvider.cs: -------------------------------------------------------------------------------- 1 | using Paratext.Data.ProjectFileAccess; 2 | 3 | namespace SIL.XForge.Scripture.Services; 4 | 5 | public class MockZippedResourcePasswordProvider : IZippedResourcePasswordProvider 6 | { 7 | public string GetPassword() => "password"; 8 | } 9 | -------------------------------------------------------------------------------- /mongodb/Users/CountUsersByInterfaceLanguage.mongodb: -------------------------------------------------------------------------------- 1 | use('xforge') 2 | 3 | db.users.aggregate([ 4 | {$project: { 5 | interfaceLanguage: 1, 6 | _id: 0 7 | }}, 8 | {$group: { 9 | _id: '$interfaceLanguage', 10 | count: { $sum: 1 } 11 | }}, 12 | {$sort: { 13 | count: -1 14 | }} 15 | ]); 16 | -------------------------------------------------------------------------------- /src/Docker/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "Docker Compose": { 4 | "commandName": "DockerCompose", 5 | "commandVersion": "1.0", 6 | "serviceActions": { 7 | "web-xforge": "StartDebugging", 8 | "db-xforge": "StartWithoutDebugging" 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | # Run npx in ClientApp. 5 | cd src/SIL.XForge.Scripture/ClientApp 6 | # But specify a working directory to lint-staged to work from the root of the repository. 7 | npx --no-install lint-staged --relative --cwd ../../.. 8 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/ITransceleratorService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using SIL.XForge.Scripture.Models; 3 | 4 | namespace SIL.XForge.Scripture.Services; 5 | 6 | public interface ITransceleratorService 7 | { 8 | IEnumerable Questions(string paratextId); 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/icu.net.dll.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/SystemRole.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public static class SystemRole 4 | { 5 | public const string ServalAdmin = "serval_admin"; 6 | public const string SystemAdmin = "system_admin"; 7 | public const string User = "user"; 8 | public const string None = "none"; 9 | } 10 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/models/project-data.ts: -------------------------------------------------------------------------------- 1 | import { obj } from '../utils/obj-path'; 2 | import { OwnedData } from './owned-data'; 3 | 4 | export const PROJECT_DATA_INDEX_PATHS: string[] = [obj().pathStr(q => q.projectRef)]; 5 | 6 | export interface ProjectData extends OwnedData { 7 | projectRef: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/tsconfig.build-esm.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.build.json", 3 | "compilerOptions": { 4 | "module": "ES2020", 5 | "outDir": "../lib/esm/scriptureforge" 6 | }, 7 | "references": [{ "path": "../common/tsconfig.build-esm.json" }], 8 | "exclude": ["**/*.spec.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/SyncStatus.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | /// 4 | /// The status of a sync for the . 5 | /// 6 | public enum SyncStatus 7 | { 8 | Queued, 9 | Running, 10 | Successful, 11 | Cancelled, 12 | Failed, 13 | } 14 | -------------------------------------------------------------------------------- /src/Migrations/SyncUserToPTUser/ISyncUserToPTUserService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading.Tasks; 3 | 4 | namespace SyncUserToPTUser 5 | { 6 | interface ISyncUserToPTUserService 7 | { 8 | Task MoveSyncUsersToProject(bool dryRun, ISet sfProjectIdsToUpdate); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/GenerateAccountRequest.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class GenerateAccountRequest 4 | { 5 | public string ShareKey { get; set; } = string.Empty; 6 | public string DisplayName { get; set; } = string.Empty; 7 | public string Language { get; set; } = string.Empty; 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/TextSnapshot.cs: -------------------------------------------------------------------------------- 1 | using SIL.XForge.Realtime; 2 | 3 | namespace SIL.XForge.Scripture.Models; 4 | 5 | public class TextSnapshot : Snapshot 6 | { 7 | /// 8 | /// Whether the TextData is valid or not. 9 | /// 10 | public bool IsValid { get; set; } 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/lynx/insights/lynx-insight-scroll-position-indicator/lynx-insight-scroll-position-indicator.component.html: -------------------------------------------------------------------------------- 1 | @for (pos of scrollPositions; track pos.id) { 2 |
3 | } 4 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/AnonymousShareKeyResponse.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class AnonymousShareKeyResponse 4 | { 5 | public string ProjectName { get; set; } = string.Empty; 6 | public string Role { get; set; } = string.Empty; 7 | public string ShareKey { get; set; } = string.Empty; 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-text/checking-text.component.html: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/settings/delete-project-dialog/delete-project-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .mat-mdc-dialog-content { 2 | max-width: 560px; 3 | } 4 | 5 | .mat-icon { 6 | overflow: unset; 7 | } 8 | 9 | #title { 10 | display: flex; 11 | flex-direction: row; 12 | gap: 8px; 13 | align-items: center; 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/training-data/training-data-multi-select.component.scss: -------------------------------------------------------------------------------- 1 | mat-list { 2 | display: flex; 3 | flex-wrap: wrap; 4 | } 5 | 6 | .mat-mdc-list-item { 7 | width: unset; 8 | } 9 | 10 | .training-data-multi-select { 11 | button { 12 | margin: 0 4px; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/AudioTiming.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class AudioTiming 4 | { 5 | public string TextRef { get; set; } 6 | public double From { get; set; } 7 | public double To { get; set; } 8 | 9 | public override string ToString() => $"{TextRef}: {From} - {To}"; 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/models/project-doc.ts: -------------------------------------------------------------------------------- 1 | import { Project } from 'realtime-server/lib/esm/common/models/project'; 2 | import { JsonRealtimeDoc } from './json-realtime-doc'; 3 | 4 | export abstract class ProjectDoc extends JsonRealtimeDoc { 5 | abstract get taskNames(): string[]; 6 | } 7 | -------------------------------------------------------------------------------- /test/SIL.XForge.Tests/Models/TestProjectRole.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public class TestProjectRole 4 | { 5 | public const string Manager = "manager"; 6 | public const string Contributor = "contributor"; 7 | public const string Administrator = "administrator"; 8 | public const string Reviewer = "reviewer"; 9 | } 10 | -------------------------------------------------------------------------------- /src/Migrations/PTDDCloneAll/ICloneAllService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading.Tasks; 3 | using SIL.XForge.Scripture.Models; 4 | 5 | namespace PTDDCloneAll 6 | { 7 | public interface ICloneAllService 8 | { 9 | Task CloneSFProjects(string mode, IEnumerable projectsToClone); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/comment.ts: -------------------------------------------------------------------------------- 1 | import { OwnedData } from '../../common/models/owned-data'; 2 | 3 | export interface Comment extends OwnedData { 4 | dataId: string; 5 | deleted: boolean; 6 | syncUserRef?: string; 7 | text?: string; 8 | audioUrl?: string; 9 | dateModified: string; 10 | dateCreated: string; 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = false 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/models/i18n-locale.ts: -------------------------------------------------------------------------------- 1 | export type LocaleDirection = 'ltr' | 'rtl'; 2 | 3 | export interface Locale { 4 | localName: string; 5 | englishName: string; 6 | canonicalTag: string; 7 | direction: LocaleDirection; 8 | tags: string[]; 9 | production: boolean; 10 | helps?: string; 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/Site.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Newtonsoft.Json; 3 | 4 | namespace SIL.XForge.Models; 5 | 6 | [JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)] 7 | public class Site 8 | { 9 | public string CurrentProjectId { get; set; } 10 | public List Projects { get; set; } = []; 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/global-notices/global-notices.component.scss: -------------------------------------------------------------------------------- 1 | .downtime-notice { 2 | margin: 0 auto 12px; 3 | padding-block: 6px; 4 | width: 65em; 5 | max-width: 100%; 6 | } 7 | 8 | .downtime-notice-content-wrapper { 9 | display: flex; 10 | align-items: center; 11 | justify-content: space-between; 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": ["main.ts", "polyfills.ts"], 8 | "include": ["typings/*.d.ts"], 9 | "exclude": ["test.ts", "**/*.spec.ts", "**/test-*.ts", "**/*.stories.*"] 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/sf-tabs-config.ts: -------------------------------------------------------------------------------- 1 | import { InjectionToken } from '@angular/core'; 2 | 3 | export interface SFTabsConfig { 4 | tooltipShowDelay: number; 5 | } 6 | 7 | export const SF_TABS_CONFIG = new InjectionToken('SF_TABS_CONFIG', { 8 | factory: () => ({ tooltipShowDelay: 500 }) 9 | }); 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/includes.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'includes' 5 | }) 6 | export class IncludesPipe implements PipeTransform { 7 | transform(items: T[] | undefined, item: T): boolean { 8 | return items != null && items.includes(item); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/SFParatextUser.cs: -------------------------------------------------------------------------------- 1 | using Paratext.Data.Users; 2 | 3 | namespace SIL.XForge.Scripture.Models; 4 | 5 | /// 6 | /// SF customization of ParatextUser 7 | /// 8 | public class SFParatextUser : ParatextUser 9 | { 10 | public SFParatextUser(string ptUsername) 11 | : base(ptUsername, true) { } 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/PersistedParatextDataSettings.cs: -------------------------------------------------------------------------------- 1 | using Paratext.Data; 2 | using PtxUtils; 3 | 4 | namespace SIL.XForge.Scripture; 5 | 6 | class PersistedParatextDataSettings : IParatextDataSettings 7 | { 8 | public SerializableStringDictionary LastRegistryDataCachedTimes { get; set; } 9 | 10 | public void SafeSave() { } 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/revisionStyle.sty: -------------------------------------------------------------------------------- 1 | changeset = revisionTemplate.tem 2 | ; For future use, add these to the template 3 | ; 4 | ; 5 | 6 | 7 | ; Separate each file by a vertical bar. This allows us to distinguish between different 8 | ; files easier then with a space. 9 | file = "{file}|" -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/scss/sf.scss: -------------------------------------------------------------------------------- 1 | // Global styles 2 | @import 'variables'; 3 | @import 'mixins/breakpoints'; 4 | @import 'layout'; 5 | @import 'forms'; 6 | @import 'styles'; 7 | @import 'fonts'; 8 | 9 | // Page Sections 10 | @import 'header'; 11 | @import 'footer'; 12 | 13 | // Page specific styles 14 | @import 'home'; 15 | @import '404'; 16 | -------------------------------------------------------------------------------- /src/RealtimeServer/typings/websocket-json-stream.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'websocket-json-stream' { 2 | import * as stream from 'stream'; 3 | 4 | class WebSocketJSONStream extends stream.Duplex { 5 | constructor(ws: WebSocket); 6 | 7 | ws: WebSocket; 8 | } 9 | 10 | namespace WebSocketJSONStream {} 11 | 12 | export = WebSocketJSONStream; 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/engine-dto.ts: -------------------------------------------------------------------------------- 1 | import { ResourceDto } from './resource-dto'; 2 | 3 | export interface EngineDto extends ResourceDto { 4 | sourceLanguageTag: string; 5 | targetLanguageTag: string; 6 | isShared: boolean; 7 | projects: ResourceDto[]; 8 | confidence: number; 9 | trainedSegmentCount: number; 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/IParatextSyncRunner.cs: -------------------------------------------------------------------------------- 1 | using System.Threading; 2 | using System.Threading.Tasks; 3 | 4 | namespace SIL.XForge.Scripture.Services; 5 | 6 | public interface IParatextSyncRunner 7 | { 8 | [Mutex] 9 | Task RunAsync(string projectId, string userId, string syncMetricsId, bool trainEngine, CancellationToken token); 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/LanguageDirection.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | /// Direction of a language. 4 | public static class LanguageDirection 5 | { 6 | /// Left-to-right 7 | public const string LTR = "ltr"; 8 | 9 | /// Right-to-left 10 | public const string RTL = "rtl"; 11 | } 12 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/models/project.ts: -------------------------------------------------------------------------------- 1 | export interface Project { 2 | name: string; 3 | rolePermissions: { [role: string]: string[] }; 4 | userRoles: { [userRef: string]: string }; 5 | userPermissions: { [userRef: string]: string[] }; 6 | /** Whether the project has its capability to synchronize project data turned off. */ 7 | syncDisabled?: boolean; 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/core/models/transcelerator-question.ts: -------------------------------------------------------------------------------- 1 | /** Represents a question from Transcelerator that can be imported. */ 2 | export interface TransceleratorQuestion { 3 | book: string; 4 | startChapter: string; 5 | startVerse: string; 6 | endChapter?: string; 7 | endVerse?: string; 8 | text: string; 9 | id: string; 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/models/realtime-offline-data.ts: -------------------------------------------------------------------------------- 1 | import { OfflineData } from '../offline-store'; 2 | import { Snapshot } from './snapshot'; 3 | 4 | /** 5 | * The model for a snapshot that is stored in the offline store. 6 | */ 7 | export interface RealtimeOfflineData extends OfflineData, Snapshot { 8 | pendingOps: any[]; 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/text/text-note-dialog/text-note-dialog.component.html: -------------------------------------------------------------------------------- 1 |

2 | {{ type }} 3 | 4 |

5 | 6 | {{ text }} 7 | 8 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/models/project-role-info.ts: -------------------------------------------------------------------------------- 1 | import { SFProjectRole } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-role'; 2 | 3 | export const NONE_ROLE: ProjectRoleInfo = { role: SFProjectRole.None, canBeShared: false }; 4 | 5 | export interface ProjectRoleInfo { 6 | role: SFProjectRole; 7 | canBeShared: boolean; 8 | } 9 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": false, 5 | "rootDir": ".", 6 | "outDir": "../lib/cjs/scriptureforge" 7 | }, 8 | "references": [{ "path": "../common/tsconfig.build.json" }], 9 | "include": ["**/*.ts", "rightsByRole.json"], 10 | "exclude": ["**/*.spec.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/scripture-chooser-dialog/scripture-chooser-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .reference { 2 | padding: 1em; 3 | } 4 | 5 | .book-lists { 6 | display: flex; 7 | flex-direction: column; 8 | gap: 1em; 9 | } 10 | 11 | .dialog-container { 12 | max-width: 560px; 13 | } 14 | 15 | h1 > button, 16 | h1 > span { 17 | vertical-align: middle; 18 | } 19 | -------------------------------------------------------------------------------- /src/SIL.XForge/Configuration/DataAccessOptions.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Configuration; 2 | 3 | public class DataAccessOptions 4 | { 5 | public string ConnectionString { get; set; } = "mongodb://localhost:27017"; 6 | public string MongoDatabaseName { get; set; } = "xforge"; 7 | public string JobDatabaseName { get; set; } 8 | public string Prefix { get; set; } 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-text/checking-text.component.scss: -------------------------------------------------------------------------------- 1 | @use '../checking-global-vars'; 2 | 3 | :host { 4 | position: absolute; 5 | height: 100%; 6 | width: 100%; 7 | display: flex; 8 | overflow-y: auto; 9 | } 10 | 11 | app-text { 12 | display: flex; 13 | flex-direction: column; 14 | flex: 1; 15 | width: 100%; 16 | } 17 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/lynx/insights/lynx-insight-editor-objects/lynx-insight-editor-objects.component.html: -------------------------------------------------------------------------------- 1 | @if (insightsEnabled) { 2 | 3 | 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/TextInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace SIL.XForge.Scripture.Models; 4 | 5 | public class TextInfo 6 | { 7 | public int BookNum { get; set; } 8 | public bool HasSource { get; set; } 9 | public List Chapters { get; set; } = []; 10 | public Dictionary Permissions { get; set; } = []; 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/ValidShareKey.cs: -------------------------------------------------------------------------------- 1 | using SIL.XForge.Models; 2 | 3 | namespace SIL.XForge.Scripture.Models; 4 | 5 | public class ValidShareKey 6 | { 7 | public SFProject Project { get; set; } = new SFProject(); 8 | public SFProjectSecret ProjectSecret { get; set; } = new SFProjectSecret(); 9 | public ShareKey ShareKey { get; set; } = new ShareKey(); 10 | } 11 | -------------------------------------------------------------------------------- /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | # .git-blame-ignore-revs 2 | # CSharpier Reformatting 3 | 6f2b6156220ee5d1333f29c00ba1fa0d235b438c 4 | 56e8271d3a5ddb534d37407714866a3718ab980f 5 | b19dc17cd055e37a9213a2deb4255964b46a08a5 6 | 08a4353a9a2dfb5cc2bd0eb98067c97f9d4f6750 7 | 5b8b4191094b8f31b9b301e7ffe53f45880d9c07 8 | 976ffdabbcb4514c014c09c85a4cce24a3b36064 9 | f07ba36d29d84a66a24061a571f2e1e490509ec0 10 | -------------------------------------------------------------------------------- /src/SIL.XForge/Configuration/Options.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Configuration; 2 | 3 | public static class Options 4 | { 5 | public static string GetSectionName() 6 | { 7 | string sectionName = typeof(T).Name; 8 | if (sectionName.EndsWith("Options")) 9 | sectionName = sectionName[..^"Options".Length]; 10 | return sectionName; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/editor-tab.ts: -------------------------------------------------------------------------------- 1 | export const editorTabTypes = [ 2 | 'biblical-terms', 3 | 'history', 4 | 'draft', 5 | 'project-source', 6 | 'project-target', 7 | 'project-resource' 8 | ] as const; 9 | type EditorTabTypes = typeof editorTabTypes; 10 | export type EditorTabType = EditorTabTypes[number]; 11 | export type EditorTabGroupType = 'source' | 'target'; 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/lynx/insights/base-services/editor-ready.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Observable } from 'rxjs'; 3 | import { LynxableEditor } from '../lynx-editor'; 4 | 5 | @Injectable() 6 | export abstract class EditorReadyService { 7 | abstract listenEditorReadyState(editor: LynxableEditor): Observable; 8 | } 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/feature-flags/feature-flags-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .mat-mdc-dialog-title { 2 | display: flex; 3 | align-items: center; 4 | column-gap: 0.5em; 5 | } 6 | 7 | .mat-mdc-dialog-content { 8 | display: flex; 9 | flex-direction: column; 10 | } 11 | 12 | app-notice { 13 | width: 25em; 14 | min-width: 100%; 15 | margin: 1em 0; 16 | } 17 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/models/user-doc.ts: -------------------------------------------------------------------------------- 1 | import { User, USER_INDEX_PATHS, USERS_COLLECTION } from 'realtime-server/lib/esm/common/models/user'; 2 | import { JsonRealtimeDoc } from './json-realtime-doc'; 3 | 4 | export class UserDoc extends JsonRealtimeDoc { 5 | static readonly COLLECTION = USERS_COLLECTION; 6 | static readonly INDEX_PATHS = USER_INDEX_PATHS; 7 | } 8 | -------------------------------------------------------------------------------- /test/SIL.XForge.Scripture.Tests/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | // Allow use of the classic NUnit assertions with NUnit 4.x 2 | // See https://docs.nunit.org/articles/nunit/release-notes/Nunit4.0-MigrationGuide.html 3 | global using Assert = NUnit.Framework.Legacy.ClassicAssert; 4 | global using CollectionAssert = NUnit.Framework.Legacy.CollectionAssert; 5 | global using StringAssert = NUnit.Framework.Legacy.StringAssert; 6 | -------------------------------------------------------------------------------- /mongodb/Projects/CountUserRoles.mongodb: -------------------------------------------------------------------------------- 1 | use('xforge') 2 | 3 | db.sf_projects.aggregate([ 4 | {$project: { 5 | _id: 0, 6 | roles: { $objectToArray: "$userRoles" } 7 | }}, 8 | {$project: { 9 | roles: "$roles.v" 10 | }}, 11 | {$unwind: "$roles"}, 12 | {$group: { 13 | _id: "$roles", 14 | count: { $sum: 1 } 15 | }}, 16 | {$sort: { 17 | count: -1 18 | }} 19 | ]) 20 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/sync.ts: -------------------------------------------------------------------------------- 1 | export interface Sync { 2 | queuedCount: number; 3 | lastSyncSuccessful?: boolean; 4 | dateLastSuccessfulSync?: string; 5 | syncedToRepositoryVersion?: string; 6 | /** Indicates if PT project data from the last send/receive operation was incorporated into the SF project docs */ 7 | dataInSync?: boolean; 8 | lastSyncErrorCode?: number; 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-audio-player/checking-audio-player.component.scss: -------------------------------------------------------------------------------- 1 | @use '../checking-global-vars' as *; 2 | 3 | .audio-area { 4 | padding: 4px; 5 | border-radius: 4px; 6 | border: 1px solid $borderColor; 7 | 8 | .player { 9 | display: flex; 10 | align-items: center; 11 | } 12 | app-audio-player { 13 | flex: 1; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/error-dialog/error-dialog.component.scss: -------------------------------------------------------------------------------- 1 | a { 2 | color: #2d73b9; 3 | cursor: pointer; 4 | } 5 | 6 | p:first-child { 7 | margin-top: 0; 8 | } 9 | 10 | mat-dialog-content { 11 | max-width: 620px; 12 | 13 | pre { 14 | text-align: left; 15 | overflow-x: auto; 16 | } 17 | } 18 | 19 | .error-id { 20 | font-family: monospace; 21 | } 22 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/BiblicalTermNoteHeadingInfo.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class BiblicalTermNoteHeadingInfo 4 | { 5 | public string Gloss { get; set; } = string.Empty; 6 | public string Language { get; set; } = string.Empty; 7 | public string Lemma { get; set; } = string.Empty; 8 | public string Transliteration { get; set; } = string.Empty; 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/IInternetSharedRepositorySourceProvider.cs: -------------------------------------------------------------------------------- 1 | using SIL.XForge.Models; 2 | 3 | namespace SIL.XForge.Scripture.Services; 4 | 5 | public interface IInternetSharedRepositorySourceProvider 6 | { 7 | IInternetSharedRepositorySource GetSource( 8 | UserSecret userSecret, 9 | string sendReceiveServerUri, 10 | string registryServerUri 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/PersistedPtxUtilsSettings.cs: -------------------------------------------------------------------------------- 1 | using PtxUtils; 2 | 3 | namespace SIL.XForge.Scripture; 4 | 5 | class PersistedPtxUtilsSettings : IPtxUtilsSettings 6 | { 7 | public SerializableStringDictionary MementoData { get; set; } 8 | public bool UpgradeNeeded { get; set; } 9 | public bool EnableFormSnapping { get; set; } 10 | 11 | public void SafeSave() { } 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge/Controllers/UrlConstants.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge; 2 | 3 | public static class UrlConstants 4 | { 5 | public const string Anonymous = "anonymous"; 6 | public const string CommandApiNamespace = "command-api"; 7 | public const string Users = "users"; 8 | public const string Projects = "projects"; 9 | public const string ProjectNotifications = "project-notifications"; 10 | } 11 | -------------------------------------------------------------------------------- /tools/Roundtrip/SequentialGuidService.cs: -------------------------------------------------------------------------------- 1 | using MongoDB.Bson; 2 | using SIL.XForge.Scripture.Services; 3 | 4 | namespace Roundtrip; 5 | 6 | public class SequentialGuidService : IGuidService 7 | { 8 | private int _seed; 9 | 10 | public string Generate() => $"{++_seed:X16}-{Guid.Empty.ToString()[9..]}"; 11 | 12 | public string NewObjectId() => ObjectId.GenerateNewId(_seed).ToString(); 13 | } 14 | -------------------------------------------------------------------------------- /src/RealtimeServer/typings/sharedb-mongo.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'sharedb-mongo' { 2 | import { MongoClient } from 'mongodb'; 3 | import ShareDB from 'sharedb'; 4 | 5 | type Callback = (err: any, client: MongoClient) => void; 6 | 7 | class ShareDbMongo extends ShareDB.DB { 8 | constructor(mongo: string | ((callback: Callback) => void), options?: any); 9 | } 10 | 11 | export = ShareDbMongo; 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/notice/notice.types.ts: -------------------------------------------------------------------------------- 1 | export const noticeTypes = ['primary', 'secondary', 'success', 'warning', 'error', 'info', 'light', 'dark'] as const; 2 | export type NoticeType = (typeof noticeTypes)[number]; 3 | 4 | export const noticeModes = ['fill-light', 'fill-dark', 'fill-extra-dark', 'outline', 'basic'] as const; 5 | export type NoticeMode = (typeof noticeModes)[number]; 6 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/copyright-banner/copyright-banner.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | {{ banner }} 4 | @if (showMoreInfo) { 5 | 6 | {{ moreInfo }} 7 | 8 | } 9 |
10 |
11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/biblical-terms/biblical-term-dialog.component.scss: -------------------------------------------------------------------------------- 1 | @use 'src/xforge-common/media-breakpoints/breakpoints' as *; 2 | 3 | mat-dialog-actions { 4 | place-content: flex-end; 5 | } 6 | 7 | mat-dialog-content { 8 | display: flex; 9 | flex-direction: column; 10 | row-gap: 1em; 11 | @include media-breakpoint('<=', md) { 12 | row-gap: 2em; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/BiblicalTermsConfig.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | /// 4 | /// Contains configuration information for Biblical Terms and Renderings. 5 | /// 6 | public class BiblicalTermsConfig 7 | { 8 | public bool BiblicalTermsEnabled { get; set; } 9 | public string? ErrorMessage { get; set; } 10 | public bool HasRenderings { get; set; } 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/base-services/tab-menu.service.ts: -------------------------------------------------------------------------------- 1 | import { Observable } from 'rxjs'; 2 | 3 | export interface TabMenuItem { 4 | type: string; 5 | text: string; 6 | icon?: string; 7 | svgIcon?: string; 8 | } 9 | 10 | export abstract class TabMenuService { 11 | abstract getMenuItems(groupId?: TGroupId): Observable; 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/ai-drafting.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/SIL.XForge/Configuration/ParatextOptions.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Configuration; 2 | 3 | public class ParatextOptions 4 | { 5 | public string ClientId { get; set; } = "client_id"; 6 | public string ClientSecret { get; set; } = "client_secret"; 7 | public string HgExe { get; set; } 8 | public string ResourcePasswordBase64 { get; set; } 9 | public string ResourcePasswordHash { get; set; } 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/mobile-not-supported/mobile-not-supported.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { NoticeComponent } from '../notice/notice.component'; 3 | 4 | @Component({ 5 | selector: 'app-mobile-not-supported', 6 | imports: [NoticeComponent], 7 | templateUrl: './mobile-not-supported.component.html' 8 | }) 9 | export class MobileNotSupportedComponent {} 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/SFApplicationBuilderExtensions.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.DependencyInjection; 2 | using SIL.XForge.Scripture.Services; 3 | 4 | namespace Microsoft.AspNetCore.Builder; 5 | 6 | public static class SFApplicationBuilderExtensions 7 | { 8 | public static void UseSFServices(this IApplicationBuilder app) => 9 | app.ApplicationServices.GetService().Init(); 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/Json0Snapshot.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Newtonsoft.Json; 3 | 4 | namespace SIL.XForge.Models; 5 | 6 | [JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)] 7 | public class Json0Snapshot : IIdentifiable 8 | { 9 | [JsonIgnore] 10 | public string Id { get; set; } 11 | 12 | [JsonIgnore] 13 | public Dictionary ExtraElements { get; set; } 14 | } 15 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/checking-config.ts: -------------------------------------------------------------------------------- 1 | export enum CheckingAnswerExport { 2 | All = 'all', 3 | MarkedForExport = 'marked_for_export', 4 | None = 'none' 5 | } 6 | 7 | export interface CheckingConfig { 8 | checkingEnabled: boolean; 9 | usersSeeEachOthersResponses: boolean; 10 | answerExportMethod: CheckingAnswerExport; 11 | noteTagId?: number; 12 | hideCommunityCheckingText?: boolean; 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/tab/tab-body/tab-body.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, HostBinding, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-tab-body', 5 | templateUrl: './tab-body.component.html', 6 | styleUrls: ['./tab-body.component.scss'] 7 | }) 8 | export class TabBodyComponent { 9 | @HostBinding('class.active') 10 | @Input() 11 | active = false; 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/BiblicalTermDefinition.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace SIL.XForge.Scripture.Models; 4 | 5 | public class BiblicalTermDefinition 6 | { 7 | public IList Categories { get; set; } = []; 8 | public IList Domains { get; set; } = []; 9 | public string Gloss { get; set; } = string.Empty; 10 | public string Notes { get; set; } = string.Empty; 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/GuidService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using MongoDB.Bson; 3 | 4 | namespace SIL.XForge.Scripture.Services; 5 | 6 | /// 7 | /// This class is injected to allow testing. 8 | /// 9 | public class GuidService : IGuidService 10 | { 11 | public string Generate() => Guid.NewGuid().ToString(); 12 | 13 | public string NewObjectId() => ObjectId.GenerateNewId().ToString(); 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge/Realtime/RealtimeApplicationBuilderExtensions.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.DependencyInjection; 2 | using SIL.XForge.Realtime; 3 | 4 | namespace Microsoft.AspNetCore.Builder; 5 | 6 | public static class RealtimeApplicationBuilderExtensions 7 | { 8 | public static void UseRealtimeServer(this IApplicationBuilder app) => 9 | app.ApplicationServices.GetService().StartServer(); 10 | } 11 | -------------------------------------------------------------------------------- /tools/ServalBuildReport/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "QA": { 3 | "ApiServer": "https://qa.serval-api.org", 4 | "Audience": "https://serval-api.org/", 5 | "TokenUrl": "https://dev-sillsdev.auth0.com/oauth/token" 6 | }, 7 | "Prod": { 8 | "ApiServer": "https://prod.serval-api.org", 9 | "Audience": "https://serval-api.org/", 10 | "TokenUrl": "https://languagetechnology.auth0.com/oauth/token" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/save-note-parameters.ts: -------------------------------------------------------------------------------- 1 | import { VerseRef } from '@sillsdev/scripture'; 2 | import { NoteStatus } from 'realtime-server/lib/esm/scriptureforge/models/note-thread'; 3 | 4 | export interface SaveNoteParameters { 5 | content?: string; 6 | dataId?: string; 7 | threadDataId?: string; 8 | verseRef?: VerseRef; 9 | biblicalTermId?: string; 10 | status?: NoteStatus; 11 | } 12 | -------------------------------------------------------------------------------- /src/Help/menu_en.json: -------------------------------------------------------------------------------- 1 | { 2 | "help_menu": { 3 | "overview": "Overview", 4 | "concepts": "Concepts", 5 | "tasks": "Tasks", 6 | "tasks_menu": { 7 | "administrator_tasks": "Administrator tasks", 8 | "basic_tasks": "Basic tasks", 9 | "community_checking_tasks": "Community Checking tasks", 10 | "translate_tasks": "Translate tasks" 11 | }, 12 | "user_interface": "User Interface" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/book-multi-select/_book-multi-select-theme.scss: -------------------------------------------------------------------------------- 1 | @use '@angular/material' as mat; 2 | 3 | @mixin color($theme) { 4 | $is-dark: mat.get-theme-type($theme) == dark; 5 | 6 | --sf-book-border-fill: #{mat.get-theme-color($theme, primary, if($is-dark, 90, 10))}; 7 | } 8 | 9 | @mixin theme($theme) { 10 | @if mat.theme-has($theme, color) { 11 | @include color($theme); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor-draft/_editor-draft-theme.scss: -------------------------------------------------------------------------------- 1 | @use '@angular/material' as mat; 2 | 3 | @mixin color($theme) { 4 | $is-dark: mat.get-theme-type($theme) == dark; 5 | 6 | --sf-draft-applied-color: #{mat.get-theme-color($theme, tertiary, if($is-dark, 80, 70))}; 7 | } 8 | 9 | @mixin theme($theme) { 10 | @if mat.theme-has($theme, color) { 11 | @include color($theme); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/revisionTemplate.tem: -------------------------------------------------------------------------------- 1 | 2 | {node} 3 | {rev} 4 | {date|rfc3339date} 5 | {author|escape} 6 | 7 | 8 | {desc|escape} 9 | 10 | -------------------------------------------------------------------------------- /src/SIL.XForge/Services/ForbiddenException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace SIL.XForge.Services; 4 | 5 | public class ForbiddenException : Exception 6 | { 7 | public ForbiddenException() 8 | : base("The user does not have permission to perform this operation.") { } 9 | 10 | public ForbiddenException(string message) 11 | : base($"The user does not have permission to perform this operation. {message}") { } 12 | } 13 | -------------------------------------------------------------------------------- /.grit/patterns/bare_when.md: -------------------------------------------------------------------------------- 1 | --- 2 | level: error 3 | --- 4 | 5 | # Bare when 6 | 7 | `when(something)` is is incomplete; it should be like `when(something).then(somethingElse)` 8 | 9 | ```grit 10 | `when($_);` 11 | ``` 12 | 13 | ## When example 14 | 15 | ```ts 16 | when(something); 17 | ``` 18 | 19 | ```ts 20 | when(something); 21 | ``` 22 | 23 | ## When negative example 24 | 25 | ```ts 26 | when(something).then(somethingElse); 27 | ``` 28 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/core/models/paratext-project.ts: -------------------------------------------------------------------------------- 1 | /** See documentation in ParatextProject.cs. */ 2 | export interface ParatextProject { 3 | paratextId: string; 4 | name: string; 5 | shortName: string; 6 | languageTag: string; 7 | /** SF project id */ 8 | projectId?: string | null; 9 | isConnectable: boolean; 10 | isConnected: boolean; 11 | hasUserRoleChanged: boolean; 12 | hasUpdate: boolean; 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/users/users.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { TranslocoModule } from '@ngneat/transloco'; 3 | import { CollaboratorsComponent } from './collaborators/collaborators.component'; 4 | 5 | @Component({ 6 | selector: 'app-users', 7 | templateUrl: './users.component.html', 8 | imports: [TranslocoModule, CollaboratorsComponent] 9 | }) 10 | export class UsersComponent {} 11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/blur-on-click.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, ElementRef, HostListener } from '@angular/core'; 2 | 3 | @Directive({ selector: 'button[appBlurOnClick]' }) 4 | export class BlurOnClickDirective { 5 | constructor(private readonly elementRef: ElementRef) {} 6 | 7 | @HostListener('click') 8 | handleClick(): void { 9 | this.elementRef.nativeElement.blur(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/ProjectSecret.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace SIL.XForge.Models; 4 | 5 | public abstract class ProjectSecret : IIdentifiable 6 | { 7 | public string Id { get; set; } 8 | 9 | /// 10 | /// Outstanding project access shares to specific people, represented by an email address and code pair. 11 | /// 12 | public List ShareKeys { get; set; } = []; 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/Answer.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace SIL.XForge.Scripture.Models; 4 | 5 | public class Answer : Comment 6 | { 7 | public VerseRefData? VerseRef { get; set; } 8 | public string? ScriptureText { get; set; } 9 | public List Likes { get; set; } = []; 10 | public List Comments { get; set; } = []; 11 | public string Status { get; set; } = AnswerStatus.None; 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/IAnonymousService.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using SIL.XForge.Models; 3 | using SIL.XForge.Scripture.Models; 4 | 5 | namespace SIL.XForge.Scripture.Services; 6 | 7 | public interface IAnonymousService 8 | { 9 | Task CheckShareKey(string shareKey); 10 | Task GenerateAccount(string shareKey, string displayName, string language); 11 | } 12 | -------------------------------------------------------------------------------- /src/Migrations/PTDDCloneAll/PTDDCloneAll.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Exe 10 | netcoreapp3.1 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/Migrations/PtdaSyncAll/PtdaSyncAll.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Exe 10 | netcoreapp3.1 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/Migrations/SyncCancel/SyncCancel.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Exe 10 | netcoreapp3.1 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/confirm-sources/_confirm-sources-theme.scss: -------------------------------------------------------------------------------- 1 | @use '@angular/material' as mat; 2 | 3 | @mixin color($theme) { 4 | $is-dark: mat.get-theme-type($theme) == dark; 5 | 6 | --sf-source-background: #{mat.get-theme-color($theme, neutral, if($is-dark, 20, 98))}; 7 | } 8 | 9 | @mixin theme($theme) { 10 | @if mat.theme-has($theme, color) { 11 | @include color($theme); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge/Utils/ParameterRebinder.cs: -------------------------------------------------------------------------------- 1 | using System.Linq.Expressions; 2 | 3 | namespace SIL.XForge.Utils; 4 | 5 | internal class ParameterRebinder : ExpressionVisitor 6 | { 7 | private readonly ParameterExpression _parameter; 8 | 9 | public ParameterRebinder(ParameterExpression parameter) => _parameter = parameter; 10 | 11 | protected override Expression VisitParameter(ParameterExpression p) => base.VisitParameter(_parameter); 12 | } 13 | -------------------------------------------------------------------------------- /src/Migrations/SyncCancel/ISyncCancelService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading.Tasks; 3 | 4 | namespace SyncCancel 5 | { 6 | /// 7 | /// Interface for service that can initiate a synchronization cancel of all SF projects. 8 | /// 9 | public interface ISyncCancelService 10 | { 11 | Task SynchronizeCancelProjectsAsync(ISet sfProjectIdsToSynchronize = null); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/e2e/update-help-site-screenshots.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -xueo pipefail 4 | 5 | echo "Deleting old screenshots" 6 | 7 | rm -rf test_output/localized_screenshots/ 8 | 9 | echo "Generating new screenshots" 10 | 11 | ./e2e.mts localization localized_screenshots 12 | 13 | echo "Copying new screenshots to help site" 14 | 15 | ./copy-help-site-screenshots.mts test_output/localized_screenshots ~/src/scripture-forge-help 16 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/serval-administration/serval-projects.component.scss: -------------------------------------------------------------------------------- 1 | mat-form-field { 2 | margin-top: 10px; 3 | } 4 | 5 | .no-projects-label { 6 | padding-top: 14px; 7 | } 8 | 9 | .draft-jobs-button { 10 | display: flex; 11 | align-items: center; 12 | gap: 4px; 13 | white-space: nowrap; 14 | } 15 | 16 | .projects-controls { 17 | display: flex; 18 | align-items: center; 19 | justify-content: space-between; 20 | } 21 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/biblical-terms/_biblical-terms-theme.scss: -------------------------------------------------------------------------------- 1 | @use '@angular/material' as mat; 2 | 3 | @mixin color($theme) { 4 | $is-dark: mat.get-theme-type($theme) == dark; 5 | 6 | --sf-biblical-terms-tabler-header-background: #{mat.get-theme-color($theme, primary, if($is-dark, 10, 95))}; 7 | } 8 | 9 | @mixin theme($theme) { 10 | @if mat.theme-has($theme, color) { 11 | @include color($theme); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/scss/_404.scss: -------------------------------------------------------------------------------- 1 | #redirect-progress-bar { 2 | background: lightgray; 3 | max-width: 500px; 4 | &, 5 | span { 6 | display: block; 7 | height: 6px; 8 | border-radius: 3px; 9 | } 10 | span { 11 | background-color: $greyDark; 12 | animation: progress linear 10s; 13 | } 14 | } 15 | 16 | @keyframes progress { 17 | from { 18 | width: 0%; 19 | } 20 | to { 21 | width: 100%; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Migrations/SyncUserToPTUser/SyncUserToPTUser.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Exe 10 | netcoreapp3.1 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/note-tag.ts: -------------------------------------------------------------------------------- 1 | export const BIBLICAL_TERM_TAG_ICON = 'biblicalterm1'; 2 | export const DEFAULT_TAG_ICON = '01flag1'; 3 | export const SF_TAG_ICON = '06star2'; 4 | export const SF_TAG_NAME = 'Scripture Forge Note'; 5 | export const TO_DO_TAG_ID = 1; 6 | export const BIBLICAL_TERM_TAG_ID = -3; 7 | 8 | export interface NoteTag { 9 | tagId: number; 10 | name: string; 11 | icon: string; 12 | creatorResolve: boolean; 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.Converters.Usj/SIL.Converters.Usj.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netstandard2.0 5 | true 6 | true 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/serval-administration/serval-project.component.scss: -------------------------------------------------------------------------------- 1 | .admin-tool { 2 | display: flex; 3 | flex-direction: column; 4 | row-gap: 32px; 5 | 6 | > .admin-tool-control { 7 | display: flex; 8 | flex-direction: row; 9 | column-gap: 10px; 10 | 11 | .serval-config-field { 12 | width: 100%; 13 | } 14 | } 15 | } 16 | 17 | .zip-progress { 18 | display: flex; 19 | align-items: center; 20 | } 21 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/page-not-found/page-not-found.component.html: -------------------------------------------------------------------------------- 1 | 2 |

error_outline{{ t("page_not_found") }}

3 |

{{ t("redirecting_in_moments") }}

4 | 5 |
6 | {{ "my_projects.my_projects" | transloco }} 7 |
8 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/media-breakpoints/_css-vars.scss: -------------------------------------------------------------------------------- 1 | // Load this file in styles.scss file to define css variables for each breakpoint. 2 | 3 | @use 'sass:string'; 4 | @use 'breakpoints'; 5 | 6 | // Define a css variable for each breakpoint 7 | :root { 8 | @each $name, $breakpoint in breakpoints.$sfBreakpoints { 9 | // prettier-ignore 10 | --sf-breakpoint-#{string.to-lower-case($name)}:#{$breakpoint}; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/TransceleratorQuestion.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class TransceleratorQuestion 4 | { 5 | public string Book { get; set; } 6 | public string StartChapter { get; set; } 7 | public string StartVerse { get; set; } 8 | public string EndChapter { get; set; } 9 | public string EndVerse { get; set; } 10 | public string Text { get; set; } 11 | public string Id { get; set; } 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge/Realtime/Op.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace SIL.XForge.Realtime; 4 | 5 | /// 6 | /// A partial implementation of the op class. 7 | /// 8 | /// This corresponds to the "o_" tables in Mongo. 9 | public class Op 10 | { 11 | [JsonProperty("m")] 12 | public OpMetadata Metadata { get; set; } = new OpMetadata(); 13 | 14 | [JsonProperty("v")] 15 | public int Version { get; set; } 16 | } 17 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/lynx-insight-user-data.ts: -------------------------------------------------------------------------------- 1 | import { LynxInsightFilter, LynxInsightSortOrder } from './lynx-insight'; 2 | 3 | export interface LynxInsightUserData { 4 | autoCorrectionsEnabled?: boolean; 5 | assessmentsEnabled?: boolean; 6 | panelData?: LynxInsightPanelUserData; 7 | } 8 | 9 | export interface LynxInsightPanelUserData { 10 | isOpen: boolean; 11 | filter: LynxInsightFilter; 12 | sortOrder: LynxInsightSortOrder; 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-usfm-format/_draft-usfm-format-theme.scss: -------------------------------------------------------------------------------- 1 | @use '@angular/material' as mat; 2 | 3 | @mixin color($theme) { 4 | $is-dark: mat.get-theme-type($theme) == dark; 5 | 6 | --new-indicator-background-color: #{mat.get-theme-color($theme, primary, if($is-dark, 70, 40))}; 7 | } 8 | 9 | @mixin theme($theme) { 10 | @if mat.theme-has($theme, color) { 11 | @include color($theme); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/Operation.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public static class Operation 4 | { 5 | public const string Create = "create"; 6 | public const string Edit = "edit"; 7 | public const string Delete = "delete"; 8 | public const string View = "view"; 9 | public const string EditOwn = "edit_own"; 10 | public const string DeleteOwn = "delete_own"; 11 | public const string ViewOwn = "view_own"; 12 | } 13 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/editor-tab-persist-data.ts: -------------------------------------------------------------------------------- 1 | import { EditorTabGroupType, EditorTabType } from './editor-tab'; 2 | 3 | /** 4 | * Minimal data to persist and reconstruct an editor tab. 5 | */ 6 | export interface EditorTabPersistData { 7 | tabType: EditorTabType; 8 | groupId: EditorTabGroupType; 9 | isSelected?: boolean; 10 | 11 | /** 12 | * The SF project id if tab is a project/resource tab. 13 | */ 14 | projectId?: string; 15 | } 16 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/ResourceConfig.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace SIL.XForge.Scripture.Models; 4 | 5 | /// 6 | /// Contains configuration information for Paratext resources. 7 | /// 8 | public class ResourceConfig 9 | { 10 | public DateTime CreatedTimestamp { get; set; } 11 | public string ManifestChecksum { get; set; } 12 | public string PermissionsChecksum { get; set; } 13 | public int Revision { get; set; } 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge/Configuration/ConfigurationExtensions.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Configuration; 2 | 3 | namespace SIL.XForge.Configuration; 4 | 5 | public static class ConfigurationExtensions 6 | { 7 | public static T GetOptions(this IConfiguration configuration) 8 | where T : class, new() 9 | { 10 | string sectionName = Options.GetSectionName(); 11 | return configuration.GetSection(sectionName).Get() ?? new T(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.Converters.Usj/LowerCaseNamingStrategy.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json.Serialization; 2 | 3 | namespace SIL.Converters.Usj 4 | { 5 | /// 6 | /// Ensures that the JSON properties for the USJ data model are in lower case. 7 | /// 8 | public class LowerCaseNamingStrategy : NamingStrategy 9 | { 10 | /// 11 | protected override string ResolvePropertyName(string name) => name.ToLowerInvariant(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/ServalResourceDto.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | /// 4 | /// The DTO used to describe a Serval Resource (such as a translation engine or build) to the frontend. 5 | /// 6 | /// 7 | /// This is the lowest level of representing an entity from Serval. 8 | /// 9 | public class ServalResourceDto 10 | { 11 | public string Id { get; set; } 12 | public string Href { get; set; } 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/InterfaceLanguage.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | public class InterfaceLanguage 4 | { 5 | public string LocalName { get; set; } 6 | public string EnglishName { get; set; } 7 | public string CanonicalTag => this.Tags[0]; 8 | public string Direction { get; set; } = LanguageDirection.LTR; 9 | public string[] Tags { get; set; } 10 | public bool Production { get; set; } = false; 11 | public string Helps { get; set; } 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/sf-tabs.types.ts: -------------------------------------------------------------------------------- 1 | export interface TabEvent { 2 | index: number; 3 | } 4 | 5 | export interface TabHeaderPointerEvent extends TabEvent { 6 | pointerEvent: MouseEvent | TouchEvent; 7 | } 8 | 9 | export interface TabLocation { 10 | groupId: TGroupId; 11 | index: number; 12 | } 13 | 14 | export interface TabMoveEvent { 15 | from: TabLocation; 16 | to: TabLocation; 17 | } 18 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/tab-group-header/tab-scroll-button/tab-scroll-button.component.html: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/system-administration/system-administration.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

System Administration

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/ISFProjectRights.cs: -------------------------------------------------------------------------------- 1 | using SIL.XForge.Models; 2 | 3 | namespace SIL.XForge.Scripture.Services; 4 | 5 | public interface ISFProjectRights 6 | { 7 | bool HasPermissions(Project project, string? userId, string[] permissions); 8 | bool HasRight(Project project, string? userId, string projectDomain, string operation, IOwnedData? data = null); 9 | bool RoleHasRight(Project project, string role, string projectDomain, string operation); 10 | } 11 | -------------------------------------------------------------------------------- /test/SIL.XForge.Scripture.Tests/Services/TestGuidService.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Services; 2 | 3 | /// 4 | /// This class generates IDs that are predictable and repeatable, i.e. are testable. 5 | /// 6 | public class TestGuidService : IGuidService 7 | { 8 | private int _charID = 1; 9 | private int _objID = 2; 10 | 11 | public string Generate() => $"{_charID++}"; 12 | 13 | public string NewObjectId() => "syncuser0" + _objID++; 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/core/models/sf-project-doc.ts: -------------------------------------------------------------------------------- 1 | import { 2 | SFProject, 3 | SF_PROJECTS_COLLECTION, 4 | SF_PROJECT_INDEX_PATHS 5 | } from 'realtime-server/lib/esm/scriptureforge/models/sf-project'; 6 | import { SFProjectBaseDoc } from './sf-project-base-doc'; 7 | 8 | export class SFProjectDoc extends SFProjectBaseDoc { 9 | static readonly COLLECTION = SF_PROJECTS_COLLECTION; 10 | static readonly INDEX_PATHS = SF_PROJECT_INDEX_PATHS; 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/models/user-profile-doc.ts: -------------------------------------------------------------------------------- 1 | import { 2 | USER_PROFILES_COLLECTION, 3 | USER_PROFILE_INDEX_PATHS, 4 | UserProfile 5 | } from 'realtime-server/lib/esm/common/models/user'; 6 | import { JsonRealtimeDoc } from './json-realtime-doc'; 7 | 8 | export class UserProfileDoc extends JsonRealtimeDoc { 9 | static readonly COLLECTION = USER_PROFILES_COLLECTION; 10 | static readonly INDEX_PATHS = USER_PROFILE_INDEX_PATHS; 11 | } 12 | -------------------------------------------------------------------------------- /test/SIL.XForge.Scripture.Tests/Services/MockProjectSettings.cs: -------------------------------------------------------------------------------- 1 | namespace Paratext.Data.ProjectSettingsAccess; 2 | 3 | /// Mock for tests. 4 | public class MockProjectSettings : ProjectSettings 5 | { 6 | private bool _editable = true; 7 | 8 | public MockProjectSettings(ScrText scrText) 9 | : base(scrText) { } 10 | 11 | public override bool Editable 12 | { 13 | get => _editable; 14 | set => _editable = value; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/SFJsonRpcApplicationBuilderExtensions.cs: -------------------------------------------------------------------------------- 1 | using SIL.XForge; 2 | using SIL.XForge.Scripture.Controllers; 3 | 4 | namespace Microsoft.AspNetCore.Builder; 5 | 6 | public static class SFJsonRpcApplicationBuilderExtensions 7 | { 8 | public static void UseSFJsonRpc(this IApplicationBuilder app) => 9 | app.UseXFJsonRpc(options => 10 | options.AddControllerWithCustomPath(UrlConstants.Projects) 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/wwwroot/images/community-checking.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mongodb/databases/dropDBNonSF.mongodb: -------------------------------------------------------------------------------- 1 | // This script drops any database not in the whitelist 2 | const dbWhitelist = ['admin', 'config', 'local', 'sf_jobs', 'xforge', 'xforge_machine']; 3 | 4 | const dbs = db.adminCommand({ listDatabases: 1 }).databases; 5 | const dropDBs = dbs.filter(db => !dbWhitelist.includes(db.name)); 6 | console.log('Dropping dbs:'); 7 | dropDBs.forEach(dropDB => { 8 | console.log(` - ${dropDB.name}`); 9 | use(dropDB.name); 10 | db.dropDatabase(); 11 | }); 12 | dbs; 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/core/models/text-audio-doc.ts: -------------------------------------------------------------------------------- 1 | import { 2 | TEXT_AUDIO_COLLECTION, 3 | TEXT_AUDIO_INDEX_PATHS, 4 | TextAudio 5 | } from 'realtime-server/lib/esm/scriptureforge/models/text-audio'; 6 | import { ProjectDataDoc } from 'xforge-common/models/project-data-doc'; 7 | 8 | export class TextAudioDoc extends ProjectDataDoc { 9 | static readonly COLLECTION = TEXT_AUDIO_COLLECTION; 10 | static readonly INDEX_PATHS = TEXT_AUDIO_INDEX_PATHS; 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/working-animated-indicator/working-animated-indicator.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { MatIcon } from '@angular/material/icon'; 3 | 4 | @Component({ 5 | selector: 'app-working-animated-indicator', 6 | templateUrl: './working-animated-indicator.component.html', 7 | styleUrls: ['./working-animated-indicator.component.scss'], 8 | imports: [MatIcon] 9 | }) 10 | export class WorkingAnimatedIndicatorComponent {} 11 | -------------------------------------------------------------------------------- /src/SIL.XForge/DataAccess/DuplicateKeyException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace SIL.XForge.DataAccess; 4 | 5 | public class DuplicateKeyException : Exception 6 | { 7 | private const string DefaultMessage = "The inserted/updated entity has the same key as an existing entity."; 8 | 9 | public DuplicateKeyException() 10 | : base(DefaultMessage) { } 11 | 12 | public DuplicateKeyException(Exception innerException) 13 | : base(DefaultMessage, innerException) { } 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/event-metrics/event-metrics-log.component.scss: -------------------------------------------------------------------------------- 1 | @use 'src/variables' as sfColors; 2 | 3 | .no-event-metrics-label { 4 | padding-top: 14px; 5 | } 6 | 7 | .table-wrapper { 8 | overflow-x: auto; 9 | display: block; 10 | } 11 | 12 | app-owner, 13 | .details-button { 14 | white-space: nowrap; 15 | } 16 | 17 | .status-icon.successful { 18 | color: sfColors.$greenDark; 19 | } 20 | 21 | .status-icon:not(.successful) { 22 | color: sfColors.$red; 23 | } 24 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/audio/audio-player/audio-player.component.scss: -------------------------------------------------------------------------------- 1 | .content { 2 | display: flex; 3 | align-items: center; 4 | 5 | .duration, 6 | .current-time { 7 | padding: 0 10px; 8 | font-size: 0.8em; 9 | } 10 | .slider { 11 | flex-grow: 1; 12 | } 13 | } 14 | 15 | .audio-not-available { 16 | display: flex; 17 | align-items: center; 18 | 19 | padding: 5px; 20 | // Same spacing as .content .current-time 21 | column-gap: 10px; 22 | } 23 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/info/info.stories.ts: -------------------------------------------------------------------------------- 1 | import { Meta, StoryObj } from '@storybook/angular'; 2 | import { InfoComponent } from './info.component'; 3 | 4 | const defaultArgs = { 5 | text: 'Some useful information.' 6 | }; 7 | 8 | const meta: Meta = { 9 | title: 'Utility/Info', 10 | component: InfoComponent, 11 | args: defaultArgs 12 | }; 13 | export default meta; 14 | 15 | type Story = StoryObj; 16 | 17 | export const Info: Story = {}; 18 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/_editor-theme.scss: -------------------------------------------------------------------------------- 1 | @use '@angular/material' as mat; 2 | 3 | @mixin color($theme) { 4 | $is-dark: mat.get-theme-type($theme) == dark; 5 | 6 | --sf-editor-note-fab-background-color: #{mat.get-theme-color($theme, tertiary, 80)}; 7 | --sf-editor-note-fab-foreground-color: #{mat.get-theme-color($theme, tertiary, 10)}; 8 | } 9 | 10 | @mixin theme($theme) { 11 | @if mat.theme-has($theme, color) { 12 | @include color($theme); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | import 'zone.js/testing'; 3 | 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; 6 | 7 | // First, initialize the Angular testing environment. 8 | getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); 9 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/ServalBuildDto.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class ServalBuildDto : ServalResourceDto 4 | { 5 | public int QueueDepth { get; set; } 6 | public ServalBuildAdditionalInfo? AdditionalInfo { get; set; } 7 | public int Revision { get; set; } 8 | public ServalResourceDto Engine { get; set; } 9 | public double PercentCompleted { get; set; } 10 | public string? Message { get; set; } 11 | public string State { get; set; } 12 | } 13 | -------------------------------------------------------------------------------- /src/Migrations/PTDDCloneAll/IPTDDSyncRunner.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | namespace PTDDCloneAll 4 | { 5 | /// 6 | /// An interface that makes it possible to register a PTDDSyncRunner to the DI container in a way where 7 | /// other services can request this using a factory function 8 | /// 9 | public interface IPTDDSyncRunner 10 | { 11 | Task RunAsync(string projectId, string userId, bool trainEngine, bool silent, bool pushLocal); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/RealtimeServer/typings/sharedb-mingo-memory.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'sharedb-mingo-memory' { 2 | import ShareDB from 'sharedb'; 3 | 4 | class ShareDBMingo extends ShareDB.DB { 5 | static extendMemoryDB(db: typeof ShareDB.DB): typeof ShareDBMingo; 6 | 7 | readonly docs: { [collection: string]: { [docId: string]: ShareDB.Snapshot } }; 8 | readonly ops: { [collection: string]: { [docId: string]: ShareDB.RawOp[] } }; 9 | 10 | constructor(); 11 | } 12 | 13 | export = ShareDBMingo; 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/core/models/edited-segment-data.ts: -------------------------------------------------------------------------------- 1 | import { OfflineData } from 'xforge-common/offline-store'; 2 | 3 | export const EDITED_SEGMENTS = 'edited_segments'; 4 | 5 | /** 6 | * Data that can be stored in browser storage and used to train edited segments while offline 7 | */ 8 | export interface EditedSegmentData extends OfflineData { 9 | projectRef: string; 10 | sourceProjectRef: string; 11 | bookNum: number; 12 | chapterNum: number; 13 | segment: string; 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge/Realtime/OpSource.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using Newtonsoft.Json.Converters; 3 | 4 | namespace SIL.XForge.Realtime; 5 | 6 | /// 7 | /// The Source, stored in the . 8 | /// 9 | /// These are stored as strings in MongoDB, and are only used by text documents. 10 | [JsonConverter(typeof(StringEnumConverter))] 11 | public enum OpSource 12 | { 13 | Editor, 14 | History, 15 | Draft, 16 | Paratext, 17 | } 18 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/audio/audio-time-pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'audioTime' }) 4 | export class AudioTimePipe implements PipeTransform { 5 | transform(seconds: number, ..._args: any[]): string { 6 | const minutesString = Math.floor(seconds / 60); 7 | seconds = Math.floor(seconds % 60); 8 | const secondsString = seconds >= 10 ? seconds : '0' + seconds; 9 | return minutesString + ':' + secondsString; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/write-status/write-status.component.html: -------------------------------------------------------------------------------- 1 | @if (state === ElementState.Submitting && !formGroup?.errors) { 2 | 3 | } @else if (state === ElementState.Submitted && !formGroup?.errors) { 4 | done 5 | } @else if (state === ElementState.Error && !formGroup?.errors) { 6 | error 7 | } 8 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/INotifier.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using SIL.XForge.Scripture.Models; 3 | 4 | namespace SIL.XForge.Scripture.Services; 5 | 6 | public interface INotifier 7 | { 8 | Task NotifyBuildProgress(string sfProjectId, ServalBuildState buildState); 9 | Task NotifyDraftApplyProgress(string sfProjectId, DraftApplyState draftApplyState); 10 | Task NotifySyncProgress(string sfProjectId, ProgressState progressState); 11 | Task SubscribeToProject(string projectId); 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/SFTrainingText.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using SIL.XForge.Scripture.Models; 3 | 4 | namespace SIL.XForge.Scripture.Services; 5 | 6 | /// 7 | /// An implementation of specifically for non-scripture training texts. 8 | /// 9 | public class SFTrainingText : ISFText 10 | { 11 | public string Id { get; init; } = string.Empty; 12 | public IEnumerable Segments { get; init; } = new List(); 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/grit.yml: -------------------------------------------------------------------------------- 1 | name: Grit check 2 | permissions: {} 3 | 4 | on: 5 | push: 6 | branches: [master, develop, sf-qa, sf-live] 7 | pull_request: 8 | merge_group: 9 | 10 | jobs: 11 | grit-check: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Check out code 15 | uses: actions/checkout@v5 16 | with: 17 | persist-credentials: false 18 | 19 | - name: grit-check 20 | uses: getgrit/github-action-check@c1ba5f99fd0e46f4cdc35d8dbc4622610ccc1784 # v0 21 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/core/models/training-data-doc.ts: -------------------------------------------------------------------------------- 1 | import { 2 | TRAINING_DATA_COLLECTION, 3 | TRAINING_DATA_INDEX_PATHS, 4 | TrainingData 5 | } from 'realtime-server/lib/esm/scriptureforge/models/training-data'; 6 | import { ProjectDataDoc } from 'xforge-common/models/project-data-doc'; 7 | 8 | export class TrainingDataDoc extends ProjectDataDoc { 9 | static readonly COLLECTION = TRAINING_DATA_COLLECTION; 10 | static readonly INDEX_PATHS = TRAINING_DATA_INDEX_PATHS; 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/word-graph-arc-dto.ts: -------------------------------------------------------------------------------- 1 | import { AlignedWordPairDto } from './aligned-word-pair-dto'; 2 | import { TranslationSource } from './translation-source'; 3 | 4 | export interface WordGraphArcDto { 5 | prevState: number; 6 | nextState: number; 7 | score: number; 8 | targetTokens: string[]; 9 | confidences: number[]; 10 | sourceSegmentStart: number; 11 | sourceSegmentEnd: number; 12 | alignment: AlignedWordPairDto[]; 13 | sources: TranslationSource[][]; 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/navigation/_navigation-theme.scss: -------------------------------------------------------------------------------- 1 | @use '@angular/material' as mat; 2 | 3 | @mixin color($theme) { 4 | $is-dark: mat.get-theme-type($theme) == dark; 5 | --sf-navigation-list-item-active: #{mat.get-theme-color($theme, primary, 99)}; 6 | --sf-navigation-list-item-active-background-color: #{mat.get-theme-color($theme, primary, if($is-dark, 20, 10))}; 7 | } 8 | 9 | @mixin theme($theme) { 10 | @if mat.theme-has($theme, color) { 11 | @include color($theme); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/supported-browsers-dialog/supported-browsers-dialog.component.html: -------------------------------------------------------------------------------- 1 | 2 |

{{ t("browser_unsupported") }}

3 | 4 |

5 |
6 | 7 | 8 | 9 |
10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-result-dto.ts: -------------------------------------------------------------------------------- 1 | import { AlignedWordPairDto } from './aligned-word-pair-dto'; 2 | import { PhraseDto } from './phrase-dto'; 3 | import { TranslationSource } from './translation-source'; 4 | 5 | export interface TranslationResultDto { 6 | translation: string; 7 | sourceTokens: string[]; 8 | targetTokens: string[]; 9 | confidences: number[]; 10 | sources: TranslationSource[][]; 11 | alignment: AlignedWordPairDto[]; 12 | phrases: PhraseDto[]; 13 | } 14 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/global-notices/global-notices.stories.ts: -------------------------------------------------------------------------------- 1 | import { Meta, StoryObj } from '@storybook/angular'; 2 | import { GlobalNoticesComponent } from './global-notices.component'; 3 | 4 | const meta: Meta = { 5 | title: 'Shared/Global Notices', 6 | component: GlobalNoticesComponent 7 | }; 8 | 9 | export default meta; 10 | type Story = StoryObj; 11 | 12 | export const Default: Story = { 13 | args: { showDowntimeNotice: true } 14 | }; 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/lynx/insights/base-services/editor-segment.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { DeltaOperation } from 'rich-text'; 3 | import { LynxInsightRange } from '../lynx-insight'; 4 | 5 | @Injectable() 6 | export abstract class EditorSegmentService { 7 | abstract parseSegments(ops: DeltaOperation[]): Map; 8 | abstract getSegmentRefs(range: LynxInsightRange, segments: Map): string[]; 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/DataAccess/SFDataAccessApplicationBuilderExtensions.cs: -------------------------------------------------------------------------------- 1 | using SIL.XForge.Scripture.Models; 2 | 3 | namespace Microsoft.AspNetCore.Builder; 4 | 5 | public static class SFDataAccessApplicationBuilderExtensions 6 | { 7 | public static void UseSFDataAccess(this IApplicationBuilder app) 8 | { 9 | app.UseDataAccess(); 10 | 11 | app.InitRepository(); 12 | app.InitRepository(); 13 | app.InitRepository(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/SIL.XForge/Configuration/PublicAuthOptions.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Configuration; 2 | 3 | /// 4 | /// This class defines the authentication configuration that may be rendered on the frontend website. 5 | /// 6 | public class PublicAuthOptions 7 | { 8 | public string Audience { get; init; } = string.Empty; 9 | public string Domain { get; init; } = string.Empty; 10 | public string FrontendClientId { get; init; } = string.Empty; 11 | public string Scope { get; init; } = string.Empty; 12 | } 13 | -------------------------------------------------------------------------------- /.grit/patterns/remove_non_null_assertion.md: -------------------------------------------------------------------------------- 1 | # Remove non-null assertion 2 | 3 | Removes all non-null assertions, without regard to whether they're needed or not. One use for this is to remove all 4 | non-null assertions from certain files and then only add them back in where they're needed. 5 | 6 | ```grit 7 | language js 8 | 9 | non_null_expression() as $nonNullAssertion where { 10 | $nonNullAssertion <: contains or { member_expression(), identifier() } as $expression, 11 | $nonNullAssertion => $expression 12 | } 13 | ``` 14 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/note.ts: -------------------------------------------------------------------------------- 1 | import { Comment } from './comment'; 2 | import { NoteStatus } from './note-thread'; 3 | 4 | export const REATTACH_SEPARATOR = '\uFFFC'; 5 | 6 | export interface Note extends Comment { 7 | threadId: string; 8 | type: string; 9 | conflictType: string; 10 | status: NoteStatus; 11 | tagId?: number; 12 | reattached?: string; 13 | assignment?: string; 14 | content?: string; 15 | acceptedChangeXml?: string; 16 | editable?: boolean; 17 | versionNumber?: number; 18 | } 19 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/event-metrics/event-metrics.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { TranslocoModule } from '@ngneat/transloco'; 3 | import { EventMetricsLogComponent } from './event-metrics-log.component'; 4 | 5 | @Component({ 6 | selector: 'app-event-metrics', 7 | templateUrl: './event-metrics.component.html', 8 | styleUrls: ['./event-metrics.component.scss'], 9 | imports: [EventMetricsLogComponent, TranslocoModule] 10 | }) 11 | export class EventMetricsComponent {} 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/ProgressState.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class ProgressState 4 | { 5 | public static readonly ProgressState Completed = new ProgressState { ProgressValue = 1.0 }; 6 | public static readonly ProgressState NotStarted = new ProgressState { ProgressValue = 0.0 }; 7 | public string? ProgressString { get; set; } 8 | public double ProgressValue { get; set; } 9 | public SyncPhase SyncPhase { get; set; } 10 | public double SyncProgress { get; set; } 11 | } 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Services/IScrTextCollection.cs: -------------------------------------------------------------------------------- 1 | using Paratext.Data; 2 | using Paratext.Data.ProjectFileAccess; 3 | 4 | namespace SIL.XForge.Scripture.Services; 5 | 6 | public interface IScrTextCollection 7 | { 8 | void Initialize(string settingsDir = null); 9 | ScrText? FindById(string username, string projectId); 10 | 11 | ResourceScrText CreateResourceScrText( 12 | string ptUsername, 13 | ProjectName projectName, 14 | IZippedResourcePasswordProvider passwordProvider 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /src/Docker/docker-compose.win.yml: -------------------------------------------------------------------------------- 1 | # This additional file contains configuration for Windows and support for Visual Studio's Fast Mode 2 | services: 3 | web-xforge: 4 | environment: 5 | - staticWebAssets=DISABLED # Fixes System.ArgumentException: 'The path must be absolute. (Parameter 'root')' 6 | volumes: 7 | - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro # Get the User Secrets from a Windows Host 8 | - ../RealtimeServer/:/app/ClientApp/node_modules/realtime-server # Override the host symbolic link 9 | -------------------------------------------------------------------------------- /src/Migrations/ServalMigration/ServalMigration.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/tab-header/tab-header.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | @if (closeable) { 6 | 15 | } 16 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/sf-tab-group/sf-tabs-providers.ts: -------------------------------------------------------------------------------- 1 | import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core'; 2 | import { NoopTabAddRequestService, TabAddRequestService } from './base-services/tab-add-request.service'; 3 | 4 | /** 5 | * Provides the default TabAddRequestService implementation for SF tabs. 6 | */ 7 | export function provideSFTabs(): EnvironmentProviders { 8 | return makeEnvironmentProviders([{ provide: TabAddRequestService, useClass: NoopTabAddRequestService }]); 9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-source.ts: -------------------------------------------------------------------------------- 1 | import { TranslateSource } from 'realtime-server/lib/esm/scriptureforge/models/translate-config'; 2 | 3 | interface DraftTextInfo { 4 | bookNum: number; 5 | } 6 | 7 | export interface DraftSource extends TranslateSource { 8 | texts: DraftTextInfo[]; 9 | noAccess?: boolean; 10 | } 11 | 12 | export interface DraftSourcesAsArrays { 13 | trainingSources: DraftSource[]; 14 | trainingTargets: DraftSource[]; 15 | draftingSources: DraftSource[]; 16 | } 17 | -------------------------------------------------------------------------------- /src/RealtimeServer/common/models/validation-schema.ts: -------------------------------------------------------------------------------- 1 | export interface ValidationSchema { 2 | // Whether or not the schema allows additional properties 3 | additionalProperties?: boolean; 4 | anyOf?: ValidationSchema[]; 5 | bsonType?: string | string[]; 6 | enum?: string[]; 7 | items?: ValidationSchema; 8 | pattern?: string; 9 | properties?: SchemaProperties; 10 | patternProperties?: SchemaProperties; 11 | required?: string[]; 12 | } 13 | 14 | export interface SchemaProperties { 15 | [key: string]: ValidationSchema; 16 | } 17 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/checking/import-questions-dialog/import-questions-confirmation-dialog/import-questions-confirmation-dialog.component.scss: -------------------------------------------------------------------------------- 1 | @use 'sass:color'; 2 | 3 | .mat-mdc-dialog-content { 4 | max-width: 560px; 5 | display: flex; 6 | gap: 20px; 7 | flex-direction: column; 8 | } 9 | 10 | .table-container { 11 | max-height: 150px; 12 | } 13 | 14 | .mat-mdc-header-cell { 15 | background-color: color.scale(#fff, $lightness: -10%); 16 | } 17 | 18 | .mat-mdc-dialog-actions { 19 | justify-content: end; 20 | } 21 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | **/.angular 2 | **/.classpath 3 | **/.dockerignore 4 | **/.env 5 | **/.git 6 | **/.gitignore 7 | **/.nx 8 | **/.project 9 | **/.settings 10 | **/.toolstarget 11 | **/.vs 12 | **/.vscode 13 | **/*.*proj.user 14 | **/*.dbmdl 15 | **/*.jfm 16 | **/azds.yaml 17 | **/bin 18 | **/charts 19 | **/coverage 20 | **/dist 21 | **/docker-compose* 22 | **/Dockerfile* 23 | **/node_modules 24 | **/npm-debug.log 25 | **/obj 26 | */src/RealtimeServer/lib/ 27 | **/secrets.dev.yaml 28 | **/tmp 29 | **/values.dev.yaml 30 | ClientApp 31 | LICENSE 32 | README.md 33 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "nuget" 9 | directory: "/" 10 | schedule: 11 | interval: "daily" 12 | allow: 13 | - dependency-name: "Serval.Client" 14 | -------------------------------------------------------------------------------- /src/Docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | db-xforge: 3 | image: mongo:7.0 4 | 5 | realtimeserver: 6 | image: ${DOCKER_REGISTRY-}sillsdev/web-xforge/realtimeserver 7 | build: 8 | context: ../.. 9 | dockerfile: src/RealtimeServer/Dockerfile 10 | 11 | web-xforge: 12 | image: ${DOCKER_REGISTRY-}sillsdev/web-xforge 13 | build: 14 | context: ../.. 15 | dockerfile: src/SIL.XForge.Scripture/Dockerfile 16 | 17 | volumes: 18 | mongo_config: 19 | mongo_data: 20 | scriptureforge-data: 21 | xforge-data: 22 | -------------------------------------------------------------------------------- /src/Migrations/SourceTargetSplitting/SourceTargetSplitting.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | latest 5 | enable 6 | Exe 7 | netcoreapp3.1 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/Migrations/BackoutCommits/BackoutCommits.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Exe 10 | net8.0 11 | BackoutCommits 12 | enable 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/note-dialog/_note-dialog-theme.scss: -------------------------------------------------------------------------------- 1 | @use '@angular/material' as mat; 2 | 3 | @mixin color($theme) { 4 | $is-dark: mat.get-theme-type($theme) == dark; 5 | 6 | --sf-note-dialog-reference-background: #{mat.get-theme-color($theme, neutral, if($is-dark, 30, 98))}; 7 | --sf-note-dialog-reference-text-color: #{mat.get-theme-color($theme, tertiary, if($is-dark, 80, 50))}; 8 | } 9 | 10 | @mixin theme($theme) { 11 | @if mat.theme-has($theme, color) { 12 | @include color($theme); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/AnswerStatus.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | /// The status of an community checking answer. 4 | public static class AnswerStatus 5 | { 6 | /// No status. 7 | public const string None = ""; 8 | 9 | /// Answer has been resolved. 10 | public const string Resolved = "resolve"; 11 | 12 | /// Answer can be exported during a sync if configured on the project. 13 | public const string Exportable = "export"; 14 | } 15 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/services/sf-project-data-service.ts: -------------------------------------------------------------------------------- 1 | import { ProjectData } from '../../common/models/project-data'; 2 | import { ProjectDataService } from '../../common/services/project-data-service'; 3 | import { SF_PROJECT_RIGHTS } from '../models/sf-project-rights'; 4 | 5 | /** 6 | * This is the abstract base class for all SF doc services that manage project data. 7 | */ 8 | export abstract class SFProjectDataService extends ProjectDataService { 9 | protected readonly projectRights = SF_PROJECT_RIGHTS; 10 | } 11 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/xforge-common/owner/owner.component.html: -------------------------------------------------------------------------------- 1 |
8 | @if (includeAvatar) { 9 |
10 | } 11 |
12 |
{{ name }}
13 | @if (dateTime) { 14 |
{{ i18n.formatDate(date, { showTimeZone }) }}
15 | } 16 |
17 |
18 | -------------------------------------------------------------------------------- /src/SIL.XForge/Models/QueuedAction.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Models; 2 | 3 | internal enum QueuedAction 4 | { 5 | /// 6 | /// The createDoc action. 7 | /// 8 | Create = 0, 9 | 10 | /// 11 | /// The deleteDoc action. 12 | /// 13 | Delete = 1, 14 | 15 | /// 16 | /// The submitOp action. 17 | /// 18 | Submit = 2, 19 | 20 | /// 21 | /// The replaceDoc action. 22 | /// 23 | Replace = 3, 24 | } 25 | -------------------------------------------------------------------------------- /mongodb/Projects/ProjectsWithInvalidDocs.mongodb: -------------------------------------------------------------------------------- 1 | // Find projects that have a text doc that is "invalid" (not the same as corrupted) 2 | // For a greater granularity, see the script InvalidChaptersInProjects.mongodb 3 | use("xforge"); 4 | 5 | const invalidProjects = db.sf_projects.countDocuments({ 6 | texts: { $elemMatch: { chapters: { $elemMatch: { isValid: false } } } } 7 | }); 8 | 9 | const totalProjects = db.sf_projects.countDocuments(); 10 | 11 | console.log(`${invalidProjects} of ${totalProjects} projects have at least one doc that is marked invalid.`); 12 | -------------------------------------------------------------------------------- /src/Migrations/BackoutCommits/ISyncAllService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading.Tasks; 3 | 4 | namespace BackoutCommits; 5 | 6 | /// 7 | /// Interface for service that can initiate a synchronization of all SF projects. 8 | /// 9 | public interface ISyncAllService 10 | { 11 | Task SynchronizeAllProjectsAsync( 12 | bool doSynchronizations, 13 | ISet sfProjectIdsToSynchronize, 14 | string projectRootDir, 15 | IDictionary sfAdminsToUse = null 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/RealtimeServer/scriptureforge/models/answer.ts: -------------------------------------------------------------------------------- 1 | import { Comment } from './comment'; 2 | import { Like } from './like'; 3 | import { VerseRefData } from './verse-ref-data'; 4 | 5 | export enum AnswerStatus { 6 | None = '', 7 | Resolved = 'resolved', 8 | Exportable = 'export' 9 | } 10 | 11 | export interface Answer extends Comment { 12 | verseRef?: VerseRefData; 13 | scriptureText?: string; 14 | selectionStartClipped?: boolean; 15 | selectionEndClipped?: boolean; 16 | likes: Like[]; 17 | comments: Comment[]; 18 | status?: AnswerStatus; 19 | } 20 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/e2e/test_characterization.json: -------------------------------------------------------------------------------- 1 | { 2 | "smoke_tests": { 3 | "success": 13, 4 | "failure": 0 5 | }, 6 | "home_and_login": { 7 | "success": 13, 8 | "failure": 0 9 | }, 10 | "generate_draft": { 11 | "success": 13, 12 | "failure": 0 13 | }, 14 | "community_checking": { 15 | "success": 13, 16 | "failure": 0 17 | }, 18 | "localized_screenshots": { 19 | "success": 13, 20 | "failure": 0 21 | }, 22 | "edit_translation": { 23 | "success": 33, 24 | "failure": 3 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/_checking-theme.scss: -------------------------------------------------------------------------------- 1 | @use '@angular/material' as mat; 2 | 3 | @mixin color($theme) { 4 | $is-dark: mat.get-theme-type($theme) == dark; 5 | 6 | --sf-community-checking-questions-nav-background: #{mat.get-theme-color($theme, neutral, if($is-dark, 20, 95))}; 7 | --sf-community-checking-audio-player-background: #{mat.get-theme-color($theme, neutral, if($is-dark, 20, 98))}; 8 | } 9 | 10 | @mixin theme($theme) { 11 | @if mat.theme-has($theme, color) { 12 | @include color($theme); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/CheckingConfig.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Scripture.Models; 2 | 3 | public class CheckingConfig 4 | { 5 | public bool CheckingEnabled { get; set; } 6 | public bool UsersSeeEachOthersResponses { get; set; } = true; 7 | public string AnswerExportMethod { get; set; } = CheckingAnswerExport.All; 8 | public int? NoteTagId { get; set; } 9 | 10 | /// Do not show chapter text in community checking area (i.e. only audio should be shown) 11 | public bool? HideCommunityCheckingText { get; set; } 12 | } 13 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/Models/TrainingData.cs: -------------------------------------------------------------------------------- 1 | using SIL.XForge.Models; 2 | 3 | namespace SIL.XForge.Scripture.Models; 4 | 5 | public class TrainingData : ProjectData 6 | { 7 | public static string GetDocId(string sfProjectId, string dataId) => $"{sfProjectId}:{dataId}"; 8 | 9 | public string DataId { get; set; } = string.Empty; 10 | public string FileUrl { get; set; } = string.Empty; 11 | public string MimeType { get; set; } = string.Empty; 12 | public int SkipRows { get; set; } 13 | public string Title { get; set; } = string.Empty; 14 | } 15 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/shared/share/share-button.component.html: -------------------------------------------------------------------------------- 1 | 2 | @if (iconOnlyButton) { 3 | 6 | } @else { 7 | 10 | } 11 | 12 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/lynx/insights/lynx-insight-action-prompt/lynx-insight-action-prompt.component.html: -------------------------------------------------------------------------------- 1 | @if (activeInsights.length === 1) { 2 | 3 | } 4 | @if (activeInsights.length > 1) { 5 |
6 | tips_and_updates 7 | filter_{{ activeInsights.length < 10 ? activeInsights.length : "9_plus" }} 8 |
9 | } 10 | -------------------------------------------------------------------------------- /src/SIL.XForge/Configuration/SiteOptions.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Configuration; 2 | 3 | public class SiteOptions 4 | { 5 | public string Id { get; set; } 6 | public string Name { get; set; } 7 | public string Origin { get; set; } 8 | public string SmtpServer { get; set; } 9 | public string PortNumber { get; set; } 10 | public string EmailFromAddress { get; set; } 11 | public bool SendEmail { get; set; } 12 | public string IssuesEmail { get; set; } 13 | public string SiteDir { get; set; } 14 | public string SharedDir { get; set; } 15 | } 16 | -------------------------------------------------------------------------------- /src/SIL.XForge.Scripture/ClientApp/src/app/checking/attach-audio/attach-audio.component.scss: -------------------------------------------------------------------------------- 1 | @use 'src/variables'; 2 | 3 | .audio-added { 4 | display: flex; 5 | align-items: center; 6 | background: rgba(0, 0, 0, 0.05); 7 | padding-inline-start: 6px; 8 | border-radius: 4px; 9 | margin-inline-end: 2px; 10 | } 11 | 12 | .stop-recording { 13 | color: variables.$red; 14 | } 15 | 16 | .clear { 17 | color: variables.$greenDark; 18 | } 19 | 20 | .add-audio { 21 | background-color: rgba(0, 0, 0, 0.05); 22 | padding-inline: 4px; 23 | margin-block-start: 2px; 24 | } 25 | -------------------------------------------------------------------------------- /src/SIL.XForge/Configuration/ServalOptions.cs: -------------------------------------------------------------------------------- 1 | namespace SIL.XForge.Configuration; 2 | 3 | /// 4 | /// Configuration options for Serval. 5 | /// 6 | public class ServalOptions 7 | { 8 | public string ApiServer { get; set; } = string.Empty; 9 | public string Audience { get; set; } = string.Empty; 10 | public string ClientId { get; set; } = string.Empty; 11 | public string ClientSecret { get; set; } = string.Empty; 12 | public string TokenUrl { get; set; } = string.Empty; 13 | public string WebhookSecret { get; set; } = string.Empty; 14 | } 15 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | --- 2 | flag_management: 3 | default_rules: 4 | carryforward: true 5 | statuses: 6 | - name_prefix: project- 7 | type: project 8 | target: auto 9 | threshold: 1% 10 | informational: true 11 | - name_prefix: patch- 12 | type: patch 13 | target: 90% 14 | informational: true 15 | coverage: 16 | status: 17 | project: 18 | default: 19 | informational: true 20 | patch: 21 | default: 22 | informational: true 23 | ignore: 24 | - "src/SIL.XForge.Scripture/**/*.cshtml" 25 | --------------------------------------------------------------------------------