You are here

public function LinkIconFormatterTrait::settingsForm in Link Icon 8

File

src/Plugin/Field/FieldFormatter/LinkIconFormatterTrait.php, line 41

Class

LinkIconFormatterTrait
A Trait to decluter the main formatter class for readability.

Namespace

Drupal\linkicon\Plugin\Field\FieldFormatter

Code

public function settingsForm(array $form, FormStateInterface $form_state) {
  $elements = parent::settingsForm($form, $form_state);
  $settings = $this
    ->getSettings();

  // Predefined titles are supposed to be controlled.
  if (isset($elements['trim_length'])) {
    unset($elements['trim_length']);
  }
  $elements['opening'] = [
    '#type' => 'item',
    '#markup' => '<h3>' . $this
      ->t('If your theme has no icon font library, define one <a href=":url" target="_blank">here</a>.', [
      ':url' => Url::fromRoute('linkicon.settings')
        ->toString(),
    ]) . '</h3>',
  ];
  $elements['linkicon_prefix'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Icon prefix class'),
    '#required' => TRUE,
    '#description' => $this
      ->t('A "prefix" or "namespace", e.g.: icon (Fontello), fa (FontAwesome), st-icon (Stackicons), genericon, fonticon, etc. <br />If the link title is <em>Facebook</em>, it will create classes: <em>icon icon-facebook</em> for Fontello, or <em>fa fa-facebook</em> for FontAwesome > 3. <br />The individual icon class itself is based on the link text key matching the pattern: icon-KEY, or fa-KEY.'),
  ];
  $elements['linkicon_wrapper_class'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Additional wrapper class'),
    '#description' => $this
      ->t('Additional wrapper class for the entire icon list apart from <strong>item-list item-list--linkicon</strong> separated by spaces.'),
  ];
  $elements['linkicon_icon_class'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Additional icon classes'),
    '#description' => $this
      ->t('Additional icon class for the actual icon apart from <strong>linkicon__icon icon</strong> separated by spaces, e.g: fab fas far.'),
  ];
  $elements['linkicon_link'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Add the classes to the A tag.'),
    '#description' => $this
      ->t('By default linkicon adds additional SPAN tag to hold the icon, enable this to add the classes to the A tag instead. This is all about DIY.'),
    '#states' => [
      'visible' => [
        ':input[name*="linkicon_load"]' => [
          'checked' => FALSE,
        ],
      ],
    ],
  ];
  $elements['linkicon_load'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Allow linkicon to provide CSS assets'),
    '#description' => $this
      ->t('Otherwise, DIY accordingly.'),
    '#states' => [
      'visible' => [
        ':input[name*="linkicon_link"]' => [
          'checked' => FALSE,
        ],
      ],
    ],
  ];
  $elements['linkicon_vertical'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Vertical'),
    '#description' => $this
      ->t('By default, icons are displayed inline. Check to make icons stacked vertically.'),
    '#states' => [
      'visible' => [
        ':input[name*="linkicon_load"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  $elements['linkicon_style'] = [
    '#type' => 'select',
    '#title' => $this
      ->t('Icon style'),
    '#options' => [
      'round' => $this
        ->t('Round'),
      'round-2' => $this
        ->t('Round 2'),
      'round-5' => $this
        ->t('Round 5'),
      'round-8' => $this
        ->t('Round 8'),
      'round-10' => $this
        ->t('Round 10'),
      'square' => $this
        ->t('Square'),
      'button' => $this
        ->t('Button'),
    ],
    '#empty_option' => $this
      ->t('- None -'),
    '#states' => [
      'visible' => [
        ':input[name*="linkicon_load"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
    '#description' => $this
      ->t('Button is more prominent if the title text is not hidden over the background color.'),
  ];
  $elements['linkicon_color'] = [
    '#type' => 'select',
    '#title' => $this
      ->t('Icon background color'),
    '#options' => [
      'grey' => $this
        ->t('Grey'),
      'dark' => $this
        ->t('Dark'),
      'purple' => $this
        ->t('Purple'),
      'orange' => $this
        ->t('Orange'),
      'blue' => $this
        ->t('Blue'),
      'lime' => $this
        ->t('Lime'),
      'red' => $this
        ->t('Red'),
    ],
    '#empty_option' => $this
      ->t('- None -'),
    '#states' => [
      'visible' => [
        ':input[name*="linkicon_load"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
    '#description' => $this
      ->t('Basic background color. You should do proper theming to suit your design better, and disable all this.'),
  ];
  $elements['linkicon_tooltip'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Display title as tooltip'),
    '#states' => [
      'visible' => [
        ':input[name*="linkicon_load"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  $elements['linkicon_no_text'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Visually hide the title text'),
    '#states' => [
      'visible' => [
        ':input[name*="linkicon_load"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  $elements['linkicon_maxlength'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('The title and tooltip maxlength'),
    '#description' => $this
      ->t('Limit the amount of characters if using token replacement for the title and tootip as defined at the widget settings, default to 60 characters.'),
    '#size' => 6,
    '#maxlength' => 3,
  ];
  $elements['linkicon_global_title'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Override title with a generic link title'),
    '#description' => $this
      ->t('If provided, the link title will be overriden with this text, e.g.: Visit the site, View Demo. Token is supported.'),
    '#states' => [
      'visible' => [
        [
          ':input[name*="linkicon_tooltip"]' => [
            'checked' => FALSE,
          ],
        ],
        [
          ':input[name*="linkicon_no_text"]' => [
            'checked' => FALSE,
          ],
        ],
      ],
    ],
  ];
  $elements['linkicon_position'] = [
    '#type' => 'select',
    '#title' => $this
      ->t('Icon position to the title text.'),
    '#description' => $this
      ->t('By default icon is before the text - Left.'),
    '#options' => [
      'bottom' => $this
        ->t('Bottom'),
      'right' => $this
        ->t('Right'),
      'top' => $this
        ->t('Top'),
    ],
    '#empty_option' => $this
      ->t('Left'),
    '#states' => [
      'visible' => [
        [
          ':input[name*="linkicon_load"]' => [
            'checked' => TRUE,
          ],
        ],
        [
          ':input[name*="linkicon_no_text"]' => [
            'checked' => FALSE,
          ],
        ],
        [
          ':input[name*="linkicon_link"]' => [
            'checked' => FALSE,
          ],
        ],
      ],
    ],
  ];
  $icon_sizes = [
    'small' => $this
      ->t('Small'),
    'medium' => $this
      ->t('Medium'),
    'large' => $this
      ->t('Large'),
    'xlarge' => $this
      ->t('X-large'),
    'xxlarge' => $this
      ->t('Xx-large'),
  ];
  $elements['linkicon_size'] = [
    '#type' => 'select',
    '#title' => $this
      ->t('Icon font size'),
    '#options' => $icon_sizes,
    '#empty_option' => $this
      ->t('Default'),
    '#states' => [
      'visible' => [
        ':input[name*="linkicon_load"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];

  // Build a preview.
  if (function_exists('icon_providers')) {
    $providers = icon_providers();
    $provider_options = [];
    foreach ($providers as $provider) {
      $provider_options[$provider['name']] = $provider['title'];
    }
    if ($provider_options) {
      $elements['linkicon_bundle'] = [
        '#type' => 'select',
        '#title' => $this
          ->t('Icon module integration'),
        '#options' => $provider_options,
        '#empty_option' => $this
          ->t('- None -'),
        '#description' => $this
          ->t('The above icon providers modules are detected. You can choose which icon CSS file to load with this module. <br>Make sure that you have a working module that loads relevant CSS accordingly. <br>Known working modules as of this writing: fontawesome, and icomoon.'),
        '#states' => [
          'visible' => [
            ':input[name*="linkicon_link"]' => [
              'checked' => FALSE,
            ],
          ],
        ],
      ];
    }
  }

  // Provides default values.
  foreach ($elements as $key => &$element) {
    if (in_array($key, [
      'opening',
      'linkicon_size_preview',
    ])) {
      continue;
    }
    $default = isset(self::defaultSettings()[$key]) ? self::defaultSettings()[$key] : '';
    $element['#default_value'] = isset($settings[$key]) ? $settings[$key] : $default;
  }

  // Previews.
  $field_settings = $this
    ->getFieldSettings();
  $has_icon_path = $this->linkIconManager
    ->getSetting('font');
  $config = $this->linkIconManager
    ->simplifySettings($settings);
  $icon_previews = [];
  $linkicon_item = [
    '#theme' => 'linkicon_item',
    '#title' => 'Twitter',
    '#icon_name' => 'twitter',
    '#settings' => $config,
  ];
  if (!empty($field_settings['title_predefined'])) {
    $values = $this->linkIconManager
      ->extractAllowedValues($field_settings['title_predefined']);
    if (!isset($values['twitter'])) {
      $linkicon_item['#icon_name'] = key($values);
      $linkicon_item['#title'] = current($values);
    }
  }
  $icon = $this->renderer
    ->render($linkicon_item);
  $tooltip = '';
  if ($config['tooltip']) {
    $tooltip = ' data-title="Twitter"';
  }
  foreach ($icon_sizes as $key => $size) {
    $is_active = $key == $config['size'] ? ' active' : '';
    $icon_previews[] = [
      '#markup' => '<a class="linkicon__item linkicon--' . $key . $is_active . '" href="#"' . $tooltip . '>' . $icon . '</a>',
    ];
  }
  $config['_preview'] = TRUE;
  if ($config['load']) {
    if ($has_icon_path) {
      $elements['#attached']['library'][] = 'linkicon/linkicon.font';
    }
    $elements['#attached']['library'][] = 'linkicon/linkicon';
  }
  $elements['linkicon_size_preview'] = [
    '#theme' => 'linkicon',
    '#linkicon_id' => 'linkicon-preview',
    '#items' => $icon_previews,
    '#config' => $config,
    '#states' => [
      'visible' => [
        ':input[name*="linkicon_link"]' => [
          'checked' => FALSE,
        ],
      ],
    ],
  ];
  return $elements;
}