Advertisement
Guest User

scripts

a guest
Aug 20th, 2017
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // AUTH ------------------------
  2.  
  3. let auth = (() => {
  4.     // user/login
  5.     function login(username, password) {
  6.         let userData = {
  7.             username,
  8.             password
  9.         };
  10.  
  11.         return requester.post('user', 'login', 'basic', userData);
  12.     }
  13.  
  14.  
  15.     // user/register
  16.     function register(username, password, name) {
  17.         let userData = {
  18.             username,
  19.             password,
  20.             name
  21.         };
  22.  
  23.         return requester.post('user', '', 'basic', userData);
  24.     }
  25.  
  26.     // user/logout
  27.     function logout() {
  28.         let logoutData = {
  29.             authtoken: sessionStorage.getItem('authtoken')
  30.         };
  31.  
  32.         return requester.post('user', '_logout', 'kinvey', logoutData);
  33.     }
  34.  
  35.     return {
  36.         login,
  37.         register,
  38.         logout
  39.     }
  40. })();
  41.  
  42. //------------------------
  43.  
  44. // REQUESTER -------------------------------
  45.  
  46. let requester = (() => {
  47.     const kinveyBaseUrl = "https://baas.kinvey.com/";
  48.     const kinveyAppKey = "kid_HkfBJsUuZ"; // APP KEY HERE
  49.     const kinveyAppSecret = "055ffbbdbfff40528d6c426bc80b6e23"; // APP SECRET HERE
  50.  
  51.     // Creates the authentication header
  52.     function makeAuth(type) {
  53.         return type === 'basic'
  54.             ?  'Basic ' + btoa(kinveyAppKey + ':' + kinveyAppSecret)
  55.             :  'Kinvey ' + sessionStorage.getItem('authtoken');
  56.     }
  57.  
  58.     // Creates request object to kinvey
  59.     function makeRequest(method, module, endpoint, auth) {
  60.         return req = {
  61.             method,
  62.             url: kinveyBaseUrl + module + '/' + kinveyAppKey + '/' + endpoint,
  63.             headers: {
  64.                 'Authorization': makeAuth(auth)
  65.             }
  66.         };
  67.     }
  68.  
  69.     // Function to return GET promise
  70.     function get (module, endpoint, auth) {
  71.         return $.ajax(makeRequest('GET', module, endpoint, auth));
  72.     }
  73.  
  74.     // Function to return POST promise
  75.     function post (module, endpoint, auth, data) {
  76.         let req = makeRequest('POST', module, endpoint, auth);
  77.         req.data = data;
  78.         return $.ajax(req);
  79.     }
  80.  
  81.     // Function to return PUT promise
  82.     function update (module, endpoint, auth, data) {
  83.         let req = makeRequest('PUT', module, endpoint, auth);
  84.         req.data = data;
  85.         return $.ajax(req);
  86.     }
  87.  
  88.     // Function to return DELETE promise
  89.     function remove (module, endpoint, auth) {
  90.         return $.ajax(makeRequest('DELETE', module, endpoint, auth));
  91.     }
  92.  
  93.     return {
  94.         get,
  95.         post,
  96.         update,
  97.         remove
  98.     }
  99. })()
  100.  
  101. //--------------------------
  102.  
  103. // MESSAGESERVICE --------------------------------
  104.  
  105. let messagesService  = (() => {
  106.     function loadMyMessages(username) {
  107.         let endpoint = `messages?query={"recipient_username":"${username}"}`;
  108.  
  109.         return requester.get('appdata', endpoint, 'kinvey');
  110.     }
  111.  
  112.     function loadArchiveMessages(username) {
  113.         let endpoint = `messages?query={"sender_username":"${username}"}`;
  114.  
  115.         return requester.get('appdata', endpoint, 'kinvey');
  116.     }
  117.  
  118.     function deleteMessage(messageId) {
  119.         let endpoint = `messages/${messageId}`;
  120.  
  121.         return requester.remove('appdata', endpoint, 'kinvey');
  122.     }
  123.  
  124.     function loadAllUsers() {
  125.         return requester.get('user', '', 'kinvey');
  126.     }
  127.  
  128.     function sendMessage(sender_username, sender_name, recipient_username, text) {
  129.         let msgData = {
  130.             sender_username,
  131.             sender_name,
  132.             recipient_username,
  133.             text
  134.         };
  135.  
  136.         return requester.post('appdata', 'messages', 'kinvey', msgData);
  137.     }
  138.  
  139.     return {
  140.         loadMyMessages,
  141.         loadArchiveMessages,
  142.         deleteMessage,
  143.         loadAllUsers,
  144.         sendMessage
  145.     }
  146. })()
  147.  
  148. // ------------------------------
  149.  
  150. // APP ==========--------------======
  151.  
  152. $(() => {
  153.     showView('AppHome');
  154.  
  155.     // Attach event handlers
  156.     (() => {
  157.         $('header').find('a[data-target]').click(navigateTo);
  158.         $('#formRegister').submit(registerUser);
  159.         $('#formLogin').submit(loginUser);
  160.         $('#linkMenuLogout').click(logoutUser);
  161.         $('#formSendMessage').submit(sendMessage);
  162.         $('#linkUserHomeMyMessages').click(() => {
  163.             showView('MyMessages');
  164.             loadReceivedMessages();
  165.         });
  166.  
  167.         $('#linkUserHomeSendMessage').click(() => {
  168.             showView('SendMessage');
  169.             loadAllUsers();
  170.         });
  171.  
  172.         $('#linkUserHomeArchiveSent').click(() => {
  173.             showView('ArchiveSent');
  174.             loadSentMessages();
  175.         });
  176.  
  177.         $('#linkMenuMyMessages').click(loadReceivedMessages);
  178.         $('#linkMenuArchiveSent').click(loadSentMessages);
  179.         $('#linkMenuSendMessage').click(loadAllUsers);
  180.         $('.notification').click(function() {
  181.             $(this).hide();
  182.         })
  183.     })()
  184.  
  185.     if(sessionStorage.getItem('authtoken') === null){
  186.         userLoggedOut();
  187.     } else {
  188.         userLoggedIn();
  189.     }
  190.  
  191.     // SEND MESSAGE FORM
  192.     function loadAllUsers() {
  193.         messagesService.loadAllUsers()
  194.             .then((allUsers) => {
  195.                 displayUsersInList(allUsers);
  196.             })
  197.     }
  198.  
  199.     function displayUsersInList(allUsers) {
  200.         let usersContainer = $('#msgRecipientUsername');
  201.         usersContainer.empty();
  202.         for(let user of allUsers) {
  203.             let username = user['username'];
  204.             let fullName = formatSender(user['name'], username);
  205.             if(username !== sessionStorage.getItem('username')){
  206.                 usersContainer.append($(`<option value="${username}">${fullName}</option>`))
  207.             }
  208.         }
  209.     }
  210.  
  211.     function sendMessage(ev) {
  212.         ev.preventDefault();
  213.         let rUsernameInput = $('#msgRecipientUsername');
  214.         let mTextInput = $('#msgText');
  215.         let senderName = sessionStorage.getItem('name');
  216.         let senderUsername = sessionStorage.getItem('username');
  217.         let recipientUsername = rUsernameInput.val();
  218.         let msgText = mTextInput.val();
  219.  
  220.         messagesService.sendMessage(senderUsername, senderName, recipientUsername, msgText)
  221.             .then(() => {
  222.                 mTextInput.val('');
  223.                 showInfo('Messaged sent.');
  224.                 showView('ArchiveSent');
  225.                 loadSentMessages();
  226.             }).catch(handleError);
  227.     }
  228.  
  229.  
  230.     // LOGIC TO LOAD SENT MESSAGES
  231.     function loadSentMessages() {
  232.         let username = sessionStorage.getItem('username');
  233.         messagesService.loadArchiveMessages(username)
  234.             .then((myMessages) => {
  235.                 displayArchivedMessages(myMessages);
  236.             }).catch(handleError);
  237.     }
  238.  
  239.     function displayArchivedMessages(myMessages) {
  240.         let messagesContainer = $('#sentMessages');
  241.         messagesContainer.empty();
  242.         let messagesTable = $('<table>');
  243.         messagesTable.append($('<thead>')
  244.             .append($('<tr>')
  245.                 .append('<th>To</th>')
  246.                 .append('<th>Message</th>')
  247.                 .append('<th>Date Sent</th>')
  248.                 .append('<th>Actions</th>')));
  249.         let tableBody = $('<tbody>');
  250.  
  251.         for(let msg of myMessages) {
  252.             let tableRow = $('<tr>');
  253.             let recipient = msg['recipient_username'];
  254.             let msgText = msg['text'];
  255.             let msgDate = formatDate(msg['_kmd']['lmt']);
  256.             let deleteBtn = $(`<button value="${msg._id}">Delete</button>`)
  257.                 .click(deleteMsg);
  258.             tableRow.append($('<td>').text(recipient));
  259.             tableRow.append($('<td>').text(msgText));
  260.             tableRow.append($('<td>').text(msgDate));
  261.             tableRow.append($('<td>').append(deleteBtn));
  262.             tableBody.append(tableRow);
  263.         }
  264.  
  265.         messagesTable.append(tableBody);
  266.         messagesContainer.append(messagesTable);
  267.     }
  268.  
  269.     // DELETE A MESSAGE
  270.     function deleteMsg() {
  271.         let messageId = $(this).val();
  272.  
  273.         messagesService.deleteMessage(messageId)
  274.             .then(() => {
  275.                 showInfo('Message deleted.');
  276.                 loadSentMessages();
  277.             }).catch(handleError);
  278.     }
  279.  
  280.     // LOGIC TO LOAD RECEIVED MESSAGES
  281.     function loadReceivedMessages() {
  282.         let username = sessionStorage.getItem('username');
  283.         messagesService.loadMyMessages(username)
  284.             .then((myMessages) => {
  285.                 displayAllMessages(myMessages);
  286.             }).catch(handleError);
  287.     }
  288.  
  289.     function displayAllMessages(myMessages) {
  290.         let messagesContainer = $('#myMessages');
  291.         messagesContainer.empty();
  292.         let messagesTable = $('<table>');
  293.         messagesTable.append($('<thead>')
  294.             .append($('<tr>')
  295.                 .append('<th>From</th>')
  296.                 .append('<th>Message</th>')
  297.                 .append('<th>Date Received</th>')));
  298.         let tableBody = $('<tbody>');
  299.  
  300.         for(let msg of myMessages) {
  301.             let tableRow = $('<tr>');
  302.             let sender = formatSender(msg['sender_name'], msg['sender_username']);
  303.             let msgText = msg['text'];
  304.             let msgDate = formatDate(msg['_kmd']['lmt']);
  305.             tableRow.append($('<td>').text(sender));
  306.             tableRow.append($('<td>').text(msgText));
  307.             tableRow.append($('<td>').text(msgDate));
  308.             tableBody.append(tableRow);
  309.         }
  310.  
  311.         messagesTable.append(tableBody);
  312.         messagesContainer.append(messagesTable);
  313.     }
  314.  
  315.     // LOGIC TO LOGOUT USER
  316.     function logoutUser() {
  317.         auth.logout()
  318.             .then(() => {
  319.                 sessionStorage.clear();
  320.                 showInfo('Logout successful.');
  321.                 userLoggedOut();
  322.             }).catch(handleError);
  323.     }
  324.  
  325.     // LOGIC TO LOGIN USER
  326.     function loginUser(ev) {
  327.         ev.preventDefault();
  328.         let inputUsername = $('#loginUsername');
  329.         let inputPassword = $('#loginPasswd');
  330.  
  331.         let usernameVal = inputUsername.val();
  332.         let passwdVal = inputPassword.val();
  333.  
  334.         auth.login(usernameVal, passwdVal)
  335.             .then((userInfo) => {
  336.                 saveSession(userInfo);
  337.                 inputUsername.val('');
  338.                 inputPassword.val('');
  339.                 showInfo('Login successful.');
  340.             }).catch(handleError);
  341.     }
  342.  
  343.     // LOGIC TO REGISTER USER
  344.     function registerUser(ev) {
  345.         ev.preventDefault();
  346.         let registerUsername = $('#registerUsername');
  347.         let registerName = $('#registerName');
  348.         let registerPassword = $('#registerPasswd');
  349.  
  350.         let usernameVal = registerUsername.val();
  351.         let nameVal = registerName.val();
  352.         let passVal = registerPassword.val();
  353.  
  354.         auth.register(usernameVal, passVal, nameVal)
  355.             .then((userInfo) => {
  356.                 saveSession(userInfo);
  357.                 registerUsername.val("");
  358.                 registerName.val("");
  359.                 registerPassword.val("");
  360.                 showInfo('User registration successful.');
  361.             }).catch(handleError);
  362.     }
  363.  
  364.     function navigateTo() {
  365.         let viewName = $(this).attr('data-target');
  366.         showView(viewName);
  367.     }
  368.  
  369.     // Shows one view/section at a time
  370.     function showView(viewName) {
  371.         $('main > section').hide();
  372.         $('#view' + viewName).show();
  373.     }
  374.  
  375.     function userLoggedOut() {
  376.         $('.anonymous').show();
  377.         $('.useronly').hide();
  378.         $('#spanMenuLoggedInUser').text('');
  379.         showView('AppHome');
  380.     }
  381.  
  382.     function userLoggedIn() {
  383.         $('.anonymous').hide();
  384.         $('.useronly').show();
  385.         let username = sessionStorage.getItem('username');
  386.         $('#spanMenuLoggedInUser').text(`Welcome, ${username}!`);
  387.         $('#viewUserHomeHeading').text(`Welcome, ${username}!`);
  388.         showView('UserHome');
  389.     }
  390.  
  391.     function saveSession(userInfo) {
  392.         let userAuth = userInfo._kmd.authtoken;
  393.         sessionStorage.setItem('authtoken', userAuth);
  394.         let userId = userInfo._id;
  395.         sessionStorage.setItem('userId', userId);
  396.         let username = userInfo.username;
  397.         sessionStorage.setItem('username', username);
  398.         sessionStorage.setItem('name', userInfo['name']);
  399.         userLoggedIn();
  400.     }
  401.  
  402.     function handleError(reason) {
  403.         showError(reason.responseJSON.description);
  404.     }
  405.  
  406.     function showInfo(message) {
  407.         let infoBox = $('#infoBox');
  408.         infoBox.text(message);
  409.         infoBox.show();
  410.         setTimeout(() => infoBox.fadeOut(), 3000);
  411.     }
  412.  
  413.     function showError(message) {
  414.         let errorBox = $('#errorBox');
  415.         errorBox.text(message);
  416.         errorBox.show();
  417.         setTimeout(() => errorBox.fadeOut(), 3000);
  418.     }
  419.  
  420.     function formatDate(dateISO8601) {
  421.         let date = new Date(dateISO8601);
  422.         if (Number.isNaN(date.getDate()))
  423.             return '';
  424.         return date.getDate() + '.' + padZeros(date.getMonth() + 1) +
  425.             "." + date.getFullYear() + ' ' + date.getHours() + ':' +
  426.             padZeros(date.getMinutes()) + ':' + padZeros(date.getSeconds());
  427.  
  428.         function padZeros(num) {
  429.             return ('0' + num).slice(-2);
  430.         }
  431.     }
  432.  
  433.     function formatSender(name, username) {
  434.         if (!name)
  435.             return username;
  436.         else
  437.             return username + ' (' + name + ')';
  438.     }
  439.  
  440.  
  441.     // Handle notifications
  442.     $(document).on({
  443.         ajaxStart: () => $("#loadingBox").show(),
  444.         ajaxStop: () => $('#loadingBox').fadeOut()
  445.     });
  446. })
  447.  
  448. // ==============================
  449.  
  450. // CSS - :
  451. #menu {
  452.     background: #DDD;
  453.     text-align: center;
  454.     padding: 8px 5px;
  455.     line-height: 1.5;
  456.     border-radius: 3px;
  457.     overflow: auto;
  458. }
  459.  
  460. #menu a {
  461.     text-decoration: none;
  462.     padding: 5px 10px;
  463.     border-radius: 5px;
  464. }
  465.  
  466. #menu a:hover {
  467.     background: #BBB;
  468. }
  469.  
  470. #menu>#spanMenuLoggedInUser {
  471.     float: right;
  472.     margin-right: 10px;
  473. }
  474.  
  475. #infoBox, #errorBox, #loadingBox {
  476.     width: 80%;
  477.     margin: 10px auto;
  478.     color: white;
  479.     text-align: center;
  480.     padding: 5px;
  481.     border-radius: 3px;
  482. }
  483.  
  484. #loadingBox {
  485.     background: #7CB3E9;
  486. }
  487.  
  488. #infoBox {
  489.     background: #393;
  490. }
  491.  
  492. #errorBox {
  493.     background: #F50;
  494. }
  495.  
  496. main > section {
  497.     padding: 20px 5px;
  498. }
  499.  
  500. section h1 {
  501.     margin: 10px 0px;
  502.     font-size: 1.3em;
  503. }
  504.  
  505. table th {
  506.     background: #DDD;
  507.     padding: 10px;
  508. }
  509.  
  510. table td {
  511.     padding: 5px 10px;
  512.     background: #EEE;
  513. }
  514.  
  515. input:required:invalid, input:focus:invalid {
  516.     background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAT1JREFUeNpi/P//PwMpgImBRMACY/x7/uDX39sXt/67cMoDyOVgMjBjYFbV/8kkqcCBrIER5KS/967s+rmkXxzI5wJiRSBm/v8P7NTfHHFFl5mVdIzhGv4+u///x+xmuAlcdXPB9KeqeLgYd3bDU2ZpRRmwH4DOeAI07QXIRKipYPD35184/nn17CO4p/+cOfjl76+/X4GYAYThGn7/g+Mfh/ZZwjUA/aABpJVhpv6+dQUjZP78Z0YEK7OezS2gwltg64GmfTu6i+HL+mUMP34wgvGvL78ZOEysf8M1sGgZvQIqfA1SDAL8iUUMPIFRQLf+AmMQ4DQ0vYYSrL9vXDz2sq9LFsiX4dLRA0t8OX0SHKzi5bXf2HUMBVA0gN356N7p7xdOS3w5fAgcfNxWtn+BJi9gVVBOQfYPQIABABvRq3BwGT3OAAAAAElFTkSuQmCC);
  517.     background-position: right top;
  518.     background-repeat: no-repeat;
  519.     -moz-box-shadow: none;
  520. }
  521.  
  522. input:required:valid {
  523.     background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAepJREFUeNrEk79PFEEUx9/uDDd7v/AAQQnEQokmJCRGwc7/QeM/YGVxsZJQYI/EhCChICYmUJigNBSGzobQaI5SaYRw6imne0d2D/bYmZ3dGd+YQKEHYiyc5GUyb3Y+77vfeWNpreFfhvXfAWAAJtbKi7dff1rWK9vPHx3mThP2Iaipk5EzTg8Qmru38H7izmkFHAF4WH1R52654PR0Oamzj2dKxYt/Bbg1OPZuY3d9aU82VGem/5LtnJscLxWzfzRxaWNqWJP0XUadIbSzu5DuvUJpzq7sfYBKsP1GJeLB+PWpt8cCXm4+2+zLXx4guKiLXWA2Nc5ChOuacMEPv20FkT+dIawyenVi5VcAbcigWzXLeNiDRCdwId0LFm5IUMBIBgrp8wOEsFlfeCGm23/zoBZWn9a4C314A1nCoM1OAVccuGyCkPs/P+pIdVIOkG9pIh6YlyqCrwhRKD3GygK9PUBImIQQxRi4b2O+JcCLg8+e8NZiLVEygwCrWpYF0jQJziYU/ho2TUuCPTn8hHcQNuZy1/94sAMOzQHDeqaij7Cd8Dt8CatGhX3iWxgtFW/m29pnUjR7TSQcRCIAVW1FSr6KAVYdi+5Pj8yunviYHq7f72po3Y9dbi7CxzDO1+duzCXH9cEPAQYAhJELY/AqBtwAAAAASUVORK5CYII=);
  524.     background-position: right top;
  525.     background-repeat: no-repeat;
  526. }
  527.  
  528. #viewUserHome a {
  529.     display: inline-block;
  530.     width: 60px;
  531.     text-align: center;
  532.     background: #BBB;
  533.     padding: 20px;
  534.     border-radius: 10px;
  535.     margin: 10px;
  536.     text-decoration: none;
  537. }
  538.  
  539. #viewUserHome a:hover {
  540.     color: white;
  541.     background: #555;
  542. }
  543.  
  544. footer {
  545.     background: #DDD;
  546.     padding: 5px 10px;
  547.     font-size: 0.8em;
  548.     text-align: center;
  549.     border-radius: 3px;
  550. }
  551.  -------
  552.  
  553. // html : ------
  554. <!DOCTYPE html>
  555. <html>
  556.  
  557. <head>
  558.     <meta charset="utf-8" />
  559.     <title>Messages</title>
  560.     <link rel="stylesheet" type="text/css" href="messages.css" />
  561.     <script src="scripts/jquery-3.1.1.min.js"></script>
  562.     <script src="scripts/models/requester.js"></script>
  563.     <script src="scripts/models/auth.js"></script>
  564.     <script src="scripts/models/messagesService.js"></script>
  565.     <script src="scripts/app.js"></script>
  566. </head>
  567.  
  568. <body>
  569. <div id="app">
  570.     <header id="menu">
  571.         <a href="#" class="anonymous" id="linkMenuAppHome" data-target="AppHome">Home</a>
  572.         <a href="#" class="anonymous" id="linkMenuLogin" data-target="Login">Login</a>
  573.         <a href="#" class="anonymous" id="linkMenuRegister" data-target="Register">Register</a>
  574.  
  575.         <a href="#" class="useronly" id="linkMenuUserHome" data-target="UserHome">Home</a>
  576.         <a href="#" class="useronly" id="linkMenuMyMessages" data-target="MyMessages">My Messages</a>
  577.         <a href="#" class="useronly" id="linkMenuArchiveSent" data-target="ArchiveSent">Archive (Sent)</a>
  578.         <a href="#" class="useronly" id="linkMenuSendMessage" data-target="SendMessage">Send Message</a>
  579.         <a href="#" class="useronly" id="linkMenuLogout">Logout</a>
  580.  
  581.         <span class="useronly" id="spanMenuLoggedInUser">Welcome, {user}!</span>
  582.     </header>
  583.  
  584.     <main>
  585.         <div id="loadingBox" style="display: none" class="notification">Loading ...</div>
  586.  
  587.         <div id="infoBox" style="display: none" class="notification">Info</div>
  588.  
  589.         <div id="errorBox" style="display: none" class="notification">Error</div>
  590.  
  591.         <section id="viewAppHome">
  592.             <h1>Welcome</h1>
  593.             Welcome to our messaging system.
  594.         </section>
  595.  
  596.         <section id="viewLogin">
  597.             <h1>Please login</h1>
  598.             <form id="formLogin">
  599.                 <label>
  600.                     <div>Username:</div>
  601.                     <input type="text" name="username" id="loginUsername" required />
  602.                 </label>
  603.                 <label>
  604.                     <div>Password:</div>
  605.                     <input type="password" name="password" id="loginPasswd" required />
  606.                 </label>
  607.                 <div>
  608.                     <input type="submit" value="Login" />
  609.                 </div>
  610.             </form>
  611.         </section>
  612.  
  613.         <section id="viewRegister">
  614.             <h1>Please register here</h1>
  615.             <form id="formRegister">
  616.                 <label>
  617.                     <div>Username:</div>
  618.                     <input type="text" name="username" id="registerUsername" required />
  619.                 </label>
  620.                 <label>
  621.                     <div>Password:</div>
  622.                     <input type="password" name="password" id="registerPasswd" required />
  623.                 </label>
  624.                 <label>
  625.                     <div>Name:</div>
  626.                     <input type="text" name="name" id="registerName" />
  627.                 </label>
  628.                 <div>
  629.                     <input type="submit" value="Register" />
  630.                 </div>
  631.             </form>
  632.         </section>
  633.  
  634.         <section id="viewUserHome">
  635.             <h1 id="viewUserHomeHeading">Welcome, {user}!</h1>
  636.             <a href="#" id="linkUserHomeMyMessages">My Messages</a>
  637.             <a href="#" id="linkUserHomeSendMessage">Send Message</a>
  638.             <a href="#" id="linkUserHomeArchiveSent">Archive (Sent)</a>
  639.         </section>
  640.  
  641.         <section id="viewMyMessages">
  642.             <h1>My Messages</h1>
  643.             <div class="messages" id="myMessages">
  644.  
  645.             </div>
  646.         </section>
  647.  
  648.         <section id="viewArchiveSent">
  649.             <h1>Archive (Sent Messages)</h1>
  650.             <div class="messages" id="sentMessages">
  651.  
  652.             </div>
  653.         </section>
  654.  
  655.         <section id="viewSendMessage">
  656.             <h1>Send Message</h1>
  657.             <form id="formSendMessage">
  658.                 <div>Recipient:</div>
  659.                 <div>
  660.                     <select name="recipient" required id="msgRecipientUsername">
  661.  
  662.                     </select>
  663.                 </div>
  664.                 <div>Message Text:</div>
  665.                 <div><input type="text" name="text" required id="msgText" /></div>
  666.                 <div><input type="submit" value="Send" /></div>
  667.             </form>
  668.         </section>
  669.     </main>
  670.  
  671.     <footer>Messaging System - Simple SPA Application</footer>
  672. </div>
  673.  
  674. </body>
  675.  
  676. </html>
  677.  
  678.  
  679. -------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement