From 4dbf913735811ff026d27ef95f996fcb1ac440b1 Mon Sep 17 00:00:00 2001 From: almakantara Date: Thu, 6 May 2021 18:51:44 -0400 Subject: [PATCH 1/7] attempted a restyle on the chat interface + mic button --- public/images/almond_mic_round_grey.svg | 30 +++ public/images/almond_mic_round_white.svg | 30 +++ public/images/almond_mic_white_round.svg | 30 +++ public/images/bubble_green.png | Bin 0 -> 2776 bytes public/javascripts/conversation.js | 129 +++++++------ public/stylesheets/conversation.css | 229 +++++++++++++++-------- public/stylesheets/style.css | 13 +- views/conversation.pug | 7 +- views/layout.pug | 2 +- views/navbar.pug | 2 +- 10 files changed, 330 insertions(+), 142 deletions(-) create mode 100644 public/images/almond_mic_round_grey.svg create mode 100644 public/images/almond_mic_round_white.svg create mode 100644 public/images/almond_mic_white_round.svg create mode 100644 public/images/bubble_green.png diff --git a/public/images/almond_mic_round_grey.svg b/public/images/almond_mic_round_grey.svg new file mode 100644 index 00000000..ebe503f7 --- /dev/null +++ b/public/images/almond_mic_round_grey.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/public/images/almond_mic_round_white.svg b/public/images/almond_mic_round_white.svg new file mode 100644 index 00000000..1c187e1c --- /dev/null +++ b/public/images/almond_mic_round_white.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/public/images/almond_mic_white_round.svg b/public/images/almond_mic_white_round.svg new file mode 100644 index 00000000..b76b661b --- /dev/null +++ b/public/images/almond_mic_white_round.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/public/images/bubble_green.png b/public/images/bubble_green.png new file mode 100644 index 0000000000000000000000000000000000000000..a54312551e80e3867dcfd6502af6adb77bcaecba GIT binary patch literal 2776 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 { function updateConnectionFeedback() { if (!ws || !open) { $('#input-form-group').addClass('has-warning'); - $('#input-form-group .spinner-container').addClass('hidden'); -- $('#input-form-group .glyphicon-warning-sign, #input-form-group .help-block').removeClass('hidden'); + $('#input-form-group .spinner-container').addClass('hidden'); - + $('#toolbar .form-inline .help-block').removeClass('hidden'); return; } $('#input-form-group').removeClass('has-warning'); - $('#input-form-group .glyphicon-warning-sign, #input-form-group .help-block').addClass('hidden'); + $('#toolbar .form-inline .help-block').addClass('hidden'); } function updateSpinner(thinking) { @@ -142,13 +142,14 @@ $(() => { function maybeScroll(container) { if (!$('#input:focus').length) return; + //keep scroll bar to the bottom scrollChat(); setTimeout(scrollChat, 1000); } function scrollChat() { - let chat = document.getElementById('conversation'); + let chat = document.getElementById('chat'); chat.scrollTop = chat.scrollHeight; } @@ -289,44 +290,44 @@ $(() => { lastMessageId = parsed.id; switch (parsed.type) { - case 'text': - case 'result': - // FIXME: support more type of results - textMessage(parsed.text, parsed.icon); - currentGrid = null; - break; - - case 'picture': - picture(parsed.url, parsed.icon); - currentGrid = null; - break; - - case 'rdl': - rdl(parsed.rdl, parsed.icon); - currentGrid = null; - break; - - case 'choice': - choice(parsed.idx, parsed.title); - break; - - case 'button': - buttonMessage(parsed.title, parsed.json); - break; - - case 'link': - linkMessage(parsed.title, parsed.url); - break; - - case 'hypothesis': - $('#input').val(parsed.hypothesis); - break; - - case 'command': - $('#input').val(''); - collapseButtons(); - appendUserMessage(parsed.command); - break; + case 'text': + case 'result': + // FIXME: support more type of results + textMessage(parsed.text, parsed.icon); + currentGrid = null; + break; + + case 'picture': + picture(parsed.url, parsed.icon); + currentGrid = null; + break; + + case 'rdl': + rdl(parsed.rdl, parsed.icon); + currentGrid = null; + break; + + case 'choice': + choice(parsed.idx, parsed.title); + break; + + case 'button': + buttonMessage(parsed.title, parsed.json); + break; + + case 'link': + linkMessage(parsed.title, parsed.url); + break; + + case 'hypothesis': + $('#input').val(parsed.hypothesis); + break; + + case 'command': + $('#input').val(''); + collapseButtons(); + appendUserMessage(parsed.command); + break; } } @@ -351,19 +352,23 @@ $(() => { updateSpinner(true); ws.send(JSON.stringify({ type: 'command', text: text })); } + function handleParsedCommand(json, title) { updateSpinner(true); ws.send(JSON.stringify({ type: 'parsed', json: json, title: title })); } + function handleThingTalk(tt) { updateSpinner(true); ws.send(JSON.stringify({ type: 'tt', code: tt })); } + function handleChoice(idx, title) { handleParsedCommand({ code: ['bookkeeping', 'choice', String(idx)], entities: {} }, title); } + function handleSpecial(special, title) { - handleParsedCommand({ code: ['bookkeeping', 'special', 'special:'+special ], entities: {} }, title); + handleParsedCommand({ code: ['bookkeeping', 'special', 'special:' + special], entities: {} }, title); } function appendUserMessage(text) { @@ -374,10 +379,10 @@ $(() => { $('#input-form').submit((event) => { var text = $('#input').val(); if (currCommand !== "") - pastCommandsUp.push(currCommand); + pastCommandsUp.push(currCommand); if (pastCommandsDown.length !== 0) { - pastCommandsUp = pastCommandsUp.concat(pastCommandsDown); - pastCommandsDown = []; + pastCommandsUp = pastCommandsUp.concat(pastCommandsDown); + pastCommandsDown = []; } pastCommandsUp.push(text); @@ -391,21 +396,21 @@ $(() => { }); $('#input-form').on('keydown', (event) => { // button is pressed - if (event.keyCode === 38) { // Up - // removes last item from array pastCommandsUp, displays it as currCommand, adds current input text to pastCommandsDown - currCommand = pastCommandsUp.pop(); - if ($('#input').val() !== "") - pastCommandsDown.push($('#input').val()); - $('#input').val(currCommand); - } - - if (event.keyCode === 40) { // Down - // removes last item from array pastCommandsDown, displays it as currCommand, adds current input text to pastCommandsUp - currCommand = pastCommandsDown.pop(); - if ($('#input').val() !== "") - pastCommandsUp.push($('#input').val()); - $('#input').val(currCommand); - } + if (event.keyCode === 38) { // Up + // removes last item from array pastCommandsUp, displays it as currCommand, adds current input text to pastCommandsDown + currCommand = pastCommandsUp.pop(); + if ($('#input').val() !== "") + pastCommandsDown.push($('#input').val()); + $('#input').val(currCommand); + } + + if (event.keyCode === 40) { // Down + // removes last item from array pastCommandsDown, displays it as currCommand, adds current input text to pastCommandsUp + currCommand = pastCommandsDown.pop(); + if ($('#input').val() !== "") + pastCommandsUp.push($('#input').val()); + $('#input').val(currCommand); + } }); $('#save-log').click(() => { @@ -449,4 +454,4 @@ $(() => { } }); }); -}); +}); \ No newline at end of file diff --git a/public/stylesheets/conversation.css b/public/stylesheets/conversation.css index ff67245b..1bb6cc0a 100644 --- a/public/stylesheets/conversation.css +++ b/public/stylesheets/conversation.css @@ -1,134 +1,217 @@ #conversation #input-form { - overflow: auto; - display: block; + overflow: auto; } #conversation #cancel { - float: right; - display: block; - font-size: 24px; - padding-top: 5px; - padding-left: 12px; - cursor: pointer; + float: right; + display: block; + font-size: 24px; + padding-top: 5px; + padding-left: 12px; + cursor: pointer; } #conversation #chat { - margin-bottom: 1em; + margin: 1em 0em; + overflow-y: scroll; + height: -webkit-fill-available; + padding: 5px 35px; + height: 595px; + overflow-anchor: none; } #conversation .message-container { - display: block; - overflow: auto; - clear: both; + display: block; + overflow: auto; + clear: both; } -#conversation .message-container > img.icon { - height: 48px; - width: 48px; - object-fit: contain; - padding-right: 12px; - float: left; +#conversation .message-container>img.icon { + height: 48px; + width: 48px; + object-fit: contain; + padding-right: 12px; + float: left; } #conversation .message-container.from-almond { - width: 90%; - text-align: left; - margin-right: auto; + width: 90%; + text-align: left; + margin-right: auto; } #conversation .message.from-user { - display: block; - width: 90%; - text-align: right; - margin-left: auto; - - border-image-source: url(../images/bubble_user.png); - border-image-slice: 88 130 93 97 fill; - border-image-width: 13px 24px 12px 24px; - padding: 13px 24px 12px 24px; -} - -#conversation .from-almond > .message { - display: block; - overflow: auto; - border-image-source: url(../images/bubble_almond.png); - border-image-slice: 90 97 94 120 fill; - border-image-width: 13px 24px 12px 24px; - padding: 13px 24px 12px 24px; + display: block; + width: 90%; + text-align: right; + margin-left: auto; + border-image-source: url(../images/bubble_green.png); + border-image-slice: 88 130 93 97 fill; + border-image-width: 25px 42px 24px 20px; + padding: 13px 24px 12px 24px; + margin-bottom: 5px; +} + +#conversation .from-almond>.message { + display: block; + overflow: auto; + border-image-source: url(../images/bubble_almond.png); + border-image-slice: 90 97 94 120 fill; + border-image-width: 13px 24px 12px 24px; + padding: 13px 24px 12px 24px; } #conversation .message { - display: block; - white-space: pre-line; + display: block; + white-space: pre-line; } -#conversation .message-picture, #conversation .message-rdl img { - max-width: 80%; +#conversation .message-picture, +#conversation .message-rdl img { + max-width: 80%; } #conversation .button-grid { - width: 80%; + width: 80%; } #conversation .button-grid .btn { - margin-bottom: 6px; - white-space: normal; + margin-bottom: 6px; + white-space: normal; } #conversation { - overflow: auto; - height: auto; - max-height: 500px; - margin: auto; - max-width: 800px; - background: #f3f4f2; - padding: 40px; + overflow: hidden; + height: auto; + max-height: 500px; + margin: auto; + max-width: 800px; + background-color: #ece5dd6b; + font-weight: 600; } #conversation.single { - height: calc(100vh - 243px); - max-height: none; + max-height: 100%; + border-bottom-left-radius: 20px; + border-bottom-right-radius: 20px; } #conversation .message-rdl-title { - font-weight: bold; + font-weight: bold; } + #conversation .message-rdl-content { - display: block; + display: block; } #input-form-group { - margin-bottom: 0; + margin-bottom: 0; } #input-form-group .spinner-container { - display: block; - padding: 12px 12px; - overflow: hidden; + display: block; + padding: 12px 12px; + overflow: hidden; } #toolbar { - margin: auto; - max-width: 800px; + margin: auto; + max-width: 800px; } #toolbar i { - padding: 3px; + padding: 3px; } #save-log { - padding-left: 10px; - cursor: pointer; + padding-left: 10px; + cursor: pointer; + width: 50%; } -.comment-options > .fa, .comment-options > .far { - cursor: pointer; - border-radius: 60px; - box-shadow: 0 0 2px #888; - padding: 10px; - margin: 5px; +.comment-options>.fa, +.comment-options>.far { + cursor: pointer; + border-radius: 60px; + box-shadow: 0 0 2px #888; + padding: 10px; + margin: 5px; } #recording-log { - max-height: calc(100vh - 200px); + max-height: calc(100vh - 200px); +} + +#record-button { + background-image: url("/images/almond_mic_white_round.svg"); + width: 60px; + height: 60px; + background-color: transparent; + border-radius: 100px; + float: right; + background-repeat: no-repeat; +} + +#record-button:hover { + background-image: url("/images/almond_mic_round_grey.svg"); + background-color: #ffffff; + border-color: transparent; +} + +#record-button:focus { + background-image: url("/images/almond_mic_round_white.svg"); + background-color: #ffffff; + border-color: transparent; + outline: none; +} + +#input { + width: 89%; + margin: 0.6em; + float: left; + border-radius: 8px; +} + +#input-block { + background-color: #8c1515; + min-height: 70px; + padding: 0.6em; +} + +.col-sm-12 ::-webkit-scrollbar { + width: 15px; } + +.col-sm-12 ::-webkit-scrollbar-thumb { + border-radius: 30px; + background: #d5d5d5; + box-shadow: inset 2px 2px 2px rgba(255, 255, 255, .25), inset -2px -2px 2px rgba(0, 0, 0, .25); +} + +.col-sm-12 ::-webkit-scrollbar-track {} + +.form-inline { + background-color: #d8d8d8; + color: #000; + line-height: 2.2em; + border-top-left-radius: 15px; + border-top-right-radius: 15px; + text-align: right; + padding-right: 15px; +} + +.comment-options { + overflow-anchor: auto; +} + +.comment-options>i { + background-color: white; +} + +.help-block { + display: inline; + color: #8c1515; + font-weight: bold; + width: 50%; + text-align: center; +} \ No newline at end of file diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 892aa117..e6938e03 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -16,7 +16,7 @@ body { #page-body.container, #page-body.container-fluid { padding-bottom: 30px; - min-height: calc(100vh - 165px); + min-height: calc(100vh - 145px); } #page-title { @@ -25,10 +25,10 @@ body { footer.page-footer { padding-top: 1.5em; - background-color: #8c1515; + background-color: #585858; color: white; text-align: right; - min-height: 120px; + min-height: 100px; } footer.page-footer a:link, @@ -147,4 +147,11 @@ pre code { .consent_conf>h2 { color: #8c1515; font-weight: 500; +} + +.navbar-brand.hidden-sm { + font-weight: bold; + line-height: 21px; + height: 47px; + font-size: 26px; } \ No newline at end of file diff --git a/views/conversation.pug b/views/conversation.pug index 722d4836..1ed3190e 100644 --- a/views/conversation.pug +++ b/views/conversation.pug @@ -8,7 +8,7 @@ block styles link(rel='stylesheet', href=Config.BASE_URL + '/stylesheets/conversation.css') block page_name - = _("Chat") + = _("Chat with Almond") block content div.modal#comment-popup @@ -25,9 +25,11 @@ block content div#toolbar div.form-inline + div.help-block.hidden= _("Lost connection to the server.") div.form-group#save-log i.far.fa-save#save-button span= _("Save Conversation Log") + div.modal#recording-save div.modal-dialog @@ -51,7 +53,8 @@ block content div.form-group.has-feedback#input-form-group label(for='#chat-input').sr-only= _("Command:") input(type='text', placeholder=_("Write your command or answer here"), value=command ? command : '').form-control#input + button(type='button', title='Click to send a voice command').btn.btn-primary#record-button span.spinner-container.form-control-feedback.hidden span.spinner= _("Almond is thinking…") span.glyphicon.glyphicon-warning-sign.form-control-feedback.hidden - span.help-block.hidden= _("Lost connection to the server.") + diff --git a/views/layout.pug b/views/layout.pug index 47f2a192..cee260fb 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -29,7 +29,7 @@ html span.icon-bar span.icon-bar span.icon-bar - a.navbar-brand.scroller.hidden-xs.hidden-sm(href=Config.BASE_URL + '/') Almond + span.navbar-brand.scroller.hidden-xs.hidden-sm Almond span.navbar-brand.scroller.hidden-md.hidden-lg(aria-hidden='true') block page_name diff --git a/views/navbar.pug b/views/navbar.pug index 2df00813..13a9b01f 100644 --- a/views/navbar.pug +++ b/views/navbar.pug @@ -1,6 +1,6 @@ ul.nav.navbar-nav if authenticated - li.hidden-md.hidden-lg + li a(class="scroller", href=Config.BASE_URL + "/") Conversation li a(class="scroller", href=Config.BASE_URL + "/apps") My Rules From 05faaf48be15d6f071754f56bc5fbb583c5d3650 Mon Sep 17 00:00:00 2001 From: almakantara Date: Thu, 6 May 2021 20:47:13 -0400 Subject: [PATCH 2/7] restyled "my skills" page --- public/stylesheets/my_stuff.css | 73 +++++++++++++++++++++++++++++++++ views/devices_list.pug | 21 ++++++---- 2 files changed, 86 insertions(+), 8 deletions(-) diff --git a/public/stylesheets/my_stuff.css b/public/stylesheets/my_stuff.css index 842a5fba..221b228f 100644 --- a/public/stylesheets/my_stuff.css +++ b/public/stylesheets/my_stuff.css @@ -11,3 +11,76 @@ float: right; } +#new_skills { + padding: 40px 0px; +} + +#new_skills>a { + font-weight: 600; + font-size: 1.3em; +} + +.panel { + min-height: 18em; + border-bottom-left-radius: 19px; + border-bottom-right-radius: 19px; + border-top-left-radius: 19px; + border-top-right-radius: 19px; +} + +.panel-body { + height: 11.5em; +} + +.panel-footer { + min-height: 4.2em; + padding: 2px 5px !important; + background-color: #b1040e; + border-bottom-left-radius: 19px; + border-bottom-right-radius: 19px; +} + +.panel-title { + font-size: 19px; + font-weight: bold; +} + +.panel-heading { + border-top-left-radius: 19px; + border-top-right-radius: 19px; + background-color: #d8d8d8 !important; +} + +.bottom_bar.fa, +.bottom_bar.far { + cursor: grab; + border-radius: 60px; + background-color: transparent; + color: white; + margin: 5px; + width: 2em; + height: 2em; + font-size: 1.5em; + line-height: 2em; + text-align: center; + border: none; +} + +.bottom_bar.fa:hover, +.bottom_bar.far:hover { + background-color: #8c1515; +} + +.form-inline.form-config { + float: right; +} + +.form-inline.form-delete { + float: right; +} + +@media (min-width: 992px) { + .panel-footer>.row>.col-md-6 { + width: 100%; + } +} \ No newline at end of file diff --git a/views/devices_list.pug b/views/devices_list.pug index b2dcaab3..d6a45f0f 100644 --- a/views/devices_list.pug +++ b/views/devices_list.pug @@ -18,6 +18,10 @@ block content span(aria-hidden='true') × p= message + div.row + div.col-sm-6.col-md-3#new_skills + a(href=Config.BASE_URL + '/devices/create').btn.btn-primary.btn-block= _("Configure a new skill") + div.row each dev, i in devices if i % 6 === 0 @@ -43,13 +47,14 @@ block content if !dev.isTransient div.col-md-6 form.form-inline(action=Config.BASE_URL + '/devices/delete',method="post").form-delete + input(type='hidden',name='id',value=dev.uniqueId) + input(type='hidden',name='_csrf',value=csrfToken) + if datasource + button(type='submit').bottom_bar.fa.power-off + else + button(type='submit').bottom_bar.fa.fa-trash-alt + + form.form-inline(action=Config.BASE_URL + '/devices/config',method="post").form-config input(type='hidden',name='id',value=dev.uniqueId) input(type='hidden',name='_csrf',value=csrfToken) - if datasource - button(type='submit').btn.btn-danger.btn-sm.btn-block= _("Disable") - else - button(type='submit').btn.btn-danger.btn-sm.btn-block= _("Forget") - - div.row - div.col-sm-6.col-md-3 - a(href=Config.BASE_URL + '/devices/create').btn.btn-primary.btn-block= _("Configure a new skill") + button(type='submit').bottom_bar.fa.fa-cog \ No newline at end of file From e0bc989b0a8a987e9cc940f1d4326d005a2d41c0 Mon Sep 17 00:00:00 2001 From: almakantara Date: Fri, 7 May 2021 19:38:46 -0400 Subject: [PATCH 3/7] further steps in layout improvement: device list, error, chat spinner --- public/images/almond.png | Bin 0 -> 70302 bytes public/images/almond_error.png | Bin 0 -> 65402 bytes public/javascripts/apps.js | 11 +++- public/javascripts/conversation.js | 10 ++-- public/stylesheets/conversation.css | 75 +++++++++++++++++++++++++++- public/stylesheets/my_stuff.css | 48 ++++++++++++++---- public/stylesheets/style.css | 55 ++++++++++++++++++++ views/conversation.pug | 3 +- views/devices_list.pug | 11 ++-- views/error.pug | 13 +++-- views/layout.pug | 5 +- views/login.pug | 2 +- views/login_required.pug | 17 ++++--- 13 files changed, 219 insertions(+), 31 deletions(-) create mode 100644 public/images/almond.png create mode 100644 public/images/almond_error.png diff --git a/public/images/almond.png b/public/images/almond.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e2b95540c6309b954adc92ef26efe18dbda4be GIT binary patch literal 70302 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 GH~tSa64BfM literal 0 HcmV?d00001 diff --git a/public/images/almond_error.png b/public/images/almond_error.png new file mode 100644 index 0000000000000000000000000000000000000000..82904d35ec30011f26081b9256062628557d000d GIT binary patch literal 65402 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 >?g2N9! z1oJZuoAWjcTLJvMBNn~q(Fv+81ewh(1Mpb@l*KM;#dFLT@_2dOI;>g04r|t}<7{^0 zmd!1zv{f&tp|o_b#n^Y*-q?SieR1Ia`(w#odvV9Uh2Tfyq`wlG^tWf>Wo}D!f@+IG zW^-ikdo6$qn`KToouFX5amyBL*}4^*wr;`JZLjc9LY7~H@O{7K&Y70(G_ka3{sJtV zKOYMhEMPOdrHdCMnP_P(*=><>+Gj;3J=_B4)4?Qkg6b@Q%;ru9@czi4Ff$w9LvA#O z!Qo*JwDhx3EbxmmTzVCX#pq`NuIKT;38hkLm;0sZBYIJn-L`Bb5^=<1adah;NTs^a zo$5wUDutfzZuIr`p})5m1N{T&OQ&HNEtPfd4#lX8{|k{x&%7Uc2UA8TsLnFTZ0<+^ zAB!^BmMjr86YNI13y?Et8>0e%YbV0- z%^w4BtH`9kJl8MAY(yuhwh?4D_dWoZ0XT&$r{?6oenHv^ouE2L5S0o(6g9huSy=lTVi>*xg44qg{Bo7*QEpFIb_ zp~RQ(FbtS4O3QcBBK@hzq#tR4bLyal& 100) { + $('#back_top').removeClass('hidden'); + console.log("hidden") + } else { + console.log("not hidden") + $('#back_top').addClass('hidden') + } + }); +}); \ No newline at end of file diff --git a/public/javascripts/conversation.js b/public/javascripts/conversation.js index 386396b1..fa460ca1 100644 --- a/public/javascripts/conversation.js +++ b/public/javascripts/conversation.js @@ -22,7 +22,7 @@ $(() => { function updateConnectionFeedback() { if (!ws || !open) { $('#input-form-group').addClass('has-warning'); - $('#input-form-group .spinner-container').addClass('hidden'); - + $('#almond_thinking_container').remove(); $('#toolbar .form-inline .help-block').removeClass('hidden'); return; } @@ -36,9 +36,9 @@ $(() => { return; if (thinking) - $('#input-form-group .spinner-container').removeClass('hidden'); + $('#almond_thinking_container').removeClass('hidden'); else - $('#input-form-group .spinner-container').addClass('hidden'); + $('#almond_thinking_container').remove(); } @@ -101,6 +101,7 @@ $(() => { function addVoteButtons() { $('.comment-options').remove(); + //$('#almond_thinking_container').remove(); $('#comment-block').val(''); const upvote = $('').addClass('far fa-thumbs-up').attr('id', 'upvoteLast'); const downvote = $('').addClass('far fa-thumbs-down').attr('id', 'downvoteLast'); @@ -143,7 +144,6 @@ $(() => { if (!$('#input:focus').length) return; //keep scroll bar to the bottom - scrollChat(); setTimeout(scrollChat, 1000); } @@ -180,6 +180,7 @@ $(() => { rdlMessage.append($('').addClass('message-rdl-content') .text(rdl.displayText)); container.append(rdlMessage); + maybeScroll(container); } @@ -374,6 +375,7 @@ $(() => { function appendUserMessage(text) { container.append($('').addClass('message message-text from-user') .text(text)); + container.append('

Almond is thinking

'); } $('#input-form').submit((event) => { diff --git a/public/stylesheets/conversation.css b/public/stylesheets/conversation.css index 1bb6cc0a..7e812ee4 100644 --- a/public/stylesheets/conversation.css +++ b/public/stylesheets/conversation.css @@ -210,8 +210,81 @@ .help-block { display: inline; - color: #8c1515; + color: #b1040e; font-weight: bold; width: 50%; text-align: center; +} + +#almond_thinking_container { + display: flex; +} + +#almond_thinking_txt { + font-size: 1.4em; + padding: 0.7em 0.2em 0em 1.2em; +} + +#almond_thinking { + padding: 1.1em; +} + +#almong_thinking { + display: flex; + justify-content: center; + align-items: center; + position: relative; + padding: 2rem 0; + margin: 0 -5%; + overflow: hidden; +} + +#almond_thinking span { + display: inline-block; + vertical-align: middle; + width: .6em; + height: .6em; + margin: .19em; + background: #8c1515; + border-radius: .6em; + animation: loading 1s infinite alternate; +} + +#almond_thinking span:nth-of-type(2) { + background: #8d2727; + animation-delay: 0.2s; +} + +#almond_thinking span:nth-of-type(3) { + background: #a73c3c; + animation-delay: 0.4s; +} + +#almond_thinking span:nth-of-type(4) { + background: #c05959; + animation-delay: 0.6s; +} + +#almond_thinking span:nth-of-type(5) { + background: #c26e6e; + animation-delay: 0.8s; +} + +#almond_thinking span:nth-of-type(6) { + background: #df9595; + animation-delay: 1.0s; +} + +#almond_thinking span:nth-of-type(7) { + background: #e6acac; + animation-delay: 1.2s; +} + +@keyframes loading { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } } \ No newline at end of file diff --git a/public/stylesheets/my_stuff.css b/public/stylesheets/my_stuff.css index 221b228f..64ce31f1 100644 --- a/public/stylesheets/my_stuff.css +++ b/public/stylesheets/my_stuff.css @@ -12,28 +12,34 @@ } #new_skills { - padding: 40px 0px; + padding: 30px 0px; } #new_skills>a { font-weight: 600; font-size: 1.3em; + border-radius: 15px; } .panel { - min-height: 18em; + min-height: 13.9em; border-bottom-left-radius: 19px; border-bottom-right-radius: 19px; border-top-left-radius: 19px; border-top-right-radius: 19px; } +.panel-default { + border-color: #585858; +} + .panel-body { - height: 11.5em; + min-height: 8em; + background-color: #ece5dd6b; } .panel-footer { - min-height: 4.2em; + min-height: 3em; padding: 2px 5px !important; background-color: #b1040e; border-bottom-left-radius: 19px; @@ -42,13 +48,20 @@ .panel-title { font-size: 19px; - font-weight: bold; + font-weight: 600; + line-height: 1.2em; } .panel-heading { + min-height: 3em; border-top-left-radius: 19px; border-top-right-radius: 19px; background-color: #d8d8d8 !important; + color: #000; +} + +#cont_head { + text-align: center; } .bottom_bar.fa, @@ -58,10 +71,10 @@ background-color: transparent; color: white; margin: 5px; - width: 2em; - height: 2em; - font-size: 1.5em; - line-height: 2em; + width: 1.4em; + height: 1.4em; + font-size: 1.3em; + line-height: 1.5em; text-align: center; border: none; } @@ -83,4 +96,21 @@ .panel-footer>.row>.col-md-6 { width: 100%; } +} + +p.device-icon-small { + float: left; + padding-right: 1em; +} + +#back_top { + text-align: right; + padding-top: 3em; + width: 100%; +} + +#bttop-button { + border-radius: 35px; + font-weight: 600; + font-size: 2em; } \ No newline at end of file diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index e6938e03..48b4e67f 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -154,4 +154,59 @@ pre code { line-height: 21px; height: 47px; font-size: 26px; +} + +#login_btn { + border-radius: 15px; + font-weight: 600; +} + +.sp_blk { + min-height: 15em; + padding-top: 4em; +} + +.blk_sx { + width: 50%; + float: left; + text-align: right; + padding-right: 6em; +} + +.err_img { + width: 100px; +} + +.blk_dx { + width: 50%; + float: right; +} + +.sorry>h2 { + font-weight: 600; + padding: 0.5em 0em; +} + +.sp_msg { + color: #8c1515; +} + +.sp_msg>h3 { + font-weight: 400; +} + +.sp_btn { + width: 100%; + text-align: center; + padding: 50px 0px; +} + +.sp_btn>a { + border-radius: 15px; +} + +.logo_top { + width: 55px; + float: left; + margin-right: 10px; } \ No newline at end of file diff --git a/views/conversation.pug b/views/conversation.pug index 1ed3190e..867e9c40 100644 --- a/views/conversation.pug +++ b/views/conversation.pug @@ -45,6 +45,7 @@ block content div#conversation.single div#chat + div#input-block span(role='button').hidden#cancel span(aria-hidden='true').glyphicon.glyphicon-remove-circle @@ -54,7 +55,5 @@ block content label(for='#chat-input').sr-only= _("Command:") input(type='text', placeholder=_("Write your command or answer here"), value=command ? command : '').form-control#input button(type='button', title='Click to send a voice command').btn.btn-primary#record-button - span.spinner-container.form-control-feedback.hidden - span.spinner= _("Almond is thinking…") span.glyphicon.glyphicon-warning-sign.form-control-feedback.hidden diff --git a/views/devices_list.pug b/views/devices_list.pug index d6a45f0f..9587c4f6 100644 --- a/views/devices_list.pug +++ b/views/devices_list.pug @@ -10,6 +10,7 @@ block styles link(rel='stylesheet', href=Config.BASE_URL + '/stylesheets/my_stuff.css') block content + a#anch_top(href='#') if message div.row div.col-xs-12 @@ -32,8 +33,9 @@ block content div.clearfix.visible-md div.col-lg-4.col-md-6 div.panel.panel-default.installed-dev - a(href='https://thingpedia.stanford.edu/thingpedia/devices/by-id/' + dev.kind).panel-heading - h2.panel-title= dev.name + div#cont_head + a(href='https://thingpedia.stanford.edu/thingpedia/devices/by-id/' + dev.kind).panel-heading + h2.panel-title= dev.name div.panel-body p.device-icon-small img(src=THINGPEDIA_URL + '/api/v3/devices/icon/' + dev.kind, alt="Icon for " + dev.name) @@ -57,4 +59,7 @@ block content form.form-inline(action=Config.BASE_URL + '/devices/config',method="post").form-config input(type='hidden',name='id',value=dev.uniqueId) input(type='hidden',name='_csrf',value=csrfToken) - button(type='submit').bottom_bar.fa.fa-cog \ No newline at end of file + button(type='submit').bottom_bar.fa.fa-cog + div.row + div#back_top.hidden + a(href= '#anch_top').btn.btn-primary#bttop-button.fas.fa-arrow-circle-up \ No newline at end of file diff --git a/views/error.pug b/views/error.pug index 0867e41f..07409b49 100644 --- a/views/error.pug +++ b/views/error.pug @@ -4,6 +4,13 @@ block page_name | Error block content - p Sorry that did not work - p= message - a(href='javascript:history.back()').btn.btn-primary Go back + div.sp_blk + div.blk_sx + img.err_img(src=Config.BASE_URL + '/images/almond_error.png') + div.blk_dx + div.sorry + h2.p Sorry that did not work + div.sp_msg + h3.p= message + div.sp_btn + a(href='javascript:history.back()').btn.btn-primary Go back diff --git a/views/layout.pug b/views/layout.pug index cee260fb..1e183fbe 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -23,13 +23,16 @@ html - var includefooter = true; body(data-developer-key=developerKey,data-thingpedia-url=Config.THINGPEDIA_URL,data-base-url=Config.BASE_URL,data-csrf-token=csrfToken) nav.navbar-inverse.navbar.navbar-fixed-top(role="banner") + div.navbar-header button(class="navbar-toggle collapsed", data-toggle="collapse", data-target="#page-nav") span.sr-only Toggle navigation span.icon-bar span.icon-bar span.icon-bar - span.navbar-brand.scroller.hidden-xs.hidden-sm Almond + span.navbar-brand.scroller.hidden-xs.hidden-sm + img.logo_top(src=Config.BASE_URL + '/images/almond.png') + | Almond span.navbar-brand.scroller.hidden-md.hidden-lg(aria-hidden='true') block page_name diff --git a/views/login.pug b/views/login.pug index cbd38a65..82d0920e 100644 --- a/views/login.pug +++ b/views/login.pug @@ -22,4 +22,4 @@ block content label(for='password').control-label Password input(type='password',name='password',value=password).form-control#password div.form-group - button(type='submit').btn.btn-primary Log in + button(type='submit').btn.btn-primary#login_btn Log in diff --git a/views/login_required.pug b/views/login_required.pug index 1063c2bf..6f761ba3 100644 --- a/views/login_required.pug +++ b/views/login_required.pug @@ -4,9 +4,14 @@ block page_name | Error block content - h1 Login required - p This Almond instance is configured to require login. - p - a(href='javascript:history.back()').btn.btn-default Go back - span= " " - a(href=Config.BASE_URL + '/user/login').btn.btn-primary Log in + div.sp_blk + div.blk_sx + img.err_img(src=Config.BASE_URL + '/images/almond_error.png') + div.blk_dx + div.sorry + h2.p=_("Login required") + div.sp_msg + h3.p=_("This Almond instance is configured to require login.") + a(href='javascript:history.back()').btn.btn-default Go back + div.sp_btn + a(href=Config.BASE_URL + '/user/login').btn.btn-primary Log in \ No newline at end of file From e28015144a1294a64c308d15f2df47115e70c6d0 Mon Sep 17 00:00:00 2001 From: almakantara Date: Tue, 11 May 2021 09:48:14 -0400 Subject: [PATCH 4/7] fixed several issues requested --- public/javascripts/apps.js | 4 +- public/javascripts/conversation.js | 62 ++++++-- public/stylesheets/conversation.css | 25 ++-- public/stylesheets/my_stuff.css | 67 +-------- public/stylesheets/style.css | 142 ++++++++++++++++-- tests/test_website_selenium.js | 26 ++-- tests/website/scaffold.js | 6 +- tests/website/test_my_api.js | 220 +++++++++++++++------------- views/apps_create.pug | 2 +- views/config.pug | 41 +++--- views/configure.pug | 46 +++--- views/conversation.pug | 87 ++++++----- views/devices_create.pug | 2 +- views/devices_list.pug | 12 +- views/error.pug | 20 +-- views/login.pug | 10 +- views/login_required.pug | 20 +-- views/navbar.pug | 12 +- views/query.pug | 8 +- 19 files changed, 476 insertions(+), 336 deletions(-) diff --git a/public/javascripts/apps.js b/public/javascripts/apps.js index f2c86b72..0dd9822b 100644 --- a/public/javascripts/apps.js +++ b/public/javascripts/apps.js @@ -4,11 +4,11 @@ $(function() { }); $(window).scroll(function() { if ($(window).scrollTop() > 100) { - $('#back_top').removeClass('hidden'); + $('#back-top').removeClass('hidden'); console.log("hidden") } else { console.log("not hidden") - $('#back_top').addClass('hidden') + $('#back-top').addClass('hidden') } }); }); \ No newline at end of file diff --git a/public/javascripts/conversation.js b/public/javascripts/conversation.js index fa460ca1..3c45f044 100644 --- a/public/javascripts/conversation.js +++ b/public/javascripts/conversation.js @@ -19,28 +19,69 @@ $(() => { var conversationId = null; var lastMessageId = -1; + var container = $('#chat'); + var currentGrid = null; + function updateConnectionFeedback() { if (!ws || !open) { $('#input-form-group').addClass('has-warning'); - $('#almond_thinking_container').remove(); - $('#toolbar .form-inline .help-block').removeClass('hidden'); + manageSpinner('remove'); + manageLostConnectionMsg('add'); + manageLostConnectionMsg('show'); return; } $('#input-form-group').removeClass('has-warning'); - $('#toolbar .form-inline .help-block').addClass('hidden'); + manageLostConnectionMsg('remove'); } function updateSpinner(thinking) { if (!ws || !open) return; + let to_do; + if (thinking) - $('#almond_thinking_container').removeClass('hidden'); + to_do = 'show'; else - $('#almond_thinking_container').remove(); + to_do = 'remove'; + + manageSpinner(to_do) } + function manageLostConnectionMsg(todo) { + // let last_elem = $("#chat > span").last(); + //$("#chat span:last-child") + + switch (todo) { + case 'remove': + $('#chat > .help-block').remove(); + break; + case 'show': + $('#chat > .help-block').removeClass('hidden'); + break; + case 'add': + $('#chat > .help-block').remove(); + $(".help-block").clone().appendTo("#chat").last(); + break; + } + return; + } + + function manageSpinner(todo) { + let last_elem = $(".from-user").last(); + switch (todo) { + case 'remove': + $('#chat > .almond-thinking').remove(); + break; + case 'show': + $('#chat > .almond-thinking').remove(); + $(".almond-thinking").clone().insertAfter(last_elem); + $('#chat > .almond-thinking').removeClass('hidden'); + break; + } + return; + } (function() { var reconnectTimeout = 100; @@ -85,9 +126,6 @@ $(() => { $('#cancel').addClass('hidden'); } - var container = $('#chat'); - var currentGrid = null; - function almondMessage(icon) { var msg = $('').addClass('message-container from-almond'); icon = icon || 'org.thingpedia.builtin.thingengine.builtin'; @@ -96,12 +134,13 @@ $(() => { container.append(msg); addVoteButtons(); + manageLostConnectionMsg('add'); + manageSpinner('remove'); return msg; } function addVoteButtons() { $('.comment-options').remove(); - //$('#almond_thinking_container').remove(); $('#comment-block').val(''); const upvote = $('').addClass('far fa-thumbs-up').attr('id', 'upvoteLast'); const downvote = $('').addClass('far fa-thumbs-down').attr('id', 'downvoteLast'); @@ -375,7 +414,9 @@ $(() => { function appendUserMessage(text) { container.append($('').addClass('message message-text from-user') .text(text)); - container.append('

Almond is thinking

'); + + manageLostConnectionMsg('add'); + manageSpinner('show'); } $('#input-form').submit((event) => { @@ -393,6 +434,7 @@ $(() => { handleCommand(text); event.preventDefault(); }); + $('#cancel').click(() => { handleSpecial('nevermind', "Cancel."); }); diff --git a/public/stylesheets/conversation.css b/public/stylesheets/conversation.css index 7e812ee4..55a25f24 100644 --- a/public/stylesheets/conversation.css +++ b/public/stylesheets/conversation.css @@ -209,27 +209,28 @@ } .help-block { - display: inline; + display: block; color: #b1040e; font-weight: bold; width: 50%; text-align: center; + font-size: 1.2em; } -#almond_thinking_container { +.almond-thinking-container { display: flex; } -#almond_thinking_txt { +.almond-thinking-txt { font-size: 1.4em; padding: 0.7em 0.2em 0em 1.2em; } -#almond_thinking { +.almond-thinking { padding: 1.1em; } -#almong_thinking { +#almond-thinking { display: flex; justify-content: center; align-items: center; @@ -239,7 +240,7 @@ overflow: hidden; } -#almond_thinking span { +.almond-thinking span { display: inline-block; vertical-align: middle; width: .6em; @@ -250,32 +251,32 @@ animation: loading 1s infinite alternate; } -#almond_thinking span:nth-of-type(2) { +.almond-thinking span:nth-of-type(2) { background: #8d2727; animation-delay: 0.2s; } -#almond_thinking span:nth-of-type(3) { +.almond-thinking span:nth-of-type(3) { background: #a73c3c; animation-delay: 0.4s; } -#almond_thinking span:nth-of-type(4) { +.almond-thinking span:nth-of-type(4) { background: #c05959; animation-delay: 0.6s; } -#almond_thinking span:nth-of-type(5) { +.almond-thinking span:nth-of-type(5) { background: #c26e6e; animation-delay: 0.8s; } -#almond_thinking span:nth-of-type(6) { +.almond-thinking span:nth-of-type(6) { background: #df9595; animation-delay: 1.0s; } -#almond_thinking span:nth-of-type(7) { +.almond-thinking span:nth-of-type(7) { background: #e6acac; animation-delay: 1.2s; } diff --git a/public/stylesheets/my_stuff.css b/public/stylesheets/my_stuff.css index 64ce31f1..2d3a07f1 100644 --- a/public/stylesheets/my_stuff.css +++ b/public/stylesheets/my_stuff.css @@ -11,76 +11,23 @@ float: right; } -#new_skills { - padding: 30px 0px; -} - -#new_skills>a { - font-weight: 600; - font-size: 1.3em; - border-radius: 15px; -} - -.panel { - min-height: 13.9em; - border-bottom-left-radius: 19px; - border-bottom-right-radius: 19px; - border-top-left-radius: 19px; - border-top-right-radius: 19px; -} - -.panel-default { - border-color: #585858; -} - -.panel-body { - min-height: 8em; - background-color: #ece5dd6b; -} - -.panel-footer { - min-height: 3em; - padding: 2px 5px !important; - background-color: #b1040e; - border-bottom-left-radius: 19px; - border-bottom-right-radius: 19px; -} - -.panel-title { - font-size: 19px; - font-weight: 600; - line-height: 1.2em; -} - -.panel-heading { - min-height: 3em; - border-top-left-radius: 19px; - border-top-right-radius: 19px; - background-color: #d8d8d8 !important; - color: #000; -} - -#cont_head { - text-align: center; -} - -.bottom_bar.fa, -.bottom_bar.far { +.bottom-bar.fa, +.bottom-bar.far { cursor: grab; border-radius: 60px; background-color: transparent; color: white; margin: 5px; - width: 1.4em; - height: 1.4em; + width: 1.6em; + height: 1.7em; font-size: 1.3em; line-height: 1.5em; text-align: center; border: none; } -.bottom_bar.fa:hover, -.bottom_bar.far:hover { +.bottom-bar.fa:hover, +.bottom-bar.far:hover { background-color: #8c1515; } @@ -103,7 +50,7 @@ p.device-icon-small { padding-right: 1em; } -#back_top { +#back-top { text-align: right; padding-top: 3em; width: 100%; diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 48b4e67f..6f340011 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -140,11 +140,11 @@ pre code { object-fit: contain; } -.consent_conf { +.consent-container { padding-top: 20px; } -.consent_conf>h2 { +.consent-container>h2 { color: #8c1515; font-weight: 500; } @@ -156,57 +156,171 @@ pre code { font-size: 26px; } -#login_btn { - border-radius: 15px; +.custom-btn { + border-radius: 10px; font-weight: 600; + font-size: 1.3em; } -.sp_blk { +.msg-container { min-height: 15em; padding-top: 4em; } -.blk_sx { +.msg-left-block { width: 50%; float: left; text-align: right; padding-right: 6em; } -.err_img { +.msg-image { width: 100px; } -.blk_dx { +.msg-right-block { width: 50%; float: right; } -.sorry>h2 { +.msg-title>h2 { font-weight: 600; padding: 0.5em 0em; } -.sp_msg { +.msg-body { color: #8c1515; } -.sp_msg>h3 { +.msg-body>h3 { font-weight: 400; } -.sp_btn { +.msg-button { width: 100%; text-align: center; padding: 50px 0px; } -.sp_btn>a { - border-radius: 15px; +.msg-button>a { + border-radius: 10px; } .logo_top { width: 55px; float: left; margin-right: 10px; +} + +.subtitle-msg { + padding: 2em 0em; + font-size: 1.3em; +} + +.subtitle-conf-msg { + font-size: 1.3em; + padding: 1.1em 0em; +} + +.control-label { + font-size: 1.2em; +} + +.panel { + min-height: 13.9em; + border-bottom-left-radius: 19px; + border-bottom-right-radius: 19px; + border-top-left-radius: 19px; + border-top-right-radius: 19px; +} + +.panel-default { + border-color: #585858; + margin: 30px 0px; +} + +.panel-body { + min-height: 8em; + background-color: #ece5dd6b; +} + +.panel-body.btn.btn-primary { + font-weight: 600; + font-size: 1.3em; + border-radius: 10px; +} + +.panel-body-conf { + font-size: 1.3em; +} + +.panel-footer { + min-height: 3em; + padding: 2px 5px !important; + background-color: #b1040e; + border-bottom-left-radius: 19px; + border-bottom-right-radius: 19px; +} + +.panel-title { + font-size: 19px; + font-weight: 600; + line-height: 1.2em; +} + +.panel-heading { + min-height: 3em; + border-top-left-radius: 19px; + border-top-right-radius: 19px; + background-color: #d8d8d8 !important; + color: #000; +} + +.content-head { + text-align: center; +} + +#new-skills { + padding: 30px 0px; +} + +#new-skills>a { + font-weight: 600; + font-size: 1.3em; + border-radius: 10px; +} + +.new-button>a, +.new-button>button { + font-weight: 600; + font-size: 0.9em; + border-radius: 10px; +} + +.new-button { + padding: 15px 0px 5px 0px; +} + +@media (min-width: 768px) { + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + font-size: 1.1em; + } +} + +.radio label, +.checkbox label { + padding-top: 15px; + padding-bottom: 15px; +} + +.online-account-choice>form>.btn, +.online-account-choice>a { + font-size: 1.1em; + border-radius: 10px; +} + +#chat_upper_container { + padding-top: 1.2em; } \ No newline at end of file diff --git a/tests/test_website_selenium.js b/tests/test_website_selenium.js index 4d02a22e..51c8ecf3 100644 --- a/tests/test_website_selenium.js +++ b/tests/test_website_selenium.js @@ -40,12 +40,12 @@ async function withSelenium(test) { // just annoying and not very useful if (process.env.TRAVIS) { builder - .setFirefoxOptions( - new firefox.Options().headless() - ) - .setChromeOptions( - new chrome.Options().headless() - ); + .setFirefoxOptions( + new firefox.Options().headless() + ) + .setChromeOptions( + new chrome.Options().headless() + ); } const driver = builder.build(); @@ -66,7 +66,7 @@ async function checkAllImages(driver) { const currentUrl = await driver.getCurrentUrl(); const images = await driver.findElements(WD.By.css('img')); - await Promise.all(images.map(async (img) => { + await Promise.all(images.map(async(img) => { const src = await img.getAttribute('src'); // small optimization: we only check an image once @@ -79,11 +79,13 @@ async function checkAllImages(driver) { _checkedImages.add(src); // this is not exactly what the browser does - const res = await Tp.Helpers.Http.getStream(src, { extraHeaders: { - Referrer: currentUrl - }}); + const res = await Tp.Helpers.Http.getStream(src, { + extraHeaders: { + Referrer: currentUrl + } + }); assert(res.headers['content-type'].startsWith('image/'), - `expected image/* content type for image, found ${res['content-type']}`); + `expected image/* content type for image, found ${res['content-type']}`); res.resume(); })); } @@ -155,4 +157,4 @@ async function main() { } module.exports = main; if (!module.parent) - main(); + main(); \ No newline at end of file diff --git a/tests/website/scaffold.js b/tests/website/scaffold.js index c4dfc8c6..f46e2bfc 100644 --- a/tests/website/scaffold.js +++ b/tests/website/scaffold.js @@ -78,7 +78,7 @@ function assertHttpError(request, httpStatus, expectedMessage) { if (expectedMessage) { let message; if (err.detail.startsWith('')) { - const match = /Sorry that did not work<\/p>

([^<]+)<\/p>/.exec(err.detail); + const match = /sorry that did not work<\/p>

([^<]+)<\/p>/.exec(err.detail); if (!match) assert.fail(`cannot find error message`); message = match[1]; @@ -131,7 +131,7 @@ async function assertBanner(request, expected) { async function assertBlocked(path, bob, nobody) { await assertRedirect(sessionRequest(path, 'GET', null, nobody, { followRedirects: false }), '/user/login'); await assertHttpError(sessionRequest(path, 'GET', null, bob), - 403, 'You do not have permission to perform this operation.'); + 403, 'You do not have permission to perform this operation.'); } module.exports = { @@ -142,4 +142,4 @@ module.exports = { assertRedirect, assertBanner, assertBlocked -}; +}; \ No newline at end of file diff --git a/tests/website/test_my_api.js b/tests/website/test_my_api.js index 7f479d2f..392dca94 100644 --- a/tests/website/test_my_api.js +++ b/tests/website/test_my_api.js @@ -98,20 +98,24 @@ async function testMyApiCreateWhenApp(auth) { delete parsed.result.raw.__timestamp; console.log(data); if (count === 0) { - assert.deepStrictEqual(parsed, { result: - { appId: result.uniqueId, - raw: { data: '!!!!!!!!!!', size: 10 }, - type: 'org.thingpedia.builtin.test:get_data', - formatted: [ { type: 'text', text: 'Notification from Test: the answer is !!!!!!!!!!' } ], - icon: 'https://thingpedia.stanford.edu/thingpedia/api/v3/devices/icon/org.thingpedia.builtin.test' } + assert.deepStrictEqual(parsed, { + result: { + appId: result.uniqueId, + raw: { data: '!!!!!!!!!!', size: 10 }, + type: 'org.thingpedia.builtin.test:get_data', + formatted: [{ type: 'text', text: 'Notification from Test: the answer is !!!!!!!!!!' }], + icon: 'https://thingpedia.stanford.edu/thingpedia/api/v3/devices/icon/org.thingpedia.builtin.test' + } }); } else { - assert.deepStrictEqual(parsed, { result: - { appId: result.uniqueId, - raw: { data: '""""""""""', size: 10 }, - type: 'org.thingpedia.builtin.test:get_data', - formatted: [ { type: 'text', text: 'Notification from Test: the answer is """""""""".' } ], - icon: 'https://thingpedia.stanford.edu/thingpedia/api/v3/devices/icon/org.thingpedia.builtin.test' } + assert.deepStrictEqual(parsed, { + result: { + appId: result.uniqueId, + raw: { data: '""""""""""', size: 10 }, + type: 'org.thingpedia.builtin.test:get_data', + formatted: [{ type: 'text', text: 'Notification from Test: the answer is """""""""".' }], + icon: 'https://thingpedia.stanford.edu/thingpedia/api/v3/devices/icon/org.thingpedia.builtin.test' + } }); } if (++count === 2) { @@ -131,8 +135,7 @@ async function testMyApiListApps(auth, uniqueId) { name: 'Test', description: 'Notify me when there are new get data on test with size 10 byte.', error: null, - code: - 'monitor(@org.thingpedia.builtin.test.get_data(size=10byte));', + code: 'monitor(@org.thingpedia.builtin.test.get_data(size=10byte));', icon: 'org.thingpedia.builtin.test', isEnabled: true, isRunning: true, @@ -144,8 +147,7 @@ async function testMyApiListApps(auth, uniqueId) { name: 'Test', description: 'Notify me when there are new get data on test with size 10 byte.', error: null, - code: - 'monitor(@org.thingpedia.builtin.test.get_data(size=10byte));', + code: 'monitor(@org.thingpedia.builtin.test.get_data(size=10byte));', icon: 'org.thingpedia.builtin.test', isEnabled: true, isRunning: true, @@ -167,43 +169,50 @@ async function testMyApiDeleteApp(auth, uniqueId) { async function testMyApiDevices(auth) { const listResult = JSON.parse(await request('/api/devices/list', 'GET', null, { auth })); - assert.deepStrictEqual(listResult, [ - { uniqueId: 'thingengine-own-server:81e0e8abba27202a', - name: 'Almond server (:81e0e8abba27202a)', - description: 'This is one of your own Almond apps.', - kind: 'org.thingpedia.builtin.thingengine', - version: 0, - ownerTier: 'server', - class: 'system', - isTransient: false, - authType: 'builtin' }, - { uniqueId: 'org.thingpedia.builtin.thingengine.server', - name: 'Almond Smart Speaker', - description: 'Commands that are specific to using Almond as a smart-speaker device.', - kind: 'org.thingpedia.builtin.thingengine.server', - version: 0, - class: 'data', - ownerTier: 'global', - isTransient: false, - authType: 'builtin' }, - { uniqueId: 'org.thingpedia.builtin.thingengine.builtin', - name: 'Miscellaneous Interfaces', - description: 'Time, randomness and other non-device specific things.', - kind: 'org.thingpedia.builtin.thingengine.builtin', - version: 0, - ownerTier: 'global', - class: 'data', - isTransient: true, - authType: 'builtin' }, - { uniqueId: 'org.thingpedia.builtin.test', - name: 'Test Device', - description: 'Test Almond in various ways', - kind: 'org.thingpedia.builtin.test', - version: 0, - ownerTier: 'global', - class: 'system', - isTransient: true, - authType: 'builtin' }, + assert.deepStrictEqual(listResult, [{ + uniqueId: 'thingengine-own-server:81e0e8abba27202a', + name: 'Almond server (:81e0e8abba27202a)', + description: 'This is one of your own Almond apps.', + kind: 'org.thingpedia.builtin.thingengine', + version: 0, + ownerTier: 'server', + class: 'system', + isTransient: false, + authType: 'builtin' + }, + { + uniqueId: 'org.thingpedia.builtin.thingengine.server', + name: 'Almond Smart Speaker', + description: 'Commands that are specific to using Almond as a smart-speaker device.', + kind: 'org.thingpedia.builtin.thingengine.server', + version: 0, + class: 'data', + ownerTier: 'global', + isTransient: false, + authType: 'builtin' + }, + { + uniqueId: 'org.thingpedia.builtin.thingengine.builtin', + name: 'Miscellaneous Interfaces', + description: 'Time, randomness and other non-device specific things.', + kind: 'org.thingpedia.builtin.thingengine.builtin', + version: 0, + ownerTier: 'global', + class: 'data', + isTransient: true, + authType: 'builtin' + }, + { + uniqueId: 'org.thingpedia.builtin.test', + name: 'Test Device', + description: 'Test Almond in various ways', + kind: 'org.thingpedia.builtin.test', + version: 0, + ownerTier: 'global', + class: 'system', + isTransient: true, + authType: 'builtin' + }, ]); const createResult = JSON.parse(await request('/api/devices/create', 'POST', JSON.stringify({ @@ -223,53 +232,62 @@ async function testMyApiDevices(auth) { }); const listResult2 = JSON.parse(await request('/api/devices/list', 'GET', null, { auth })); - listResult2[listResult2.length-1].version = 0; - assert.deepStrictEqual(listResult2, [ - { uniqueId: 'thingengine-own-server:81e0e8abba27202a', - name: 'Almond server (:81e0e8abba27202a)', - description: 'This is one of your own Almond apps.', - kind: 'org.thingpedia.builtin.thingengine', - version: 0, - ownerTier: 'server', - class: 'system', - isTransient: false, - authType: 'builtin' }, - { uniqueId: 'org.thingpedia.builtin.thingengine.server', - name: 'Almond Smart Speaker', - description: 'Commands that are specific to using Almond as a smart-speaker device.', - kind: 'org.thingpedia.builtin.thingengine.server', - version: 0, - class: 'data', - ownerTier: 'global', - isTransient: false, - authType: 'builtin' }, - { uniqueId: 'org.thingpedia.builtin.thingengine.builtin', - name: 'Miscellaneous Interfaces', - description: 'Time, randomness and other non-device specific things.', - kind: 'org.thingpedia.builtin.thingengine.builtin', - version: 0, - ownerTier: 'global', - class: 'data', - isTransient: true, - authType: 'builtin' }, - { uniqueId: 'org.thingpedia.builtin.test', - name: 'Test Device', - description: 'Test Almond in various ways', - kind: 'org.thingpedia.builtin.test', - version: 0, - ownerTier: 'global', - class: 'system', - isTransient: true, - authType: 'builtin' }, - { uniqueId: 'com.xkcd', - name: 'XKCD', - description: 'A webcomic of romance, sarcasm, math, and language.', - kind: 'com.xkcd', - version: 0, - ownerTier: 'global', - class: 'data', - isTransient: false, - authType: 'none' } + listResult2[listResult2.length - 1].version = 0; + assert.deepStrictEqual(listResult2, [{ + uniqueId: 'thingengine-own-server:81e0e8abba27202a', + name: 'Almond server (:81e0e8abba27202a)', + description: 'This is one of your own Almond apps.', + kind: 'org.thingpedia.builtin.thingengine', + version: 0, + ownerTier: 'server', + class: 'system', + isTransient: false, + authType: 'builtin' + }, + { + uniqueId: 'org.thingpedia.builtin.thingengine.server', + name: 'Almond Smart Speaker', + description: 'Commands that are specific to using Almond as a smart-speaker device.', + kind: 'org.thingpedia.builtin.thingengine.server', + version: 0, + class: 'data', + ownerTier: 'global', + isTransient: false, + authType: 'builtin' + }, + { + uniqueId: 'org.thingpedia.builtin.thingengine.builtin', + name: 'Miscellaneous Interfaces', + description: 'Time, randomness and other non-device specific things.', + kind: 'org.thingpedia.builtin.thingengine.builtin', + version: 0, + ownerTier: 'global', + class: 'data', + isTransient: true, + authType: 'builtin' + }, + { + uniqueId: 'org.thingpedia.builtin.test', + name: 'Test Device', + description: 'Test Almond in various ways', + kind: 'org.thingpedia.builtin.test', + version: 0, + ownerTier: 'global', + class: 'system', + isTransient: true, + authType: 'builtin' + }, + { + uniqueId: 'com.xkcd', + name: 'XKCD', + description: 'A webcomic of romance, sarcasm, math, and language.', + kind: 'com.xkcd', + version: 0, + ownerTier: 'global', + class: 'data', + isTransient: false, + authType: 'none' + } ]); } @@ -358,4 +376,4 @@ async function main() { } module.exports = main; if (!module.parent) - main(); + main(); \ No newline at end of file diff --git a/views/apps_create.pug b/views/apps_create.pug index e1fda44a..375b700f 100644 --- a/views/apps_create.pug +++ b/views/apps_create.pug @@ -1,7 +1,7 @@ extends layout block page_name - | New App + = _("New App") block content if error diff --git a/views/config.pug b/views/config.pug index f36e9620..7b9258a6 100644 --- a/views/config.pug +++ b/views/config.pug @@ -5,26 +5,33 @@ block scripts script(src=Config.BASE_URL + '/javascripts/config.js') block page_name - | Configuration + = _("Configuration") block content div.panel.panel-default.config-unit div.panel-heading - h2.panel-title Server - div.panel-body - p The server is up and running at #{server.name}, port #{server.port}. + h2.panel-title=_("Server") + div.panel-body.panel-body-conf + p=_("The server is up and running at: ") + | #{server.name} + | , + = _(" port") + | #{server.port} + | . if server.extraAddresses.length > 0 - p The server is also reachable at: #{server.extraAddresses.join(', ')}. + p=_("The server is also reachable at: ") + | #{server.extraAddresses.join(', ')} + | . //if server.initialSetup p.text-danger The server is in initial setup mode and thus open to | all external access. Pair your phone now! - p Access to this server requires a password. - p + p=_("Access to this server requires a password.") + p.new-button a.btn.btn-primary(role='button',data-toggle='collapse',href='#change-server-password',aria-expanded=(user.error != null)) - | Change password + =_("Change Password") div(class=(user.error != null ? 'well' : 'well collapse'))#change-server-password if user.error @@ -37,22 +44,22 @@ block content form(action=Config.BASE_URL + '/config/set-server-password',method='post',data-toggle='validator') input(type='hidden',name='_csrf',value=csrfToken) div.form-group - label(for='password').control-label Password + label(for='password').control-label=_("Password") input(type='password',name='password',value=user.password,required=true,maxlength=255,minlength=8,data-minlength=8).form-control#password - span.help-block Minimum of 8 characters + span.help-block=_("Minimum of 8 characters") div.form-group - label(for='confirm-password').control-label Confirm password + label(for='confirm-password').control-label=_("Confirm password") input(type='password',name='confirm-password',value='',required=true,data-match='#password',data-match-error="The password and the confirmation must match").form-control#confirm-password span.help-block.with-errors - div.form-group - button(type='submit').btn.btn-primary Change + div.new-button.form-group + button(type='submit').btn.btn-primary=_("Change") div.panel.panel-default.config-unit div.panel-heading - h2.panel-title Options - div.panel-body + h2.panel-title=_("Options") + div.panel-body.panel-body-conf form(action=Config.BASE_URL + '/config/set-options',method='post',data-toggle='validator') input(type='hidden',name='_csrf',value=csrfToken) div.form-group @@ -75,8 +82,8 @@ block content input(type='checkbox',name='voice_output',value='1',checked=settings.voice_output)#setting-voice-output = _(" Enable voice output (text to speech).") - div.form-group - button(type='submit').btn.btn-primary Save + div.new-button.form-group + button(type='submit').btn.btn-primary=_("Save") //-div.panel.panel-default.config-unit div.panel-heading diff --git a/views/configure.pug b/views/configure.pug index 36a321be..cfc9fd4b 100644 --- a/views/configure.pug +++ b/views/configure.pug @@ -1,15 +1,15 @@ extends layout block page_name - | Initial Configuration + = _("Initial Configuration") block content - h2 Welcome to Almond! + h2= _("Welcome to Almond!") - p - | You must configure a password before you use your Almond. + p.subtitle-conf-msg + = _("You must configure a password before you use your Almond.") if Config.ENABLE_DB_ENCRYPTION - | This password will be used to generate a secure encryption key to store your saved credentials. + = _("This password will be used to generate a secure encryption key to store your saved credentials.") each error in errors div.alert.alert-danger.alert-dismissible.fade.in(role='alert') @@ -20,13 +20,13 @@ block content form(action=Config.BASE_URL + '/user/configure', method='post',data-toggle='validator') input(type='hidden',name='_csrf',value=csrfToken) div.form-group - label(for='password').control-label Password + label(for='password').control-label= _("Password") input(type='password',name='password',value=password).form-control#password div.form-group - label(for='confirm-password').control-label Confirm password + label(for='confirm-password').control-label= _("Confirm password") input(type='password',name='confirm-password',value='',required=true,data-match='#password',data-match-error="The password and the confirmation must match").form-control#confirm-password span.help-block.with-errors - div.consent_conf + div.consent-container +consent_form div.form-group div.checkbox @@ -34,7 +34,7 @@ block content input(type='checkbox',name='agree_consent',id='register-agree-consent',value='1',required=true) =_("I agree to grant consent to this research.") div.form-group - button(type='submit').btn.btn-primary Configure + button(type='submit').btn.btn-primary#configure-btn= _("Configure") @@ -43,29 +43,29 @@ mixin consent_form div.consent-form p - | You are invited to participate in a research study on virtual assistants. With your consent, the Almond virtual assistant will record the commands you give it. - | Recording the commands will allow Almond virtual assistant to improve its understanding of natural language. The collection is completely confidential, and personal data (such as emails and phone numbers) will be stripped automatically. - | You must be 18 or older to participate, and currently residing in the United States. + = _("You are invited to participate in a research study on virtual assistants. With your consent, the Almond virtual assistant will record the commands you give it.") + = _("Recording the commands will allow Almond virtual assistant to improve its understanding of natural language. The collection is completely confidential, and personal data (such as emails and phone numbers) will be stripped automatically.") + = _("You must be 18 or older to participate, and currently residing in the United States.") - h3 Risks and Benefits + h3= _("Risks and Benefits") p - | We do not foresee any risk from this study. The benefits which may reasonably be expected to result from this study are that the open-source Almond virtual assistant improves over time. We cannot and do not guarantee or promise that you will receive any benefits from this study. - | Your decision whether or not to participate in this study will not affect the functionality of the Almond virtual assistant service, or your ability to use it. - | You will not receive any payment for your participation. + = _("We do not foresee any risk from this study. The benefits which may reasonably be expected to result from this study are that the open-source Almond virtual assistant improves over time. We cannot and do not guarantee or promise that you will receive any benefits from this study.") + = _("Your decision whether or not to participate in this study will not affect the functionality of the Almond virtual assistant service, or your ability to use it.") + = _("You will not receive any payment for your participation.") - h3 Participant Rights + h3= _("Participant Rights") p - | If you have read this form and have decided to participate in this project, please understand your participation is voluntary and you have the right to withdraw your consent or discontinue participation at any time without penalty or loss of benefits to which you are otherwise entitled. The alternative is not to participate. You have the right to refuse to answer particular questions. The results of this research study may be presented at scientific or professional meetings or published in scientific journals. Your individual privacy will be maintained in all published and written data resulting from the study. + = _("If you have read this form and have decided to participate in this project, please understand your participation is voluntary and you have the right to withdraw your consent or discontinue participation at any time without penalty or loss of benefits to which you are otherwise entitled. The alternative is not to participate. You have the right to refuse to answer particular questions. The results of this research study may be presented at scientific or professional meetings or published in scientific journals. Your individual privacy will be maintained in all published and written data resulting from the study.") p - | Your private information collected as part of the research might be shared with other researchers in anonymized form in the future, without additional consent from you. + = _("Your private information collected as part of the research might be shared with other researchers in anonymized form in the future, without additional consent from you.") - h3 Contact Information + h3= _("Contact Information") p - | Questions: If you have any questions, concerns or complaints about this research, its procedures, risks and benefits, contact the Protocol Director, Giovanni Campagna, at [gcampagn [at] cs.stanford.edu]. + = _("Questions: If you have any questions, concerns or complaints about this research, its procedures, risks and benefits, contact the Protocol Director, Giovanni Campagna, at [gcampagn [at] cs.stanford.edu].") p - | Independent Contact: If you are not satisfied with how this study is being conducted, or if you have any concerns, complaints, or general questions about the research or your rights as a participant, please contact the Stanford Institutional Review Board (IRB) to speak to someone independent of the research team at (650)-723-2480 or toll free at 1-866-680-2906, or email at IRB2-Manager@lists.stanford.edu. You can also write to the Stanford IRB, Stanford University, 1705 El Camino Real, Palo Alto, CA 94306. + = _("Independent Contact: If you are not satisfied with how this study is being conducted, or if you have any concerns, complaints, or general questions about the research or your rights as a participant, please contact the Stanford Institutional Review Board (IRB) to speak to someone independent of the research team at (650)-723-2480 or toll free at 1-866-680-2906, or email at IRB2-Manager@lists.stanford.edu. You can also write to the Stanford IRB, Stanford University, 1705 El Camino Real, Palo Alto, CA 94306.") - p If you agree to these terms, please keep a copy of this form for your records. \ No newline at end of file + p= _("If you agree to these terms, please keep a copy of this form for your records.") \ No newline at end of file diff --git a/views/conversation.pug b/views/conversation.pug index 867e9c40..afcad211 100644 --- a/views/conversation.pug +++ b/views/conversation.pug @@ -11,49 +11,58 @@ block page_name = _("Chat with Almond") block content - div.modal#comment-popup - div.modal-dialog - form(method='post') + div#chat_upper_container + div.modal#comment-popup + div.modal-dialog + form(method='post') + div.modal-content + div.modal-body + div.form-group + label(for='comment-block').control-label= _("Write your comment for the last response") + textarea.form-control#comment-block + div.modal-footer + div.form-group + button(type='submit').btn.btn-primary= _("Comment") + + div#toolbar + div.form-inline + + div.form-group#save-log + i.far.fa-save#save-button + span= _("Save Conversation Log") + + + div.modal#recording-save + div.modal-dialog div.modal-content div.modal-body - div.form-group - label(for='comment-block').control-label= _("Write your comment for the last response") - textarea.form-control#comment-block + p= _("The conversation log has been updated.") + pre#recording-log + p.small= _("Privacy warning: The log may include your account and device names, as well as the results from performing actions on your accounts.") div.modal-footer - div.form-group - button(type='submit').btn.btn-primary= _("Comment") + button.btn.btn-primary#recording-download= _("Download") + a(target='_blank',rel='noopener').btn.btn-primary#recording-share= _("Share with Almond Team") + button.btn.btn-default#recording-save-done= _("Done") - div#toolbar - div.form-inline - div.help-block.hidden= _("Lost connection to the server.") - div.form-group#save-log - i.far.fa-save#save-button - span= _("Save Conversation Log") + div#conversation.single + div#chat + + div#input-block + span(role='button').hidden#cancel + span(aria-hidden='true').glyphicon.glyphicon-remove-circle + span.sr-only= _("Cancel") + form(action='#')#input-form + div.form-group.has-feedback#input-form-group + label(for='#chat-input').sr-only= _("Command:") + input(type='text', placeholder=_("Write your command or answer here"), value=command ? command : '').form-control#input + button(type='button', title='Click to send a voice command').btn.btn-primary#record-button + span.glyphicon.glyphicon-warning-sign.form-control-feedback.hidden + div#hidden-container + div.help-block.hidden= _("Lost connection to the server.") + div.almond-thinking.hidden + span + span + span - div.modal#recording-save - div.modal-dialog - div.modal-content - div.modal-body - p= _("The conversation log has been updated.") - pre#recording-log - p.small= _("Privacy warning: The log may include your account and device names, as well as the results from performing actions on your accounts.") - div.modal-footer - button.btn.btn-primary#recording-download= _("Download") - a(target='_blank',rel='noopener').btn.btn-primary#recording-share= _("Share with Almond Team") - button.btn.btn-default#recording-save-done= _("Done") - - div#conversation.single - div#chat - - div#input-block - span(role='button').hidden#cancel - span(aria-hidden='true').glyphicon.glyphicon-remove-circle - span.sr-only= _("Cancel") - form(action='#')#input-form - div.form-group.has-feedback#input-form-group - label(for='#chat-input').sr-only= _("Command:") - input(type='text', placeholder=_("Write your command or answer here"), value=command ? command : '').form-control#input - button(type='button', title='Click to send a voice command').btn.btn-primary#record-button - span.glyphicon.glyphicon-warning-sign.form-control-feedback.hidden diff --git a/views/devices_create.pug b/views/devices_create.pug index 9a3ccd7c..ab6d3457 100644 --- a/views/devices_create.pug +++ b/views/devices_create.pug @@ -7,5 +7,5 @@ block page_name = _("New Skill") block content - p= _("What skill do you want to set up?") + p.subtitle-conf-msg= _("What skill do you want to set up?") div#online-account-selector.container diff --git a/views/devices_list.pug b/views/devices_list.pug index 9587c4f6..a0077245 100644 --- a/views/devices_list.pug +++ b/views/devices_list.pug @@ -20,7 +20,7 @@ block content p= message div.row - div.col-sm-6.col-md-3#new_skills + div.col-sm-6.col-md-3#new-skills a(href=Config.BASE_URL + '/devices/create').btn.btn-primary.btn-block= _("Configure a new skill") div.row @@ -33,7 +33,7 @@ block content div.clearfix.visible-md div.col-lg-4.col-md-6 div.panel.panel-default.installed-dev - div#cont_head + div.content-head a(href='https://thingpedia.stanford.edu/thingpedia/devices/by-id/' + dev.kind).panel-heading h2.panel-title= dev.name div.panel-body @@ -52,14 +52,14 @@ block content input(type='hidden',name='id',value=dev.uniqueId) input(type='hidden',name='_csrf',value=csrfToken) if datasource - button(type='submit').bottom_bar.fa.power-off + button(type='submit').bottom-bar.fa.power-off else - button(type='submit').bottom_bar.fa.fa-trash-alt + button(type='submit').bottom-bar.fa.fa-trash-alt form.form-inline(action=Config.BASE_URL + '/devices/config',method="post").form-config input(type='hidden',name='id',value=dev.uniqueId) input(type='hidden',name='_csrf',value=csrfToken) - button(type='submit').bottom_bar.fa.fa-cog + button(type='submit').bottom-bar.fa.fa-cog div.row - div#back_top.hidden + div#back-top.hidden a(href= '#anch_top').btn.btn-primary#bttop-button.fas.fa-arrow-circle-up \ No newline at end of file diff --git a/views/error.pug b/views/error.pug index 07409b49..2be12c40 100644 --- a/views/error.pug +++ b/views/error.pug @@ -1,16 +1,16 @@ extends layout block page_name - | Error + = _("Error") block content - div.sp_blk - div.blk_sx - img.err_img(src=Config.BASE_URL + '/images/almond_error.png') - div.blk_dx - div.sorry - h2.p Sorry that did not work - div.sp_msg + div.msg-container + div.msg-left-block + img.msg-image(src=Config.BASE_URL + '/images/almond_error.png') + div.msg-right-block + div.msg-title + h2.p= _("Sorry that did not work") + div.msg-body h3.p= message - div.sp_btn - a(href='javascript:history.back()').btn.btn-primary Go back + div.msg-button + a(href='javascript:history.back()').btn.btn-primary.custom-btn= _("Go back") diff --git a/views/login.pug b/views/login.pug index 82d0920e..3f3e63d1 100644 --- a/views/login.pug +++ b/views/login.pug @@ -1,13 +1,13 @@ extends layout block page_name - | Login + = _("Login") block content if isLocked - p Your Almond is locked. Your must input your password to start it. + p.subtitle-msg=_("Your Almond is locked. Your must input your password to start it.") else - p You have been logged out. You must input your password again to access your Almond. + p.subtitle-msg=_("You have been logged out. You must input your password again to access your Almond.") each error in errors div.alert.alert-danger.alert-dismissible.fade.in(role='alert') @@ -19,7 +19,7 @@ block content input(type='hidden',name='_csrf',value=csrfToken) input(type='hidden',name='username',value='ignored') div.form-group - label(for='password').control-label Password + label(for='password').control-label=_("Password") input(type='password',name='password',value=password).form-control#password div.form-group - button(type='submit').btn.btn-primary#login_btn Log in + button(type='submit').btn.btn-primary.custom-btn=_("Log in") diff --git a/views/login_required.pug b/views/login_required.pug index 6f761ba3..43c0d627 100644 --- a/views/login_required.pug +++ b/views/login_required.pug @@ -1,17 +1,17 @@ extends layout block page_name - | Error + = _("Error") block content - div.sp_blk - div.blk_sx - img.err_img(src=Config.BASE_URL + '/images/almond_error.png') - div.blk_dx - div.sorry + div.msg-container + div.msg-left-block + img.msg-image(src=Config.BASE_URL + '/images/almond_error.png') + div.msg-right-block + div.msg-title h2.p=_("Login required") - div.sp_msg + div.msg-body h3.p=_("This Almond instance is configured to require login.") - a(href='javascript:history.back()').btn.btn-default Go back - div.sp_btn - a(href=Config.BASE_URL + '/user/login').btn.btn-primary Log in \ No newline at end of file + a(href='javascript:history.back()').btn.btn-default=_("Go back") + div.msg-button + a(href=Config.BASE_URL + '/user/login').btn.btn-primary=_("Log in") \ No newline at end of file diff --git a/views/navbar.pug b/views/navbar.pug index 13a9b01f..8f056e4d 100644 --- a/views/navbar.pug +++ b/views/navbar.pug @@ -1,17 +1,17 @@ ul.nav.navbar-nav if authenticated li - a(class="scroller", href=Config.BASE_URL + "/") Conversation + a(class="scroller", href=Config.BASE_URL + "/")=_("Conversation") li - a(class="scroller", href=Config.BASE_URL + "/apps") My Rules + a(class="scroller", href=Config.BASE_URL + "/apps")=_("My Rules") li - a(class="scroller", href=Config.BASE_URL + "/devices") My Skills + a(class="scroller", href=Config.BASE_URL + "/devices")=_("My Skills") li - a(class="scroller", href=Config.THINGPEDIA_URL + "/cheatsheet", target='_blank', rel='noopener') Cheatsheet + a(class="scroller", href=Config.THINGPEDIA_URL + "/cheatsheet", target='_blank', rel='noopener')=_("Cheatsheet") ul.nav.navbar-nav.navbar-right if authenticated li - a(class="scroller", href=Config.BASE_URL + "/config") Configuration + a(class="scroller", href=Config.BASE_URL + "/config")=_("Configuration") li - a.navbar-login#navbar-login-button(class="scroller", href=Config.BASE_URL + "/user/logout") Log out + a.navbar-login#navbar-login-button(class="scroller", href=Config.BASE_URL + "/user/logout")=_("Log out") diff --git a/views/query.pug b/views/query.pug index ad2f41cc..c5799834 100644 --- a/views/query.pug +++ b/views/query.pug @@ -4,17 +4,17 @@ block scripts script(src=Config.BASE_URL + '/javascripts/query.js') block page_name - | Run Query + = _("Run Query") block content div.form-group - label(for="code").control-label Query + label(for="code").control-label=_("Query") textarea#code(name="code", placeholder="Write query here").form-control p.from-group - button(type="button")#run.btn.btn-success Run + button(type="button")#run.btn.btn-success=_("Run") div.form-group - label(for="results").control-label Results + label(for="results").control-label=_("Results") textarea#results(name="results").form-control From 7fcbf3703f97ba5a9fe48a2101b3d41e9355f2c3 Mon Sep 17 00:00:00 2001 From: almakantara Date: Tue, 18 May 2021 16:32:52 -0400 Subject: [PATCH 5/7] final commit with requested fixes --- public/stylesheets/conversation.css | 2 +- public/stylesheets/style.css | 1 + views/conversation.pug | 2 +- views/devices_list.pug | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/public/stylesheets/conversation.css b/public/stylesheets/conversation.css index 55a25f24..45ec83ee 100644 --- a/public/stylesheets/conversation.css +++ b/public/stylesheets/conversation.css @@ -166,7 +166,7 @@ } #input { - width: 89%; + width: 97.6%; margin: 0.6em; float: left; border-radius: 8px; diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 6f340011..eb716128 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -282,6 +282,7 @@ pre code { #new-skills { padding: 30px 0px; + margin-left: 15px; } #new-skills>a { diff --git a/views/conversation.pug b/views/conversation.pug index afcad211..bfb09db9 100644 --- a/views/conversation.pug +++ b/views/conversation.pug @@ -55,7 +55,7 @@ block content div.form-group.has-feedback#input-form-group label(for='#chat-input').sr-only= _("Command:") input(type='text', placeholder=_("Write your command or answer here"), value=command ? command : '').form-control#input - button(type='button', title='Click to send a voice command').btn.btn-primary#record-button + button(type='button', title='Click to send a voice command').btn.btn-primary.hidden#record-button span.glyphicon.glyphicon-warning-sign.form-control-feedback.hidden div#hidden-container diff --git a/views/devices_list.pug b/views/devices_list.pug index a0077245..4d3c7a8d 100644 --- a/views/devices_list.pug +++ b/views/devices_list.pug @@ -56,7 +56,7 @@ block content else button(type='submit').bottom-bar.fa.fa-trash-alt - form.form-inline(action=Config.BASE_URL + '/devices/config',method="post").form-config + form.hidden.form-inline(action=Config.BASE_URL + '/devices/config',method="post").form-config input(type='hidden',name='id',value=dev.uniqueId) input(type='hidden',name='_csrf',value=csrfToken) button(type='submit').bottom-bar.fa.fa-cog From 7271ab9f82c0edf883b3729cf56d6f63b1d06d4c Mon Sep 17 00:00:00 2001 From: almakantara Date: Tue, 18 May 2021 17:15:10 -0400 Subject: [PATCH 6/7] fixed chat bubbles --- public/stylesheets/conversation.css | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/public/stylesheets/conversation.css b/public/stylesheets/conversation.css index 45ec83ee..0c230c97 100644 --- a/public/stylesheets/conversation.css +++ b/public/stylesheets/conversation.css @@ -45,20 +45,19 @@ width: 90%; text-align: right; margin-left: auto; - border-image-source: url(../images/bubble_green.png); - border-image-slice: 88 130 93 97 fill; - border-image-width: 25px 42px 24px 20px; + background-color: #DCF8C6; + border-radius: 10px; padding: 13px 24px 12px 24px; - margin-bottom: 5px; + margin-bottom: 10px; } #conversation .from-almond>.message { display: block; overflow: auto; - border-image-source: url(../images/bubble_almond.png); - border-image-slice: 90 97 94 120 fill; - border-image-width: 13px 24px 12px 24px; + background-color: #fff; + border-radius: 10px; padding: 13px 24px 12px 24px; + margin-bottom: 10px; } #conversation .message { From 844a81f60a2b9656e25ba7dc65f641be367bd4aa Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Wed, 19 May 2021 19:12:43 -0700 Subject: [PATCH 7/7] Update tests to the new layout of the error page --- tests/website/scaffold.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/website/scaffold.js b/tests/website/scaffold.js index f46e2bfc..adf31660 100644 --- a/tests/website/scaffold.js +++ b/tests/website/scaffold.js @@ -78,7 +78,7 @@ function assertHttpError(request, httpStatus, expectedMessage) { if (expectedMessage) { let message; if (err.detail.startsWith('')) { - const match = /sorry that did not work<\/p>

([^<]+)<\/p>/.exec(err.detail); + const match = /Sorry that did not work<\/h2><\/div>

([^<]+)<\/h3>/.exec(err.detail); if (!match) assert.fail(`cannot find error message`); message = match[1]; @@ -142,4 +142,4 @@ module.exports = { assertRedirect, assertBanner, assertBlocked -}; \ No newline at end of file +};