..  include:: /Includes.rst.txt


..  _for-editors-service-advanced:

========
Advanced
========

..  figure:: /Images/Service-Advanced.png
    :class: with-shadow
    :alt: Advanced tab of a Klaro service record with JavaScript callback fields

    Service Configuration - Advanced Tab

..  contents::
   :local:

Advanced Settings
==================

Callback
--------

..  confval:: callback
    :name: service-callback

    :type: string
    :Default: ''

    You can define an optional callback function that will be called each time
    the consent state for the given service changes. The consent value is passed
    as the first parameter (`true` means consented). The `service` config is
    passed as the second parameter. The content of this field is wrapped with
    `callback: function(consent, service) { }`. `consent` is a boolean that
    reflects the current state. `service` holds all information about the
    selected service.

`onAccept` callback function
----------------------------

..  confval:: on_accept

    :type: string
    :Default: ''

    JavaScript code that is called each time the service is accepted. The
    content of this field is wrapped with
    `callback: function(handlerOpts) { }`. The object `handlerOpts` contains
    `config` (the current Klaro configuration), `service` (the current service),
    and `vars` when values were defined in the `vars` field.

    ..  code-block:: javascript
        :linenos:
        :caption: **Example: Google Tag Manager**

        // we notify the tag manager about all services that were accepted. You can define
        // a custom event in GTM to load the service if consent was given.
        for(let k of Object.keys(handlerOpts.consents)){
            if (handlerOpts.consents[k]){
                let eventName = 'klaro-'+k+'-accepted'
                dataLayer.push({'event': eventName})
            }
        }

    ..  code-block:: javascript
        :linenos:
        :caption: **Example: Google Analytics**

        // we grant analytics storage
        gtag('consent', 'update', {
            'analytics_storage': 'granted',
        })

    ..  code-block:: javascript
        :linenos:
        :caption: **Example: Google Ads**

        // we grant ad storage and personalization
        gtag('consent', 'update', {
            'ad_storage': 'granted',
            'ad_user_data': 'granted',
            'ad_personalization': 'granted'
        })

`onInit` callback function
--------------------------

..  confval:: on_init

    :type: string
    :Default: ''

    JavaScript code that is called once per page load. The content of this
    field is wrapped with `callback: function(handlerOpts) { }`. The object
    `handlerOpts` contains `config` (the current Klaro configuration), `service`
    (the current service), and `vars` when values were defined in the `vars`
    field.

    ..  code-block:: javascript
        :linenos:
        :caption: **Example: Google Tag Manager**

        // initialization code here (will be executed only once per page-load)
        window.dataLayer = window.dataLayer || [];
        window.gtag = function(){dataLayer.push(arguments)}
        gtag('consent', 'default', {'ad_storage': 'denied', 'analytics_storage': 'denied', 'ad_user_data': 'denied', 'ad_personalization': 'denied'})
        gtag('set', 'ads_data_redaction', true)

`onDecline` callback function
-----------------------------

..  confval:: on_decline

    :type: string
    :Default: ''

    JavaScript code that is called each time the service is declined. The
    content of this field is wrapped with
    `callback: function(handlerOpts) { }`. The object `handlerOpts` contains
    `config` (the current Klaro configuration), `service` (the current service),
    and `vars` when values were defined in the `vars` field.

    ..  code-block:: javascript
        :linenos:
        :caption: **Example: Google Analytics**

        // we deny analytics storage
        gtag('consent', 'update', {
            'analytics_storage': 'denied',
        })

    ..  code-block:: javascript
        :linenos:
        :caption: **Example: Google Ads**

        // we decline ad storage and personalization
        gtag('consent', 'update', {
            'ad_storage': 'denied',
            'ad_user_data': 'denied',
            'ad_personalization': 'denied'
        })

Variables
---------

..  confval:: vars

    :type: string
    :Default: ''

    Variables that can be used in callback functions. The content of this field
    is enclosed in curly brackets and must be valid JavaScript object notation.

..  warning::

    Callback and variable fields are emitted to the frontend configuration.
    Enter only trusted JavaScript and validate syntax before deploying changes.
