diff --git a/css/80_app.css b/css/80_app.css index a8f7a63e9..72ba5f369 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -440,19 +440,6 @@ button[disabled].action:hover { color: #333; } -.notification-badge { - display: block; - position: absolute; - width: 10px; - height: 10px; - right: 7px; - top: 9px; -} - -.notification-badge.hide { - display: none; -} - /* Toolbar / Persistent UI Elements ------------------------------------------------------- */ @@ -556,7 +543,7 @@ button.save .count { text-align: center; } -.help-wrap svg.icon.pre-text.add-note, +.help-pane svg.icon.pre-text.add-note, button.add-note svg.icon { height: 15px; width: 15px; @@ -573,7 +560,7 @@ button.add-note svg.icon { margin-left: 4px; margin-right: unset; } -.help-wrap svg.icon.pre-text.add-note { +.help-pane svg.icon.pre-text.add-note { margin-left: 3px; margin-right: 3px; } @@ -3185,10 +3172,6 @@ button.autofix.action.active { /*fill: #597be7;*/ } -.notification-badge.warning { - color: #ffdf5c; -} - /* error styles */ .errors-list, @@ -3232,10 +3215,6 @@ button.autofix.action.active { /*fill: #597be7;*/ } -.notification-badge.error { - color: #ff0c05; -} - /* Issues Pane */ .issues-options-container { @@ -3584,7 +3563,7 @@ li.issue-fix-item:not(.actionable) .fix-icon { z-index: 10; } -.map-pane.help-wrap { +.map-pane.help-pane { width: 600px; } @@ -3624,12 +3603,12 @@ li.issue-fix-item:not(.actionable) .fix-icon { /* Help ------------------------------------------------------- */ -.help-wrap p { +.help-pane p { font-size: 15px; margin-bottom: 20px; } -.help-wrap .left-content .body p code { +.help-pane .left-content .body p code { padding: 3px 4px; font-size: 12px; color: #555; @@ -3642,14 +3621,14 @@ li.issue-fix-item:not(.actionable) .fix-icon { box-shadow: inset 0 -1px 0 #bbb; } -.help-wrap .left-content .icon.pre-text { +.help-pane .left-content .icon.pre-text { vertical-align: text-top; margin-right: 0; margin-left: 0; display: inline-block; } -.help-wrap .toc { +.help-pane .toc { width: 40%; float: right; margin-left: 20px; @@ -3657,68 +3636,68 @@ li.issue-fix-item:not(.actionable) .fix-icon { padding-left: 5px; } -.help-wrap .toc li a, -.help-wrap .nav a { +.help-pane .toc li a, +.help-pane .nav a { display: block; border: 1px solid #ccc; padding: 5px 10px; } -.help-wrap .toc li a { +.help-pane .toc li a { border-bottom: 0; } -.help-wrap .toc li a:hover, -.help-wrap .nav a:hover { +.help-pane .toc li a:hover, +.help-pane .nav a:hover { background: #ececec; } -.help-wrap .toc li a.selected { +.help-pane .toc li a.selected { background: #e8ebff; } -.help-wrap .toc li:first-child a { +.help-pane .toc li:first-child a { border-radius: 4px 4px 0 0; } -.help-wrap .toc li:nth-last-child(3) a { +.help-pane .toc li:nth-last-child(3) a { border-bottom: 1px solid #ccc; border-radius: 0 0 4px 4px } -.help-wrap .toc li.shortcuts a, -.help-wrap .toc li.walkthrough a { +.help-pane .toc li.shortcuts a, +.help-pane .toc li.walkthrough a { overflow: hidden; margin-top: 10px; border-bottom: 1px solid #ccc; border-radius: 4px; } -.help-wrap .toc li.walkthrough a { +.help-pane .toc li.walkthrough a { text-align: center; } -.help-wrap .nav { +.help-pane .nav { position: relative; padding-bottom: 30px; } -.help-wrap .nav a { +.help-pane .nav a { float: left; width: 50%; text-align: center; } -.help-wrap .nav a:first-child { +.help-pane .nav a:first-child { border-radius: 4px 0 0 4px; } -.help-wrap .nav a:last-child:not(:only-child) { +.help-pane .nav a:last-child:not(:only-child) { border-radius: 0 4px 4px 0; border-left: 0; } -.help-wrap .nav a:only-child { +.help-pane .nav a:only-child { width: 100%; border-radius: 4px; } diff --git a/modules/ui/index.js b/modules/ui/index.js index 2c973f43d..e663bed92 100644 --- a/modules/ui/index.js +++ b/modules/ui/index.js @@ -1,7 +1,6 @@ export { uiInit } from './init'; export { uiAccount } from './account'; export { uiAttribution } from './attribution'; -export { uiBackground } from './background'; export { uiBackgroundDisplayOptions } from './background_display_options'; export { uiBackgroundOffset } from './background_offset'; export { uiChangesetEditor } from './changeset_editor'; @@ -27,7 +26,6 @@ export { uiFlash } from './flash'; export { uiFormFields } from './form_fields'; export { uiFullScreen } from './full_screen'; export { uiGeolocate } from './geolocate'; -export { uiHelp } from './help'; export { uiImproveOsmComments } from './improveOSM_comments'; export { uiImproveOsmDetails } from './improveOSM_details'; export { uiImproveOsmEditor } from './improveOSM_editor'; @@ -40,7 +38,6 @@ export { uiKeepRightEditor } from './keepRight_editor'; export { uiKeepRightHeader } from './keepRight_header'; export { uiLasso } from './lasso'; export { uiLoading } from './loading'; -export { uiMapData } from './map_data'; export { uiMapInMap } from './map_in_map'; export { uiModal } from './modal'; export { uiNotice } from './notice'; @@ -48,7 +45,6 @@ export { uiNoteComments } from './note_comments'; export { uiNoteEditor } from './note_editor'; export { uiNoteHeader } from './note_header'; export { uiNoteReport } from './note_report'; -export { uiPreferences } from './preferences'; export { uiPresetEditor } from './preset_editor'; export { uiPresetIcon } from './preset_icon'; export { uiPresetList } from './preset_list'; diff --git a/modules/ui/init.js b/modules/ui/init.js index 3aa7dd7c8..b893cbf60 100644 --- a/modules/ui/init.js +++ b/modules/ui/init.js @@ -14,22 +14,17 @@ import { utilGetDimensions } from '../util/dimensions'; import { uiAccount } from './account'; import { uiAttribution } from './attribution'; -import { uiBackground } from './background'; import { uiContributors } from './contributors'; import { uiFeatureInfo } from './feature_info'; import { uiFullScreen } from './full_screen'; import { uiGeolocate } from './geolocate'; -import { uiHelp } from './help'; import { uiInfo } from './info'; import { uiIntro } from './intro'; -import { uiIssues } from './issues'; import { uiIssuesInfo } from './issues_info'; import { uiLoading } from './loading'; -import { uiMapData } from './map_data'; import { uiMapInMap } from './map_in_map'; import { uiNotice } from './notice'; import { uiPhotoviewer } from './photoviewer'; -import { uiPreferences } from './preferences'; import { uiRestore } from './restore'; import { uiScale } from './scale'; import { uiShortcuts } from './shortcuts'; @@ -42,6 +37,11 @@ import { uiVersion } from './version'; import { uiZoom } from './zoom'; import { uiCmd } from './cmd'; +import { uiBackground } from './panes/background'; +import { uiHelp } from './panes/help'; +import { uiIssues } from './panes/issues'; +import { uiMapData } from './panes/map_data'; +import { uiPreferences } from './panes/preferences'; export function uiInit(context) { var _initCounter = 0; @@ -106,35 +106,20 @@ export function uiInit(context) { .attr('class', 'map-control geolocate-control') .call(uiGeolocate(context)); - var background = uiBackground(context); - controls - .append('div') - .attr('class', 'map-control background-control') - .call(background.renderToggleButton); + var uiPanes = [ + uiBackground(context), + uiMapData(context), + uiIssues(context), + uiPreferences(context), + uiHelp(context) + ]; - var mapData = uiMapData(context); - controls - .append('div') - .attr('class', 'map-control map-data-control') - .call(mapData.renderToggleButton); - - var issues = uiIssues(context); - controls - .append('div') - .attr('class', 'map-control map-issues-control') - .call(issues.renderToggleButton); - - var preferences = uiPreferences(context); - controls - .append('div') - .attr('class', 'map-control preferences-control') - .call(preferences.renderToggleButton); - - var help = uiHelp(context); - controls - .append('div') - .attr('class', 'map-control help-control') - .call(help.renderToggleButton); + uiPanes.forEach(function(pane) { + controls + .append('div') + .attr('class', 'map-control ' + pane.id + '-control') + .call(pane.renderToggleButton); + }); content .append('div') @@ -252,12 +237,10 @@ export function uiInit(context) { .append('div') .attr('class', 'map-panes'); - panes - .call(background.renderPane) - .call(mapData.renderPane) - .call(issues.renderPane) - .call(preferences.renderPane) - .call(help.renderPane); + uiPanes.forEach(function(pane) { + panes + .call(pane.renderPane); + }); ui.info = uiInfo(context); diff --git a/modules/ui/pane.js b/modules/ui/pane.js new file mode 100644 index 000000000..1d221ba59 --- /dev/null +++ b/modules/ui/pane.js @@ -0,0 +1,118 @@ +import { + event as d3_event, + select as d3_select +} from 'd3-selection'; + +import { svgIcon } from '../svg/icon'; +import { textDirection } from '../util/locale'; +import { tooltip } from '../util/tooltip'; +import { uiTooltipHtml } from './tooltipHtml'; + + +export function uiPane(id, context) { + + var _key; + var _title = ''; + var _description = ''; + var _iconName = ''; + + var _paneSelection = d3_select(null); + + var _paneTooltip; + + var pane = { + id: id + }; + + pane.title = function(val) { + if (!arguments.length) return _title; + _title = val; + return pane; + }; + + pane.key = function(val) { + if (!arguments.length) return _key; + _key = val; + return pane; + }; + + pane.description = function(val) { + if (!arguments.length) return _description; + _description = val; + return pane; + }; + + pane.iconName = function(val) { + if (!arguments.length) return _iconName; + _iconName = val; + return pane; + }; + + pane.selection = function() { + return _paneSelection; + }; + + function hidePane() { + context.ui().togglePanes(); + } + + pane.togglePane = function() { + if (d3_event) d3_event.preventDefault(); + _paneTooltip.hide(); + context.ui().togglePanes(!_paneSelection.classed('shown') ? _paneSelection : undefined); + }; + + pane.renderToggleButton = function(selection) { + + if (!_paneTooltip) { + _paneTooltip = tooltip() + .placement((textDirection === 'rtl') ? 'right' : 'left') + .html(true) + .title(uiTooltipHtml(_description, _key)); + } + + selection + .append('button') + .on('click', pane.togglePane) + .call(svgIcon('#' + _iconName, 'light')) + .call(_paneTooltip); + }; + + pane.renderContent = function() { + // override + }; + + pane.renderPane = function(selection) { + + _paneSelection = selection + .append('div') + .attr('class', 'fillL map-pane hide ' + id + '-pane') + .attr('pane', id); + + var heading = _paneSelection + .append('div') + .attr('class', 'pane-heading'); + + heading + .append('h2') + .text(_title); + + heading + .append('button') + .on('click', hidePane) + .call(svgIcon('#iD-icon-close')); + + + _paneSelection + .append('div') + .attr('class', 'pane-content') + .call(pane.renderContent); + + if (_key) { + context.keybinding() + .on(_key, pane.togglePane); + } + }; + + return pane; +} diff --git a/modules/ui/background.js b/modules/ui/panes/background.js similarity index 82% rename from modules/ui/background.js rename to modules/ui/panes/background.js index 29003ecb3..90c9f8f36 100644 --- a/modules/ui/background.js +++ b/modules/ui/panes/background.js @@ -3,22 +3,22 @@ import _debounce from 'lodash-es/debounce'; import { descending as d3_descending, ascending as d3_ascending } from 'd3-array'; import { event as d3_event, select as d3_select } from 'd3-selection'; -import { t, textDirection } from '../util/locale'; -import { svgIcon } from '../svg/icon'; -import { uiBackgroundDisplayOptions } from './background_display_options'; -import { uiBackgroundOffset } from './background_offset'; -import { uiCmd } from './cmd'; -import { uiDisclosure } from './disclosure'; -import { uiMapInMap } from './map_in_map'; -import { uiSettingsCustomBackground } from './settings/custom_background'; -import { uiTooltipHtml } from './tooltipHtml'; -import { tooltip } from '../util/tooltip'; +import { t, textDirection } from '../../util/locale'; +import { tooltip } from '../../util/tooltip'; +import { svgIcon } from '../../svg/icon'; +import { uiBackgroundDisplayOptions } from '../background_display_options'; +import { uiBackgroundOffset } from '../background_offset'; +import { uiCmd } from '../cmd'; +import { uiDisclosure } from '../disclosure'; +import { uiMapInMap } from '../map_in_map'; +import { uiSettingsCustomBackground } from '../settings/custom_background'; +import { uiTooltipHtml } from '../tooltipHtml'; +import { uiPane } from '../pane'; export function uiBackground(context) { - var key = t('background.key'); - var _pane = d3_select(null); + var _key = t('background.key'); var _customSource = context.background().findSource('custom'); var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle')); @@ -51,7 +51,7 @@ export function uiBackground(context) { .html(true) .title(function() { var tip = '
' + t('background.switch') + '
'; - return uiTooltipHtml(tip, uiCmd('⌘' + key)); + return uiTooltipHtml(tip, uiCmd('⌘' + _key)); }) ); } else if (description || isOverflowing) { @@ -292,11 +292,11 @@ export function uiBackground(context) { function update() { - if (!_pane.select('.disclosure-wrap-background_list').classed('hide')) { + if (!backgroundPane.selection().select('.disclosure-wrap-background_list').classed('hide')) { updateBackgroundList(); } - if (!_pane.select('.disclosure-wrap-overlay_list').classed('hide')) { + if (!backgroundPane.selection().select('.disclosure-wrap-overlay_list').classed('hide')) { updateOverlayList(); } @@ -318,55 +318,14 @@ export function uiBackground(context) { } } - var paneTooltip = tooltip() - .placement((textDirection === 'rtl') ? 'right' : 'left') - .html(true) - .title(uiTooltipHtml(t('background.description'), key)); - uiBackground.togglePane = function() { - if (d3_event) d3_event.preventDefault(); - paneTooltip.hide(); - context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined); - }; + var backgroundPane = uiPane('background', context) + .key(_key) + .title(t('background.title')) + .description(t('background.description')) + .iconName('iD-icon-layers'); - function hidePane() { - context.ui().togglePanes(); - } - - uiBackground.renderToggleButton = function(selection) { - - selection - .append('button') - .on('click', uiBackground.togglePane) - .call(svgIcon('#iD-icon-layers', 'light')) - .call(paneTooltip); - }; - - uiBackground.renderPane = function(selection) { - - _pane = selection - .append('div') - .attr('class', 'fillL map-pane background-pane hide') - .attr('pane', 'background'); - - - var heading = _pane - .append('div') - .attr('class', 'pane-heading'); - - heading - .append('h2') - .text(t('background.title')); - - heading - .append('button') - .on('click', hidePane) - .call(svgIcon('#iD-icon-close')); - - - var content = _pane - .append('div') - .attr('class', 'pane-content'); + backgroundPane.renderContent = function(content) { // background list content @@ -411,9 +370,8 @@ export function uiBackground(context) { update(); context.keybinding() - .on(key, uiBackground.togglePane) - .on(uiCmd('⌘' + key), quickSwitch); + .on(uiCmd('⌘' + _key), quickSwitch); }; - return uiBackground; + return backgroundPane; } diff --git a/modules/ui/help.js b/modules/ui/panes/help.js similarity index 86% rename from modules/ui/help.js rename to modules/ui/panes/help.js index d2e56f2d1..c23bde88e 100644 --- a/modules/ui/help.js +++ b/modules/ui/panes/help.js @@ -1,23 +1,17 @@ -import { - event as d3_event, - select as d3_select -} from 'd3-selection'; import marked from 'marked'; -import { svgIcon } from '../svg/icon'; -import { uiCmd } from './cmd'; -import { uiIntro } from './intro/intro'; -import { uiShortcuts } from './shortcuts'; -import { uiTooltipHtml } from './tooltipHtml'; +import { svgIcon } from '../../svg/icon'; +import { uiCmd } from '../cmd'; +import { uiIntro } from '../intro/intro'; +import { uiShortcuts } from '../shortcuts'; +import { uiTooltipHtml } from '../tooltipHtml'; +import { uiPane } from '../pane'; -import { t, textDirection } from '../util/locale'; -import { tooltip } from '../util/tooltip'; -import { icon } from './intro/helper'; +import { t, textDirection } from '../../util/locale'; +import { tooltip } from '../../util/tooltip'; +import { icon } from '../intro/helper'; export function uiHelp(context) { - var key = t('help.key'); - - var _pane = d3_select(null); var docKeys = [ ['help', [ @@ -281,36 +275,18 @@ export function uiHelp(context) { }; }); - var paneTooltip = tooltip() - .placement((textDirection === 'rtl') ? 'right' : 'left') - .html(true) - .title(uiTooltipHtml(t('help.title'), key)); + var helpPane = uiPane('help', context) + .key(t('help.key')) + .title(t('help.title')) + .description(t('help.title')) + .iconName('iD-icon-help'); - function hidePane() { - context.ui().togglePanes(); - } - - uiHelp.togglePane = function() { - if (d3_event) d3_event.preventDefault(); - paneTooltip.hide(); - context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined); - }; - - uiHelp.renderToggleButton = function(selection) { - - selection.append('button') - .on('click', uiHelp.togglePane) - .call(svgIcon('#iD-icon-help', 'light')) - .call(paneTooltip); - }; - - - uiHelp.renderPane = function(selection) { + helpPane.renderContent = function(content) { function clickHelp(d, i) { var rtl = (textDirection === 'rtl'); content.property('scrollTop', 0); - doctitle.html(d.title); + helpPane.selection().select('.pane-heading h2').html(d.title); body.html(d.html); body.selectAll('a') @@ -373,29 +349,6 @@ export function uiHelp(context) { context.container().call(uiShortcuts(context), true); } - - _pane = selection.append('div') - .attr('class', 'help-wrap map-pane fillL hide') - .attr('pane', 'help'); - - var heading = _pane - .append('div') - .attr('class', 'pane-heading'); - - var doctitle = heading - .append('h2') - .text(t('help.title')); - - heading - .append('button') - .on('click', hidePane) - .call(svgIcon('#iD-icon-close')); - - - var content = _pane - .append('div') - .attr('class', 'pane-content'); - var toc = content .append('ul') .attr('class', 'toc'); @@ -454,10 +407,7 @@ export function uiHelp(context) { clickHelp(docs[0], 0); - context.keybinding() - .on(key, uiHelp.togglePane); - }; - return uiHelp; + return helpPane; } diff --git a/modules/ui/issues.js b/modules/ui/panes/issues.js similarity index 85% rename from modules/ui/issues.js rename to modules/ui/panes/issues.js index 780741282..38705d204 100644 --- a/modules/ui/issues.js +++ b/modules/ui/panes/issues.js @@ -2,19 +2,18 @@ import _debounce from 'lodash-es/debounce'; import { event as d3_event, select as d3_select } from 'd3-selection'; -import { t, textDirection } from '../util/locale'; -import { tooltip } from '../util/tooltip'; +import { t } from '../../util/locale'; +import { tooltip } from '../../util/tooltip'; //import { actionNoop } from '../actions/noop'; -import { geoSphericalDistance } from '../geo'; -import { svgIcon } from '../svg/icon'; -import { uiDisclosure } from './disclosure'; -import { uiTooltipHtml } from './tooltipHtml'; -import { utilGetSetValue, utilHighlightEntities, utilNoAuto } from '../util'; +import { geoSphericalDistance } from '../../geo'; +import { svgIcon } from '../../svg/icon'; +import { uiDisclosure } from '../disclosure'; +import { utilGetSetValue, utilHighlightEntities, utilNoAuto } from '../../util'; +import { uiPane } from '../pane'; export function uiIssues(context) { - var key = t('issues.key'); var MINSQUARE = 0; var MAXSQUARE = 20; @@ -23,8 +22,6 @@ export function uiIssues(context) { var _errorsSelection = d3_select(null); var _warningsSelection = d3_select(null); var _rulesList = d3_select(null); - var _pane = d3_select(null); - var _toggleButton = d3_select(null); var _errors = []; var _warnings = []; @@ -42,22 +39,6 @@ export function uiIssues(context) { ); - function addNotificationBadge(selection) { - var d = 10; - selection.selectAll('svg.notification-badge') - .data([0]) - .enter() - .append('svg') - .attr('viewbox', '0 0 ' + d + ' ' + d) - .attr('class', 'notification-badge hide') - .append('circle') - .attr('cx', d / 2) - .attr('cy', d / 2) - .attr('r', (d / 2) - 1) - .attr('fill', 'currentColor'); - } - - function renderErrorsList(selection) { _errorsSelection = selection .call(drawIssuesList, 'errors', _errors); @@ -402,7 +383,7 @@ export function uiIssues(context) { var opts = cases[type]; var hiddenIssues = context.validator().getIssues(opts); if (hiddenIssues.length) { - _pane.select('.issues-none .details') + issuesPane.selection().select('.issues-none .details') .text(t( 'issues.no_issues.hidden_issues.' + type, { count: hiddenIssues.length.toString() } @@ -410,7 +391,7 @@ export function uiIssues(context) { return; } } - _pane.select('.issues-none .details') + issuesPane.selection().select('.issues-none .details') .text(t('issues.no_issues.hidden_issues.none')); } @@ -465,7 +446,7 @@ export function uiIssues(context) { messageType = 'no_edits'; } - _pane.select('.issues-none .message') + issuesPane.selection().select('.issues-none .message') .text(t('issues.no_issues.message.' + messageType)); } @@ -487,31 +468,25 @@ export function uiIssues(context) { _warnings = _warnings.slice(0, 1000); - _toggleButton.selectAll('.notification-badge') - .classed('error', (_errors.length > 0)) - .classed('warning', (_errors.length === 0 && _warnings.length > 0)) - .classed('hide', (_errors.length === 0 && _warnings.length === 0)); - - - _pane.selectAll('.issues-errors') + issuesPane.selection().selectAll('.issues-errors') .classed('hide', _errors.length === 0); if (_errors.length > 0) { - _pane.selectAll('.hide-toggle-issues_errors .hide-toggle-text') + issuesPane.selection().selectAll('.hide-toggle-issues_errors .hide-toggle-text') .text(t('issues.errors.list_title', { count: errorCount })); - if (!_pane.select('.disclosure-wrap-issues_errors').classed('hide')) { + if (!issuesPane.selection().select('.disclosure-wrap-issues_errors').classed('hide')) { _errorsSelection .call(drawIssuesList, 'errors', _errors); } } - _pane.selectAll('.issues-warnings') + issuesPane.selection().selectAll('.issues-warnings') .classed('hide', _warnings.length === 0); if (_warnings.length > 0) { - _pane.selectAll('.hide-toggle-issues_warnings .hide-toggle-text') + issuesPane.selection().selectAll('.hide-toggle-issues_warnings .hide-toggle-text') .text(t('issues.warnings.list_title', { count: warningCount })); - if (!_pane.select('.disclosure-wrap-issues_warnings').classed('hide')) { + if (!issuesPane.selection().select('.disclosure-wrap-issues_warnings').classed('hide')) { _warningsSelection .call(drawIssuesList, 'warnings', _warnings); renderIgnoredIssuesReset(_warningsSelection); @@ -520,14 +495,14 @@ export function uiIssues(context) { var hasIssues = _warnings.length > 0 || _errors.length > 0; - var issuesNone = _pane.select('.issues-none'); + var issuesNone = issuesPane.selection().select('.issues-none'); issuesNone.classed('hide', hasIssues); if (!hasIssues) { renderIgnoredIssuesReset(issuesNone); setNoIssuesText(); } - if (!_pane.select('.disclosure-wrap-issues_rules').classed('hide')) { + if (!issuesPane.selection().select('.disclosure-wrap-issues_rules').classed('hide')) { updateRulesList(); } @@ -654,58 +629,14 @@ export function uiIssues(context) { } - function hidePane() { - context.ui().togglePanes(); - } + var issuesPane = uiPane('issues', context) + .key(t('issues.key')) + .title(t('issues.title')) + .description(t('issues.title')) + .iconName('iD-icon-alert'); - - var paneTooltip = tooltip() - .placement((textDirection === 'rtl') ? 'right' : 'left') - .html(true) - .title(uiTooltipHtml(t('issues.title'), key)); - - - - uiIssues.togglePane = function() { - if (d3_event) d3_event.preventDefault(); - paneTooltip.hide(); - context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined); - }; - - - uiIssues.renderToggleButton = function(selection) { - _toggleButton = selection - .append('button') - .on('click', uiIssues.togglePane) - .call(svgIcon('#iD-icon-alert', 'light')) - .call(addNotificationBadge) - .call(paneTooltip); - }; - - - uiIssues.renderPane = function(selection) { - _pane = selection - .append('div') - .attr('class', 'fillL map-pane issues-pane hide') - .attr('pane', 'map-issues'); - - var heading = _pane - .append('div') - .attr('class', 'pane-heading'); - - heading - .append('h2') - .text(t('issues.title')); - - heading - .append('button') - .on('click', hidePane) - .call(svgIcon('#iD-icon-close')); - - var content = _pane - .append('div') - .attr('class', 'pane-content'); + issuesPane.renderContent = function(content) { content .append('div') @@ -743,10 +674,7 @@ export function uiIssues(context) { ); // update(); - - context.keybinding() - .on(key, uiIssues.togglePane); }; - return uiIssues; + return issuesPane; } diff --git a/modules/ui/map_data.js b/modules/ui/panes/map_data.js similarity index 92% rename from modules/ui/map_data.js rename to modules/ui/panes/map_data.js index d6362a518..9686f87fc 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/panes/map_data.js @@ -3,19 +3,19 @@ import { select as d3_select } from 'd3-selection'; -import { svgIcon } from '../svg/icon'; -import { t, textDirection } from '../util/locale'; -import { tooltip } from '../util/tooltip'; -import { geoExtent } from '../geo'; -import { modeBrowse } from '../modes/browse'; -import { uiDisclosure } from './disclosure'; -import { uiSettingsCustomData } from './settings/custom_data'; -import { uiTooltipHtml } from './tooltipHtml'; -import { uiCmd } from './cmd'; +import { svgIcon } from '../../svg/icon'; +import { t, textDirection } from '../../util/locale'; +import { tooltip } from '../../util/tooltip'; +import { geoExtent } from '../../geo'; +import { modeBrowse } from '../../modes/browse'; +import { uiDisclosure } from '../disclosure'; +import { uiSettingsCustomData } from '../settings/custom_data'; +import { uiTooltipHtml } from '../tooltipHtml'; +import { uiCmd } from '../cmd'; +import { uiPane } from '../pane'; export function uiMapData(context) { - var key = t('map_data.key'); var osmDataToggleKey = uiCmd('⌥' + t('area_fill.wireframe.key')); var features = context.features().keys(); var layers = context.layers(); @@ -24,8 +24,6 @@ export function uiMapData(context) { var settingsCustomData = uiSettingsCustomData(context) .on('change', customChanged); - var _pane = d3_select(null); - var _fillSelected = context.storage('area-fill') || 'partial'; var _dataLayerContainer = d3_select(null); var _photoOverlayContainer = d3_select(null); @@ -775,16 +773,16 @@ export function uiMapData(context) { function update() { - if (!_pane.select('.disclosure-wrap-data_layers').classed('hide')) { + if (!mapDataPane.selection().select('.disclosure-wrap-data_layers').classed('hide')) { updateDataLayers(); } - if (!_pane.select('.disclosure-wrap-photo_overlays').classed('hide')) { + if (!mapDataPane.selection().select('.disclosure-wrap-photo_overlays').classed('hide')) { updatePhotoOverlays(); } - if (!_pane.select('.disclosure-wrap-fill_area').classed('hide')) { + if (!mapDataPane.selection().select('.disclosure-wrap-fill_area').classed('hide')) { updateFillList(); } - if (!_pane.select('.disclosure-wrap-map_features').classed('hide')) { + if (!mapDataPane.selection().select('.disclosure-wrap-map_features').classed('hide')) { updateFeatureList(); } @@ -809,56 +807,13 @@ export function uiMapData(context) { context.map().pan([0,0]); // trigger a redraw } - var paneTooltip = tooltip() - .placement((textDirection === 'rtl') ? 'right' : 'left') - .html(true) - .title(uiTooltipHtml(t('map_data.description'), key)); - - function hidePane() { - context.ui().togglePanes(); - } - - uiMapData.togglePane = function() { - if (d3_event) d3_event.preventDefault(); - paneTooltip.hide(); - context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined); - }; - - uiMapData.renderToggleButton = function(selection) { - - selection - .append('button') - .on('click', uiMapData.togglePane) - .call(svgIcon('#iD-icon-data', 'light')) - .call(paneTooltip); - }; - - - uiMapData.renderPane = function(selection) { - - _pane = selection - .append('div') - .attr('class', 'fillL map-pane map-data-pane hide') - .attr('pane', 'map-data'); - - var heading = _pane - .append('div') - .attr('class', 'pane-heading'); - - heading - .append('h2') - .text(t('map_data.title')); - - heading - .append('button') - .on('click', hidePane) - .call(svgIcon('#iD-icon-close')); - - - var content = _pane - .append('div') - .attr('class', 'pane-content'); + var mapDataPane = uiPane('map-data', context) + .key(t('map_data.key')) + .title(t('map_data.title')) + .description(t('map_data.description')) + .iconName('iD-icon-data'); + mapDataPane.renderContent = function(content) { // data layers content @@ -905,7 +860,6 @@ export function uiMapData(context) { setFill(_fillSelected); context.keybinding() - .on(key, uiMapData.togglePane) .on(t('area_fill.wireframe.key'), toggleWireframe) .on(osmDataToggleKey, function() { d3_event.preventDefault(); @@ -915,5 +869,5 @@ export function uiMapData(context) { .on(t('map_data.highlight_edits.key'), toggleHighlightEdited); }; - return uiMapData; -} \ No newline at end of file + return mapDataPane; +} diff --git a/modules/ui/preferences.js b/modules/ui/panes/preferences.js similarity index 56% rename from modules/ui/preferences.js rename to modules/ui/panes/preferences.js index 1b4364378..db284ace5 100644 --- a/modules/ui/preferences.js +++ b/modules/ui/panes/preferences.js @@ -1,23 +1,15 @@ -import { event as d3_event, select as d3_select } from 'd3-selection'; +import { event as d3_event } from 'd3-selection'; -import { svgIcon } from '../svg/icon'; -import { t, textDirection } from '../util/locale'; -import { tooltip } from '../util/tooltip'; -import { uiDisclosure } from './disclosure'; -import { uiTooltipHtml } from './tooltipHtml'; +import { svgIcon } from '../../svg/icon'; +import { t } from '../../util/locale'; +import { tooltip } from '../../util/tooltip'; +import { uiDisclosure } from '../disclosure'; +import { uiPane } from '../pane'; export function uiPreferences(context) { - const key = t('preferences.key'); - let _pane = d3_select(null); let _showThirdPartyIcons = context.storage('preferences.privacy.thirdpartyicons') || 'true'; - const paneTooltip = tooltip() - .placement((textDirection === 'rtl') ? 'right' : 'left') - .html(true) - .title(uiTooltipHtml(t('preferences.description'), key)); - - function renderPrivacyOptions(selection) { // enter let privacyOptionsListEnter = selection.selectAll('.privacy-options-list') @@ -74,46 +66,13 @@ export function uiPreferences(context) { } } + let preferencesPane = uiPane('preferences', context) + .key(t('preferences.key')) + .title(t('preferences.title')) + .description(t('preferences.description')) + .iconName('fas-user-cog'); - uiPreferences.togglePane = () => { - if (d3_event) d3_event.preventDefault(); - paneTooltip.hide(); - context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined); - }; - - - uiPreferences.renderToggleButton = (selection) => { - selection - .append('button') - .on('click', uiPreferences.togglePane) - .call(svgIcon('#fas-user-cog', 'light')) - .call(paneTooltip); - }; - - - uiPreferences.renderPane = (selection) => { - _pane = selection - .append('div') - .attr('class', 'fillL map-pane preferences-pane hide') - .attr('pane', 'preferences'); - - let heading = _pane - .append('div') - .attr('class', 'pane-heading'); - - heading - .append('h2') - .text(t('preferences.title')); - - heading - .append('button') - .on('click', () => context.ui().togglePanes()) - .call(svgIcon('#iD-icon-close')); - - - let content = _pane - .append('div') - .attr('class', 'pane-content'); + preferencesPane.renderContent = (content) => { content .append('div') @@ -122,10 +81,7 @@ export function uiPreferences(context) { .title(t('preferences.privacy.title')) .content(renderPrivacyOptions) ); - - context.keybinding() - .on(key, uiPreferences.togglePane); }; - return uiPreferences; + return preferencesPane; }