Commit a573a6b5 by talequale

merge

parents 0676d24c 01e21767
...@@ -20,6 +20,12 @@ const fs = require( 'fs' ); ...@@ -20,6 +20,12 @@ const fs = require( 'fs' );
var cache = {}; var cache = {};
const {execSync} = require('child_process');
let commit;
const updateCommitInfo = function() {
commit = execSync('git rev-parse HEAD').toString().trim();
};
updateCommitInfo();
const serveBundle = async function(tpl, res){ const serveBundle = async function(tpl, res){
var fileName = dir(pack.src, pack.entry.js); var fileName = dir(pack.src, pack.entry.js);
...@@ -30,10 +36,12 @@ const serveBundle = async function(tpl, res){ ...@@ -30,10 +36,12 @@ const serveBundle = async function(tpl, res){
return res.end(err.message); return res.end(err.message);
} }
const cacheEntry = posixName;//+new Date()+'_'+Math.random().toString(36).substr(2) const cacheEntry = posixName;//+new Date()+'_'+Math.random().toString(36).substr(2)
updateCommitInfo();
res.end(tpl res.end(tpl
//.replace('$DATA$', JSON.stringify(data)) //.replace('$DATA$', JSON.stringify(data))
.replace('$BUNDLE$', .replace('$BUNDLE$',
'<script src="'+cacheEntry+'"></script>') '<script src="'+cacheEntry+'"></script>')
.replace('$COMMIT$', '<script>var CommitID = "'+commit+'";</script>')
); );
transformJSX(jsx+'', pack.entry.js, function(err, result) { transformJSX(jsx+'', pack.entry.js, function(err, result) {
......
import { AsyncAjax } from "/core/Ajax.jsx";
export { AsyncAjax } from "/core/Ajax.jsx";
export const AsyncAuthAjax = {
async get(url) {
if(!store.get('account.token'))
return false;
return await AsyncAjax.get(url, {
headers: {
authorization: 'Bearer ' + store.get( 'account.token' )
}
})
},
async post(url, data) {
if(!store.get('account.token'))
return false;
return await AsyncAjax.post(url, data, {
headers: {
authorization: 'Bearer ' + store.get( 'account.token' )
}
})
}
};
\ No newline at end of file
const transformCfg = function(cfg) {
return {
...cfg,
headers: {
'Content-Type': 'application/json',
...(cfg && cfg.headers || {})
}
}
};
const xhrProceed = function(method, xhr, cfg, cb) {
xhr.open(method, cfg.url, true);
for(let key in cfg.headers){
xhr.setRequestHeader(key, cfg.headers[key]);
}
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
let json;
try {
json = JSON.parse(xhr.responseText);
cb && cb(false, json);
}catch (e) {
console.error('AJAX:'+ method +' Incorrect Response ← '+cfg.url, xhr.responseText, e);
cb && cb(true, e);
}
}else if(xhr.status === 404){
cb && cb(true);
}else if(xhr.status === 401){
//Пользователь не авторизован
window.location.href = "/login";
return;
}else if(xhr.status === 403){
//Нет доступа к ассистенту
window.location.href = "/";
return;
}else if (xhr.status >= 400){
/*HeaderModel.statusNotification.statuses.push({type: 'error'});
setTimeout(function () {
HeaderModel.statusNotification.statuses.length = 0;
}, 3000);*/
cb && cb(true, {"status":"error"});
return;
}
};
};
export const Ajax = { export const Ajax = {
post(url, data, cb){ post(url, data, cb, cfg){
let stringData=''; let stringData='';
try{ try{
stringData = JSON.stringify(data); stringData = JSON.stringify(data);
cfg = transformCfg(cfg || {});
cfg.url = url;
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open("POST", url, true); xhrProceed("POST", xhr, cfg, cb);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
let json;
try {
json = JSON.parse(xhr.responseText);
cb && cb(false, json);
}catch (e) {
console.error('AJAX:POST Incorrect Response ← '+url, xhr.responseText, e);
cb && cb(true, e);
}
}else if(xhr.status === 404){
cb && cb(true);
}else if(xhr.status === 401){
//Пользователь не авторизован
window.location.href = "/login";
return;
}else if(xhr.status === 403){
//Нет доступа к ассистенту
window.location.href = "/";
return;
}else if (xhr.status >= 400){
/*HeaderModel.statusNotification.statuses.push({type: 'error'});
setTimeout(function () {
HeaderModel.statusNotification.statuses.length = 0;
}, 3000);*/
cb && cb(true, {"status":"error"});
return;
}
};
xhr.send(stringData); xhr.send(stringData);
}catch (e) { }catch (e) {
/* HeaderModel.statusNotification.statuses.push({type: 'error'}); /* HeaderModel.statusNotification.statuses.push({type: 'error'});
...@@ -46,39 +64,12 @@ export const Ajax = { ...@@ -46,39 +64,12 @@ export const Ajax = {
} }
}, },
get(url, cb){ get(url, cb, cfg){
try{ try{
cfg = transformCfg(cfg || {});
cfg.url = url;
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open("GET", url, true); xhrProceed("GET", xhr, cfg, cb);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
let json;
try {
json = JSON.parse(xhr.responseText);
cb && cb(false, json);
}catch (e) {
console.error('AJAX:GET Incorrect Response ← '+url, xhr.responseText, e);
cb && cb(true, e);
}
}else if(xhr.status === 404){
cb && cb(true);
}else if(xhr.status === 401){
//Пользователь не авторизован
window.location.href = "/login";
return;
}else if(xhr.status === 403){
//Нет доступа к ассистенту
window.location.href = "/";
return;
} else if (xhr.status >= 400){
/*HeaderModel.statusNotification.statuses.push({type: 'error'});
setTimeout(function () {
HeaderModel.statusNotification.statuses.length = 0;
}, 3000);*/
cb && cb(true, {"status":"error"});
}
};
xhr.send(null); xhr.send(null);
}catch (e) { }catch (e) {
/*HeaderModel.statusNotification.statuses.push({type: 'error'}); /*HeaderModel.statusNotification.statuses.push({type: 'error'});
...@@ -91,7 +82,7 @@ export const Ajax = { ...@@ -91,7 +82,7 @@ export const Ajax = {
} }
}; };
export const AsyncAjax = { export const AsyncAjax = {
get(url) { get(url, cfg) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
Ajax.get(url, function(err, data) { Ajax.get(url, function(err, data) {
if(err){ if(err){
...@@ -99,10 +90,10 @@ export const AsyncAjax = { ...@@ -99,10 +90,10 @@ export const AsyncAjax = {
}else{ }else{
resolve(data); resolve(data);
} }
}) }, cfg)
}); });
}, },
post(url, data){ post(url, data, cfg){
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
Ajax.post(url, data, function(err, data) { Ajax.post(url, data, function(err, data) {
if(err){ if(err){
...@@ -110,7 +101,7 @@ export const AsyncAjax = { ...@@ -110,7 +101,7 @@ export const AsyncAjax = {
}else{ }else{
resolve(data); resolve(data);
} }
}) }, cfg)
}); });
} }
}; };
\ No newline at end of file
...@@ -15,8 +15,8 @@ ...@@ -15,8 +15,8 @@
<script src="core/data/store/Store.js"></script> <script src="core/data/store/Store.js"></script>
$COMMIT$
<script src="model/Store.js"></script> <script src="model/Store.js"></script>
$BUNDLE$ $BUNDLE$
</head> </head>
<body> <body>
......
...@@ -3,21 +3,23 @@ import './view/page/account/WelcomePage.jsx'; ...@@ -3,21 +3,23 @@ import './view/page/account/WelcomePage.jsx';
import './view/page/account/Account.jsx'; import './view/page/account/Account.jsx';
import './view/page/tmp/Fields.jsx'; import './view/page/tmp/Fields.jsx';
import './view/cmp/switch/Switch.jsx';
import Header from './view/block/header/Header.jsx'; import Header from './view/block/header/Header.jsx';
import "/global-styles/base.scss"; import "/global-styles/base.scss";
import { Switch } from "./view/cmp/switch/Switch";
import {Page} from "./view/page/Page";
export default function() { export default function() {
let tagField, exportEl; let tagField, exportEl;
let dom = <div renderTo={document.body} cls="page-content"> let dom = <div renderTo={document.body} cls="page-content">
<view.block.Header/> <view.block.Header/>
{Switch({cls: 'page-content__inner', key: 'navigation.current'}, { {Switch({cls: 'page-content__inner', key: 'navigation.current'},
login: new view.page.Login(), Object.keys(Page).reduce((store, pageName)=>{
welcome: new view.page.WelcomePage(), store[pageName] = new Page[pageName]();
fields: new view.page.tmp.Fields(), return store;
account: new view.page.Account() }, {})
})} )}
</div>; </div>;
}; };
......
const store = new Store({ const store = new Store({
commit: window.CommitID,
'navigation': { 'navigation': {
current: 'login' current: 'login'
}, },
'account': { 'account': {
userID: 5,
name: 'Диогроген Курославович', name: 'Диогроген Курославович',
phone: '79999877414' phone: '79999877414',
token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE1ODAzMDg0NTcsImV4cCI6MTU4MDM5NDg1Nywicm9sZXMiOlsiUk9MRV9BRE1JTiIsIlJPTEVfRU1QTE9ZRUUiXSwicGhvbmUiOiI3OTk5OTg3NzQxNCIsImlkIjo1fQ.yt7LqaBkHZ_YFXg4WV8LRrm6eW9RdBjFbWNlLBYJXDyFPKjeVuR9PTGwnZdztqRxnGEKc60FnZfqpf52rfTdgkZWuuy_jXQbxfUzRvuD2GHPd4Ds12ucQnbij71-Rv0d8mA4L3EzbEQzMfSwoQsjhY6PXmhHRft4mSuXm0Cx4cn7ms92gTBFGbSWA-Ru395jTcaTpWdpAyIQFCMwAyQ1zQDRwsYc4RPPVKTH2BhkGVLVWlMDh_D22kduV-zcEzxEAFvOf6HhctsYBaasByhXIHVKQUcSKjA5bz_eftW7XQWeer0gQNR3OLRP9Qo7INL8GnhVhGEuu5UL6x0JJ9FeutOhZ4xa0jOqwzmYRcTMP63LbWNoSGHgn-UY14yG_O31Ij0wDNS-VqhCoVB1IdGawWX_p3eKLuUvCX38ZLs3cAIU1vmHlF--0KNSwo3OeYj-U9R8tWPi-zkUDw29ZAM1wu38uXI4_bw_UG2g53cSdjxuIQw8sLmAp7EF-6R1q28YQecqVKm-d8VgVeVAh8ueicFeejSzgax-3GRjHR9Kudqgxescas6rm6g5iV_-73VUXrn-8rvg2vXuB3nF-7X-SWV2gKFBP9u0hTGMBeseODyjohN3bWjnfPWU0rWhwNUsPIJabzg0iICv4a5li507TCaHg025HEa2V2mayj0wkk8'
} }
}); });
...@@ -13,8 +16,25 @@ const store = new Store({ ...@@ -13,8 +16,25 @@ const store = new Store({
try{ try{
var data = JSON.parse( localStorage.getItem( 'store' ) ); var data = JSON.parse( localStorage.getItem( 'store' ) );
window.addEventListener && console.log(data) window.addEventListener && console.log(data)
for(var k in data){ if(window.CommitID !== store.get('commit')){
store.set(k, data[k]); console.warn('STORE: warn outdated:');
console.warn('\t\tCurrent data: '+ store.get('commit'), store._props);
console.warn('\t\tSaved data: '+ window.CommitID, data);
console.warn('\tRun restoreStore() for restore saved state');
window.restoreStore = function() {
for( var k in data ){
if(k !== 'commit'){
store.set( k, data[ k ] );
}
}
};
}else{
for( var k in data ){
store.set( k, data[ k ] );
}
console.log('STORE: loaded from localStorage');
} }
}catch( e ){} }catch( e ){}
store.on('change', function() { store.on('change', function() {
......
...@@ -3,6 +3,7 @@ import Button from "/view/cmp/button/Button.jsx"; ...@@ -3,6 +3,7 @@ import Button from "/view/cmp/button/Button.jsx";
import Logo from '/svg/logo.svg'; import Logo from '/svg/logo.svg';
import User from "/svg/user.svg"; import User from "/svg/user.svg";
import Logout from "/svg/logout.svg"; import Logout from "/svg/logout.svg";
import { Page } from "../../page/Page";
const {IF, NOT} = Store; const {IF, NOT} = Store;
export default D.declare('view.block.Header', () => { export default D.declare('view.block.Header', () => {
...@@ -12,10 +13,7 @@ export default D.declare('view.block.Header', () => { ...@@ -12,10 +13,7 @@ export default D.declare('view.block.Header', () => {
})} > })} >
<div class="button-temp"> <div class="button-temp">
{ {
[ Object.keys(Page).map(name=>
'login',
'welcome','fields', 'account'
].map(name=>
<button type={'button'} onClick={() => store.set('navigation.current', name)}>{name}</button> <button type={'button'} onClick={() => store.set('navigation.current', name)}>{name}</button>
) )
} }
......
...@@ -44,4 +44,5 @@ Switch.Item = function(cfg, children) { ...@@ -44,4 +44,5 @@ Switch.Item = function(cfg, children) {
export const Item = Switch.Item; export const Item = Switch.Item;
export default Switch; export default Switch;
\ No newline at end of file export {Switch};
\ No newline at end of file
import * as Pages from './index';
export {Pages as Page};
\ No newline at end of file
...@@ -2,7 +2,7 @@ import './accountPage.scss'; ...@@ -2,7 +2,7 @@ import './accountPage.scss';
import User from "/svg/user.svg"; import User from "/svg/user.svg";
import Rating from '../../block/ratingBlock/Rating.jsx'; import Rating from '../../block/ratingBlock/Rating.jsx';
export default D.declare('view.page.Account', () => { const Account = D.declare('view.page.Account', () => {
return <div class="account-page"> return <div class="account-page">
<h1 class="readers-only">Страница личного кабинета сотрудника</h1> <h1 class="readers-only">Страница личного кабинета сотрудника</h1>
<div class="account-page__wrapper"> <div class="account-page__wrapper">
...@@ -72,4 +72,7 @@ export default D.declare('view.page.Account', () => { ...@@ -72,4 +72,7 @@ export default D.declare('view.page.Account', () => {
</div> </div>
</div> </div>
</div> </div>
}) });
export default Account;
export {Account};
\ No newline at end of file
...@@ -3,7 +3,7 @@ import Button from '/view/cmp/button/Button.jsx'; ...@@ -3,7 +3,7 @@ import Button from '/view/cmp/button/Button.jsx';
import Arr from '/svg/arr.svg'; import Arr from '/svg/arr.svg';
import './welcomePage.scss'; import './welcomePage.scss';
export default D.declare('view.page.WelcomePage', () => const WelcomePage = D.declare('view.page.WelcomePage', () =>
<div class="welcome-page"> <div class="welcome-page">
<div class="welcome-page__wrapper"> <div class="welcome-page__wrapper">
<Info <Info
...@@ -199,4 +199,8 @@ export default D.declare('view.page.WelcomePage', () => ...@@ -199,4 +199,8 @@ export default D.declare('view.page.WelcomePage', () =>
</Info> </Info>
</div> </div>
</div> </div>
) );
export default WelcomePage;
export {WelcomePage};
export {Account} from "./account/Account";
export {WelcomePage} from "./account/WelcomePage";
export {Login} from "./login/Login";
//export {LoginPhone} from "./login/LoginPhone";
//export {LoginCode} from "./login/LoginCode";
export {Fields} from "./tmp/Fields";
export {TestRequests} from "./tmp/TestRequests";
\ No newline at end of file
...@@ -9,9 +9,9 @@ import LoginPhone from './LoginPhone.jsx'; ...@@ -9,9 +9,9 @@ import LoginPhone from './LoginPhone.jsx';
import LoginCode from './LoginCode.jsx'; import LoginCode from './LoginCode.jsx';
const {AND, OR, IF} = Store; const {AND, OR, IF} = Store;
export default D.declare('view.page.Login', () => { const Login = D.declare('view.page.Login', () => {
const loginStore = new Store({ const loginStore = new Store({
phone: '79991112233', phone: '79999877415',
code: '', code: '',
codeValid: false, codeValid: false,
active: 'enterPhone', active: 'enterPhone',
...@@ -46,4 +46,7 @@ export default D.declare('view.page.Login', () => { ...@@ -46,4 +46,7 @@ export default D.declare('view.page.Login', () => {
</form> </form>
</IF> </IF>
</div> </div>
}) });
export default Login;
export {Login};
...@@ -4,9 +4,10 @@ import { API } from "/dict/Consts.jsx"; ...@@ -4,9 +4,10 @@ import { API } from "/dict/Consts.jsx";
import Arr from '/svg/arr.svg'; import Arr from '/svg/arr.svg';
const {AND, OR, IF} = Store; const {AND, OR, IF} = Store;
export default D.declare('view.page.LoginCode', ({loginStore}) => { const LoginCode = D.declare('view.page.LoginCode', ({loginStore}) => {
const checkCode = function () { const checkCode = function () {
loginStore.set('codeChecking', true); loginStore.set('codeChecking', true);
loginStore.set('codeError', false);
try{ try{
}catch(e){ }catch(e){
...@@ -42,3 +43,6 @@ export default D.declare('view.page.LoginCode', ({loginStore}) => { ...@@ -42,3 +43,6 @@ export default D.declare('view.page.LoginCode', ({loginStore}) => {
</Button> </Button>
</> </>
}); });
export default LoginCode;
export {LoginCode};
\ No newline at end of file
...@@ -4,10 +4,12 @@ import { API } from "/dict/Consts.jsx"; ...@@ -4,10 +4,12 @@ import { API } from "/dict/Consts.jsx";
import Arr from '/svg/arr.svg'; import Arr from '/svg/arr.svg';
const {AND, OR, IF} = Store; const {AND, OR, IF} = Store;
export default D.declare('view.page.LoginPhone', ({loginStore}) => { const LoginPhone = D.declare('view.page.LoginPhone', ({loginStore}) => {
const checkPhone = async function() { const checkPhone = async function() {
loginStore.set('phoneChecking', true); loginStore.set('phoneChecking', true);
loginStore.set('phoneError', false);
try{ try{
const result = await AsyncAjax.post( API.ENDPOINTS.CHECK_PHONE(), { const result = await AsyncAjax.post( API.ENDPOINTS.CHECK_PHONE(), {
phone: loginStore.get('phone') phone: loginStore.get('phone')
...@@ -54,3 +56,6 @@ export default D.declare('view.page.LoginPhone', ({loginStore}) => { ...@@ -54,3 +56,6 @@ export default D.declare('view.page.LoginPhone', ({loginStore}) => {
</Button> </Button>
</> </>
}); });
export default LoginPhone;
export {LoginPhone};
\ No newline at end of file
...@@ -2,7 +2,8 @@ import Button from "/view/cmp/button/Button.jsx"; ...@@ -2,7 +2,8 @@ import Button from "/view/cmp/button/Button.jsx";
import LabeledField from "../../cmp/field/LabeledField.jsx"; import LabeledField from "../../cmp/field/LabeledField.jsx";
import PhoneInput from "../../cmp/field/PhoneInput.jsx"; import PhoneInput from "../../cmp/field/PhoneInput.jsx";
import Input from "../../cmp/field/Input"; import Input from "../../cmp/field/Input";
export default D.declare('view.page.tmp.Fields', () => {
const Fields = D.declare('view.page.tmp.Fields', () => {
var data = new Store({ var data = new Store({
phone: '', phone: '',
phone3: '7', phone3: '7',
...@@ -50,3 +51,6 @@ export default D.declare('view.page.tmp.Fields', () => { ...@@ -50,3 +51,6 @@ export default D.declare('view.page.tmp.Fields', () => {
</div> </div>
</div> </div>
}); });
export default Fields;
export {Fields};
\ No newline at end of file
import Button from "/view/cmp/button/Button.jsx";
import LabeledField from "../../cmp/field/LabeledField.jsx";
import PhoneInput from "../../cmp/field/PhoneInput.jsx";
import Input from "../../cmp/field/Input";
import { AsyncAuthAjax } from "../../../controller/Ajax";
import {API} from "../../../dict/Consts";
const TestRequests = D.declare('view.page.tmp.TestRequests', () => {
let response;
return <div>
Курвалол
<button onclick={async()=>{
const result = await AsyncAuthAjax.get(API.ENDPOINTS.GET_USER(store.get('account.userID')));
response.innerText = JSON.stringify(result, null, 2);
}}>Get user</button>
<div className='error-block'>{response = <div></div>}</div>
</div>
});
export default TestRequests;
export {TestRequests};
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment