ostrio:flow-router-title

v3.4.0Published last week

support support

Reactive page title

Change document.title on the fly in Meteor.js apps via flow-router-extra API.

ToC

Features

  • 👨‍🔬 100% tests coverage
  • ✨ Use prefixes for groups, including nesting
  • 🎛 Per route, per group, and default (all routes) title tag

Various ways to set title, ordered by priority:

  • FlowRouter.route() [overrides all below]
  • FlowRouter.group()
  • FlowRouter.globals
  • Head template <title>Text</title> tag [superseded by any above]

Installation

meteor add ostrio:flow-router-title

Demos

ES6 Import

1import { FlowRouterTitle } from 'meteor/ostrio:flow-router-title';

flow-router-title performs the best when used with the next packages:

  • flow-router-meta - Per route meta tags, script, and link (e.g. CSS) — set per-route meta-tags, stylesheets, and scripts
  • flow-router-extra - Carefully extended FlowRouter

API

  • new FlowRouterTitle(FlowRouter) — The main FlowRouterTitle constructor that accepts FlowRouter as the only argument
  • FlowRouterTitle#set(title: string) — The only method that changes document.title during runtime

After new FlowRouterTitle(FlowRouter) instance is initiated it extends FlowRouter.router() and FlowRouter.group() methods and FlowRouter.globals with support of:

  • title: string — String property
  • title: function(params, qs, data) => string — Method returning string
  • titlePrefix: string — String property for page's title prefix
  • titlePrefix: function(params, qs, data) => string — Method returning string for page's title prefix

Usage

Initialize FlowRouterTitle class by passing FlowRouter object. Right after creating all routes:

1import { FlowRouter } from 'meteor/ostrio:flow-router-extra';
2import { FlowRouterTitle } from 'meteor/ostrio:flow-router-title';
3
4FlowRouter.route('/', {
5  action() { /* ... */ },
6  title: 'Title'
7  /* ... */
8});
9
10const titleHandler = new FlowRouterTitle(FlowRouter);

Set title via Route

Set title property in route's or group's configuration:

1// Set default document.title value in
2// case router has no title property
3FlowRouter.globals.push({
4  title: 'Default title'
5});
6
7FlowRouter.route('/me/account', {
8  name: 'account',
9  title: 'My Account'
10});

.set() method

Set document.title during runtime (without route(s)):

1FlowRouter.route('/', {/* ... */});
2
3const titleHandler = new FlowRouterTitle(FlowRouter);
4titleHandler.set('My Awesome Title String'); // <- Returns `true`
5
6// `.set()` method accepts {string} only
7// Invalid values won't throw an exception
8// instead it will simply return `false`

Function context

Use function context (with data hook):

1FlowRouter.route('/post/:_id', {
2  name: 'post',
3  waitOn(params) {
4    return [Meteor.subscribe('post', params._id)];
5  },
6  async data(params) {
7    return await Collections.Posts.findOneAsync(params._id);
8  },
9  title(params, query, data) {
10    if (data) {
11      return data.title;
12    }
13    return '404: Page not found';
14  }
15});

Group context

Use group context:

1const account = FlowRouter.group({
2  prefix: '/account',
3  title: 'Account',
4  titlePrefix: 'Account > '
5});
6
7account.route('/', {
8  name: 'accountIndex' // Title will be `Account`
9});
10
11account.route('/settings', {
12  name: 'AccountSettings',
13  title: 'My Settings' // Title will be `Account > My Settings`
14});

Reactive data sources

To change title reactively, just pass it as function:

1FlowRouter.route('/me/account', {
2  name: 'account',
3  title() {
4    // In this example we used `ostrio:i18n` package
5    return i18n.get('account.document.title');
6  }
7});
8
9// Use params from route
10FlowRouter.route('/page/:_id/:slug', {
11  name: 'somePage',
12  title(params) {
13    return `Page ${params.slug}`;
14  }
15});

More examples

In all examples below title can be a Function or String:

1import { FlowRouter } from 'meteor/ostrio:flow-router-extra';
2
3FlowRouter.globals.push({
4  title() {/* ... */} // <-- Suitable for reactive data source
5});
6
7FlowRouter.globals.push({
8  title: 'Title text'
9});
10
11FlowRouter.group({
12  title() {/* ... */}, // <-- Suitable for reactive data source
13  titlePrefix() {/* ... */} // <-- Can accept reactive data source, but won't trigger re-computation
14});
15
16FlowRouter.group({
17  title: 'Title text',
18  titlePrefix: 'Title prefix text'
19});
20
21FlowRouter.route('/path', {
22  title() {/* ... */} // <-- Reactive
23});
24
25FlowRouter.route('/path', {
26  title: 'Title text'
27});

Running Tests

  1. Clone this package
  2. In Terminal (Console) go to directory where package is cloned
  3. Then run:

Meteor/Tinytest

# Default
meteor test-packages ./

# With custom port
meteor test-packages ./ --port 8888

# With local MongoDB and custom port
MONGO_URL="mongodb://127.0.0.1:27017/flow-router-title-tests" meteor test-packages ./ --port 8888

Support this project