| # Add a new feature |
| All the features are hidden behind a switch, so users can turn them on or off as |
| desired. This doc explains how to add this feature switch option to the options |
| page, and some guidance on where should the feature be developed. |
| |
| ## Add an option |
| Each feature has a boolean option "linked" to it, which determines whether the |
| feature will be enabled or not. |
| |
| ### How to add the feature switch option |
| 1. First of all, think of a short codename for the feature. |
| 2. Modify the `//src/common/optionsPrototype.json5` file by adding an entry. |
| - All features should have the `false` value set as a default, so existing |
| users have to explicitly enable the option after they receive the extension |
| update. Otherwise, it might cause confusion, because users wouldn't know if |
| the feature was added by the extension or Google. |
| 3. Now, modify the `//src/options/optionsPage.json5` file by adding an entry to |
| the corresponding section. The _experimental_ property is optional and should |
| only be used with features which are unreliable (or could be at some point in |
| the future) due to their nature. |
| 4. Finally, add the option string at `//src/static/_locales/en/manifest.json`, |
| by adding the string under the `options_{{codename}}` key. |
| |
| ### How to add additional options for the feature |
| Apart from the feature switch option, additional options can be defined in order |
| to further customize the behavior of a feature. |
| |
| This is not usually the case, and it is preferred that the number of options is |
| kept to a minimum so the extension is as simple as possible. In any case, this |
| section explains how to add them in case they are needed. |
| |
| *** promo |
| As a source of inspiration, take a look at the Community Console dark mode |
| feature: apart from the feature switch option (`ccdarktheme`) it has 2 |
| additional options associated with it: |
| |
| - The `ccdarktheme_mode` option can be configured in the options page with a |
| selector, and determines whether the dark/light themes are set according to the |
| OS's dark mode setting, or whether the user is the one in charge of switching |
| between them by clicking a button/switch in the Community Console. |
| - Note that this option is only applied when the feature switch is turned |
| on. |
| - The `ccdarktheme_switch_enabled` option is used to save whether the user |
| manually enabled the dark theme or not by using the switch/button in the |
| Community Console. |
| - It is only applied when `ccdarktheme_mode` is set to `switch` and the |
| feature is enabled. |
| *** |
| |
| These are the steps which you should generally follow when adding additional |
| options: |
| |
| 1. Think of a codename for the additional option. It should be the feature |
| codename appended by an underscore and a suffix |
| (`{{feature_codename}}_{{suffix}}`). |
| 2. Modify the following files: |
| 1. Add an entry for the option in the `//src/common/optionsPrototype.json5` |
| file. |
| 2. Append the option's codename to the `//src/common/specialOptions.json5` |
| file. This is so the option can be handled in a specific way when |
| showing/saving it in the options page, or so it is handled outside of the |
| options page. |
| 3. If you want to handle the option from the options page, follow these steps: |
| 1. Modify the `//src/static/options/optionsPage.json5` file to add the |
| appropriate code which implements the option under the `customHTML` |
| property. |
| - Don't include text, only the HTML structure. If you add a `data-i18n` |
| attribute to an HTML element, its contents will be replaced with the |
| corresponding i18n string (for instance, |
| `<span data-i18n="test"></span>` will be rendered as |
| `<span data-i18n="test">Test</span>` if `Test` was the string defined |
| with the key `options_test`). |
| 2. Modify the `//src/optionsCommon.js` file to add the following things: |
| 1. In the switch statement inside the save function, add a case to |
| handle saving your additional option. |
| 2. In the switch statement inside the load event listener, add another |
| case so your option is correctly set in the options page with the saved |
| value. |
| 3. Add the corresponding i18n strings at |
| `//src/static/_locales/en/manifest.json`. |
| 4. If you want to handle the option outside of the options page, include an |
| empty case in both switches at `//src/optionsCommon.js`, so the option is not |
| handled there. |
| |
| ## Develop the feature |
| TODO(issue #32): Write this section. |