Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Exam/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules
tmpSert/*
16 changes: 16 additions & 0 deletions Exam/.vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
// Используйте IntelliSense, чтобы узнать о возможных атрибутах.
// Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов.
// Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [

{
// "runtimeExecutable":"C:\\workspace\\NodeJS8.7.0\\node-v8.7.0-win-x64\\node.exe",
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${cwd}/app.js"
}
]
}
12 changes: 12 additions & 0 deletions Exam/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Задание на экзамен

Отобразите на странице календарь праздничных дней, возвращаемый сервером при запросе к серверу по контексту "/calendar".

Данные приходят с задержкой, поэтому следует отобразить пользователю gif изображение загрузки данных (файл находится в папке клиента) и скрыть, по окончанию загрузки. Получаемые данные лучше преобразовать в удобные для вас объекты.

Представление календаря может быть любым (просто список). Используйте bootstrap для отображения выходной или не выходной день (предпразничные дни также возвращаются для ответа на часты вопрос - "отдыхаем ли мы..." ).

Следует организовать интерфейс, позволяющий пользователю отфильтровать полученные данные, отобразив только праздники за определенный интервал, который укажет пользователь.



75 changes: 75 additions & 0 deletions Exam/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
var express = require("express");

var app = express();
var router = express.Router();

app.use(express.static(__dirname + "/clientApp"));
var fs = require('fs');

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

var httpServer = http.createServer(app);

httpServer.listen(port);

app.use('/calendar', router);

router.route('/').get(function(req,resp){
setTimeout(
function(){
resp.json(getCalendar())
},
1000);
});

function getCalendar(){
const calendar =
{
"January": {
"1-6": {"rest": true, "n": "Новый год"},
"7": {"rest": true, "n": "Рождество Христово"},
"8": {"rest": true, "n": "Новый год"}
},

"February": {
"22": {"rest": false},
"23": {"rest": true, "n": "День защитника Отечества"}
},

"March": {
"7": {"rest": false},
"8": {"rest": true, "n": "Международный женский день"},
"9": {"rest": true}
},

"April": {
"28": {"rest": false},
"30": {"rest": true}
},

"May": {
"1": {"rest": true, "n": "Праздник Весны и Труда"},
"2": {"rest": true},
"9": {"rest": true, "n": "День Победы"}
},

"June": {
"9": {"rest": false},
"11": {"rest": true},
"12": {"rest": true, "n": "День России"}
},

"November": {
"5": {"rest": true}
},

"December": {
"29": {"rest": false},
"31": {"rest": true}
}
};
return calendar;
}
102 changes: 102 additions & 0 deletions Exam/clientApp/client.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
var monthsList = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
];

var holidaysList = {};
var request = new XMLHttpRequest();
request.open('GET', 'http://localhost:3000/calendar', true);
request.send();
request.onreadystatechange = function () {
var $gif = $('.gif');
if(request.readyState === XMLHttpRequest.DONE && request.status === 200) {
$gif.fadeOut();
var response = request.responseText;
holidaysList = JSON.parse(response);
calendar(holidaysList);
}
};


function calendar(holidaysList, userRange) {
var $calendarTable = $('.calendar_table');
$calendarTable.html('');
var table = '<table border = "1"><tr><th>Month</th><th>Date</th><th>Weekend</th><th>Name</th></tr>';
for (var month in holidaysList) {
if (userRange && userRange.indexOf(month) === -1) {
continue;
}
else {
var obj=holidaysList[month];
for (var day in obj) {
var weekend = obj[day].rest;
var holidayName = obj[day].n;
var tdWeekend = '<td class="bg-success">Weekend</td>';
var tdWorkDay = '<td class="bg-warning">Work day</td>';
table += "<tr>" + "<td>" + month + "</td>" + "<td>" + day + "</td>";
if (weekend) {
table += tdWeekend;
}
else {
table += tdWorkDay;
}
if (holidayName) {
table += "<td>" + holidayName + "</td></tr>";
}
else {
table += "<td></td></tr>";
}
month = "";
}
}
}
table += '</table>';
$calendarTable.append(table);
}

$(function(){
$('#startDate').daterangepicker({
singleDatePicker: true,
});
});

$(function(){
$('#endDate').daterangepicker({
singleDatePicker: true,
});
});

function buildUserRange () {
userRange = [];
var $startDate = $('#startDate');
var $endDate = $('#endDate');
var startDateValue = $startDate.val();
var endDateValue = $endDate.val();
var startDateValueParsed = Date.parse(startDateValue);
var endDateValueParsed = Date.parse(endDateValue);
var startMonth = new Date(startDateValueParsed).getMonth();
var endMonth = new Date(endDateValueParsed).getMonth();
for (i = 0; i < monthsList.length; i++) {
if (i >= startMonth && i <= endMonth) {
userRange.push(monthsList[i]);
}
}
calendar (holidaysList, userRange);
}







40 changes: 40 additions & 0 deletions Exam/clientApp/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>Календарь праздничных дней 2018</title>
<script src="http://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css">
<!-- Include Required Prerequisites -->
<script type="text/javascript" src="//cdn.jsdelivr.net/jquery/1/jquery.min.js"></script>
<script type="text/javascript" src="//cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/bootstrap/3/css/bootstrap.css" />

<!-- Include Date Range Picker -->
<script type="text/javascript" src="//cdn.jsdelivr.net/bootstrap.daterangepicker/2/daterangepicker.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/bootstrap.daterangepicker/2/daterangepicker.css" />
<script src="client.js"></script>
</head>
<body>
<div class="gif">
<img src="loading5.gif">
</div>
<div class="calendar_dates">
<div class="form-group">
<label for="startDate">Start date</label>
<input type="text" class="form-control" id="startDate" name="startDate" placeholder="Date" required>
</div>
<div class="form-group">
<label for="endDate">End date</label>
<input type="text" class="form-control" id="endDate" name="endDate" placeholder="Date" required>
</div>
<div class="form-group">
<button type="button" class="btn btn-primary range_button" onclick="buildUserRange()">Apply</button>
</div>
</div>

<div class="calendar_table"></div>
</body>
</html>
Binary file added Exam/clientApp/loading5.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading