Skip to content

Commit

Permalink
refactor(ts): corpus chooser tree
Browse files Browse the repository at this point in the history
  • Loading branch information
arildm committed Oct 1, 2024
1 parent cc2b5af commit ab8cf18
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 24 deletions.
23 changes: 9 additions & 14 deletions app/scripts/components/corpus_chooser/corpus-chooser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,20 +142,15 @@ angular.module("korpApp").component("corpusChooser", {

statemachine.listen("logout", function () {
$ctrl.credentials = []
const newCorpora: string[] = []
for (let corpus of settings.corpusListing.getSelectedCorpora()) {
if (!settings.corpora[corpus]["limited_access"]) {
newCorpora.push(corpus)
} else {
settings.corpora[corpus].selected = false
}
}

if (_.isEmpty(newCorpora)) {
newCorpora.push(...(settings.preselected_corpora || []))
}
settings.corpusListing.select(newCorpora)
$ctrl.updateSelectedCount(newCorpora)
// Unselect restricted corpora
for (const corpus of Object.values(settings.corpora))
corpus.selected = corpus.selected && !corpus.limited_access
// Select those, or if none remain, fall back to default selection
const remaining = Object.keys(_.pickBy(settings.corpora, (corpus) => corpus.selected))
const toSelect = remaining.length ? remaining : settings.preselected_corpora || []
// Apply selection
settings.corpusListing.select(toSelect)
$ctrl.updateSelectedCount(toSelect)
$ctrl.updateLimitedAccess()
})

Expand Down
3 changes: 2 additions & 1 deletion app/scripts/components/corpus_chooser/info-box.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { locObj } from "@/i18n"
import { LangString } from "@/i18n/types"
import { CorpusTransformed } from "@/settings/config-transformed.types"
import { ChooserFolderSub } from "./util"
import { RootScope } from "@/root-scope.types"

type CcInfoBoxController = IController & {
object: ChooserFolderSub | CorpusTransformed
Expand Down Expand Up @@ -67,7 +68,7 @@ angular.module("korpApp").component("ccInfoBox", {
},
controller: [
"$rootScope",
function ($rootScope) {
function ($rootScope: RootScope) {
let $ctrl = this as CcInfoBoxController

const isFolder = (object: ChooserFolderSub | CorpusTransformed): object is ChooserFolderSub =>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,29 @@
/** @format */
import angular from "angular"
import { getAllCorpora } from "./util"
import angular, { IController } from "angular"
import { ChooserFolder, ChooserFolderSub, getAllCorpora } from "./util"
import settings from "@/settings"
var collapsedImg = require("../../../img/collapsed.png")
import { collatorSort, html } from "@/util"
import "@/components/checkbox-ternary"
import { CorpusTransformed } from "@/settings/config-transformed.types"
import { RootScope } from "@/root-scope.types"

type CcTreeController = IController & {
node: ChooserFolder
onSelect: () => void
onSelectOnly: (args: { corporaIds: string[] }) => void
onShowInfo: (args: { node: CorpusTransformed | ChooserFolderSub }) => void
indent: number
sortedFolders: ChooserFolderSub[]
sortedCorpora: CorpusTransformed[]
toggleFolderVisibility: (folder: ChooserFolderSub) => void
toggleFolderSelection: ($event: MouseEvent, folder: ChooserFolderSub) => void
showInfo: ($event: MouseEvent, folder: ChooserFolderSub) => void
onChildSelect: () => void
selectOnly: (ids: string[]) => void
onShowInfoLocal: (node: ChooserFolderSub | CorpusTransformed) => void
toggleCorpusSelection: ($event: MouseEvent, corpus: CorpusTransformed) => void
}

angular.module("korpApp").component("ccTree", {
template: html`
Expand Down Expand Up @@ -76,11 +95,11 @@ angular.module("korpApp").component("ccTree", {
controller: [
"$rootScope",
"$scope",
function ($rootScope, $scope) {
let $ctrl = this
function ($rootScope: RootScope) {
const $ctrl = this as CcTreeController

$ctrl.$onInit = () => {
function sort(nodes) {
function sort<T extends ChooserFolderSub | CorpusTransformed>(nodes: T[]) {
return collatorSort(nodes, "title", $rootScope.lang)
}
$ctrl.sortedCorpora = sort($ctrl.node.corpora)
Expand All @@ -92,7 +111,7 @@ angular.module("korpApp").component("ccTree", {
}

$ctrl.toggleFolderSelection = (e, folder) => {
if (folder["limited_access"]) {
if (folder.limited_access) {
folder.extended = !folder.extended
return
}
Expand Down
4 changes: 3 additions & 1 deletion app/scripts/components/corpus_chooser/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@ export type ChooserFolder = {
tokens: number
sentences: number
subFolders: ChooserFolderSub[]
limited_access?: boolean
}

export type ChooserFolderSub = ChooserFolder & {
id: string
title: LangString
description?: LangString
selected: "none" | "some" | "all"
extended?: boolean
}

export type ChooserFolderRoot = ChooserFolder & {
Expand Down Expand Up @@ -185,7 +187,7 @@ export const updateLimitedAccess = (node: ChooserFolder, credentials: string[] =
limitedAccess = false
}
}
node["limited_access"] = limitedAccess
node.limited_access = limitedAccess
return limitedAccess
}

Expand Down
4 changes: 2 additions & 2 deletions app/scripts/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import _ from "lodash"
import angular, { IControllerService, IHttpService, type IRequestConfig, type IScope } from "angular"
import settings from "@/settings"
import { getLang, loc, locObj } from "@/i18n"
import { LangMap } from "./i18n/types"
import { LangMap, LangString } from "./i18n/types"
import { RootScope } from "./root-scope.types"
import { JQueryExtended, JQueryStaticExtended } from "./jquery.types"
import { HashParams, LocationService, UrlParams } from "./urlparams"
Expand Down Expand Up @@ -467,7 +467,7 @@ export function httpConfAddMethodFetch(
* @param lang The code of the language to translate to. Defaults to the global current language.
* @returns A copy of the list, sorted.
*/
export function collatorSort(elems: LangMap[], key: string | number, lang?: string) {
export function collatorSort<K extends keyof any, T extends Record<K, LangString>>(elems: T[], key: K, lang?: string) {
lang = lang || getLang()
const comparator = new Intl.Collator(lang).compare
return elems.slice().sort((a, b) => comparator(locObj(a[key], lang), locObj(b[key], lang)))
Expand Down

0 comments on commit ab8cf18

Please sign in to comment.