ORCHID
MAP
- - { CLIENT.VER }
+ - {(APP_INFO.VERSION || 1)}.{(APP_INFO.RELEASE.length || 0)}
+
+ О редакторе карт
+
Проект на github
diff --git a/src/constants/app_info.js b/src/constants/app_info.js
index 6c28981..5f98810 100644
--- a/src/constants/app_info.js
+++ b/src/constants/app_info.js
@@ -3,28 +3,28 @@ export const APP_INFO = {
RELEASE: 1,
CHANGELOG: {
- 2: {
- 0: [
- '15.08.18 Первый коммит',
- '15.08.18 ReactJS для управления интерфейсом',
- '16.08.18 Карта, роутер, стикеры, панели редактора',
- '27.08.18 Выбор логотипа и стиля карты',
- '29.08.18 Переключение режимов, сохранение',
- '04.09.18 Загрузка карт, перерисовка данных, маршруты',
+ 2: [
+ [
+ 'Redux, redux-saga', // [26.11.18]
+ 'Рисование карт на стороне клиента', // [28.11.18]
+ 'Backend на expressjs + mongoose', // [30.11.18]
+ 'Импорт данных из старых версий карт', // [06.12.18]
+ 'Диалог со списком карт пользователя', // [07.12.18]
+ 'Мобильный интерфейс', // [07.12.18]
],
- 1: [
- '26.11.18 Redux, redux-saga',
- '28.11.18 Рисование карт на стороне клиента',
- '30.11.18 Backend на expressjs + mongoose',
- '04.12.18 Backend на expressjs + mongoose',
- '06.12.18 Импорт данных из старых версий карт',
- '07.12.18 Диалог со списком карт пользователя',
- ]
- },
- 1: {
- 0: [
+ [
+ 'Первый коммит', // [15.08.18]
+ 'ReactJS для управления интерфейсом', // [15.08.18]
+ 'Карта, роутер, стикеры, панели редактора', // [16.08.18]
+ 'Выбор логотипа и стиля карты', // [27.08.18]
+ 'Переключение режимов, сохранение', // [29.08.18]
+ 'Загрузка карт, перерисовка данных, маршруты', // [04.09.18]
+ ],
+ ],
+ 1: [
+ [
'Первый работающий редактор карт'
]
- }
+ ]
}
};
diff --git a/src/constants/dialogs.js b/src/constants/dialogs.js
index 65d9fa6..65ff3ee 100644
--- a/src/constants/dialogs.js
+++ b/src/constants/dialogs.js
@@ -2,4 +2,5 @@
export const DIALOGS = ({
NONE: 'NONE',
MAP_LIST: 'MAP_LIST',
+ APP_INFO: 'APP_INFO',
}: { [key: String]: String });
diff --git a/src/containers/LeftDialog.jsx b/src/containers/LeftDialog.jsx
index 3d1e54a..61336df 100644
--- a/src/containers/LeftDialog.jsx
+++ b/src/containers/LeftDialog.jsx
@@ -3,14 +3,20 @@ import React from 'react';
import { DIALOGS } from '$constants/dialogs';
import { MapListDialog } from '$components/dialogs/MapListDialog';
import classnames from 'classnames';
+import { AppInfoDialog } from '$components/dialogs/AppInfoDialog';
type Props = {
dialog: String,
dialog_active: Boolean,
}
+const LEFT_DIALOGS = {
+ [DIALOGS.MAP_LIST]: MapListDialog,
+ [DIALOGS.APP_INFO]: AppInfoDialog,
+};
+
export const LeftDialog = ({ dialog, dialog_active }: Props) => (
- { dialog === DIALOGS.MAP_LIST && }
+ { dialog && LEFT_DIALOGS[dialog] && React.createElement(LEFT_DIALOGS[dialog]) }
);
diff --git a/src/redux/user/actions.js b/src/redux/user/actions.js
index bfe6f02..7daaa57 100644
--- a/src/redux/user/actions.js
+++ b/src/redux/user/actions.js
@@ -40,9 +40,10 @@ export const cropAShot = payload => ({ type: ACTIONS.CROP_A_SHOT, ...payload });
export const setProvider = provider => ({ type: ACTIONS.SET_PROVIDER, provider });
-export const setDialog = ({ dialog, dialog_active }) => ({ type: ACTIONS.SET_DIALOG, dialog });
+export const setDialog = dialog => ({ type: ACTIONS.SET_DIALOG, dialog });
+export const setDialogActive = dialog_active => ({ type: ACTIONS.SET_DIALOG_ACTIVE, dialog_active });
+
export const locationChanged = location => ({ type: ACTIONS.LOCATION_CHANGED, location });
export const setReady = ready => ({ type: ACTIONS.SET_READY, ready });
-
export const gotVkUser = user => ({ type: ACTIONS.GOT_VK_USER, user });
diff --git a/src/redux/user/constants.js b/src/redux/user/constants.js
index 0616175..fe75bb8 100644
--- a/src/redux/user/constants.js
+++ b/src/redux/user/constants.js
@@ -42,6 +42,7 @@ export const ACTIONS = ({
SET_PROVIDER: 'SET_PROVIDER',
SET_DIALOG: 'SET_DIALOG',
+ SET_DIALOG_ACTIVE: 'SET_DIALOG_ACTIVE',
LOCATION_CHANGED: 'LOCATION_CHANGED',
SET_READY: 'SET_READY',
diff --git a/src/redux/user/reducer.js b/src/redux/user/reducer.js
index 6e85774..8767696 100644
--- a/src/redux/user/reducer.js
+++ b/src/redux/user/reducer.js
@@ -78,10 +78,16 @@ const setRenderer = (state, { payload }) => ({
const setProvider = (state, { provider }) => ({ ...state, provider });
-const setDialog = (state, { dialog, dialog_active }) => ({
+const setDialog = (state, { dialog }) => ({
...state,
- dialog: dialog || state.dialog,
- dialog_active: typeof dialog_active !== 'undefined' ? dialog_active : !state.dialog_active,
+ dialog,
+ // dialog_active: typeof dialog_active !== 'undefined' ? dialog_active : !state.dialog_active,
+ // dialog_active,
+});
+
+const setDialogActive = (state, { dialog_active }) => ({
+ ...state,
+ dialog_active: dialog_active || !state.dialog_active,
});
const setReady = (state, { ready = true }) => ({
@@ -114,6 +120,7 @@ const HANDLERS = ({
[ACTIONS.SET_PROVIDER]: setProvider,
[ACTIONS.SET_DIALOG]: setDialog,
+ [ACTIONS.SET_DIALOG_ACTIVE]: setDialogActive,
[ACTIONS.SET_READY]: setReady,
}: { [key: String]: Function });
diff --git a/src/styles/dialogs.less b/src/styles/dialogs.less
index c5cd105..bfe5045 100644
--- a/src/styles/dialogs.less
+++ b/src/styles/dialogs.less
@@ -38,6 +38,11 @@
display: flex;
flex-direction: column;
+
+ a {
+ color: white;
+ opacity: 0.8;
+ }
}
.dialog-shader {
@@ -125,3 +130,71 @@
font-size: 20px;
text-transform: uppercase;
}
+
+.app-info-changelog {
+ color: white;
+ padding: 10px;
+ font-size: 0.8em;
+
+ div {
+ opacity: 0.8;
+ }
+}
+
+.app-info-number {
+ width: 16px;
+}
+
+.app-info-changelog-item {
+ text-transform: uppercase;
+ display: flex;
+ flex: 1;
+
+ .app-info-current {
+ font-size: 0.9em;
+ opacity: 0.3;
+ display: inline;
+ padding-left: 10px;
+ }
+}
+
+.app-info-version {
+ padding-bottom: 5px;
+ flex: 1;
+ flex-direction: column-reverse;
+}
+
+.app-info-release {
+ padding-bottom: 5px;
+ display: flex;
+ flex: 1;
+}
+
+.app-info-build {
+ padding-bottom: 5px;
+ display: flex;
+ flex-direction: column-reverse;
+ flex: 1;
+}
+
+.app-info-change {
+ display: flex;
+ flex-direction: row;
+ padding-bottom: 5px;
+
+ .app-info-number {
+ width: 20px;
+ }
+
+ span {
+ flex: 1;
+ }
+}
+
+.app-info-list {
+ padding: 10px 0;
+
+ div {
+ padding: 2.5px 0;
+ }
+}
diff --git a/src/styles/main.less b/src/styles/main.less
index cba184a..185856a 100644
--- a/src/styles/main.less
+++ b/src/styles/main.less
@@ -117,3 +117,12 @@ body {
@media (max-width: @mobile_breakpoint) {
.desktop-only { display: none; }
}
+
+
+h2 {
+ font: inherit;
+ font-size: 18px;
+ font-weight: 400;
+ text-transform: uppercase;
+ margin: 10px 0;
+}
diff --git a/src/styles/panel.less b/src/styles/panel.less
index c46923f..f19bc83 100644
--- a/src/styles/panel.less
+++ b/src/styles/panel.less
@@ -164,9 +164,8 @@
}
.panel-user {
- z-index: 1;
-
@media (max-width: @mobile_breakpoint) {
+ z-index: 1;
flex-direction: column-reverse;
.control-sep {