This commit is a bit involved, as it factors the tag specific handling out of `/list-ordering` (and moves the `Algorithm` class one higher as a result), leaving it in the `Algorithm`. The algorithms for list ordering now only know how to handle a single tag, and this is managed by the `Algorithm` class - which is also no longer the base class for the list ordering. The list ordering algorithms now inherit from a generic `OrderingAlgorithm` base class which handles some rudimentary things. Overall the logic hasn't changed much: the tag-specific stuff has been moved into the `Algorithm`, and the list ordering algorithms essentially just removed the iteration on tags. The `RoomListStore2` still shovels a bunch of information over to the `Algorithm`, which can lead to an awkward code flow however this commit is meant to keep the number of surfaces touched to a minimum. The RoomListStore has also gained the ability to set per-list (tag) ordering and sorting, which is required for the new room list. The assumption that it defaults from the account-level settings is not reviewed by design, yet. This decision is deferred.
54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
/*
|
|
Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
import { TagID } from "../models";
|
|
import { Room } from "matrix-js-sdk/src/models/room";
|
|
import { OrderingAlgorithm } from "./list-ordering/OrderingAlgorithm";
|
|
|
|
export enum SortAlgorithm {
|
|
Manual = "MANUAL",
|
|
Alphabetic = "ALPHABETIC",
|
|
Recent = "RECENT",
|
|
}
|
|
|
|
export enum ListAlgorithm {
|
|
// Orders Red > Grey > Bold > Idle
|
|
Importance = "IMPORTANCE",
|
|
|
|
// Orders however the SortAlgorithm decides
|
|
Natural = "NATURAL",
|
|
}
|
|
|
|
export interface ITagSortingMap {
|
|
// @ts-ignore - TypeScript really wants this to be [tagId: string] but we know better.
|
|
[tagId: TagID]: SortAlgorithm;
|
|
}
|
|
|
|
export interface IListOrderingMap {
|
|
// @ts-ignore - TypeScript really wants this to be [tagId: string] but we know better.
|
|
[tagId: TagID]: ListAlgorithm;
|
|
}
|
|
|
|
export interface IOrderingAlgorithmMap {
|
|
// @ts-ignore - TypeScript really wants this to be [tagId: string] but we know better.
|
|
[tagId: TagID]: OrderingAlgorithm;
|
|
}
|
|
|
|
export interface ITagMap {
|
|
// @ts-ignore - TypeScript really wants this to be [tagId: string] but we know better.
|
|
[tagId: TagID]: Room[];
|
|
}
|