Commit 728c59f9 by talequale

merge

parents 3d166b91 0fd93e90
...@@ -66,5 +66,22 @@ img { ...@@ -66,5 +66,22 @@ img {
font-family: monospace; font-family: monospace;
padding: 0 32px 16px; padding: 0 32px 16px;
color: #ccdde8; color: #ccdde8;
font-size: 16px;
} }
} }
.log-block {
background: #ccdde8;
div {
white-space: pre;
font-family: monospace;
padding: 0 32px 16px;
color: #194965;
font-size: 14px;
}
}
.test-request-block {
padding: 0 32px 16px;
}
\ No newline at end of file
...@@ -22,6 +22,12 @@ export default function() { ...@@ -22,6 +22,12 @@ export default function() {
}, {}) }, {})
)} )}
</div>; </div>;
const w = window;
w.addEventListener('resize', function() {
store.set({
isMobile: w.innerWidth < 1025
});
});
}; };
let latest; let latest;
const store = new Store(latest = { const store = new Store(latest = {
commit: window.CommitID, commit: window.CommitID,
isMobile: false,
'navigation': { 'navigation': {
current: 'Login' current: 'Login'
}, },
......
...@@ -8,11 +8,23 @@ const AccountBlock = D.declare('view.block.AccountBlock', () => { ...@@ -8,11 +8,23 @@ const AccountBlock = D.declare('view.block.AccountBlock', () => {
<div class="account__info"> <div class="account__info">
<h3 class="account__name"> <h3 class="account__name">
<User width="32" height="32"/> <User width="32" height="32"/>
<span>{'Ким Ир Сен Константин Му Константинович Константинопольский'.split(/\s/).map(word => <div <span>
cls="title-name-word">{word}</div>)}</span> {(update)=>store.sub([
'account.data.firstname',
'account.data.middlename',
'account.data.lastname'
], (f, m, l)=>
update(
[l,f,m]
.join(' ')
.split(/\s+/)
.map(word => <div class="title-name-word">{word}</div>)
)
)}
</span>
</h3> </h3>
<p>Химки-2</p> <p>{store.val('account.data.location')}</p>
<p>Кассир</p> <p>{store.val('account.data.position.title')}</p>
</div> </div>
<div class="account__rating"> <div class="account__rating">
<Rating/> <Rating/>
......
...@@ -8,6 +8,27 @@ import { Page } from "../../page/Page"; ...@@ -8,6 +8,27 @@ import { Page } from "../../page/Page";
const {IF, NOT} = Store; const {IF, NOT} = Store;
const Header = D.declare('view.block.Header', () => { const Header = D.declare('view.block.Header', () => {
const tempPageMenuHidden = new Store.Value.Boolean(true); const tempPageMenuHidden = new Store.Value.Boolean(true);
const actions = {
logo: 'Account',
logout: function() {
store.set('account.token', false);
store.set('account.data', false);
},
profile: 'Profile'
};
store.sub('isMobile', (is)=> actions.profile = is ? 'Profile': 'Account');
const action = function(name) {
if(store.get('isTesting')){
// TODO SHOW MODAL
}else{
if(typeof actions[name] === 'function'){
actions[name]();
}else{
store.set( 'navigation.current', actions[name]);
}
}
};
return <header class={D.cls( return <header class={D.cls(
"page-header", { "page-header", {
"page-header--inner": (NOT(store.valEqual( 'navigation.current', 'Login'))) "page-header--inner": (NOT(store.valEqual( 'navigation.current', 'Login')))
...@@ -32,20 +53,25 @@ const Header = D.declare('view.block.Header', () => { ...@@ -32,20 +53,25 @@ const Header = D.declare('view.block.Header', () => {
</div> </div>
<IF condition={NOT(store.valEqual( 'navigation.current', 'Login'))}> <IF condition={NOT(store.valEqual( 'navigation.current', 'Login'))}>
<div className="page-header__wrapper"> <div className="page-header__wrapper">
<a href="#" class="page-header__logo" aria-label={"Логотип ВкусВилл"}> <Button class={"button page-header__logo-link page-header__logo"}
aria-label={"Перейти на главную страницу"}
onClick={()=>action('logo')}>
<Logo width="116" height="41"/> <Logo width="116" height="41"/>
</a> </Button>
<div class="page-header__user-block"> <div class="page-header__user-block">
<Button class={"button page-header__profile-link"} <Button class={"button page-header__profile-link"}
type={"button"}
aria-label={"Перейти на страницу профиля"} aria-label={"Перейти на страницу профиля"}
> onClick={()=>action('profile')}>
<User width="32" height="32"/><span>Иванов Иван</span> <User width="32" height="32"/>
<span>
{store.val('account.data.lastname')}{' '}
{store.val('account.data.firstname')}
</span>
</Button> </Button>
<Button class={"button page-header__logout-link"} <Button class={"button page-header__logout-link"}
type={"button"}
aria-label={"Выйти из аккаунта"} aria-label={"Выйти из аккаунта"}
> onClick={()=>action('logout')}>
<Logout width="18" height="18"/><span>Выйти</span> <Logout width="18" height="18"/><span>Выйти</span>
</Button> </Button>
</div> </div>
......
import './button.scss'; import './button.scss';
export default D.declare('view.cmp.Button', function(cfg, children) { export default D.declare('view.cmp.Button', function(cfg, children) {
return <button type={'button' || cfg.type} class={'button'} {...cfg}>{children}</button> return <button type={cfg.type || 'button'} class={'button'} {...cfg}>{children}</button>
}); });
import './Field.scss'; import './Field.scss';
import Input from './Input.jsx'; import Input from './Input.jsx';
export default D.declare('view.cmp.field.LabeledField', (cfg, children)=> { const LabeledField = D.declare('view.cmp.field.LabeledField', (cfg, children)=> {
return <div class={D.cls( "field", cfg.cls, { "field--invalid": cfg.invalid } )}> return <div class={D.cls( "field", cfg.cls, { "field--invalid": cfg.invalid } )}>
<label class="field__label"> <label class="field__label">
<span class="field__label-text">{cfg.label}</span> <span class="field__label-text">{cfg.label}</span>
...@@ -9,4 +9,7 @@ export default D.declare('view.cmp.field.LabeledField', (cfg, children)=> { ...@@ -9,4 +9,7 @@ export default D.declare('view.cmp.field.LabeledField', (cfg, children)=> {
</label> </label>
{children} {children}
</div> </div>
}) });
export default LabeledField;
export {LabeledField};
\ No newline at end of file
...@@ -5,6 +5,13 @@ import Eye from '/svg/eye.svg'; ...@@ -5,6 +5,13 @@ import Eye from '/svg/eye.svg';
import '../../block/card/card.scss'; import '../../block/card/card.scss';
const Account = D.declare('view.page.Account', () => { const Account = D.declare('view.page.Account', () => {
store.sub([
'isMobile', 'navigation.current'
], (is, page)=>{
if(!is && page === 'Profile')
store.set('navigation.current', '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">
......
...@@ -39,11 +39,16 @@ const Login = D.declare('view.page.Login', () => { ...@@ -39,11 +39,16 @@ const Login = D.declare('view.page.Login', () => {
loginStore.set({phone}) loginStore.set({phone})
}else{ }else{
const result = await AsyncAuthAjax.get( API.ENDPOINTS.GET_USER( store.get( 'account.userID' ) ) ); const result = await AsyncAuthAjax.get( API.ENDPOINTS.GET_USER( store.get( 'account.userID' ) ) );
store.set( 'account.data', result ); if(store.get('account.data') &&
if( result.lastLoginAt ){ store.get('navigation.current') !== 'Login'){
store.set( 'navigation.current', 'Account' );
}else{ }else{
store.set( 'navigation.current', 'Welcome' ); store.set( 'account.data', result );
if( result.lastLoginAt ){
store.set( 'navigation.current', 'Account' );
}else{
store.set( 'navigation.current', 'Welcome' );
}
} }
} }
}); });
......
...@@ -5,14 +5,38 @@ import Input from "../../cmp/field/Input"; ...@@ -5,14 +5,38 @@ import Input from "../../cmp/field/Input";
import { AsyncAuthAjax } from "../../../controller/Ajax"; import { AsyncAuthAjax } from "../../../controller/Ajax";
import {API} from "../../../dict/Consts"; import {API} from "../../../dict/Consts";
const TestRequests = D.declare('view.page.tmp.TestRequests', () => { const TestRequests = D.declare('view.page.tmp.TestRequests', () => {
let response;
return <div> return <div style={{padding: '16px'}}>
Курвалол <h1>Testing requests</h1>
<button onclick={async()=>{
const result = await AsyncAuthAjax.get(API.ENDPOINTS.GET_USER(store.get('account.userID')));
response.innerText = JSON.stringify(result, null, 2); {((response, s = new Store({id: store.get('account.userID')}))=>
}}>Get user</button> <div class='test-request-block'>
<div className='error-block'>{response = <div></div>}</div> <LabeledField bind={s.bind('id')} label={'User ID'}/>
<button onClick={async() => {
const result = await AsyncAuthAjax.get( API.ENDPOINTS.GET_USER( s.get( 'id' ) ) );
response.innerText = JSON.stringify( result, null, 2 );
}}>
Get user
</button>
<div className='log-block'>{response = <div/>}</div>
</div>)()}
{((response)=>
<div class='test-request-block'>
<button onClick={async() => {
const result = await AsyncAuthAjax.get( API.ENDPOINTS.GET_USER_NEW_CARDS() );
response.innerText = `${result.length} new cards.
`+JSON.stringify( result.slice(0,3), null, 2 )+'\n\n . . . . .\n\n'+
JSON.stringify( result.slice(result.length-3), null, 2 );
}}>
New cards
</button>
<div className='log-block'>{response = <div/>}</div>
</div>)()}
</div> </div>
}); });
......
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