modules/ui/rapid_poweruser_features_dialog.js (138 lines of code) (raw):

import { select as d3_select } from 'd3-selection'; import { t } from '../core/localizer'; import { prefs } from '../core/preferences'; import { modeBrowse } from '../modes'; import { uiModal } from './modal'; export function uiRapidPowerUserFeaturesDialog(context) { const featureFlags = [ 'previewDatasets', 'tagnosticRoadCombine', 'tagSources', 'showAutoFix', 'allowLargeEdits' ]; const rapidContext = context.rapidContext(); const showPowerUser = rapidContext.showPowerUser; let _modalSelection = d3_select(null); let _content = d3_select(null); // if we are not currently showing poweruser features, move all the feature flags to a different keyspace if (!showPowerUser) { featureFlags.forEach(featureFlag => { const val = prefs(`rapid-internal-feature.${featureFlag}`); if (val) { prefs(`rapid-internal-feature.was.${featureFlag}`, val); prefs(`rapid-internal-feature.${featureFlag}`, null); } }); } else { featureFlags.forEach(featureFlag => { const val = prefs(`rapid-internal-feature.was.${featureFlag}`); if (val) { prefs(`rapid-internal-feature.${featureFlag}`, val); prefs(`rapid-internal-feature.was.${featureFlag}`, null); } }); } function isEnabled(featureFlag) { return prefs(`rapid-internal-feature.${featureFlag}`) === 'true'; } function toggleFeature(_, featureFlag) { let enabled = prefs(`rapid-internal-feature.${featureFlag}`) === 'true'; enabled = !enabled; prefs(`rapid-internal-feature.${featureFlag}`, enabled); // custom on-toggle behaviors can go here if (featureFlag === 'previewDatasets' && !enabled) { // user unchecked previewDatasets feature const datasets = rapidContext.datasets(); Object.values(datasets).forEach(ds => { if (ds.beta) { ds.added = false; ds.enabled = false; } }); context.enter(modeBrowse(context)); // return to browse mode (in case something was selected) context.map().pan([0,0]); // trigger a map redraw } } return (selection) => { _modalSelection = uiModal(selection); _modalSelection.select('.modal') .attr('class', 'modal rapid-modal'); // RapiD styling _content = _modalSelection.select('.content') .append('div') .attr('class', 'rapid-stack poweruser'); _content .call(renderModalContent); _content.selectAll('.ok-button') .node() .focus(); }; function renderModalContent(selection) { /* Header */ let headerEnter = selection.selectAll('.modal-section-heading') .data([0]) .enter() .append('div') .attr('class', 'modal-section-heading'); headerEnter .append('h3') .attr('class', 'modal-heading') .html(t('rapid_poweruser_features.heading.label')); headerEnter .append('div') .attr('class', 'modal-heading-desc') .text(t('rapid_poweruser_features.heading.description')) .append('span') .attr('class', 'smile') .text('😎'); /* Features */ let features = selection.selectAll('.rapid-features-container') .data([0]); let featuresEnter = features.enter() .append('div') .attr('class', 'rapid-features-container'); features .merge(featuresEnter) .call(renderFeatures); /* OK Button */ let buttonsEnter = selection.selectAll('.modal-section.buttons') .data([0]) .enter() .append('div') .attr('class', 'modal-section buttons'); buttonsEnter .append('button') .attr('class', 'button ok-button action') .on('click', () => _modalSelection.remove()) .text(t('confirm.okay')); } function renderFeatures(selection) { let rows = selection.selectAll('.rapid-checkbox-feature') .data(featureFlags, d => d); // enter let rowsEnter = rows.enter() .append('div') .attr('class', 'modal-section rapid-checkbox rapid-checkbox-feature'); rowsEnter .append('div') .attr('class', 'rapid-feature') .each((d, i, nodes) => { let selection = d3_select(nodes[i]); // line1: Label selection .append('div') .attr('class', 'rapid-feature-label') .text(d => t(`rapid_poweruser_features.${d}.label`)); // line2: description selection .append('div') .attr('class', 'rapid-feature-description') .text(d => t(`rapid_poweruser_features.${d}.description`)); }); let inputsEnter = rowsEnter .append('div') .attr('class', 'rapid-checkbox-inputs'); let checkboxEnter = inputsEnter .append('label') .attr('class', 'rapid-checkbox-label'); checkboxEnter .append('input') .attr('type', 'checkbox') .attr('class', 'rapid-feature-checkbox') .on('click', toggleFeature); checkboxEnter .append('div') .attr('class', 'rapid-checkbox-custom'); // update rows = rows .merge(rowsEnter); rows.selectAll('.rapid-feature-checkbox') .property('checked', isEnabled); } }