microsoft / fast

The adaptive interface system for modern web experiences.
https://www.fast.design
Other
9.28k stars 594 forks source link

feat: Add an option to reverse the order of the route titles #7007

Open cedx opened 3 months ago

cedx commented 3 months ago

πŸ™‹ Feature Request

Most websites, and even Windows applications, put the root title as the last component. The general pattern is: <document/page name> - <application name> or <routeTitle> - <rootTitle> (like: "Material Symbols and Icons - Google Fonts" or "Document1 - Word")

But the router produces the opposite title pattern: <rootTitle> - <routeTitle>

So, I would like an option to set the direction of the title order. This could also be interesting for RTL languages.

πŸ€” Expected Behavior

The document title follows this pattern if the newly created option is set: <child2> - <child1> - <root>

😯 Current Behavior

The document title follows this pattern: <root> - <child1> - <child2>

πŸ’ Possible Solution

Add an option to the DefaultTitleBuilder constructor? And let folks override the RouterConfiguration.createTitleBuilder() method...

πŸ’» Examples

Currently, I use a custom TitleBuilder just for this purpose:

class TitleBuilder {
    readonly #fragmentSeparator: string;
    readonly #reverseOrder: boolean;
    readonly #segmentSeparator: string;

    constructor(segmentSeparator = " - ", fragmentSeparator = ":", reverseOrder = false) {
        this.#fragmentSeparator = fragmentSeparator;
        this.#reverseOrder = reverseOrder;
        this.#segmentSeparator = segmentSeparator;
    }

    buildTitle(rootTitle: string, routeTitles: string[][]) {
        const segments = [rootTitle];
        for (const fragments of routeTitles) segments.push(fragments.filter(title => title.length).join(this.#fragmentSeparator));

        const titles = segments.filter(title => title.length);
        if (this.#reverseOrder) titles.reverse();
        return titles.join(this.#segmentSeparator);
    }

    joinTitles(parentTitle: string, childTitle: string): string {
        const titles = [parentTitle, childTitle].filter(title => title.length);
        if (this.#reverseOrder) titles.reverse();
        return titles.join(this.#segmentSeparator);
    }
}