Commit a3b05e6e by Иван Кубота

Store aggregate function OR

parent 3f4e7c92
...@@ -177,4 +177,27 @@ StoreBinding.prototype = { ...@@ -177,4 +177,27 @@ StoreBinding.prototype = {
}; };
Store.prototype = Object.assign(new Observable, Store.prototype); Store.prototype = Object.assign(new Observable, Store.prototype);
Store.AND = function() {
};
Store.OR = function(...args) {
let composite, _i = args.length,
vals = new Array(_i);
return function(update) {
let check = ()=>{
let result = false;
for(let i = 0; i < _i; i++){
result = result || vals[i];
}
if(composite !== result)
update(composite = result);
};
for(let i = 0; i < _i; i++){
args[i]((val)=>{vals[i] = val;check();})
}
};
};
typeof module === 'object' && (module.exports = Store); typeof module === 'object' && (module.exports = Store);
\ No newline at end of file
const Consts = {
ANCHORS: {
EXIT: "#exit",
},
API: {
ENDPOINTS: {
// Auth Endpoints
SEND_CODE: "/api/login/send_code",
CHECK_CODE: "/api/login/check_code",
CHECK_PHONE: "/api/login/check_phone",
CHECK_ID_TOKEN: "/api/login/check_id_token",
// Testing Endpoints
GET_TESTING_LIST: "/api/quizzes",
PUT_TESTING_LIST: id => `/api/quizzes/${id}`,
GET_ACTIVE_TESTING: "/api/quiz/active",
CREATE_TESTING_ATTEMPT: "/api/quiz_attempt_create",
GET_TESTING_ATTEMPT: id => `/api/quiz_attempts/${id}`,
GET_TESTING_QUESTION: id => `/api/quiz_questions/${id}`,
SEND_QUESTION_ANSWERS: id => `/api/quiz_questions/${id}`,
INTERRUPT_TEST: id => `/api/quiz_attempt/abort/${id}`,
// Employees Endpoints
GET_USERS_LIST: "/api/users",
EDIT_USER: id => `/api/users/${id}`,
// Employee Positions
GET_POSITIONS: "/api/employee_positions",
// Knowledge Endpoints
GET_CARD_PRODUCTS: "/api/card_products",
GET_CARD_INFOS: "/api/card_infos",
GET_CARD_PRODUCTS_CARD: id => `/api/card_products/${id}`,
GET_CARD_INFO_CARD: id => `/api/card_infos/${id}`,
GET_CARD_INFO_ITEM: id => `/api/card_info_items/${id}`,
CATEGORIES_CATEGORY: id => `/api/categories/${id}`,
// Categories
GET_CATEGORIES: "/api/categories",
// Account Endpoints
GET_USER: id => `/api/users/${id}`,
GET_USER_NEW_CARDS: "/api/history/cards/new",
GET_USER_QUIZ_ATTEMPT_ID: "/api/quiz_attempt/last",
GET_USER_QUIZ_ATTEMPTS_BY_ID: id => `/api/quiz_attempts/${id}`,
},
HEADERS: {
DEFAULT: {
"Content-Type": "application/json",
},
},
DELAY: {
DEFAULT_MS: 1000,
FILTERS_MS: 500,
},
METHODS: {
GET: "GET",
POST: "POST",
PUT: "PUT",
DELETE: "DELETE",
},
STATUS_REQUEST: {
NONE: "NONE",
FETCHING: "FETCHING",
DONE: "DONE",
},
},
ENV: {
DEVELOPMENT: "development",
PRODUCTION: "production",
NODE_ENV: process.env.NODE_ENV,
IS_DEVELOPMENT: null,
BASE_URL: null,
},
ERRORS: {
API: {
NO_ENDPOINT: "NO_ENDPOINT",
},
},
DOM: {
ROOT: "root",
},
LOCAL_STORAGE: {
TOKEN: {
TOKEN: "token",
GET_TOKEN: null,
},
EMPLOYEE: {
IS_LOGGES_FIRST_TIME: "isLoggedFirstTime",
},
ROLES: "roles",
ROLE: "role",
USER_ID: "userId",
TESTING: {
QUESTION_NUMBER: "questionNumber",
ATTEMPT_ID: "attemptId",
TIMER_VALUE: "timerValue",
RESULT_ID: "resultId",
INTERRUPT_TEST: "interruptTest",
DURATION: 'duration'
},
},
ROLES: {
ADMIN: "ROLE_ADMIN",
VISITOR: "ROLE_VISITOR",
EMPLOYEE: "ROLE_EMPLOYEE",
},
ROUTES: {
MAIN: "/",
ADMIN: {
MAIN: "/admin",
EMPLOYEES: "/admin/employees",
CONTENTS: "/admin/contents",
TESTING: "/admin/testing",
STATISTICS: "/admin/statistics",
},
LOGIN: {
MAIN: "/login",
LOGIN_ENTRY: "/login/entry",
LOGIN_INFO: "/login/info",
CHANGE_ROLE: "/login/change_role",
},
EMPLOYEE: {
ACCOUNT: {
MAIN: "/account",
PERSONAL: "/account/personal",
GREETING: "/account/greeting",
},
TESTING: {
MAIN: "/account/testing",
TESTING_NOT_ACTIVATED: "/account/testing/not_activated",
TESTING_CONFIRMATION: "/account/testing/confirmation",
TESTING_TEST: questionId => `/account/testing/test/${questionId}`,
TESTING_HIGH_RESULT: "/account/testing/high_result",
TESTING_TOP_RESULT: "/account/testing/top_result",
TESTING_RESULT: "/account/testing/result",
TESTING_ANSWERS: "/account/testing/answers",
TESTING_FINISH: "/account/testing/finish",
TESTING_INTERRUPT: "/account/testing/interrupt",
MOCK_TESTING_HIGH_RESULT: "/account/mock/testing/high_result",
MOCK_TESTING_TOP_RESULT: "/account/mock/testing/top_result",
MOCK_TESTING_RESULT: "/account/mock/testing/result",
},
KNOWLEDGE_BASE: {
MAIN: "/account/knowledge_base",
KNOWLEDGE_BASE_TOP: categoryId => `/account/knowledge_base/top/${categoryId}`,
KNOWLEDGE_BASE_CARD: (categoryId, cardId) =>
`/account/knowledge_base/card/${categoryId}/${cardId}`,
},
},
},
PAGINATE: {
MAX_PAGES: 19,
},
TESTING: {
LIST: {
ITEMS_PER_PAGE: 20,
},
},
EMPLOYEES: {
LIST: {
ITEMS_PER_PAGE: 20,
},
},
POSITIONS: {
LIST: {
ITEMS_PER_PAGE: 20,
},
},
MODAL: {
EDIT: {
WIDTH: "1060px",
HEIGHT: "730px",
},
ACTIVATED: {
HEIGHT: "300px",
},
ERROR: {
HEIGHT: "420px",
},
CONFIRM: {
HEIGHT: "440px",
},
EDIT_CONFIRM: {
HEIGHT: "420px",
},
SMS: {
HEIGHT: "690px",
WIDTH: "1060px",
},
},
FORMS: {
INPUT: {
MAX_SIZE: 100,
},
},
DATE_FORMATS: {
DEFAULT: "dd.MM.yyyy",
MONTH_YEAR: "LLLL yyyy",
DAY_MONTH: "dd.MM",
},
}
Consts.LOCAL_STORAGE.TOKEN.GET_TOKEN = (token) => `Bearer ${token}`
Consts.ENV.IS_DEVELOPMENT = Consts.ENV.NODE_ENV === Consts.ENV.DEVELOPMENT
Consts.ENV.BASE_URL = 'https://api.local.vkusvill.testin.ru';/*Consts.ENV.IS_DEVELOPMENT
? `${window.location.protocol}//${window.location.hostname}`//${window.location.port!=="80"?':'+window.location.port:''}`
: window.location.origin*/
export default Consts
import Consts from "./Consts"
const Strings = {
ADMIN_MENU: [
{
id: 0,
name: "Список сотрудников",
link: Consts.ROUTES.ADMIN.EMPLOYEES,
},
{
id: 1,
name: "Управление контентом",
link: Consts.ROUTES.ADMIN.CONTENTS,
},
{
id: 2,
name: "Управление тестированием",
link: Consts.ROUTES.ADMIN.TESTING,
},
{
id: 3,
name: "Статистика",
link: Consts.ROUTES.ADMIN.STATISTICS,
},
],
AUTH: {
AUTH_PROBLEM: "Проблемы с авторизацией?",
AUTH_PROBLEM_TEXT: "Текст про то, куда писать и звонить",
AUTH_PROBLEM_PHONE: "8 800 000 00 00",
TO_LOGIN: "Вернуться к авторизации",
EXIT: "Выйти",
ROLES: {
ROLE_ADMIN: {
id: 1,
str: "Как администратор",
props: { arrow: true, theme: "submit", type: "button" },
},
ROLE_EMPLOYEE: {
id: 2,
str: "Как пользователь",
props: { arrow: "next", theme: "default", type: "button" },
},
},
CHOOSE_ROLE_TITLE: "Вы хотите войти как администратор или как пользователь?",
FORM_PHONE_LABEL: "Введите номер телефона, чтобы продолжить.",
FORM_LOGIN_LABEL: "Введите код из СМС",
WELLCOME: "Добро пожаловать в\u00A0\развивающую платформу Вкусвилл!",
},
BUTTONS: {
FARTHER: "Далее",
},
ERRORS: {
API: {
[Consts.ERRORS.API.NO_ENDPOINT]: "Такого endpoint не существует",
},
FIELDS: {
VALUE_MISSING: "Поле не заполнено",
MIN_VALUE: "Поле заполнено некорректно",
},
},
ACCOUNT: {
MAIN: {
NEW_CARDS: "Новые карточки для вашей должности:",
},
GREETING: {
HEADER: "Добро пожаловать!",
TEXT1: "Мы очень рады видеть вас во внутренней базе знаний ВкусВилла!\n",
TEXT2:
"Здесь собрана информация по всему ассортименту продуктов и правилам взаимодействия с покупателями.\n" +
"Для закрепления и проверки знаний можно всегда пройти интерактивное тестирование!\n" +
"\n" +
"**Вы будете одним из первых сотрудников получивших доступ к продукту находящемуся в разработке. Обязательно сообщайте о всех выявленных проблемах — мы постараемся как можно быстрее всё исправить.**",
},
PERSONAL_AREA: {
FINAL_TESTING: "Итоговое тестирование",
PASSED: "Пройдено",
YOU_HAVE_NOT_PASSED: "Вы еще не проходили итоговое тестирование",
PERSONAL_AREA: "Личный кабинет",
TODAY_YOU_CAN: "Сегодня вы можете",
NEW_CARDS_FOR_YOU_POST: "Новые карточки для вашей должности",
YOU_LOOKED_AT_ALL_THE_NEW_CARDS: "Вы просмотрели все новые карточки этого месяца.",
KEEP_IT_UP: "Так держать!",
BUTTONS: {
FINAL_TEST: "Пройти итоговое тестирование",
TRIAL_TEST: "Пройти пробное тестирование",
VIEW_KNOWLEDGE_BASE: "Посмотреть базу знаний",
},
},
TESTING: {
WELCOME: {
HEADER: "Добро пожаловать\\u00A0итоговое\nтестирование!",
TEXT1:
"Ассортимент наших магазинов постоянно расширяется и на главном экране появляются карточки с новыми товарами.\n\n"+
"Тестирование — это проверка вашей подготовки к работе с покупателями.\n" +
"Если не уверены в своих знаниях — потренеруйтесь на пробном тестировании.\n",
TEXT2: "Тестирование проходит в период: ",
},
NOT_ACTIVATED: {
ATTENTION: "Внимание!",
HEADER: "Тестирование не\u00A0активировано",
TEXT1:
"Текст про то, что тестирование еще не активировано. СТА -\n" +
"потренироваться на пробном тестировании.\n" +
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi\n" +
"lacinia augue quam, in dapibus nulla ullamcorper nec. Mauris\n" +
"ac magna est.",
},
CONFIRMATION: {
HEADER: "Тестирование невозможно прервать",
TEXT: "Это последнее предупреждение. Вы уверены, что\nготовы начать?",
},
RESULT: {
CONGRATULATION: "Поздравляем!",
RESULT: "Ваш результат:",
CORRECT_COUNT: "Вы верно ответили на",
HEADER: "Вы завершили тестирование!",
HEADER_TOP: "Вы вошли в ТОП лучших ответов!",
HEADER_BAD: "Тестирование завершено",
TEXT1:
"ТОП лучших ответов означает, что в следующем\n" +
"тестировании вам нужно будет ответить на меньшее\n" +
"количество вопросов.Отличная работа! Мы гордимся\n" +
"вами!",
TEXT2:
"К сожалению, это очень низкий результат.\n" +
"Мы верим, что вы можете лучше! При подготовке к\n" +
"следующему тестированию, попробуйте\n" +
"потренироваться на пробном тесте или почитать\n" +
"нашу базу знаний.",
FINAL: "Спасибо за участие в тестировании!\nУвидимся через месяц!",
INTERRUPT_HEADER: "Тестирование было прервано",
INTERRUPT_TEXT1: "Вам придется начать его заново.",
INTERRUPT_TEXT2:
"Это могло произойти из-за проблем в соединении с\n" +
'интернетом либо из-за нажатия кнопки "назад".\n' +
"Пожалуйста, убедитесь, что Вы находитесь в зоне хорошего\n" +
"приема и начните тестирование снова.",
},
ANSWERS_TYPE: {
RADIO: "Возможен единственный выбор",
CHECKBOX: "Возможно несколько вариантов",
},
},
},
LOGIN: {
SMS: {
PLACEHOLDER: "000000",
},
LOGIN: "Ваш телефон",
},
KNOWLEDGE: {
CATEGORY: {
TITLE: "База знаний",
SUBTITLE: "Категории",
},
CARDS: {
CARDS_IN_CATEGORY: "Карточек в категории",
VIEWED: "Просмотрено",
},
},
BUTTON: {
CONTINUE: "Продолжить",
PRACTICE_FIRST: "Сначала потренироваться",
START_TESTING: "Начать тестирование",
READY_GO: "Я готов! Начать",
SHOW_MY_ANSWERS: "Посмотреть мои ответы",
COMPLETE_TESTING: "Завершить тестирование",
DONE: "Готово",
START_OVER: "Начать заново",
SHOW_CARD: "Посмотреть карточку с информацией",
},
}
export default Strings
...@@ -2,16 +2,27 @@ import '../../cmp/field/LabeledField.jsx'; ...@@ -2,16 +2,27 @@ import '../../cmp/field/LabeledField.jsx';
import Logo from '../../../svg/logo_vkusvill.svg'; import Logo from '../../../svg/logo_vkusvill.svg';
import './loginPage.scss'; import './loginPage.scss';
const {AND, OR} = Store;
export default D.declare('view.page.Login', () => { export default D.declare('view.page.Login', () => {
const loginStore = new Store({ const loginStore = new Store({
phone: '7', phone: '7',
code: '', code: '',
active: 'enterPhone', active: 'enterPhone',
phoneValid: false phoneValid: false,
phoneChecking: false
}); });
loginStore.sub('phone', function (phone) { loginStore.sub('phone', function (phone) {
loginStore.set('phoneValid', phone.length === 11); loginStore.set('phoneValid', phone.length === 11);
}); });
const checkPhone = function() {
loginStore.set('phoneChecking', true);
setTimeout(function() {
loginStore.set('phoneChecking', false);
loginStore.set('active', 'enterCode');
}, 2000)
};
return <div className={"login-page"}> return <div className={"login-page"}>
<div class="login-page__big-logo"> <div class="login-page__big-logo">
<Logo width="660" height="300"/> <Logo width="660" height="300"/>
...@@ -20,8 +31,11 @@ export default D.declare('view.page.Login', () => { ...@@ -20,8 +31,11 @@ export default D.declare('view.page.Login', () => {
enterPhone: [ enterPhone: [
<view.cmp.field.LabeledField label={'Login'} bind={loginStore.bind('phone')}/>, <view.cmp.field.LabeledField label={'Login'} bind={loginStore.bind('phone')}/>,
<button <button
onclick={()=>loginStore.set('active', 'enterCode')} onclick={checkPhone}
disabled={loginStore.valFalse('phoneValid')} disabled={OR(
loginStore.valFalse('phoneValid'),
loginStore.valTrue('phoneChecking')
)}
>Ага</button> >Ага</button>
], ],
enterCode: [ enterCode: [
......
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