Другое

Руководство по CollectionControl и ColorPickerControl в Apache Superset

Освойте CollectionControl с ColorPickerControl в Apache Superset. Исправьте проблемы с сохранением цветов с помощью нашего полного руководства по реализации и рабочих примерах.

Как правильно реализовать CollectionControl с ColorPickerControl в плагинах графиков Apache Superset?

Я разрабатываю плагин графика для Apache Superset и мне нужно добавить список цветов для настройки графика. Я реализовал CollectionControl с ColorPickerControl как опцию конфигурации, но хотя коллекция отображается в пользовательском интерфейсе, выбранные значения цветов не сохраняются.

Вот моя конфигурация controlPanel.ts:

typescript
const config: ControlPanelConfig = {
  controlPanelSections: [
    // ... другие разделы ...
    {
      label: t('Chart Controls!'),
      expanded: true,
      controlSetRows: [
        // ... другие элементы управления ...
        [
          {
            name: 'from_color',
            config: {
              type: 'ColorPickerControl',
              label: t('From Color'),
              default: '#FFFFFF',
              renderTrigger: true,
              validators: [validateNonEmpty]
            },
          },
        ],
        [
          {
            name: 'to_color',
            config: {
              type: 'ColorPickerControl',
              label: t('To Color'),
              default: '#007700',
              renderTrigger: true,
              validators: [validateNonEmpty]
            },
          },
        ],
        [
          {
            name: 'MyCollection13',
            config: {
              controlName: 'ColorPickerControl',
              type: 'CollectionControl',
              label: t('Color ranges'),
              renderTrigger: true,
            }
          }
        ]
      ],
    },
  ],
};

Элемент ‘MyCollection13’ - это коллекция выбора цвета. Он корректно отображается в пользовательском интерфейсе, но выбор цвета не обновляет его значение. Эта функциональность не поддерживается, или существует правильный способ реализации CollectionControl с ColorPickerControl в Apache Superset?

Реализация CollectionControl с ColorPickerControl в Apache Superset

Реализация CollectionControl с ColorPickerControl в Apache Superset требует конкретной конфигурации и понимания того, как коллекции обрабатывают свою структуру данных. На основе результатов исследований, вот comprehensive руководство по правильной реализации этой функциональности.

Проблема, с которой вы сталкиваетесь, когда коллекция отображается правильно, но не сохраняет выбранные цвета, обычно связана с неправильной конфигурацией CollectionControl или отсутствием обработки значений. Давайте предоставим полное решение.

Содержание

Правильная конфигурация CollectionControl

На основе результатов исследований из репозитория GitHub Apache Superset и документации по плагинам, CollectionControl с ColorPickerControl требует определенных параметров конфигурации:

typescript
const config: ControlPanelConfig = {
  controlPanelSections: [
    {
      label: t('Элементы управления диаграммой!'),
      expanded: true,
      controlSetRows: [
        // Отдельные селекторы цветов (рабочий пример)
        [
          {
            name: 'from_color',
            config: {
              type: 'ColorPickerControl',
              label: t('Начальный цвет'),
              default: '#FFFFFF',
              renderTrigger: true,
              validators: [validateNonEmpty],
              description: t('Выберите начальный цвет для градиента')
            },
          },
        ],
        [
          {
            name: 'to_color',
            config: {
              type: 'ColorPickerControl',
              label: t('Конечный цвет'),
              default: '#007700',
              renderTrigger: true,
              validators: [validateNonEmpty],
              description: t('Выберите конечный цвет для градиента')
            },
          },
        ],
        // CollectionControl с ColorPickerControl (исправленный)
        [
          {
            name: 'color_ranges',
            config: {
              type: 'CollectionControl',
              controlName: 'ColorPickerControl',
              label: t('Диапазоны цветов'),
              description: t('Добавьте несколько диапазонов цветов для вашей диаграммы'),
              default: [
                { value: '#FF0000', label: 'Красный' },
                { value: '#00FF00', label: 'Зеленый' }
              ],
              validators: [validateCollection],
              renderTrigger: true,
              // Дополнительные свойства, специфичные для коллекции
              addLabel: t('Добавить диапазон цвета'),
              removable: true,
              duplicable: true,
              controlOverrides: {
                // Переопределения, специфичные для ColorPickerControl
                showColorPreview: true,
                allowCustomColors: true
              }
            }
          }
        ]
      ],
    },
  ],
};

Структура данных и обработка значений

Ключевое понимание из реализации Apache Superset заключается в том, что CollectionControl ожидает определенную структуру данных для своих значений. Как показано в документации Apache Superset, коллекции обычно обрабатывают массивы объектов с определенными свойствами.

Понимание формата данных

CollectionControl с ColorPickerControl работает лучше всего со следующей структурой данных:

typescript
interface ColorRange {
  value: string; // Hex-код цвета
  label?: string; // Опциональная метка для отображения
  id?: string; // Опциональный уникальный идентификатор
}

// Пример использования в компоненте вашей диаграммы
const colorRanges = props.controls.color_ranges.value as ColorRange[];

Обработка обновлений значений

Коллекция требует правильной обработки значений в вашем компоненте диаграммы:

typescript
// В методе рендеринга вашего компонента диаграммы
render() {
  const { controls } = this.props;
  
  // Доступ к значениям коллекции
  const colorRanges = controls.color_ranges.value || [];
  
  // Обработка цветов для вашей диаграммы
  const colors = colorRanges.map(range => range.value);
  
  // Использование цветов в логике визуализации
  return (
    <div>
      {colors.map((color, index) => (
        <div key={index} style={{ backgroundColor: color }}>
          Цвет: {color}
        </div>
      ))}
    </div>
  );
}

Полный рабочий пример

Вот полная реализация на основе результатов исследований из архитектуры плагинов Apache Superset:

typescript
// controlPanel.ts
import { t } from '@superset-ui/core';
import { ControlPanelConfig, validateNonEmpty, validateCollection } from '@superset-ui/chart-controls';

const config: ControlPanelConfig = {
  controlPanelSections: [
    {
      label: t('Элементы управления диаграммой!'),
      expanded: true,
      controlSetRows: [
        // CollectionControl с ColorPickerControl
        [
          {
            name: 'color_ranges',
            config: {
              type: 'CollectionControl',
              controlName: 'ColorPickerControl',
              label: t('Диапазоны цветов'),
              description: t('Добавьте несколько диапазонов цветов для визуализации вашей диаграммы'),
              default: [
                { value: '#FF6B6B', label: 'Основной' },
                { value: '#4ECDC4', label: 'Вторичный' },
                { value: '#45B7D1', label: 'Акцентный' }
              ],
              validators: [
                validateCollection,
                (value: any[]) => {
                  if (!Array.isArray(value) || value.length === 0) {
                    return t('Требуется как минимум один диапазон цветов');
                  }
                  return null;
                }
              ],
              renderTrigger: true,
              addLabel: t('Добавить диапазон цвета'),
              removable: true,
              duplicable: true,
              controlOverrides: {
                showColorPreview: true,
                allowCustomColors: true,
                colorPalette: 'superset', // Использовать палитру цветов по умолчанию Superset
              }
            }
          }
        ]
      ],
    },
  ],
};

export default config;

// В вашем компоненте диаграммы
class MyChartPlugin extends React.Component {
  render() {
    const { controls, width, height } = this.props;
    
    // Получение значений коллекции
    const colorRanges = controls.color_ranges.value || [];
    
    // Обработка цветов для вашей диаграммы
    const chartColors = colorRanges.map((range: any) => range.value);
    
    // Пример использования с ECharts (как упоминалось в исследованиях)
    const chartOptions = {
      // ... ваша конфигурация диаграммы
      series: [{
        data: [/* ваши данные */],
        itemStyle: {
          color: (params: any) => {
            // Использование диапазонов цветов на основе данных
            const index = params.dataIndex % chartColors.length;
            return chartColors[index];
          }
        }
      }]
    };
    
    return (
      <div style={{ width, height }}>
        {/* Ваш код рендеринга диаграммы */}
      </div>
    );
  }
}

export default MyChartPlugin;

Лучшие практики и рекомендации

На основе результатов исследований из ресурсов по разработке плагинов Apache Superset:

1. Правильные значения по умолчанию

Как показано в документации по плагинам Apache Superset, всегда предоставляйте осмысленные значения по умолчанию для коллекций:

typescript
default: [
  { value: '#FF0000', label: 'Красный' },
  { value: '#00FF00', label: 'Зеленый' }
]

2. Валидация и обработка ошибок

Реализуйте правильную валидацию, как упоминалось в обсуждениях Apache Superset:

typescript
validators: [
  validateCollection,
  (value: any[]) => {
    if (!Array.isArray(value)) {
      return t('Диапазоны цветов должны быть массивом');
    }
    if (value.some(item => !item.value || !/^#[0-9A-F]{6}$/i.test(item.value))) {
      return t('Все диапазоны цветов должны иметь допустимые шестнадцатеричные значения цвета');
    }
    return null;
  }
]

3. Доступность и UX

Учитывайте функции доступности и улучшения пользовательского опыта:

typescript
controlOverrides: {
  showColorPreview: true,
  allowCustomColors: true,
  colorPalette: 'superset',
  showLabels: true,
  searchable: true
}

Устранение распространенных проблем

Проблема 1: Значения не сохраняются

Проблема: CollectionControl отображается, но не сохраняет выбранные цвета.

Решение: Убедитесь, что ваш CollectionControl имеет правильные значения по умолчанию и валидаторы:

typescript
// Проверьте, содержит ли ваш элемент управления этими обязательными свойствами
config: {
  type: 'CollectionControl',
  controlName: 'ColorPickerControl',
  label: t('Диапазоны цветов'),
  default: [], // Должно быть значение по умолчанию
  validators: [], // Должны быть валидаторы
  renderTrigger: true
}

Проблема 2: Неправильная структура данных

Проблема: Цвета недоступны в вашем компоненте диаграммы.

Решение: Правильно получайте доступ к значениям коллекции:

typescript
// Правильный способ доступа к значениям коллекции
const colorRanges = props.controls.color_ranges.value || [];

// Каждый элемент в коллекции имеет следующую структуру:
// { value: '#FF0000', label: 'Красный', id: 'уникальный-id' }

Проблема 3: UI не обновляется

Проблема: Интерфейс не отражает изменения цветов.

Решение: Добавьте правильные триггеры рендеринга и обеспечьте управление состоянием React:

typescript
// Добавьте renderTrigger для принудительного обновления UI
renderTrigger: true,

// В вашем компоненте используйте useEffect для обработки изменений
useEffect(() => {
  if (controls.color_ranges.changed) {
    // Обработка изменения
  }
}, [controls.color_ranges]);

Дополнительные ресурсы

Для дальнейшего обучения обратитесь к этим авторитетным источникам:

  1. Apache Superset GitHub - Реализация CollectionControl
  2. Apache Superset GitHub - Функции ColorPickerControl
  3. Руководство по разработке плагинов Apache Superset
  4. Документация по компонентам UI Apache Superset

Ключом к успешной реализации является понимание того, что CollectionControl работает как контейнер для нескольких экземпляров указанного типа элемента управления (ColorPickerControl в вашем случае), и каждый экземпляр поддерживает свою собственную структуру значений внутри массива коллекции.

Источники

  1. Apache Superset GitHub - Тестовая реализация CollectionControl
  2. Apache Superset GitHub - Pull Request ColorPickerControl
  3. Руководство по разработке плагинов Apache Superset
  4. Архитектура плагинов UI Apache Superset
  5. Обсуждение Apache Superset - Реализация селектора цветов
  6. Официальная документация Apache Superset
  7. Stack Overflow - Разработка пользовательских диаграмм в Apache Superset

Заключение

Реализация CollectionControl с ColorPickerControl в Apache Superset требует внимания к нескольким ключевым аспектам:

  • Правильная конфигурация: Убедитесь, что ваш CollectionControl имеет все необходимые свойства, включая default, validators и renderTrigger
  • Структура данных: Понимайте, что коллекции поддерживают массивы объектов с определенными свойствами (value, label, id)
  • Обработка значений: Правильно получайте доступ к значениям коллекции в вашем компоненте диаграммы
  • Валидация: Реализуйте правильную валидацию для обеспечения целостности данных
  • Обработка ошибок: Обрабатывайте крайние случаи и предоставляйте осмысленные сообщения об ошибках

Следуя этим рекомендациям и используя результаты исследований из официальных реализаций Apache Superset, вы можете создавать надежные плагины диаграмм с возможностью выбора нескольких цветов, которые правильно сохраняют и сохраняют выбор пользователя.

Авторы
Проверено модерацией
Модерация