{ "index": [ { "section": "General", "regex": "^README.md|developer-notes/general|lib", "pages": [ "README.md", "lib/component-base.md", "lib/paging-utils.md", "lib/redux-component-base.md", "lib/sort-utils.md", "lib/test-utils.md", "developer-notes/general/chrome-plugins.md", "developer-notes/general/environments.md", "developer-notes/general/generators.md", "developer-notes/general/setup.md", "developer-notes/general/stub-data.md", "developer-notes/general/vs-code.md", "developer-notes/general/writing-documentation.md", "components/products/lib/reducer-utils.md" ] }, { "section": "Common Components", "regex": "^components/common", "pages": [ "components/common/attributes/share-class-link-listener.md", "components/common/elements/ft-carousel/ft-carousel.md", "components/common/elements/ft-date-dropdown/ft-date-dropdown.md", "components/common/elements/ft-datepicker/ft-datepicker.md", "components/common/elements/ft-historical-modal/ft-historical-modal.md", "components/common/elements/ft-label/ft-label.md", "components/common/elements/ft-modal-inline/ft-modal-inline.md", "components/common/elements/ft-owl-carousel/ft-owl-carousel.md", "components/common/elements/ft-owl-tabbed/ft-owl-tabbed.md", "components/common/elements/ft-th-sortable/ft-th-sortable.md" ] }, { "section": "Marketing", "regex": "^components/marketing", "pages": [ "components/marketing/common/value-converters/ft-format-grid-cell.md", "components/marketing/layouts/ft-choose-subscription/ft-choose-subscription-step1.md", "components/marketing/lists/ft-document-lister/ft-document-lister.md", "components/marketing/lists/ft-report-archive-a/ft-report-archive-a.md", "components/marketing/lists/ft-report-archive-b/ft-report-archive-b.md", "components/marketing/lists/ft-report-archive-c/ft-report-archive-c.md", "components/marketing/lists/ft-report-archive-d/ft-report-archive-d.md", "components/marketing/grids/ft-grid-filter/ft-grid-filter.md", "components/marketing/grids/ft-grid-filter-form/ft-grid-filter-form.md", "components/marketing/grids/ft-grid-filter-dropdown/ft-grid-filter-dropdown.md", "components/marketing/video/ft-video-switch/ft-video-switch.md", "components/marketing/common/elements/ft-gateway/ft-gateway.md", "components/marketing/common/elements/ft-multi-select-bar/ft-multi-select-bar.md" ] }, { "section": "Products", "subs": [ { "section": "General", "regex": "^developer-notes/products", "pages": [ "developer-notes/products/product-components-overview.md", "developer-notes/products/useful-links.md" ] }, { "section": "Common components", "regex": "^components/products/common/elements", "pages": [ "components/products/common/elements/ft-footnote/ft-footnote.md", "components/products/common/elements/ft-labels/ft-labels.md" ] }, { "section": "Value converters", "regex": "^components/products/common/value-converters", "pages": [] }, { "section": "PPSS", "regex": "^components/products/ppss", "pages": [ "components/products/ppss/ft-ppss-table-base.md", "components/products/ppss/ft-find-a-fund/ft-find-a-fund.md", "components/products/ppss/ft-ppss/ft-ppss.md", "components/products/ppss/ft-ppss-favorite/ft-ppss-favorite.md", "components/products/ppss/ft-ppss-etf/ft-ppss-etf-row.md", "components/products/ppss/ft-ppss-etf/ft-ppss-etf.md", "components/products/ppss/ft-ppss-fund-filter/ft-ppss-dropdown.md", "components/products/ppss/ft-ppss-fund-filter/ft-ppss-fund-filter.md", "components/products/ppss/ft-ppss-fund-identifiers/ft-ppss-fund-identifiers-row.md", "components/products/ppss/ft-ppss-fund-identifiers/ft-ppss-fund-identifiers.md", "components/products/ppss/ft-ppss-fund-name/ft-ppss-fund-name.md", "components/products/ppss/ft-ppss-performance/ft-ppss-performance-row.md", "components/products/ppss/ft-ppss-performance/ft-ppss-performance.md", "components/products/ppss/ft-ppss-ratings/ft-ppss-ratings-row.md", "components/products/ppss/ft-ppss-ratings/ft-ppss-ratings.md", "components/products/ppss/ft-ppss-search-box/ft-ppss-search-box.md", "components/products/ppss/ft-ppss-tab-header/ft-ppss-tab-header.md", "components/products/ppss/ft-ppss-yield/ft-ppss-yield-row.md", "components/products/ppss/ft-ppss-yield/ft-ppss-yield.md", "components/products/ppss/ft-ppss-table-toolbar/ft-ppss-table-toolbar.md" ] }, { "section": "Overview", "regex": "^components/products/overview", "pages": [ "components/products/overview/ft-fund-mmfr-stable-nav-header/ft-fund-mmfr-stable-nav-header.md", "components/products/overview/ft-fund-price-header/ft-fund-price-header.md", "components/products/overview/ft-fund-information/ft-fund-information.md", "components/products/overview/ft-fund-nav-header/ft-fund-nav-header.md", "components/products/overview/ft-fund-static-bar/ft-fund-static-bar.md", "components/products/overview/ft-fund-trading-characteristics/ft-fund-trading-characteristics.md" ] }, { "section": "Portfolio", "regex": "^components/products/portfolio", "pages": [ "components/products/portfolio/ft-asset-class-exposure/ft-asset-class-exposure.md", "components/products/portfolio/ft-commodities-sector-breakdown/ft-commodities-sector-breakdown.md", "components/products/portfolio/ft-category-fund-list/ft-category-fund-list.md", "components/products/portfolio/ft-coupon-rate-breakdown/ft-coupon-rate-breakdown.md", "components/products/portfolio/ft-credit-quality-exposure/ft-credit-quality-exposure.md", "components/products/portfolio/ft-currency-distribution/ft-currency-distribution.md", "components/products/portfolio/ft-fixed-income-sector-breakdown/ft-fixed-income-sector-breakdown.md", "components/products/portfolio/ft-geographic-allocation/ft-geographic-allocation.md", "components/products/portfolio/ft-geographic-breakdown/ft-geographic-breakdown.md", "components/products/portfolio/ft-holdings/ft-holdings.md", "components/products/portfolio/ft-manager-roster/ft-manager-roster.md", "components/products/portfolio/ft-market-capitalisation/ft-market-capitalisation.md", "components/products/portfolio/ft-maturity-breakdown/ft-maturity-breakdown.md", "components/products/portfolio/ft-portfolio-statistics-and-positions/ft-portfolio-statistics-and-positions.md", "components/products/portfolio/ft-quality-breakdown/ft-quality-breakdown.md", "components/products/portfolio/ft-sector-allocation/ft-sector-allocation.md", "components/products/portfolio/ft-sector-exposure/ft-sector-exposure.md", "components/products/portfolio/ft-strategy-breakdown/ft-strategy-breakdown.md", "components/products/portfolio/ft-top-exposures/ft-top-exposures.md", "components/products/portfolio/ft-top-ten-holdings/ft-top-ten-holdings.md", "components/products/portfolio/util/util.md", "components/products/portfolio/ft-geographic-breakdown/en-us-retail/ft-geographic-breakdown.md", "components/products/portfolio/ft-portfolio-statistics-and-positions/en-us-retail/ft-portfolio-statistics-and-positions.md" ] }, { "section": "Performance", "regex": "^components/products/performance|components/products/historical", "pages": [ "components/products/historical/ft-historical-average-annual-total-returns/ft-historical-average-annual-total-returns.md", "components/products/historical/ft-historical-cumulative-total-returns/ft-historical-cumulative-total-returns.md", "components/products/performance/ft-after-tax-average-annual-returns/ft-after-tax-average-annual-returns.md", "components/products/performance/ft-average-annual-total-returns/ft-average-annual-total-returns.md", "components/products/performance/ft-calendar-year-returns/ft-calendar-year-returns.md", "components/products/performance/ft-discrete-returns/ft-discrete-returns.md", "components/products/performance/ft-performance-annualised/ft-performance-annualised.md", "components/products/performance/ft-performance-cumulative/ft-performance-cumulative.md", "components/products/performance/ft-backtested-performance-annualised/etf/ft-backtested-performance-annualised.md", "components/products/performance/ft-calendar-year-returns/en-us-retail/ft-calendar-year-returns.md", "components/products/performance/ft-calendar-year-returns/etf/ft-calendar-year-returns.md", "components/products/performance/ft-backtested-performance-cumulative/etf/ft-backtested-performance-cumulative.md", "components/products/performance/ft-performance-annualised/etf/ft-performance-annualised.md", "components/products/performance/ft-performance-cumulative/en-us-retail/ft-performance-cumulative.md", "components/products/performance/ft-performance-cumulative/etf/ft-performance-cumulative.md", "components/products/performance/ft-backtested-performance-calendar/etf/ft-backtested-performance-calendar.md" ] }, { "section": "Pricing & Distribution", "regex": "^components/products/pricing-distribution", "pages": [ "components/products/pricing-distribution/ft-dividends-historical/ft-dividends-historical.md", "components/products/pricing-distribution/ft-dividends/ft-dividends.md", "components/products/pricing-distribution/ft-nav-high-low/ft-nav-high-low.md", "components/products/pricing-distribution/ft-price-chart/ft-price-chart.md", "components/products/pricing-distribution/ft-pricing-distribution/ft-pricing-distribution.md", "components/products/pricing-distribution/ft-share-prices/ft-share-prices.md" ] }, { "section": "Price", "regex": "^components/products/pricing", "pages": [] }, { "section": "Distributions", "regex": "^components/products/distributions", "pages": [] }, { "section": "Documents", "regex": "^components/products/documents", "pages": [] } ] }, { "section": "Uncategorized", "pages": [] } ], "pages": { "README.md": "

Installation and set up

\n

prerequisites

\n
    \n
  1. Nodejs > 6.5
  2. \n
  3. Git
  4. \n
\n

steps

\n
    \n
  1. npm install aurelia-cli -g
  2. \n
  3. npm install
  4. \n
  5. copy built assets folder from responsive-web to assets
  6. \n
  7. au run --watch
  8. \n
  9. au test
  10. \n
\n

build details

\n

The build creates web-platform.js in the assets/js folder

\n

commands

\n

au run

\n

Runs the build process, then starts a local dev server on port 9000 i.e. http://localhost:9000/

\n\n

Run a full build before committing.

\n

au run --watch

\n

Same as au run, but will rebuild when code changes\nSee au run task for --js and --docs and --dev flags

\n

au run --watch --use-test-server

\n

Same as au run --watch --use-test-server, but will use test server data\nType au help run for more details

\n

au build

\n

Runs the build process. This includes linting, processing, transpiling and bundling, but not tests\nSee au run task for --js and --docs and --dev flags

\n

au test

\n

Runs ALL test suites (*.spec.js files).\nAppend a spec filename to this command to run that suite only e.g. au test src\\components\\products\\common\\elements\\ft-footnote.spec.js

\n

au test --ui

\n

Runs test suites for UI components using Jasmine and Karma. This will open and close a browser window while running tests.\nAppend a spec filename to this command to run that suite only e.g. au test src\\components\\products\\common\\elements\\ft-footnote.spec.js --ui\nNB: Doesn't run the Business Logic (reducer) test suites.

\n

au test --bl

\n

Runs test suites for Business Logic JS files (reducers, value-converters etc) using Jest.\nAppend a spec filename to this command to run that suite only e.g. au test --bl src\\components\\products\\distributions\\ft-distributions\\lib\\en-us-retail\\distribution-rate.spec.js\nNB: These tests run very fast, as they only use NodeJS.

\n

au lint-css

\n

Lints all scss files within src folder using http://stylelint.io/\nConfiguration is based on stylelint-config-standard with custom configuration in .stylelintrc file

\n

au lint-js

\n

Uses ESLint to lint all .js files within src and test folders.\nConfiguration is on '.eslintrc' and based on the Aurelia eslint configuration.

\n

au lint-markup

\n

Lints html files using gulp-lintspaces\nAll this really lints is whitespace and indentation, but at the moment there aren't any suitable html snippet linters.

\n

au process-assets

\n

At present, this just copies the bootstrap fonts from the node_modules folder to assets.\nIn future it will likely copy more font and image files as part of the build.

\n

au process-css

\n

This applies the following to the scss files in the src folder:

\n\n

au process-markup

\n

This just applies the lint-markup task, before passing the markup off to the bundler

\n

au generate redux-component

\n

This is used to generate a redux component or sub-component. Tests, documentation, sass and (optionally) reducer files are also generated. See lib/redux-component-base.md for more details.

\n

au proxy-server

\n

This is used to test the dev assets against the live or dev site.

\n

Example proxying live site with dev css assets

\n

au proxy-server --proxy-target http://rcovlnx0188:8202 --dev-css-assets-server http://pattern-library.corp.frk.com/

\n

Example proxying dev site with dev css assets

\n

au proxy-server --dev-css-assets-server http://pattern-library.corp.frk.com/

\n

Example proxying live site with dev js assets, and aurelia etf config

\n

au proxy-server --override-aurelia-config configuration/etf/main --dev-js-assets-server http://localhost:9000/

\n", "lib/component-base.md": "

component-base

\n

This class is used as a base class for components.

\n

It provides access to an instance of the Aurelia LogManager.

\n
this.logger.debug('my debug message');\n
\n

getLabel

\n

This should be used to retrieve the labels from the redux object. It should replace the use of :

\n
<ft-label label.bind=\"label['as-of']\"></ft-label>\n\n${label['as-of']}\n
\n

with

\n
<ft-label label.bind=\"getLabel('as-of')\"></ft-label>\n\n$getLabel('as-of')}\n
\n

As long as this.label is populated with the labels and the key exists, it should return the label, otherwise it will return the key searched for in square brackets eg: [as-of]

\n

This can help to highlight missing labels on the page.

\n

To change a page from label['key'] to getLabels('key'), a regex can be performed:

\n
search: (label\\[)(.+)(\\])\n\nreplace: getLabel($2)\n
\n", "lib/paging-utils.md": "

paging-utils

\n

getPagingInfo(totalRecords, pageSize = 10, pageNumber = 1)

\n

Use this function returns an object with data that can be used for paging a recordset.

\n

Call it every time you go to a new page, to get info on the page and navigation options.

\n

arguments:

\n\n

The return object has the following properties:

\n\n

Page Object:

\n\n

Example:

\n
let records = [{}, {}, ... {}]; // 23 records\nlet pageSize = 10;\nlet info = getPagingInfo(records.length, pageSize, 1);\n\n/*\ninfo = {\n  firstPage: null,\n  previousPage: null,\n  currentPage: {\n    page: 1,\n    startRecord: 1,\n    endRecord: 10\n  },\n  nextPage: 2,\n  lastPage: 3,\n  totalPages: 3,\n  pages: [\n    {\n      page: 1,\n      startRecord: 1,\n      endRecord: 10\n    }, {\n      page: 2,\n      startRecord: 11,\n      endRecord: 20\n    }, {\n      page: 3,\n      startRecord: 21,\n      endRecord: 23\n    }\n  ],\n  firstRecord: 1,\n  lastRecord: 23,\n  totalRecords: 23\n}\n*/\n\n// filter records to current page\nlet recordsToShow = records.filter((record, index) => {\n  let recordNumber = index + 1;\n  return info.currentPage.startRecord <= recordNumber\n    && recordNumber <= info.currentPage.endRecord;\n});\n\n// message to display\nlet message = `Showing ${info.currentPage.startRecord} to ${info.currentPage.endRecord} of ${info.totalRecords} records.`;\n// message = 'Showing 1 to 10 of 23 records.'\n\n// to go to next page\nif (info.nextPage !== null) {\n  info = getPagingInfo(records.length, pageSize, info.nextPage);\n}\n\n// to go to last page\nif (info.lastPage !== null) {\n  info = getPagingInfo(records.length, pageSize, info.lastPage);\n}\n\n// etc...\n
\n", "lib/redux-component-base.md": "

redux-component-base

\n

This class is used as a base class for components, to provide common methods for interacting with the redux store\nNew components can be generated via the command au generate redux-component.

\n

This will create component js, html and test files. It will also create a markdown file for documentation, and a sass file for styling. Optionally, reducers for json data and app state (plus associated tests) can also be created.

\n

mapState(newState)

\n

If you define a function called mapState, your component will subscribe to the redux store, and mapState will get called every time the store changes with the whole of the new state.

\n

The mapState function should set the components' properties with the data they need from the state. This should be the only place your component deals directly with the redux store

\n

mapState is optional. If your component gets all it's data passed via @bindable properties (e.g. a dumb sub-component), then you can remove the mapState function.

\n

mapState is based on the mapStateToProperties function used for connecting React components to redux: http://redux.js.org/docs/basics/UsageWithReact.html

\n

dispatching actions

\n

The components will also have access to the redux dispatch function.\nThe two most likely uses of this will be:

\n\n

fund specific

\n

If the component displays information for a specific fund at a time, then it should either have a @bindable fundId property, or set it's fundId from an element attribute set by the JSP page.

\n

In your mapState function, you can use the helper function getFundState to get the fund spefici slice of state e.g.

\n
let fundState = getFundState(newState, this.fundId);\n
\n

non fund specific

\n

If your component is not fund specific i.e. displays data for several funds at once, then you can delete references to fundId and getFundState.

\n

logger

\n

As the ReduxComponentBase class inherits from the ComponentBase class, it already has the LogManager injected into it.\nThis enables you to debug to the console via:\nthis.logger.debug('My message')

\n", "lib/sort-utils.md": "

sort-utils

\n

function library to help sorting an array of objects

\n

Usage

\n
[{foo: 'bar'}, ...].sort(createCompare('foo', 'ASC', {}))\n
\n

Developer notes

\n

createCompare(dataKey, direction, options)

\n\n

This library also contains private functions that are used internally for sorting strings, dates and numbers

\n", "lib/test-utils.md": "

test-utils

\n

Function to help with UI unit testing

\n

simulateInputChange(element, value)

\n

Use this function to simulate changing the value of a <select> or other <input> element

\n
    let input;\n    component.boundTo(mock);\n    component.create(bootstrap)\n    .then(() => {\n      input = document.getElementById('test1').getElementsByTagName('input')[0];\n    })\n    .then(() => simulateInputChange(input, 'FREEX'))\n    .then(() => {\n      expect(....).toBe(...);\n    })\n    .then(done);\n
\n

wait(delay = 10)

\n

Use this function to pause execution for a number of milliseconds. This is often used to allow Aurelia to redraw before testing the component

\n
    component.create(bootstrap)\n      .then(() => {\n        component.viewModel.mapState(mockState);\n      })\n      .then(wait(25))\n      .then(() => {\n        expect(...).toBe(...);\n      })\n      .then(done);\n
\n", "developer-notes/general/chrome-plugins.md": "

Chrome Plugins

\n

Aurelia Inspector

\n

https://chrome.google.com/webstore/detail/aurelia-inspector/ofemgdknaajmpeoblfdjkenbpcfbdefg?hl=en

\n

Cross Origin Resource Sharing

\n

Allows fonts to work when developing locally. Sometimes this stops, but turning off and on again seems to fix it

\n

https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en-GB

\n

Add "http://pattern-library.corp.frk.com/" to the Intercepted URLS or URL patterns to solve any font cors issues.

\n", "developer-notes/general/environments.md": "

Environments

\n

US Dev

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
These docshttp://pattern-library.corp.frk.com/docs.html
livesite instanceus-dev-5
New web-platform sitehttp://rcovlnx0191:6205/en-us-gw/investor/
Old US sitehttp://rcovlnx0191:6205/en-us-retail/investor/
Livesite cachehttp://rcovlnx0191:6205/iw/admin/JCS.jsp
Coverage reporthttp://pattern-library.corp.frk.com/coverage/
\n

The old US site can be used to regression test components.

\n

International Dev

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
livesite instanceinternational-dev-2
franklintempletonglobal sitehttp://rcovlnx0191:8222/en-gb-testgw/investor/
\n

New sites not created yet.

\n

Bamboo - Continuous Integration (CI)

\n

http://rcovlnx0157.noam.corp.frk.com:8085/browse/USPI-FR35

\n

SVN Repository

\n

This link can also be used in browser if no svn client\nhttps://sourcemgmtsvn.noam.corp.frk.com:18080/svn/globalweb/branches/GW-Maintenance/frontend-projects/web-platform

\n

Intl Responsive Wireframes

\n

https://cx2rjv.axshare.com/#g=1&p=mutual_funds_page_performance_v4\npassword: responsive

\n

ETF Wireframes

\n

https://x4kl1b.axshare.com/#p=our_etfs_-_fund_explorer&g=1&view=c\npassword: etfs

\n", "developer-notes/general/generators.md": "

Code generators

\n

Code generators allow you to quick create stubs for multiple files.

\n

To see available generators run: au generate

\n

To run a generator, run e.g.: au generate redux-component

\n

The generator code can be found in aurelia_project/generators.

\n

The basic pattern is to set up the directory structure you will need\nand then, for each directory, for each file, create a function that\nreturns the stub text for that file.

\n

See the redux-component for an example.

\n", "developer-notes/general/setup.md": "

Local Setup

\n

The web-platform builds the js and teh pattern-library builds the css and other assets.\nSo to run locally, you either need to run 2 web projects or run one and link to the\nbuilt resources of the other project.

\n

Add a chrome extension so you can load the fonts (otherwise you get cross origin access errors):\nhttps://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en-US

\n

Running web-platform locally against built pattern-library

\n
    \n
  1. Edit aurelia_project/environments/dev.js and set cssRoot: 'http://pattern-library.corp.frk.com'
  2. \n
  3. Edit your test page to load css with following:\n<link rel="stylesheet" href="http://pattern-library.corp.frk.com/assets/css/core.css" type="text/css"/>
  4. \n
\n

Running web-platform locally against local pattern-library

\n
    \n
  1. Edit aurelia_project/environments/dev.js and set cssRoot: 'http://localhost:3000'
  2. \n
  3. Edit your test page to load css with following:\n<link rel="stylesheet" href="http://localhost:3000/assets/css/core.css" type="text/css"/>
  4. \n
\n

You may need to stop and start your server to pick up the environment.js change.

\n", "developer-notes/general/stub-data.md": "

Stub data

\n

You can download stub json data by appending the spring bean name to the end of the following request:

\n

http://rcovlnx0191:6205/en-us-gw/investor/?bid=

\n

e.g. http://rcovlnx0191:6205/en-us-retail/investor/?bid=us.closed-end-funds-labels

\n

Note that for production data you will want to go to\nhttps://www.franklintempleton.com/investor/?bid=bean.id

\n

But the code to convert xml files (e.g. labels) is not in prod yet, so\nyou will need to use the server above for now.

\n

Service data

\n

International

\n

http://rcovlnx0193:5111/gw-data-admin/serviceTestIntl

\n

ETF

\n

http://rcovlnx0193:5111/gw-data-admin/serviceTestEtf

\n

http://rcovlnx0194:5111/gw-data-admin/serviceTestEtf.do

\n", "developer-notes/general/vs-code.md": "

Visual Studio Code

\n

VS Code is the recommended (free) editor for Aurelia development.

\n

Installation

\n

If you have admin rights

\n

Just download the .exe file from https://code.visualstudio.com/Download

\n

If you don't have admin rights

\n
    \n
  1. Download the zip file available from https://code.visualstudio.com/Download
  2. \n
  3. Extract the zip contents, and copy the folder somewhere. It dosen't have to be copied to program files like it says in the documentation
  4. \n
  5. Double-click Code.exe in the folder to start
  6. \n
  7. (Optionally) set your %PATH% variable as described in https://code.visualstudio.com/docs/setup/windows, although that may need admin rights
  8. \n
\n

Extensions

\n

ESLint

\n

Just install this extension: https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint

\n

It will automatically pick up the project's .eslintrc.json file and highlight code that breaks our eslint rules.

\n

To automatically fix ESLint errors when you save a file, got to File / Preferences / Settings and add "eslint.autoFixOnSave": true to your user settings

\n

Aurelia

\n

Plugin is here: https://github.com/aurelia/vscode-extension/wiki\nBlog post describing it here: http://blog.aurelia.io/2016/10/11/introducing-the-aurelia-vs-code-plugin/

\n

After installing extension, go to File / Preferences / Color theme and chose one of the following themes:

\n\n

Minimap

\n

To enable the minimap feature to navigate code (like you get with Sublime Text), go to File / Preferences / Settings and add "editor.minimap.enabled": true to your user settings

\n

Auto-Open Markdown Preview

\n

Splits pane when editing markdown files to give a live preview

\n

Plugin here: https://marketplace.visualstudio.com/items?itemName=hnw.vscode-auto-open-markdown-preview

\n", "developer-notes/general/writing-documentation.md": "

Writing documentation

\n

Documentation is written in markdown. Markdown files end in .md

\n

see https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet for\nall the codes.

\n

See the Visual Studio Code notes for details of a markdown preview plugin

\n

Documentation should live as close to the thing it is documenting as possible.\ne.g. if you are documenting a component then add the md file to the same\ndirectory as the component and name it the same except for the .md extension.

\n

Generic documentation should live under src/developer-notes.

\n

The documentation is converted to html using marked with the following settings:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SettingValue
gfmtrue
tablestrue
breaksfalse
pedanticfalse
sanitizefalse
smartListstrue
smartypantsfalse
\n

gfm includes all the markdown extensions produced by github.

\n

To generate the documentation locally run: au process-docs

\n

This generates a docs.json file under the assets folder of the project.

\n

The index is defined in aurelia.json and is used\nto populate the navigation. Each section can have subsections, and all\nsections and subsections have a regex to determine which documents\nbelong to that section.

\n

e.g.

\n
    {\n      \"section\": \"Products\",\n      \"pages\": [],\n      \"subs\": [\n        {\n          \"section\": \"General\",\n          \"pages\": [\n            \"developer-notes/products/useful-links.md\",\n            \"developer-notes/products/product-components-overview.md\"\n          ],\n          \"regex\": \"^developer-notes/products\"\n        },\n        ...\n
\n

So with the above, all docs under developer-notes/products and its\nsubdirectories will go into the Products - General subsection.

\n

The json file can be edited to add new sections and to reorder pages and\nsections - it is read by the process-docs task and docs are only added\nif they do not already exist in a section (in which case they are just\nappended to the end of the pages array for that section.

\n

Still to do:

\n
    \n
  1. make specific docs linkable so we can have cross-references.
  2. \n
  3. improve styling.
  4. \n
  5. auto generate links to test pages and style guide.
  6. \n
\n", "developer-notes/products/product-components-overview.md": "

Product components overview

\n

For product components we are using Redux for our state storage.\n see http://redux.js.org/

\n

Typically, each product component will send off an action to populate\nits state and subscribe to changes in the redux store.\nWhen the state changes e.g. once the ajax requests have returned,\nthe component will be notified.

\n

The component will then map the bits of the state it needs into its own\nlocal member variables and aurelia binding will then update the UI\nautomatically.

\n

So a key part of a component is to supply a reducer which will map the\ndata returned from the ajax requests and create a new version of the\nstate. The data and logic are likely to be country or site specific,\nso normally, the reducer is placed into a sub folder of the lib folder\nand we use site configuration to set it up.

\n

Folder structure

\n\n

Converting a US fund component

\n
    \n
  1. identify the beans required for the component.
  2. \n
  3. identify the xsl for the component.\nThis will be converted into a redux reducer and an aurelia component\nthat shows the data on the page.
  4. \n
  5. update src/configuration/en-us-retail/beans.js\nAdd a new attribute under components for your component with\na list of the beans discovered in the earlier step. For any bean that\nis fund specific, you also need to add an entry under the beans\nattribute (lower down).
  6. \n
  7. edit aurelia_project/tasks/get-stub-data.js to add the beans\nfor which you need stub data and then run: au get-stub-data.\nYou should see your beans under test/data or test/data/<fund-id>\ndepending on whether they need a fund id or not. If they are in the\nwrong place, move them.
  8. \n
  9. run: au generate redux-component\nand follow the prompts. This will generate a whole load of\nfiles for you under src/components/products/<page>/<ft-<component-name>
  10. \n
  11. convert the xsl into the reducer and the component.
  12. \n
  13. write unit tests for the component and the reducer.
  14. \n
  15. write up component documentation in the md file.
  16. \n
  17. commit all changes and set up code review.
  18. \n
\n", "developer-notes/products/useful-links.md": "

Useful links

\n

Path to top of Products XSL

\n

iw-mount: international/main/admin/resources/WORKAREA/ALL/iwov-resources/xsl/gw/components/products

\n

Path to US spring bean configuration

\n

livesite-customer-src: etc/classes/conf/us/products/us-products-application-context.xml

\n", "components/common/attributes/share-class-link-listener.md": "

Share class link listener

\n

This is a custom attribute which listens for changes made to the href attributes of anchor tags which have the \nshare-class-link-listener attribute. These changes to the href are made from selecting a different class in the ft-share-class-filter \ncustom element, present on individual Fund pages.

\n

Upon a state change, it compares the current href query string parameters against those in the store, and if the current \n ones differ from the store, it runs a routine to update the params accordingly.

\n", "components/products/lib/reducer-utils.md": "

reducer-utils

\n

This library contains helper functions for reducers

\n

navDirection(val)

\n

This is used to determine the nav direction for a string

\n

val - the nav change. The function will automatically parse out the number

\n

Returns GAIN, LOSS or STATIC depending on parsed numerical value. Returns '' if can't be parsed

\n

navChangeClass(direction)

\n

This is used to determine the class for a NAV direction. When applied to an html element, the class will apply a triangle pointing up, down or right, and set the text color to green, red or grey, for GAIN, LOSS or STATIC

\n

direction - String. Required. Either GAIN, LOSS or STATIC

\n

Returns gain, loss or static

\n

getUniqOptions(property)

\n

This returns a function that can be applied to an array of funds to get an array of the unique options. This example will return the unique values of property foo:

\n
let funds = [{foo: 1, bar: 'A'}, {foo: 2, bar: 'B'}, {foo: 1, bar: 'C'}, ];\nlet myFunction = getUniqOptions('foo');\nlet uniqueFooValues = myFunction(funds); // returns [1, 2]\n
\n

This function is used to get options for dropdown filters

\n

formatCusip(val)

\n

This function changes the format of a 9 character string to XXX XXX XXX. Any other length of string is returned unchanged

\n

val - the original CUSIP value

\n
let formattedCusip = formatCusip('G3658U329'); // returns G36 58U 329\n
\n

formatCurrency(val, currency)

\n

Return value followed by currency symbol if numeric, otherwise return dash.

\n

val - the currency amount\ncurrency - the currency value

\n
let value = formatCurrency('55.10', 'USD'); // returns $55.10\n
\n

formatDateToDay(val)

\n

clean up different date formats and convert to common DD/MM/YYYY

\n

val - val date in format DD/MM/YYYY or YYYY-MM-DD

\n
let value = formatDateToDay('1982-11-18 01:11:11'); // returns 18/11/1982\n
\n", "components/products/ppss/ft-ppss-table-base.md": "

ft-ppss-table-base

\n

This is an abstract component class file. It contains common functionality for PPSS table sub-components.

\n

Current implementations include:

\n\n

Usage

\n

This should not be used directly! Instead, extend this class to create a table sub-component

\n

Developer notes

\n

This class provides a changeSort(name) function that dispatches the following action:

\n
{\n    type: 'PPSS_CHANGE_SORT',\n    columnName: name\n}\n
\n

It is passed to ft-th-sortable instances, to call when they are clicked.

\n", "components/common/elements/ft-carousel/ft-carousel.md": "

ft-carousel

\n

This uses the bootstrap carousel. The carousel is created in the attached() method (where jquery is available.

\n

A unique id is created using a timestamp and passed to the data-target attributes of the navigation elements.\nThe element that we are going to create the carousel on is passed to the component using ref.\nThe actual content of each slide is passed in using transclusion ie a slot. It is assumed that each slide will be\nenclosed in a div with a item class and a slide-title attribute.

\n

The next and previous buttons are added through sub-elements ft-carousel-navigation. These elements gain a\nreference to the parent through dependency injection, but initialisation parameters for labels and whether left or right\nare passed through bindings.

\n", "components/common/elements/ft-date-dropdown/ft-date-dropdown.md": "

ft-date-dropdown

\n

Usage

\n
<ft-date-dropdown fund-id=\"817\" cid=\"uniqueId\"></ft-date-dropdown>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/common/elements/ft-datepicker/ft-datepicker.md": "

ft-datepicker

\n

Based on the jQuery UI component: https://jqueryui.com/datepicker/

\n

Usage

\n
<ft-datepicker value.two-way=\"value\" options.bind=\"myoptions\"></ft-datepicker>\n
\n

Options are defined here: http://api.jqueryui.com/datepicker/

\n", "components/common/elements/ft-historical-modal/ft-historical-modal.md": "

ft-historical-modal

\n

Usage

\n
<ft-historical-modal fund-id=\"817\" cid=\"uniqueId\"></ft-historical-modal>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/common/elements/ft-label/ft-label.md": "

ft-label

\n

Labels can include html. Therefore, it is not safe to bind them with ${ label['labelKey'] }, as the html will be escaped.

\n

One alternative is to bind the innerHTML of the parent element to the label - e.g.

\n
<th innerHTML.bind=\"label[ 'total-label' ]\"></th>\n
\n

But that can only be done when the label is the only child of the parent. In other cases, use the <ft-label> component.

\n
<th scope=\"col\">\n    <ft-label label.bind=\"label['pay-date-label']\"></ft-label>\n    <ft-footnote section=\"Tax\" element=\"Pay date\" caveats.bind=\"caveats\"></ft-footnote>\n</th>\n
\n", "components/common/elements/ft-modal-inline/ft-modal-inline.md": "

ft-modal-inline

\n

This is a way of adding a modal, where the content is taken from the main component html and pushed into a slot within the modal

\n
<ft-modal-inline id=\"test1\" view-model.ref=\"modal\" title.bind=\"title\" close.bind=\"close\" >\n    <div slot=\"body\">\n      <p>contents</p>\n    </div>\n    <div slot=\"footer\">\n      <p>contents</p>\n    </div>\n</ft-modal-inline>\n
\n

The modal has slots for:

\n\n

And bound attributes for

\n\n

Opening the Modal

\n

In your component controller, use this.modal.openModal(); to open the modal. this.modal relates to the veiw-modal.ref="modal" on the ft-modal-inline component, and calls a function within the modal component.

\n", "components/common/elements/ft-owl-carousel/ft-owl-carousel.md": "

ft-owl-carousel

\n

This uses the OWL carousel. The carousel is created in the attached() method where jquery is available.

\n

A unique id is created using a timestamp and passed to the data-target attributes of the navigation elements.\nThe element that we are going to create the carousel on is passed to the component using ref.\nThe actual content of each slide is passed in using transclusion ie a slot. It is assumed that each slide will be\nenclosed in a div with a owl-item class and nested div with item class.\nExample: <div class="owl-item"><div class="item">Content</div></div>

\n

Carousel configuration is is in ft-owl-carousel.js

\n

Usage

\n
<ft-owl-carousel>\n  <div class=\"owl-item\">\n      <div class=\"item\" >\n          <h3>Title1</h3>\n          <a href=\"#\">Link Text</a>\n      </div>\n  </div>\n  <div class=\"owl-item\">\n      <div class=\"item\" >\n          <h3>Title2</h3>\n          <a href=\"#\">Link Text</a>\n      </div>\n  </div>\n</ft-owl-carousel>\n
\n", "components/common/elements/ft-owl-tabbed/ft-owl-tabbed.md": "

ft-owl-tabbed

\n

This uses the OWL carousel. The carousel is created in the attached() method where jquery is available.

\n

A unique id is created using a timestamp and passed to the data-target attributes of the navigation elements.\nThe element that we are going to create the carousel on is passed to the component using ref.\nThe actual content of each slide is passed in using transclusion ie a slot. It is assumed that each slide will be\nenclosed in a li with a owl-tab class and nested a with link to corresponding tab.\nAdditionally ft-owl-tabbed can have class="hidden" to hide list of items during framework load. This class will be removed after tabbed carousel initialization.\nTabs content needs to be defined separately.\nCarousel configuration is is in ft-owl-tabbed.js

\n

Usage

\n
\n<ft-owl-tabbed class=\"hidden\">\n  <li role=\"presentation\" class=\"owl-tab active\">\n    <a href=\"#tabs-content-1\" aria-controls=\"tabs-content-1\" data-toggle=\"tab\" aria-expanded=\"true\">Title 1</a>\n  </li>\n  <li role=\"presentation\" class=\"owl-tab \">\n    <a href=\"#tabs-content-2\" aria-controls=\"tabs-content-2\" data-toggle=\"tab\" aria-expanded=\"true\">Title 2</a>\n  </li>\n</ft-owl-tabbed>\n<div class=\"panel-body tab-content\">\n  <div role=\"tabpane\" class=\"tab-pane active\" id=\"tabs-content-1\">\n    Content 1\n  </div>\n  <div role=\"tabpane\" class=\"tab-pane\" id=\"tabs-content-2\">\n    Content 2\n  </div>\n</div>\n
\n", "components/common/elements/ft-th-sortable/ft-th-sortable.md": "

ft-th-sortable

\n

This component creates a <th> that the user can click on to sort.

\n

Usage

\n
<th scope=\"col\" class=\"fund\"\n    as-element=\"ft-th-sortable\"\n    title.one-time=\"getLabel('fund-name')\"\n    sort.bind=\"sort.columns.get('FUND_NAME')\"\n    click-callback.call=\"changeSort('FUND_NAME')\"></th>\n
\n\n

Developer notes

\n", "components/marketing/common/value-converters/ft-format-grid-cell.md": "

ft-format-grid-cell

\n

value-converter

\n

Usage

\n
<td innerhtml.bind=\"dataObj | ftFormatGridCell:dataKey\"></td>\n
\n

Developer notes

\n\n", "components/marketing/layouts/ft-choose-subscription/ft-choose-subscription-step1.md": "

ft-choose-subscription

\n

Usage

\n
<ft-choose-subscription></ft-choose-subscription>\n
\n

Marketing component to allow users to choose various subscriptions.

\n

Uses 'aurelia-fetch-client' to post data to end point after step 2.

\n", "components/marketing/lists/ft-document-lister/ft-document-lister.md": "

ft-document-lister

\n

Usage

\n
<ft-document-lister>\n  SERVER SIDE RENDERED CONTENT\n</ft-document-lister>\n
\n

Developer notes

\n

This component is server side rendered.

\n

This component is unlike other components in that the content and data are server side rendered upfront.

\n

Test page: 'test\\pages\\en-gb\\doclister.html'

\n

Note: If making updates, ensure doc-lister component in pattern library is kept up to date, as this is the HMTL 'single source of the truth' that the XLS backed team work from.

\n

See further dev notes in pattern library

\n", "components/marketing/lists/ft-report-archive-a/ft-report-archive-a.md": "

ft-report-archive-a

\n

Usage

\n
<ft-report-archive-a fund-id=\"817\" cid=\"uniqueId\"></ft-report-archive-a>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/marketing/lists/ft-report-archive-b/ft-report-archive-b.md": "

ft-report-archive-a

\n

Usage

\n
<ft-report-archive-a fund-id=\"817\" cid=\"uniqueId\"></ft-report-archive-a>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/marketing/lists/ft-report-archive-c/ft-report-archive-c.md": "

ft-report-archive-c

\n

Usage

\n
<ft-report-archive-c></ft-report-archive-c>\n
\n", "components/marketing/lists/ft-report-archive-d/ft-report-archive-d.md": "

ft-report-archive-d

\n

Usage

\n
<ft-report-archive-d></ft-report-archive-d>\n
\n", "components/marketing/grids/ft-grid-filter/ft-grid-filter.md": "

ft-grid-filter

\n

Usage

\n
<ft-grid-filter cid=\"unqiue_ref\">\n    <script slot=\"config\" type=\"application/json\">\n        {\n            \"cardsPerPage\": 3,\n            \"currentView\": \"GRID\",\n            \"showViewToggle\": true,\n            \"filters\": [...],\n            \"columns\": [...]\n        }\n    </script>\n    <div data-fti-component=\"card\"\n        class=\"hidden all Macro-News christopher-j-molumphy-cfa  col-sm-6 col-md-4 col-lg-3 no\"\n        card-title=\"Global Economic Perspective: March 2017\"\n        card-title-url=\"https://www.franklintempleton.com/investor/insights/commentary?commentaryPath=en-us/en-us-retail/GEP&amp;commentaryType=Macro News\"\n        commentary-type=\"Macro News\"\n        speaker-name=\"Christopher J. Molumphy, CFA|John Smith|Jane Doe\"\n        published-date=\"Mar 23, 2017\"\n        nav=\"$1.23\">\n        <div class=\"card card-speaker card-small\">...</div>\n    </div>\n    ...\n    <div data-fti-component=\"card\"\n        class=\"hidden all Global-Market-Viewpoints  col-sm-6 col-md-4 col-lg-3 no\"\n        card-title=\"Commodities Overview: February 2017\"\n        card-title-url=\"https://www.franklintempleton.com/investor/insights/commentary?commentaryPath=en-us/en-us-retail/CommoditiesOverview_Feb17&amp;commentaryType=Global Market Viewpoints\"\n        commentary-type=\"Global Market Viewpoints|Other News\"\n        speaker-name=\"\"\n        published-date=\"Feb 28, 2017\">\n        <div class=\"card card-image dark card-small\">...</div>\n    </div>\n</ft-grid-filter>\n
\n

JSON Options

\n

The <script> tag should contain a valid JSON snippet with options on how the grid should display and work. If something doesn't work, check the snippet is valid JSON.

\n\n

filter config object

\n

Add one of these for each dropdown filter you want to display

\n
{\n    \"name\": \"COMMENTARY_TYPE\",\n    \"type\": \"DROPDOWN\",\n    \"label\": \"Category\",\n    \"dataKey\": \"commentaryType\",\n    \"selected\": \"ALL\",\n    \"options\": [\n        {\"label\": \"Category: All\", \"value\": \"ALL\"},\n        {\"label\": \"Global Market Viewpoints\", \"value\": \"Global Market Viewpoints\"},\n        {\"label\": \"Macro News\", \"value\": \"Macro News\"},\n        {\"label\": \"Other News\", \"value\": \"Other News\"}\n    ]\n}\n
\n\n

column config object

\n

Add one of these for each column you want the table to display

\n
{\n    \"name\": \"SPEAKER_NAME\",\n    \"label\": \"Speaker\",\n    \"dataKey\": \"speakerName\",\n    \"class\": \"speaker\",\n    \"isNumeric\": false,\n    \"isDate\": false\n}\n
\n\n

Card Elements

\n

The minimum markup required for a card is:

\n
<div data-fti-component=\"card\">...</div>\n
\n

Notes

\n\n

Actions

\n

Dispatches this example action when the 'load more' button is clicked:

\n
{\n    type: 'GRID_LOAD_MORE'\n}\n
\n

Dispatches this example action when a table column header is clicked:

\n
{\n    type: 'GRID_CHANGE_SORT',\n    columnName: 'COMMENTARY_TYPE'\n}\n
\n", "components/marketing/grids/ft-grid-filter-form/ft-grid-filter-form.md": "

ft-grid-filter-form

\n

This component generates a grid filter form, used for filtering the results of a grid/table, and toggling between the grid/table views

\n

Usage

\n
<ft-grid-filter-form filters.bind=\"filters\"\n    show-view-toggle.bind=\"showViewToggle\"\n    current-view.bind=\"currentView\"></ft-grid-filter-form>\n
\n

Developer notes

\n\n

Dispatches the following action when a toggle button is clicked:

\n
{\n    type: 'GRID_CHANGE_VIEW',\n    view: 'TABLE'\n}\n
\n", "components/marketing/grids/ft-grid-filter-dropdown/ft-grid-filter-dropdown.md": "

ft-grid-filter-dropdown

\n

This component generates a grid filter dropdown control

\n

Usage

\n
<ft-grid-filter-dropdown\n    filter.bind=\"filter\"\n    selected.bind=\"selected\"></ft-grid-filter-dropdown>\n
\n

Developer notes

\n\n

Dispatches the following example action when the dropdown is changed:

\n
{\n    type: 'GRID_CHANGE_DROPDOWN',\n    name: 'COMMENTARY_TYPE',\n    newValue: 'Macro News'\n}\n
\n", "components/products/historical/ft-historical-average-annual-total-returns/ft-historical-average-annual-total-returns.md": "

ft-historical-average-annual-total-returns

\n

Usage

\n
<ft-historical-average-annual-total-returns fund-id=\"817\" cid=\"uniqueId\"></ft-historical-average-annual-total-returns>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/marketing/video/ft-video-switch/ft-video-switch.md": "

ft-video-switch

\n

Usage

\n
<ft-video-switch transcript-url=\"http://www.franklintempleton.co.uk\">\n    <div data-fti-component=\"video\" class=\"hidden\" language=\"English\">\n        <div class=\"video-container\">...</div>\n    </div>\n    <div data-fti-component=\"video\" class=\"hidden\" language=\"German\">\n        <div class=\"video-container\">...</div>\n    </div>\n</ft-video-switch>\n
\n

Attributes

\n\n

Video Elements

\n

The minimum markup required is:

\n
<div data-fti-component=\"video\" class=\"hidden\" language=\"German\"></div>\n
\n

Notes

\n\n", "components/products/historical/ft-historical-cumulative-total-returns/ft-historical-cumulative-total-returns.md": "

ft-historical-cumulative-total-returns

\n

Usage

\n
<ft-historical-cumulative-total-returns fund-id=\"817\" cid=\"uniqueId\"></ft-historical-cumulative-total-returns>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/overview/ft-fund-mmfr-stable-nav-header/ft-fund-mmfr-stable-nav-header.md": "

ft-fund-mmfr-stable-nav-header

\n

Usage

\n

Not directly used, it is a sub component of ft-fund-static-bar

\n", "components/products/overview/ft-fund-price-header/ft-fund-price-header.md": "

ft-fund-price-header

\n

Usage

\n

Not directly used, it is a sub component of ft-fund-static-bar

\n", "components/products/overview/ft-fund-information/ft-fund-information.md": "

ft-fund-information

\n

Usage

\n
<ft-fund-information fund-id=\"817\" cid=\"uniqueId\"></ft-fund-information>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/overview/ft-fund-nav-header/ft-fund-nav-header.md": "

ft-fund-nav-header

\n

Usage

\n

Not directly used, it is a sub component of ft-fund-static-bar

\n", "components/products/overview/ft-fund-static-bar/ft-fund-static-bar.md": "

ft-fund-static-bar

\n

Usage

\n
<ft-fund-static-bar fund-id=\"817\" cid=\"uniqueId\"></ft-fund-static-bar>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n

A lot of work has been done to provide the data for any of the other components which might appear inside the fund static bar.

\n

However at the moment, this is not required, so the majority of the code has been commented out.

\n

This includes a number of functions which gather other pieces of data.

\n

If the data is required in the future then the code just needs to be uncommented.

\n", "components/products/overview/ft-fund-trading-characteristics/ft-fund-trading-characteristics.md": "

ft-trading-characteristics

\n

Usage

\n
<ft-trading-characteristics fund-id=\"817\" cid=\"uniqueId\"></ft-trading-characteristics>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-asset-class-exposure/ft-asset-class-exposure.md": "

ft-asset-class-exposure

\n

Usage

\n
<ft-asset-class-exposure fund-id=\"817\" cid=\"uniqueId\"></ft-asset-class-exposure>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-commodities-sector-breakdown/ft-commodities-sector-breakdown.md": "

ft-commodities-sector-breakdown

\n

Usage

\n
<ft-commodities-sector-breakdown fund-id=\"817\" cid=\"uniqueId\"></ft-commodities-sector-breakdown>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-category-fund-list/ft-category-fund-list.md": "

ft-category-fund-list

\n

Usage

\n
<ft-category-fund-list fund-id=\"817\" cid=\"uniqueId\"></ft-category-fund-list>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-coupon-rate-breakdown/ft-coupon-rate-breakdown.md": "

ft-coupon-rate-breakdown

\n

Usage

\n
<ft-coupon-rate-breakdown fund-id=\"817\" cid=\"uniqueId\"></ft-coupon-rate-breakdown>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-credit-quality-exposure/ft-credit-quality-exposure.md": "

ft-credit-quality-exposure

\n

Usage

\n
<ft-credit-quality-exposure fund-id=\"817\" cid=\"uniqueId\"></ft-credit-quality-exposure>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-currency-distribution/ft-currency-distribution.md": "

ft-currency-distribution

\n

Usage

\n
<ft-currency-distribution fund-id=\"817\" cid=\"uniqueId\"></ft-currency-distribution>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-fixed-income-sector-breakdown/ft-fixed-income-sector-breakdown.md": "

ft-fixed-income-sector-breakdown

\n

Usage

\n
<ft-fixed-income-sector-breakdown fund-id=\"817\" cid=\"uniqueId\"></ft-fixed-income-sector-breakdown>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-geographic-allocation/ft-geographic-allocation.md": "

ft-geographic-allocation

\n

Usage

\n
<ft-geographic-allocation fund-id=\"817\" cid=\"uniqueId\"></ft-geographic-allocation>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-geographic-breakdown/ft-geographic-breakdown.md": "

ft-geographic-breakdown

\n

Usage

\n
<ft-geographic-breakdown fund-id=\"817\" cid=\"uniqueId\"></ft-geographic-breakdown>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n

The bulk of this functionality is now moved into src/components/products/portfolio/util/util.js.

\n
function _infoBuilder(action) {\n  let [rawPortfolio] = action.json;\n  // const config = portfolioUtils.getConfig(rawConfig);\n  const rawBreakdowns = get(rawPortfolio, 'globalProductsValue.portfolioIntlValue.breakdown.brkdwnDet');\n  const breakdown =  portfolioUtils.findObjInArray(rawBreakdowns, 'COUNTRY_ALLOCATION');\n  const visible = (typeof breakdown !== 'undefined');\n  let obj = {\n    caveatSecName: 'Portfolio', tableID: 'geographic-breakdown-data', visible: visible\n  };\n\n  if (visible) {\n    let tempBreakdown = portfolioUtils.getIntlSimplifiedBreakdown(breakdown);\n\n    obj = Object.assign({}, obj, tempBreakdown);\n\n    obj.showChart = true;\n    obj.spanRow = true;\n  }\n  return obj;\n}\n
\n
Things that should be changed when using this as a base
\n

_'COUNTRYALLOCATION' - This is the breakdown that needs to be displayed. The value should match the type in the Portfolio file.

\n

'geographic-breakdown-data' - This is the id of the Caveat to be displayed.

\n", "components/products/portfolio/ft-holdings/ft-holdings.md": "

ft-holdings

\n

Usage

\n
<ft-holdings fund-id=\"25802\"></ft-holdings>\n
\n

Developer notes

\n

The holdings component displays a filterable and pageable table, listing all holdings for this fund.

\n

Configuration is done in the redux state at products.app.holdings.

\n", "components/products/portfolio/ft-manager-roster/ft-manager-roster.md": "

ft-manager-roster

\n

Usage

\n
<ft-manager-roster fund-id=\"817\" cid=\"uniqueId\"></ft-manager-roster>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-market-capitalisation/ft-market-capitalisation.md": "

ft-market-capitalisation

\n

Usage

\n
<ft-market-capitalisation fund-id=\"817\" cid=\"uniqueId\"></ft-market-capitalisation>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n

ft-market-capitalisation Int & ETF use the same front end Aurelia component, they have separate reducers.

\n

Structures

\n

EN-GB

\n
{\n\"breakdown\": {\n        \"brkdwnDet\": [\n        {\n                    \"asOfDate\": {\n                      \"val\": \"31/12/2016\"\n                    },\n                    \"brkDwnLst\": {\n                      \"lstDtls\": [\n                        {\n                          \"name\": {\n                            \"val\": \"<2.0 Billion\"\n                          },\n                          \"val\": {\n                            \"val\": \"11.91\"\n                          }\n                        }\n                      ]\n                    },\n                    \"type\": \"MARKET_CAPITAL_ALLOCATION\"\n                  }\n        ]\n  }\n }\n
\n

ETF

\n
{\n\"breakdown\": {\n        \"brkdwnDet\": [\n        {\n                    \"asOfDate\": {\n                      \"lbl\": \"As of\",\n                      \"val\": \"2017-04-26\"\n                    },\n                    \"brkDwnLst\": {\n                      \"lstDtls\": [\n                        {\n                          \"name\": {\n                            \"val\": \"10.0-25.0 Billion\"\n                          },\n                          \"rank\": {\n                            \"val\": \"4\"\n                          },\n                          \"val\": {\n                            \"val\": \"16.58320\"\n                          },\n                          \"valStd\": {\n                            \"val\": \"16.5832\"\n                          }\n                        }\n                      ]\n                    },\n                    \"type\": \"MARKET_CAPITAL_ALLOCATION\",\n                    \"asOfDateStd\": {\n                      \"val\": \"2017-04-26\"\n                    }\n                  }\n        ]\n   }\n}\n
\n", "components/products/portfolio/ft-maturity-breakdown/ft-maturity-breakdown.md": "

ft-maturity-breakdown

\n

Usage

\n
<ft-maturity-breakdown fund-id=\"817\" cid=\"uniqueId\"></ft-maturity-breakdown>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-portfolio-statistics-and-positions/ft-portfolio-statistics-and-positions.md": "

ft-portfolio-statistics-and-positions

\n

Usage

\n
<ft-portfolio-statistics-and-positions fund-id=\"817\" cid=\"uniqueId\"></ft-portfolio-statistics-and-positions>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-quality-breakdown/ft-quality-breakdown.md": "

ft-quality-breakdown

\n

Usage

\n
<ft-quality-breakdown fund-id=\"817\" cid=\"uniqueId\"></ft-quality-breakdown>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-sector-allocation/ft-sector-allocation.md": "

ft-sector-allocation

\n

Usage

\n
<ft-sector-allocation fund-id=\"817\" cid=\"uniqueId\"></ft-sector-allocation>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-sector-exposure/ft-sector-exposure.md": "

ft-sector-exposure

\n

Usage

\n
<ft-sector-exposure fund-id=\"817\" cid=\"uniqueId\"></ft-sector-exposure>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n

This component comes includes 2 versions, one with chart and table, one with collapsing table.

\n

eg:

\n\n", "components/products/portfolio/ft-strategy-breakdown/ft-strategy-breakdown.md": "

ft-strategy-breakdown

\n

Usage

\n
<ft-strategy-breakdown fund-id=\"817\" cid=\"uniqueId\"></ft-strategy-breakdown>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-top-exposures/ft-top-exposures.md": "

ft-top-exposures

\n

Usage

\n
<ft-top-exposures fund-id=\"817\" cid=\"uniqueId\"></ft-top-exposures>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/ft-top-ten-holdings/ft-top-ten-holdings.md": "

ft-top-ten-holdings

\n

Usage

\n
<ft-top-ten-holdings fund-id=\"817\" cid=\"uniqueId\"></ft-top-ten-holdings>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/portfolio/util/util.md": "

Portfolio Utils

\n

Exposes a number of utilities which are used in Sector Breakdown components.

\n

Usage

\n

Imported as:

\n
import {portfolioUtils} from '../../../util/util';\n
\n

This exposes the the portfolioUtils object.

\n

Using the function from

\n", "components/products/performance/ft-after-tax-average-annual-returns/ft-after-tax-average-annual-returns.md": "

ft-after-tax-average-annual-returns

\n

Usage

\n
<ft-after-tax-average-annual-returns fund-id=\"817\" cid=\"uniqueId\"></ft-after-tax-average-annual-returns>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-average-annual-total-returns/ft-average-annual-total-returns.md": "

ft-average-annual-total-returns

\n

Usage

\n
<ft-average-annual-total-returns fund-id=\"817\" cid=\"uniqueId\"></ft-average-annual-total-returns>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-calendar-year-returns/ft-calendar-year-returns.md": "

ft-calendar-year-returns

\n

Usage

\n
<ft-calendar-year-returns fund-id=\"817\" show-chart=\"true\" span-row=\"true\" cid=\"uniqueId\"></ft-calendar-year-returns>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-discrete-returns/ft-discrete-returns.md": "

ft-discrete-returns

\n

Usage

\n
<ft-discrete-returns fund-id=\"817\" cid=\"uniqueId\"></ft-discrete-returns>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-performance-annualised/ft-performance-annualised.md": "

ft-performance-cumulative

\n

Usage

\n
<ft-performance-annualised fund-id=\"15846\"></ft-performance-annualised>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-performance-cumulative/ft-performance-cumulative.md": "

ft-performance-cumulative

\n

Usage

\n
<ft-performance-cumulative fund-id=\"817\" cid=\"uniqueId\"></ft-performance-cumulative>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/ppss/ft-find-a-fund/ft-find-a-fund.md": "

ft-find-a-fund

\n

Usage

\n
<ft-find-a-fund fund-id=\"817\" cid=\"uniqueId\"></ft-find-a-fund>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/ppss/ft-ppss/ft-ppss.md": "

ft-ppss

\n

Usage

\n
<ft-ppss cid=\"uniqueId\"\n    product-page-url=\"http://www.franklintempleton.co.uk/en_GB/investor/funds/fund-detail/\"></ft-ppss>\n
\n

product-page-url will have the fundId appended to it to form links to individual product pages. In future, the productPageUrl variable may be set via configuration json or some other process.

\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n

Most of the work (filtering, sorting etc) of the PPSS data is done in the mapState() function of the ft-ppss.js component file. There are various private functions in this file to help process the data.

\n", "components/products/ppss/ft-ppss-favorite/ft-ppss-favorite.md": "

ft-ppss-favorite

\n

This sub-component is used to generate a favorites <td> cell.

\n

NB: Favorites is currently just a feature of US sites, but will be left in International sites in case they want this in the future.

\n

TODO: This feature has still to be implemented in web-platform

\n

Usage

\n
<td if.one-time=\"config.showFavorites\"\n    class=\"favorites hidden-print\"\n    as-element=\"ft-ppss-favorite\"\n    fund.bind=\"fund\"\n    user.one-time=\"user\"></td>\n
\n

Developer notes

\n", "components/products/ppss/ft-ppss-etf/ft-ppss-etf-row.md": "

ft-ppss-etf-row

\n

This PPSS sub-component displays a row of the ETF table.

\n

Usage

\n
<tr repeat.for=\"fund of funds\"\n    as-element=\"ft-ppss-etf-row\"\n    fund.bind=\"fund\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    product-page-url.one-time=\"productPageUrl\"></tr>\n
\n\n

Developer notes

\n

The template uses <template view-cache="*"> to cache the component, and increase rendering speed.

\n", "components/products/ppss/ft-ppss-etf/ft-ppss-etf.md": "

ft-ppss-etf

\n

This PPSS sub-component displays the ETF table.

\n

Usage

\n
<ft-ppss-etf\n    funds.bind=\"funds\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    sort.bind=\"sort\"\n    nav-as-of-date.one-time=\"navAsOfDate\"\n    product-page-url.one-time=\"productPageUrl\"></ft-ppss-etf>\n
\n\n

Developer notes

\n", "components/products/ppss/ft-ppss-fund-filter/ft-ppss-dropdown.md": "

ft-ppss-dropdown

\n

This PPSS sub-component creates a dropdown filter that the user can change.

\n

Usage

\n
<ft-ppss-dropdown filter.bind=\"filter\"\n    selected.bind=\"filter.selected\"\n    label.one-time=\"label\"></ft-ppss-dropdown>\n
\n

filter - is an object describing the dropdown's state e.g:

\n
{\n    name: 'ASSET_CLASS',\n    labelKey: 'assetclass',\n    dataKey: 'assetClass',\n    selected: {value: 'Equity', label: 'Equity'},\n    options: [\n        {\"label\": \"Equity\", \"value\": \"Equity\"},\n        {\"label\": \"Fixed Income\", \"value\": \"Fixed Income\"}\n    ]\n}\n
\n\n

selected - TODO This is a shortcut to the filter's selected property, so that binding will update when it changes. Ideally, this should not be needed if it's possible to watch the property.

\n

Developer notes

\n

So far, this is only used inside the ft-ppss-fund-filter component.

\n

Filters will always have an All option.

\n

Dispatches the following action when user changes the value:

\n
{\n    type: 'PPSS_CHANGE_DROPDOWN',\n    name: this.filter.name,\n    newValue: option\n}\n
\n", "components/products/ppss/ft-ppss-fund-filter/ft-ppss-fund-filter.md": "

ft-ppss-fund-filter

\n

This PPSS sub-component allows the user to filter the list of funds displayed by various criteria.

\n

Usage

\n
<ft-ppss-fund-filter filters.bind=\"filters\" label.one-time=\"label\"></ft-ppss-fund-filter>\n
\n

filter is an object describing which filter inputs should be displayed, their options and currently selected values e.g:

\n
{\n  favorites: true, // {myFavoritesOnly: true},\n  dropdowns: [{\n    name: 'ASSET_CLASS',\n    labelKey: 'assetclass',\n    dataKey: 'assetClass',\n    selected: {value: 'Equity', label: 'Equity'},\n    options: [\n      {\"label\": \"Equity\", \"value\": \"Equity\"},\n      {\"label\": \"Fixed Income\", \"value\": \"Fixed Income\"}\n    ]\n  }, {\n  ...\n  }, {\n    name: 'SHARE_CLASS',\n    labelKey: 'shareclass',\n    dataKey: 'shareClass',\n    selected: {value: ['C', 'C1'], label: 'C & C1'},\n    options: [\n      {value: ['A', 'A1'], label: 'A & A1'},\n      {value: ['C', 'C1'], label: 'C & C1'},\n      {value: 'R', label: 'R'},\n      {value: 'R6', label: 'R6'},\n      {value: ['Advisor', 'Z'], label: 'Advisor/Z'}\n    ]\n  }],\n  keywords: {\n    searchKeys: ['symbol', 'fundShortName', 'fundId', 'fundLegalName'],\n    searchString: ''\n  }\n}\n
\n

Developer notes

\n\n", "components/products/ppss/ft-ppss-fund-identifiers/ft-ppss-fund-identifiers-row.md": "

ft-ppss-fund-identifiers-row

\n

This PPSS sub-component displays a row of the Fund Identifiers table.

\n

TODO: This has still to be fully developed

\n

Usage

\n
<tr repeat.for=\"fund of funds\"\n    as-element=\"ft-ppss-fund-identifiers-row\"\n    fund.bind=\"fund\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    product-page-url.one-time=\"productPageUrl\">\n
\n\n

Developer notes

\n", "components/products/ppss/ft-ppss-fund-identifiers/ft-ppss-fund-identifiers.md": "

ft-ppss-fund-identifiers

\n

This PPSS sub-component display the Fund Identifiers table.

\n

TODO: This has still to be fully developed

\n

Usage

\n
<ft-ppss-fund-identifiers\n    funds.bind=\"funds\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    filters.bind=\"filters\"\n    sort.bind=\"sort\"\n    user.bind=\"user\"\n    product-page-url.one-time=\"productPageUrl\"></ft-ppss-fund-identifiers>\n
\n\n

Developer notes

\n", "components/products/ppss/ft-ppss-fund-name/ft-ppss-fund-name.md": "

ft-ppss-fund-name

\n

This sub-component is used to generate a fund name <td> cell.

\n

It creates a link to the fund's product page, it displays hard or soft closure messages if present, and (optionally) it displays sales charges and expenses information in an expandable panel.

\n

Usage

\n
<td class=\"fund-name\"\n    as-element=\"ft-ppss-fund-name\"\n    fund.bind=\"fund\"\n    product-page-url.one-time=\"productPageUrl\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    tab=\"performance\"></td>\n
\n

tab - this is used to create a unique id name, if there are multiple tabs available

\n

Developer notes

\n

The template uses <template view-cache="*"> to cache the component, and increase rendering speed.

\n", "components/products/ppss/ft-ppss-performance/ft-ppss-performance-row.md": "

ft-ppss-performance-row

\n

This PPSS sub-component displays a row of the Performance table.

\n

Usage

\n
<tr repeat.for=\"fund of funds\"\n    as-element=\"ft-ppss-performance-row\"\n    fund.bind=\"fund\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    product-page-url.one-time=\"productPageUrl\"\n    performance-view.bind=\"performanceView\">\n
\n\n

Developer notes

\n

To optimise the performance at which this component renders when displaying lots of rows, 7 data <td>s are created, and the contents changed when the performanceView updates.

\n

This seems to work faster than destroying or hiding the <td>s and creating new ones.

\n

The template also uses <template view-cache="*"> to cache the component, and increase rendering speed.

\n

en-us-retail has it's own version of this component

\n", "components/products/ppss/ft-ppss-performance/ft-ppss-performance.md": "

ft-ppss-performance

\n

This PPSS sub-component displays the Performance table.

\n

(Optionally) this sub-component displays a dropdown to swap between Month-end and Quarter-end data.

\n

Usage

\n
<ft-ppss-performance\n    funds.bind=\"funds\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    filters.bind=\"filters\"\n    sort.bind=\"sort\"\n    user.bind=\"user\"\n    performance-view.bind=\"performanceView\"\n    product-page-url.one-time=\"productPageUrl\"\n    ytd-as-of-date.one-time=\"ytdAsOfDate\"\n    period-end.bind=\"display.periodEnd\"\n    nav-as-of-date-month.one-time=\"navAsOfDateMonth\"\n    nav-as-of-date-quarter.one-time=\"navAsOfDateQuarter\"\n    include-sales-charges.bind=\"display.includeSalesCharges\"></ft-ppss-performance>\n
\n\n

Developer notes

\n

For Int'l sites, funds are grouped by Investment vehicle. This is done by having several <tbody> sections, each with a sortable header row, and multiple Performance data rows.

\n

To optimise the performance at which this component renders when displaying lots of rows, all possible sortable <th>s are created, and the contents shown/hidden when the performanceView updates.

\n

This seems to work faster than destroying the <th>s and creating new ones.

\n", "components/products/ppss/ft-ppss-ratings/ft-ppss-ratings-row.md": "

ft-ppss-ratings-row

\n

This PPSS sub-component displays a row of the Ratings table. For some funds, a message will be displayed instead of data.

\n

So far, this is only used on the US site

\n

Usage

\n
<tr repeat.for=\"fund of funds\"\n    as-element=\"ft-ppss-ratings-row\"\n    fund.bind=\"fund\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    product-page-url.one-time=\"productPageUrl\"></tr>\n
\n\n

Developer notes

\n

The template uses <template view-cache="*"> to cache the component, and increase rendering speed.

\n", "components/products/ppss/ft-ppss-ratings/ft-ppss-ratings.md": "

ft-ppss-ratings

\n

This PPSS sub-component displays the Ratings table.

\n

So far, this is only used on the US site.

\n

Usage

\n
<ft-ppss-ratings\n    funds.bind=\"funds\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    filters.bind=\"filters\"\n    sort.bind=\"sort\"\n    user.bind=\"user\"\n    morningstar-as-of-date.one-time=\"morningstarAsOfDate\"\n    fund-category-as-of-date.one-time=\"fundCategoryAsOfDate\"\n    product-page-url.one-time=\"productPageUrl\"></ft-ppss-ratings>\n
\n\n

Developer notes

\n", "components/products/ppss/ft-ppss-search-box/ft-ppss-search-box.md": "

ft-ppss-search-box

\n

This PPSS sub-component is used to perform keyword search filtering to funds

\n

Usage

\n
<ft-ppss-search-box label.one-time=\"label\"\n    search-string.bind=\"filters.keywords.searchString\"></ft-ppss-search-box>\n
\n

searchString - The search string that is currently being filtered on. This should be an empty string if no keyword filtering is currently being applied.

\n

Developer notes

\n

Dispatches the following action when user changes input:

\n
{\n    type: 'PPSS_CHANGE_KEYWORDS',\n    newSearchString: 'foo'\n}\n
\n

Currently this is hard-coded with a 500ms debounce i.e. the action won't be dispatched until the user has stopped typing for half a second.

\n", "components/products/ppss/ft-ppss-tab-header/ft-ppss-tab-header.md": "

ft-ppss-tab-header

\n

This PPSS sub-component displays the tabs which users can click on to see different data tables.

\n

It can also be configured to show toggles for the Performance View or Sales Charges

\n

Usage

\n
<ft-ppss-tab-header config.one-time=\"config\"\n    label.one-time=\"label\"\n    current-table.bind=\"currentTable\"\n    show-performance-toggle.bind=\"config.showPerformanceToggle\"\n    performance-view.bind=\"display.performanceView\"\n    show-sales-charge-toggle.bind=\"config.showSalesChargeToggle\"\n    include-sales-charges.bind=\"display.includeSalesCharges\"></ft-ppss-tab-header>\n
\n\n

Developer notes

\n

3 different actions can be dispatched:

\n
    \n
  1. When a tab is clicked

    \n
    {\ntype: 'PPSS_CHANGE_TAB',\ntab: key\n}\n
    \n
  2. \n
  3. When the performance view is changed:

    \n
    {\ntype: 'PPSS_CHANGE_PERFORMANCE_VIEW',\ndata: val\n}\n
    \n
  4. \n
  5. When the sales charges are toggled on or off:

    \n
    {\ntype: 'PPSS_CHANGE_SALES_CHARGES',\ndata: val\n}\n
    \n
  6. \n
\n", "components/products/ppss/ft-ppss-yield/ft-ppss-yield-row.md": "

ft-ppss-yield-row

\n

This PPSS sub-component displays a row of the Yield table. For some funds, a message will be displayed instead of data.

\n

So far, this is only used on the US site

\n

Usage

\n
<tr repeat.for=\"fund of funds\"\n    as-element=\"ft-ppss-yield-row\"\n    fund.bind=\"fund\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    product-page-url.one-time=\"productPageUrl\"\n    include-sales-charges.bind=\"includeSalesCharges\"></tr>\n
\n\n

Developer notes

\n

The template uses <template view-cache="*"> to cache the component, and increase rendering speed.

\n", "components/products/ppss/ft-ppss-yield/ft-ppss-yield.md": "

ft-ppss-yield

\n

This PPSS sub-component displays the Yield table.

\n

So far, this is only used on the US site.

\n

Usage

\n
<ft-ppss-yield\n    funds.bind=\"funds\"\n    label.one-time=\"label\"\n    config.one-time=\"config\"\n    filters.bind=\"filters\"\n    sort.bind=\"sort\"\n    user.bind=\"user\"\n    product-page-url.one-time=\"productPageUrl\"\n    dist-rate-nav-as-of-date.one-time=\"distRateNavAsOfDate\"\n    standard-yield-as-of-date.one-time=\"standardYieldAsOfDate\"\n    standard-yield-as-of-date-money-fund.one-time=\"standardYieldAsOfDateMoneyFund\"\n    include-sales-charges.bind=\"display.includeSalesCharges\"></ft-ppss-yield>\n
\n\n

Developer notes

\n", "components/products/pricing-distribution/ft-dividends-historical/ft-dividends-historical.md": "

ft-dividends-historical

\n

Displays dividend information for different share classes in the fund

\n

NB Only share classes with historical dividend information should be passed in

\n

Usage

\n
<ft-dividends-historical label.bind=\"label\"\n  config.bind=\"config\"\n  share-class.bind=\"currentShareClass\"></ft-dividends-historical>\n
\n", "components/products/pricing-distribution/ft-dividends/ft-dividends.md": "

ft-dividends

\n

Displays dividend information for different share classes in the fund

\n

NB Only share classes with distribution information should be passed in

\n

NBB Component will not display at all if no share classes are passed

\n

Usage

\n
<ft-dividends label.bind=\"label\"\n    dividend-share-classes.bind=\"dividendShareClasses\"\n    dividend-as-of-date.bind=\"dividendAsOfDate\"></ft-dividends>\n
\n

Developer notes

\n\n", "components/products/pricing-distribution/ft-nav-high-low/ft-nav-high-low.md": "

ft-nav-high-low

\n

Usage

\n
<ft-nav-high-low label.bind=\"label\"\n    config.bind=\"config\"\n    share-class.bind=\"shareClass\"></ft-nav-high-low>\n
\n

Developer notes

\n\n", "components/products/pricing-distribution/ft-price-chart/ft-price-chart.md": "

ft-price-chart

\n

Usage

\n
<ft-price-chart fund-id=\"817\" cid=\"uniqueId\"></ft-price-chart>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/pricing-distribution/ft-pricing-distribution/ft-pricing-distribution.md": "

ft-pricing-distribution

\n

Top Level component for the Pricing and Distributions Tab

\n

Usage

\n
<ft-pricing-distribution fund-id=\"12904\"></ft-pricing-distribution>\n
\n", "components/products/pricing-distribution/ft-share-prices/ft-share-prices.md": "

ft-share-prices

\n

Usage

\n
<ft-share-prices label.bind=\"label\"\n    share-class.bind=\"currentShareClass\"></ft-share-prices>\n
\n

Developer notes

\n\n

navChangePercent is optional

\n", "components/products/ppss/ft-ppss-table-toolbar/ft-ppss-table-toolbar.md": "

ft-ppss-table-toolbar

\n

This PPSS sub-component allows the user to compare funds, remove or add it to their favorites, and add the factsheet to their cart.

\n

TODO: This has still to be developed in web-platform

\n

Usage

\n
<tr as-element=\"ft-ppss-table-toolbar\"\n    label.one-time=\"label\"\n    user.bind=\"user\"\n    class=\"table-toolbar hidden\"\n    data-ppss-favorite=\"tool-bar\"\n    data-fti-sticky-item=\"yield\"></tr>\n
\n

Developer notes

\n", "components/marketing/common/elements/ft-gateway/ft-gateway.md": "

ft-gateway

\n

Usage

\n", "components/marketing/common/elements/ft-multi-select-bar/ft-multi-select-bar.md": "

ft-multi-select-bar

\n

This bar is used by doc listers and doc archive marketting components.\nIt shoulds a bar with options to download, edit, email and subscribe (removed for now).

\n

Requires:

\n\n
<ft-multi-select-bar  multiselect.two-way=\"multiselect\" selected.bind=\"selected\" on-selected.bind=\"onSelectDocument\"></ft-multi-select-bar>\n
\n", "components/products/common/elements/ft-footnote/ft-footnote.md": "

ft-footnote

\n

<ft-footnote> is a caveat related component. See 'todo Caveats overview'\nfor general details on caveat processing.

\n

Other components will use this component to identify a particular\nelement in the page which could contain a reference\n(if specified by the data),\nto a a particular footnote at the bottom of the page.

\n

The ft-footnote component adds a <sup id="66666666"> tag for each\nmatching caveat.

\n

The caveats component (todo add ref) will\nfind these and insert the correct footnote number, (and add the caveat\ncontent to the foot of the page).

\n

The numbers in the super text do not currently link to the actual\nfootnotes.

\n

In common with other caveat related components (see #ft-proximal),\nthe component has 3 bindings:

\n
    \n
  1. section - a string (usually hard-coded) to indicate the section to\ntake the caveat from.
  2. \n
  3. element - a string (usually hard-coded) which acts as a key\n(shared with business) to identify the specific caveat to show.
  4. \n
  5. footnotes (todo change to the actual attribute name) - the object\ncontaining the caveat data.
  6. \n
\n

Example usage

\n
<ft-footnote section=\"Distribution Information\" element=\"Capital Gain Distributions\" footnotes.bind=\"footnotes\"></ft-footnote>\n
\n", "components/products/common/elements/ft-labels/ft-labels.md": "

ft-labels

\n

<ft-labels> is a label related component.

\n

The sole purpose of ft-labels is to load the correct labels for the page.

\n

It requires a specific bean labels

\n
component: {\n    labels: [\n      'etf.labels'\n    ]\n    }\n
\n

It should be placed on the page before any other components to ensure that the labels are loaded before anything else.

\n

Example usage

\n
<ft-labels></ft-labels>\n
\n", "components/products/portfolio/ft-geographic-breakdown/en-us-retail/ft-geographic-breakdown.md": "

ft-geographic-breakdown

\n

Usage

\n
<ft-geographic-breakdown fund-id=\"817\" cid=\"uniqueId\"></ft-geographic-breakdown>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n
sumBy(lstDtls,  (o) => { return (o.val.alt * 100); } ) / 100;\n
\n

The chart data is totaled using values multiplied by 100 to avoid doing maths on decimal numbers.

\n", "components/products/portfolio/ft-portfolio-statistics-and-positions/en-us-retail/ft-portfolio-statistics-and-positions.md": "

ft-portfolio-statistics-and-positions

\n

Usage

\n
<ft-portfolio-statistics-and-positions fund-id=\"817\" cid=\"uniqueId\"></ft-portfolio-statistics-and-positions>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-backtested-performance-annualised/etf/ft-backtested-performance-annualised.md": "

ft-performance-cumulative

\n

Usage

\n
<ft-performance-cumulative fund-id=\"817\" cid=\"uniqueId\"></ft-performance-cumulative>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-calendar-year-returns/en-us-retail/ft-calendar-year-returns.md": "

ft-calendar-year-returns

\n

Usage

\n
<ft-calendar-year-returns fund-id=\"817\" show-chart=\"true\" span-row=\"true\" cid=\"uniqueId\"></ft-calendar-year-returns>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-calendar-year-returns/etf/ft-calendar-year-returns.md": "

ft-calendar-year-returns

\n

Usage

\n
<ft-calendar-year-returns fund-id=\"817\" show-chart=\"true\" span-row=\"true\" cid=\"uniqueId\"></ft-calendar-year-returns>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-backtested-performance-cumulative/etf/ft-backtested-performance-cumulative.md": "

ft-performance-cumulative

\n

Usage

\n
<ft-performance-cumulative fund-id=\"817\" cid=\"uniqueId\"></ft-performance-cumulative>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-performance-annualised/etf/ft-performance-annualised.md": "

ft-performance-cumulative

\n

Usage

\n
<ft-performance-annualised fund-id=\"15846\"></ft-performance-annualised>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-performance-cumulative/en-us-retail/ft-performance-cumulative.md": "

ft-performance-cumulative

\n

Usage

\n
<ft-performance-cumulative fund-id=\"817\" cid=\"uniqueId\"></ft-performance-cumulative>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-performance-cumulative/etf/ft-performance-cumulative.md": "

ft-performance-cumulative

\n

Usage

\n
<ft-performance-cumulative fund-id=\"817\" cid=\"uniqueId\"></ft-performance-cumulative>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n", "components/products/performance/ft-backtested-performance-calendar/etf/ft-backtested-performance-calendar.md": "

ft-performance-cumulative

\n

Usage

\n
<ft-performance-cumulative fund-id=\"817\" cid=\"uniqueId\"></ft-performance-cumulative>\n
\n

The cid is guaranteed to be unique to this page even if multiple instances of the component are added to the same page.

\n

Developer notes

\n" } }