Commit a573a6b5 by talequale

merge

parents 0676d24c 01e21767
......@@ -20,6 +20,12 @@ const fs = require( 'fs' );
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){
var fileName = dir(pack.src, pack.entry.js);
......@@ -30,10 +36,12 @@ const serveBundle = async function(tpl, res){
return res.end(err.message);
}
const cacheEntry = posixName;//+new Date()+'_'+Math.random().toString(36).substr(2)
updateCommitInfo();
res.end(tpl
//.replace('$DATA$', JSON.stringify(data))
.replace('$BUNDLE$',
'<script src="'+cacheEntry+'"></script>')
.replace('$COMMIT$', '<script>var CommitID = "'+commit+'";</script>')
);
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 = {
post(url, data, cb){
post(url, data, cb, cfg){
let stringData='';
try{
stringData = JSON.stringify(data);
cfg = transformCfg(cfg || {});
cfg.url = url;
const xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
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;
}
};
xhrProceed("POST", xhr, cfg, cb);
xhr.send(stringData);
}catch (e) {
/* HeaderModel.statusNotification.statuses.push({type: 'error'});
......@@ -46,39 +64,12 @@ export const Ajax = {
}
},
get(url, cb){
get(url, cb, cfg){
try{
cfg = transformCfg(cfg || {});
cfg.url = url;
const xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
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"});
}
};
xhrProceed("GET", xhr, cfg, cb);
xhr.send(null);
}catch (e) {
/*HeaderModel.statusNotification.statuses.push({type: 'error'});
......@@ -91,7 +82,7 @@ export const Ajax = {
}
};
export const AsyncAjax = {
get(url) {
get(url, cfg) {
return new Promise(function(resolve, reject) {
Ajax.get(url, function(err, data) {
if(err){
......@@ -99,10 +90,10 @@ export const AsyncAjax = {
}else{
resolve(data);
}
})
}, cfg)
});
},
post(url, data){
post(url, data, cfg){
return new Promise(function(resolve, reject) {
Ajax.post(url, data, function(err, data) {
if(err){
......@@ -110,7 +101,7 @@ export const AsyncAjax = {
}else{
resolve(data);
}
})
}, cfg)
});
}
};
\ No newline at end of file
......@@ -15,8 +15,8 @@
<script src="core/data/store/Store.js"></script>
$COMMIT$
<script src="model/Store.js"></script>
$BUNDLE$
</head>
<body>
......
......@@ -3,21 +3,23 @@ import './view/page/account/WelcomePage.jsx';
import './view/page/account/Account.jsx';
import './view/page/tmp/Fields.jsx';
import './view/cmp/switch/Switch.jsx';
import Header from './view/block/header/Header.jsx';
import "/global-styles/base.scss";
import { Switch } from "./view/cmp/switch/Switch";
import {Page} from "./view/page/Page";
export default function() {
let tagField, exportEl;
let dom = <div renderTo={document.body} cls="page-content">
<view.block.Header/>
{Switch({cls: 'page-content__inner', key: 'navigation.current'}, {
login: new view.page.Login(),
welcome: new view.page.WelcomePage(),
fields: new view.page.tmp.Fields(),
account: new view.page.Account()
})}
{Switch({cls: 'page-content__inner', key: 'navigation.current'},
Object.keys(Page).reduce((store, pageName)=>{
store[pageName] = new Page[pageName]();
return store;
}, {})
)}
</div>;
};
......
const store = new Store({
commit: window.CommitID,
'navigation': {
current: 'login'
},
'account': {
userID: 5,
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({
try{
var data = JSON.parse( localStorage.getItem( 'store' ) );
window.addEventListener && console.log(data)
for(var k in data){
store.set(k, data[k]);
if(window.CommitID !== store.get('commit')){
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 ){}
store.on('change', function() {
......
......@@ -3,6 +3,7 @@ import Button from "/view/cmp/button/Button.jsx";
import Logo from '/svg/logo.svg';
import User from "/svg/user.svg";
import Logout from "/svg/logout.svg";
import { Page } from "../../page/Page";
const {IF, NOT} = Store;
export default D.declare('view.block.Header', () => {
......@@ -12,10 +13,7 @@ export default D.declare('view.block.Header', () => {
})} >
<div class="button-temp">
{
[
'login',
'welcome','fields', 'account'
].map(name=>
Object.keys(Page).map(name=>
<button type={'button'} onClick={() => store.set('navigation.current', name)}>{name}</button>
)
}
......
......@@ -44,4 +44,5 @@ Switch.Item = function(cfg, children) {
export const Item = Switch.Item;
export default Switch;
\ No newline at end of file
export default Switch;
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';
import User from "/svg/user.svg";
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">
<h1 class="readers-only">Страница личного кабинета сотрудника</h1>
<div class="account-page__wrapper">
......@@ -72,4 +72,7 @@ export default D.declare('view.page.Account', () => {
</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';
import Arr from '/svg/arr.svg';
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__wrapper">
<Info
......@@ -199,4 +199,8 @@ export default D.declare('view.page.WelcomePage', () =>
</Info>
</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';
import LoginCode from './LoginCode.jsx';
const {AND, OR, IF} = Store;
export default D.declare('view.page.Login', () => {
const Login = D.declare('view.page.Login', () => {
const loginStore = new Store({
phone: '79991112233',
phone: '79999877415',
code: '',
codeValid: false,
active: 'enterPhone',
......@@ -46,4 +46,7 @@ export default D.declare('view.page.Login', () => {
</form>
</IF>
</div>
})
});
export default Login;
export {Login};
......@@ -4,9 +4,10 @@ import { API } from "/dict/Consts.jsx";
import Arr from '/svg/arr.svg';
const {AND, OR, IF} = Store;
export default D.declare('view.page.LoginCode', ({loginStore}) => {
const LoginCode = D.declare('view.page.LoginCode', ({loginStore}) => {
const checkCode = function () {
loginStore.set('codeChecking', true);
loginStore.set('codeError', false);
try{
}catch(e){
......@@ -42,3 +43,6 @@ export default D.declare('view.page.LoginCode', ({loginStore}) => {
</Button>
</>
});
export default LoginCode;
export {LoginCode};
\ No newline at end of file
......@@ -4,10 +4,12 @@ import { API } from "/dict/Consts.jsx";
import Arr from '/svg/arr.svg';
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() {
loginStore.set('phoneChecking', true);
loginStore.set('phoneError', false);
try{
const result = await AsyncAjax.post( API.ENDPOINTS.CHECK_PHONE(), {
phone: loginStore.get('phone')
......@@ -54,3 +56,6 @@ export default D.declare('view.page.LoginPhone', ({loginStore}) => {
</Button>
</>
});
export default LoginPhone;
export {LoginPhone};
\ No newline at end of file
......@@ -2,7 +2,8 @@ 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";
export default D.declare('view.page.tmp.Fields', () => {
const Fields = D.declare('view.page.tmp.Fields', () => {
var data = new Store({
phone: '',
phone3: '7',
......@@ -50,3 +51,6 @@ export default D.declare('view.page.tmp.Fields', () => {
</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