diff --git a/index.html b/index.html
index c6a9001..fc87d89 100644
--- a/index.html
+++ b/index.html
@@ -4,6 +4,8 @@
-
this.openCabinet()}>
{title}
+
{/*this.renderToolbarTab(0, 'search')*/}
{this.renderToolbarTagRoot()}
diff --git a/src/js/map/map.js b/src/js/map/map.js
index b43f5a5..e983e73 100644
--- a/src/js/map/map.js
+++ b/src/js/map/map.js
@@ -273,7 +273,6 @@ Stop and start the development process in terminal after you have added your tok
.attr('class', 'location')
.attr('transform', (d) => {
d.LatLng = new L.LatLng(+d.latitude, +d.longitude);
- console.log(lMap.latLngToLayerPoint(d.LatLng))
return `translate(${lMap.latLngToLayerPoint(d.LatLng).x},
${lMap.latLngToLayerPoint(d.LatLng).y})`;
})
diff --git a/src/reducers/index.js b/src/reducers/index.js
index c940079..3b39f37 100644
--- a/src/reducers/index.js
+++ b/src/reducers/index.js
@@ -1,6 +1,4 @@
-import {
- combineReducers
-} from 'redux'
+import { combineReducers } from 'redux'
import domain from './domain.js'
import app from './app.js'
diff --git a/src/reducers/ui.js b/src/reducers/ui.js
index 2180304..8ead656 100644
--- a/src/reducers/ui.js
+++ b/src/reducers/ui.js
@@ -5,8 +5,6 @@ import {
TOGGLE_FETCHING_EVENTS,
TOGGLE_VIEW,
TOGGLE_TIMELINE,
- OPEN_CABINET,
- CLOSE_CABINET,
TOGGLE_INFOPOPUP,
TOGGLE_NOTIFICATIONS
} from '../actions'
@@ -27,41 +25,6 @@ function toggleFetchingEvents(uiState, action) {
});
}
-function toggleView(uiState, action) {
- return Object.assign({}, uiState, {
- flags: Object.assign({}, uiState.flags, {
- isView2d: !uiState.flags.isView2d
- })
- });
-}
-
-function toggleTimeline(uiState, action) {
- return Object.assign({}, uiState, {
- flags: Object.assign({}, uiState.flags, {
- isTimeline: !uiState.flags.isTimeline
- })
- });
-}
-
-function closeCabinet(uiState, action) {
- return Object.assign({}, uiState, {
- flags: Object.assign({}, uiState.flags, {
- isCabinet: false
- })
- });
-}
-
-function openCabinet(uiState, action) {
- return Object.assign({}, uiState, {
- flags: Object.assign({}, uiState.flags, {
- isCabinet: true
- }),
- components: Object.assign({}, uiState.components, {
- cabinetFileTab: action.tabNum,
- })
- });
-}
-
function toggleInfoPopup(uiState, action) {
return Object.assign({}, uiState, {
flags: Object.assign({}, uiState.flags, {
@@ -84,14 +47,6 @@ function ui(uiState = initial.ui, action) {
return toggleFetchingDomain(uiState, action);
case TOGGLE_FETCHING_EVENTS:
return toggleFetchingEvents(uiState, action);
- case TOGGLE_VIEW:
- return toggleView(uiState, action);
- case TOGGLE_TIMELINE:
- return toggleTimeline(uiState, action);
- case OPEN_CABINET:
- return openCabinet(uiState, action);
- case CLOSE_CABINET:
- return closeCabinet(uiState, action);
case TOGGLE_INFOPOPUP:
return toggleInfoPopup(uiState, action);
case TOGGLE_NOTIFICATIONS:
diff --git a/src/scss/cabinet.scss b/src/scss/cabinet.scss
deleted file mode 100644
index 5c132ea..0000000
--- a/src/scss/cabinet.scss
+++ /dev/null
@@ -1,827 +0,0 @@
-@import 'icons';
-@import 'video';
-
-.cabinet-wrapper {
- overflow: auto;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- width: 100%;
- height: 100%;
- display: table;
- table-layout: fixed;
- color: $offwhite;
- background-color: $black;
- font-family: 'Merriweather', serif;
- transition: opacity 0.5s ease 0.1s, z-index 0.1s ease 0s;
- opacity: 1;
- z-index: $final-level;
-
- &.hidden {
- transition: opacity 0.5s ease 0s, z-index 0.1s ease 0.5s;
- opacity: 0;
- z-index: $hidden;
- }
-
- &.show {
- z-index: $final-level;
- }
-
- .top-action {
- position: fixed;
- top: 20px;
- right: 20px;
- z-index: 1;
-
- button {
- font-family: 'Lato';
- font-size: $xlarge;
- text-align: left;
- text-transform: uppercase;
- background: none;
- border: none;
- color: $offwhite;
- outline: none;
- cursor: pointer;
- transition: 0.2s ease;
- letter-spacing: 0.1em;
-
- .label {
- height: 28px;
- float: left;
- line-height: 28px;
- padding-left: 10px;
- }
-
- svg {
- float: left;
- path, circle, polygon,
- polyline, line {
- stroke-width: 2px;
- transition: 0.2s ease;
- stroke: $offwhite;
- fill: none;
- stroke-linecap: round;
- }
- }
-
- &:hover {
- transition: 0.2s ease;
- letter-spacing: 0.15em;
- }
- }
- }
-
- .cabinet-header {
- position: fixed;
- top: 0px;
- width: 100%;
- padding: 20px 0;
- background: $black;
- transition: 1s ease;
- text-transform: uppercase;
- font-family: 'Merriweather', serif;
-
- .header-title {
- width: 280px;
- margin: 0 auto;
- cursor: pointer;
-
- p {
- font-size: $normal;
- margin: 0;
- width: 100%;
- text-align: center;
- transition: 2s ease;
- letter-spacing: normal;
- }
- p:first-child {
- font-size: 8px;
- }
-
- &:hover {
- p {
- transition: 2s ease;
- letter-spacing: 0.1em;
- }
- }
- }
- }
-
- .share-sm {
- position: fixed;
- bottom: 20px;
- right: 20px;
- }
-
- .side-menu-file-cabinet {
- position: fixed;
- top: 20px;
- left: 20px;
- z-index: 1;
- }
-
- .logo-fa {
- background: url('/static/archive/img/logo-fa-square.png');
- margin: 0px 0 30px 20px;
- height: 30px;
- width: 30px;
- background-size: 30px;
- animation-name: fadeIn;
- animation-duration: 3s;
- position: fixed;
- top: 20px;
- cursor: pointer;
- }
-
- &.cabinet-wrapper-files {
- display: block;
- background: $black;
- }
-
- &.cabinet-wrapper-cover {
- background-color: $black;
- background-repeat:no-repeat;
- -webkit-background-size:cover;
- -moz-background-size:cover;
- -o-background-size:cover;
- background-size:cover;
- background-position:center;
- }
-}
-
-.cabinet-cover {
- position: absolute;
- display: flex;
- justify-content: center;
- align-items: center;
- text-align: center;
- vertical-align: middle;
- width: 100%;
- bottom: 0;
- top: 0;
- animation-name: fadeIn;
- animation-duration: 0.5s;
-
- .content {
- display: inline-block;
- width: 90%;
- max-width: 800px;
- box-sizing: border-box;
- padding: 30px;
- border-radius: 2px;
- overflow: auto;
- }
-
- .cabinet-cover-header {
- width: 100%;
- margin-bottom: 20px;
- animation-name: fallFadeIn;
- animation-duration: 3s;
-
- .main-title {
- .title {
- font-size: $cover-title;
- text-transform: uppercase;
- }
- margin-top: 0;
- margin-bottom: 0;
- }
- .untertitle {
- font-size: $xxlarge;
- text-transform: none;
- letter-spacing: 0.1em;
- }
- }
-
- .cabinet-cover-content {
- width: 100%;
-
- animation-name: fadeIn;
- animation-duration: 3s;
-
- .tile-row {
- position: relative;
- padding: 10px;
- box-sizing: border-box;
-
- .tile {
- position: relative;
- display: inline-block;
- width: calc(50% - 20px);
- height: 90px;
- line-height: 90px;
- box-sizing: border-box;
- background: none;
- border: 1px solid $offwhite;
- font-family: 'Lato', Helvetica, sans-serif;
- font-size: $xxlarge;
- text-transform: uppercase;
- cursor: pointer;
- transition: 1s ease;
- letter-spacing: 0.1em;
-
- span {
- z-index: 1;
- }
-
- &:before {
- position: absolute;
- content: " ";
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- display: block;
- z-index: 0;
- transition: 1s ease;
- background-color: rgba($black, 0.15);
- }
-
- &:hover {
- transition: 1s ease;
- letter-spacing: 0.15em;
- &:before{
- transition: 1s ease;
- background-color: rgba($black, 0.3);
- }
- }
-
- &:first-child {
- margin-right: 20px;
- }
-
- &.full {
- width: 100%;
- margin-right: 0;
- }
-
- & * {
- position: relative;
- }
-
- .tile-content {
- margin: 0 auto;
- padding: 30px 0;
- width: 200px;
-
- .label {
- height: 28px;
- float: left;
- line-height: 28px;
- padding-left: 10px;
- }
-
- svg {
- float: left;
- path, circle, polygon,
- polyline, line {
- stroke-width: 2px;
- transition: 0.2s ease;
- stroke: $offwhite;
- fill: none;
- stroke-linecap: round;
- }
- }
- }
- }
- }
- }
-}
-
-.secondary-action {
- width: 90px;
- margin: 0 auto;
- letter-spacing: 0.1em;
- text-transform: uppercase;
- font-family: 'Lato';
- font-size: $small;
- padding: 20px 0;
- text-align: center;
- transition: 0.2s ease;
- border-bottom: 2px solid rgba($offwhite, 0);
- cursor: pointer;
-
- &:hover {
- transition: 0.2s ease;
- letter-spacing: 0.15em;
- border-bottom: 2px solid $yellow;
- }
-}
-
-.cabinet-files {
- animation-name: fadeIn;
- animation-duration: 0.5s;
-
- &.file-tab-list-off {
- ul.cabinet-file-tab-list {
- transition: 0.2s ease;
- left: -300px;
- }
- }
-
- ul.cabinet-file-tab-list {
- width: 300px;
- position: fixed;
- float: left;
- top: 0;
- bottom: 0;
- margin: 0;
- padding-top: 160px;
- border-right: 1px solid $darkgrey;
- background: $black;
- transition: 0.2s ease;
- left: 0;
- z-index: 1;
-
- li.cabinet-file-tab {
- width: calc(100% - 40px);
- text-align: left;
- border: 0;
- margin-left: 20px;
- margin-right: 20px;
- box-sizing: border-box;
- font-family: 'Merriweather', serif;
- font-size: $large;
- font-weight: 100;
- border-bottom: 1px solid $darkgrey;
- transition: 0.2s ease;
- color: $offwhite;
-
- &:hover {
- transition: 0.2s ease;
- color: $yellow;
- }
-
- &.react-tabs__tab--selected {
- color: $yellow;
-
- &:after {
- content: ' →';
- }
- }
- }
-
- .action {
- text-align: left;
- border: 0;
- box-sizing: border-box;
-
- button {
- margin: 20px;
- width: calc(100% - 40px);
- letter-spacing: 0.1em;
- text-transform: uppercase;
- font-family: 'Lato';
- font-size: $large;
- text-align: left;
- padding-left: 0;
- }
-
- &.secondary-action button {
- padding: 20px;
- border: 1px solid $midwhite;
- text-align: center;
- &:hover {
- transition: 0.2s ease;
- border-color: $offwhite;
- background: rgba($offwhite, 0.1);
- }
- }
- }
-
- .language-toggle {
- width: 100%;
- position: absolute;
- bottom: 0;
- z-index: 10;
- }
- }
-
-
-
- .react-tabs__tab-panel {
- z-index: 0;
- }
-
- .cabinet-file-content {
- width: 90%;
- max-width: 800px;
- box-sizing: border-box;
- padding: 140px 30px 60px 30px;
- border-radius: 2px;
- overflow: auto;
- margin: 0 auto;
- text-align: left;
- animation-name: fadeIn;
- animation-duration: 1.5s;
-
- h1 {
- font-size: $title;
- text-align: center;
- font-weight: 700;
- text-transform: uppercase;
- margin-bottom: 50px;
- }
-
- .title-separator {
- margin: 0 auto;
- width: 100px;
- border-bottom: 4px solid $yellow;
- margin-bottom: 50px;
- }
-
- h2 {
- letter-spacing: normal;
- text-transform: capitalize;
- margin-top: 40px;
- }
-
- .cabinet-body-text {
- padding: 10px 0;
-
- .section {
- margin-bottom: 40px;
- }
-
- p {
- margin: 20px 0;
- font-size: $xlarge;
- font-weight: 100;
- line-height: 24px;
-
- &:first-child {
- margin-top: 0;
- }
-
- &:last-child {
- margin-bottom: 0;
- }
- }
-
- .highpoint {
- font-size: $xxxlarge;
- margin: 60px 0;
- border-left: 4px solid $yellow;
- padding-left: 20px;
- }
-
- img {
- width: 100%;
- }
-
- .actions {
- width: 100%;
- display: inline-block;
- }
-
- .primary-action {
- button {
- font-size: $large;
- height: 140px;
- line-height: 140px;
- width: 100%;
- padding: 0;
- border: 1px solid $offwhite;
- background-size: 100%;
- color: $offwhite;
- cursor: pointer;
- outline: none;
- font-family: 'Lato', Helvetica, sans-serif;
- text-transform: uppercase;
- margin-bottom: 10px;
- transition: 0.2s ease;
- letter-spacing: 0.1em;
-
- &:after {
- content: ' →';
- }
-
- &:hover {
- transition: 0.2s ease;
- letter-spacing: 0.15em;
- }
- }
-
- &.only-on-mobile {
- display: none;
-
- button:after {
- content: '';
- }
- }
-
- &.ja {
- button { background-image: url("/static/archive/img/scene01.jpg"); }
- }
- &.pj {
- button { background-image: url("/static/archive/img/scene02.jpg"); }
- }
- &.st {
- button { background-image: url("/static/archive/img/scene03.jpg"); }
- }
- }
- }
- }
-
- .actions {
- min-width: 200px;
- margin: 0 auto;
-
- .action {
- display: inline-block;
- float: left;
- }
-
- button {
- font-size: $large;
- display: block;
- width: 100%;
- }
-
- .primary-action {
- width: 100%;
- animation-name: fadeIn;
- animation-duration: 1s;
-
- &:first-child {
- margin-right: 5%;
- }
-
- button {
- height: 120px;
- margin: 20px auto;
- letter-spacing: 0.1em;
- text-transform: uppercase;
- font-family: 'Lato';
- }
-
- &.mobile {
- width: 100%;
- }
- }
-
- .document-action {
- width: 100%;
- border: 0;
- display: block;
- margin: 0 auto;
- clear: both;
-
- button {
- display: inline-block;
- text-align: center;
- width: 100%;
- height: 40px;
- line-height: 40px;
- margin: 10px auto;
- padding: 0;
- letter-spacing: 0.1em;
- text-transform: uppercase;
- border: 0;
- outline: none;
- border-bottom: 4px solid rgba($yellow, 0);
- background: none;
-
- a {
- text-align: center;
- box-sizing: border-box;
- padding-bottom: 5px;
- cursor: pointer;
- text-decoration: none;
- color: $offwhite;
-
- &:after {
- content: '↓';
- }
- &:hover {
- transition: 0.2s ease;
- border-bottom: 4px solid rgba($yellow, 1);
- color: $yellow;
- }
- }
- }
- }
-
- &:last-child {
- margin-bottom: 40px;
- }
- }
-}
-
-/**
-*
-* VIDEO ON LANDING
-*/
-
-.fullscreen {
- position: fixed;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- z-index: 2;
- background: $black;
-}
-.video {
- display: block;
- left: 0px;
- overflow: hidden;
- padding-bottom: 56.25%; /* 56.25% = 16:9. set ratio */
- position: absolute;
- top: 50%;
- width: 100%;
- -webkit-transform-origin: 50% 0;
- transform-origin: 50% 0;
- -webkit-transform: translateY(-50%);
- transform: translateY(-50%);
-}
-.video .wrapper {
- display: block;
- height: 300%;
- left: 0px;
- overflow: hidden;
- position: absolute;
- top: 50%;
- width: 100%;
- -webkit-transform: translateY(-50%);
- transform: translateY(-50%);
-}
-.video iframe {
- display: block;
- height: 100%;
- width: 100%;
-}
-
-/*
-* VIDEO ON SITE
-*/
-
-.video-responsive{
- overflow:hidden;
- padding-bottom:56.25%;
- position:relative;
- height:0;
-}
-.video-responsive iframe{
- left:0;
- top:0;
- height:100%;
- width:100%;
- position:absolute;
-}
-
-/*
-* Responsiveness
-*
-*/
-
-@media (max-width: 780px) {
- .cabinet-files .cabinet-file-content .cabinet-body-text .primary-action {
- &.not-on-mobile {
- display: none;
- }
- &.only-on-mobile {
- display: block;
- }
- }
- .cabinet-cover {
- .content {
- padding: 0;
- }
- .cabinet-cover-header {
- margin-bottom: 40px;
-
- .main-title {
- .title {
- font-size: 36px;
- }
- }
- .untertitle {
- font-size: $normal;
- }
- }
-
- .cabinet-cover-content .tile-row {
- padding: 0;
-
- .tile {
- width: 60%;
- height: 48px;
- line-height: 48px;
- margin: 0 20%;
- margin-bottom: 10px;
- font-size: $normal;
- &:first-child {
- margin-right: 20%;
- }
- &.tile00 {
- display: none;
- }
- }
- }
- }
-
- .cabinet-files {
- ul.cabinet-file-tab-list {
- width: 100%;
-
- li.cabinet-file-tab {
- text-align: center;
- font-size: $normal;
- height: 48px;
- line-height: 48px;
- }
- }
-
- &.file-tab-list-off {
- ul.cabinet-file-tab-list {
- transition: 0.2s ease;
- left: -100%;
- }
- }
-
- .cabinet-file-content {
- width: 100%;
- margin: 0;
- padding: 100px 15px 40px 15px;
- box-sizing: border-box;
- overflow: auto;
-
- .cabinet-body-text {
- padding: 10px 0;
- font-size: $xlarge;
-
- p {
- margin: 20px 0;
- }
-
- img {
- width: 100%;
- }
- }
- }
- }
- .top-action.not-on-mobile {
- display: none;
- }
-}
-
-/* Tablets with very short heights */
-@media (max-height: 768px) and (min-width: 780px) {
- .cabinet-cover .content {
- max-width: 640px;
- }
-
- .cabinet-cover .cabinet-cover-header {
- margin-bottom: 20px;
-
- .main-title .title {
- font-size: 48px;
- }
- }
-
- .cabinet-cover .cabinet-cover-content .tile-row .tile {
- height: 50px;
- line-height: 50px;
- font-size: $xlarge;
-
- .tile-content {
- padding: 10px 0;
- }
- }
-}
-
-@media (min-width: 1350px) {
- .cabinet-files {
- animation-name: fadeIn;
- animation-duration: 0.5s;
-
- &.file-tab-list-off {
- ul.cabinet-file-tab-list {
- left: 0;
- }
- }
- }
-
- .side-menu-file-cabinet {
- display: none;
- }
-}
-
-/* ----------- Non-Retina Screens ----------- */
-@media screen
- and (min-device-width: 1200px)
- and (max-device-width: 1600px)
- and (-webkit-min-device-pixel-ratio: 1) {
-}
-
-/* ----------- Retina Screens ----------- */
-@media screen
- and (min-device-width: 1200px)
- and (max-device-width: 1600px)
- and (-webkit-min-device-pixel-ratio: 2)
- and (min-resolution: 192dpi) {
-}
diff --git a/src/selectors/index.js b/src/selectors/index.js
index 9f22bb5..d79960a 100644
--- a/src/selectors/index.js
+++ b/src/selectors/index.js
@@ -10,6 +10,7 @@ export const getSites = (state) => {
if (process.env.features.USE_SITES) return state.domain.sites
return []
}
+console.log(process.env)
export const getNotifications = state => state.domain.notifications;
export const getTagTree = state => state.domain.tags;
export const getTagsFilter = state => state.app.filters.tags;
diff --git a/src/store/index.js b/src/store/index.js
index c60975a..735a481 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -1,8 +1,4 @@
-import {
- createStore,
- applyMiddleware,
- compose
-} from 'redux';
+import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from '../reducers';
diff --git a/src/store/initial.js b/src/store/initial.js
index ba925fe..c5f38ad 100644
--- a/src/store/initial.js
+++ b/src/store/initial.js
@@ -1,27 +1,33 @@
-// TODO: annotate sections of this state.
-
-// NB: why does this canvas document need to be created?
-const canvas = document.createElement('canvas');
-const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
-
const initial = {
+ /*
+ * The Domain or 'domain' of this state refers to the tree of data
+ * available for render and display.
+ * Selections and filters in the 'app' subtree will operate the domain
+ * in mapStateToProps of the Dashboard, and deterimne which items
+ * in the domain will get rendered by React
+ */
domain: {
events: [],
narratives: [],
locations: [],
-
categories: [],
sites: [],
-
- // Tag tree
- tags: { },
+ tags: {},
notifications: [],
},
+
+ /*
+ * The 'app' subtree of this state determines the data and information to be
+ * displayed.
+ * It may refer to those the user interacts with, by selecting,
+ * fitlering and so on, which ultimately operate on the data to be displayed.
+ * Additionally, some of the 'app' flags are determined by the config file
+ * or by the characteristics of the client, browser, etc.
+ */
app: {
error: null,
highlighted: null,
selected: [],
- notifications: [],
filters: {
timerange: [
d3.timeParse("%Y-%m-%dT%H:%M:%S")("2014-08-22T12:00:00"),
@@ -38,7 +44,6 @@ const initial = {
},
base_uri: 'http://127.0.0.1:8000/', // Modify accordingly on production setup.
isMobile: (/Mobi/.test(navigator.userAgent)),
- isWebGL: (gl && gl instanceof WebGLRenderingContext),
language: 'en-US',
mapAnchor: process.env.MAP_ANCHOR,
features: {
@@ -46,6 +51,12 @@ const initial = {
USE_SEARCH: process.env.features.USE_SEARCH
}
},
+
+ /*
+ * The 'ui' subtree of this state refers the state of the cosmetic
+ * elements of the application, such as color palettes of groups or how some
+ * of the UI tools are enabled or disabled dynamically by the user
+ */
ui: {
style: {
colors: {
@@ -77,9 +88,7 @@ const initial = {
flags: {
isFetchingDomain: false,
isFetchingEvents: false,
- isView2d: true,
- isTimeline: true,
- isToolbar: false,
+
isCardstack: true,
isInfopopup: false,
isNotification: true
@@ -88,9 +97,6 @@ const initial = {
formatter: d3.timeFormat("%d %b, %H:%M"),
formatterWithYear: d3.timeFormat("%d %b %Y, %H:%M"),
parser: d3.timeParse("%Y-%m-%dT%H:%M:%S")
- },
- components: {
- toolbarTab: false,
}
}
};
diff --git a/webpack.config.js b/webpack.config.js
index 5e7e738..4706f03 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -2,12 +2,18 @@ const webpack = require('webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const userConfig = require('./config');
+const userConfigJSON = {};
+
const devMode = process.env.NODE_ENV !== 'production';
const path = require('path');
const APP_DIR = path.resolve(__dirname, './src');
const BUILD_DIR = path.resolve(__dirname, './build');
+for (const k in userConfig) {
+ userConfigJSON[k] = JSON.stringify(userConfig[k]);
+}
+
const config = {
entry: {
index: `${APP_DIR}/index.jsx`,
@@ -53,16 +59,8 @@ const config = {
plugins: [
new webpack.DefinePlugin({
'process.env': {
+ ...userConfigJSON,
'NODE_ENV': JSON.stringify('production'),
- 'MAPBOX_TOKEN': JSON.stringify(userConfig.MAPBOX_TOKEN),
- 'SERVER_ROOT': JSON.stringify(userConfig.SERVER_ROOT),
- 'EVENT_EXT': JSON.stringify(userConfig.EVENT_EXT),
- 'CATEGORY_EXT': JSON.stringify(userConfig.CATEGORY_EXT),
- 'TAG_TREE_EXT': JSON.stringify(userConfig.TAG_TREE_EXT),
- 'SITES_EXT': JSON.stringify(userConfig.SITES_EXT),
- 'EVENT_DESC_ROOT': JSON.stringify(userConfig.EVENT_DESC_ROOT),
- 'MAP_ANCHOR': JSON.stringify(userConfig.MAP_ANCHOR),
- 'INCOMING_DATETIME_FORMAT': JSON.stringify(userConfig.INCOMING_DATETIME_FORMAT),
'features': {
'USE_TAGS': JSON.stringify(userConfig.features.USE_TAGS),
'USE_SEARCH': JSON.stringify(userConfig.features.USE_SEARCH),