Client Behaviour (ts.js) ======================== - Created EntryView.getViewModel: translates model data to view data, specifically synthesizes the start time and duration from the timestamp. - Added nextModel option to EntryView, needed for calculating the entry duration. - Created EntryView.formatStart: given the timestamp, return the start time, in HH:MM format. Code is written for both 24hr and 12hr format, still need to write a selector mechanism. For now, uses 12hr format. - Created EntryView.formatDuration: Get the duration of the entry based on this entry's timestamp and and the next entry's timestamp in a display-able form. If nextModel is `null` or `undefined` it is assumed that `model` is the most recent model and duration is calculated against the current time. - Changed EntryView.render to use getViewModel. - Added 'blur' listeners to the mark and timestamp input fields to close them without persisting the changes. - Created EntryView.update: Refresh the display based on the model using the existing DOM elements. - EntryView.save() now uses EntryView.update() instead of EntryView.render() and no longer includes an implicit close() - EntryView.close() has been split into seperate save() and close() functions, to persist the changes and hide the input dialogs, respectively. - EntryListView.addOne now passes the nextModel to EntryViews is creates. - EntryListView.createNewEntryOnEnter() now clear the new intry input after creating a new entry. - EntryListView.render() now uses a for-structure to traverse the entry collection and passes the nextModel (if there is one) to EntryListView.addOne. Client UI (ts-screen.scss) ========================== - Font size, family, and color adjusted on timeline and user input fields. - Day seperator secondary header colors adjusted. - Mark column width shortened, timestamp and duration columns widened. - Styles added for notes UI Client UI (index.yaws) ====================== - Markup changes needed for getViewModel chanes. - Expanded day seperator.
316 lines
5.5 KiB
SCSS
316 lines
5.5 KiB
SCSS
/*
|
|
* author: Jonathan Bernard
|
|
* TimeStamper main CSS for screen media types
|
|
*/
|
|
|
|
@import "rounded";
|
|
|
|
$darkTxt: #222;
|
|
$lightTxt: #eee;
|
|
$darkBg: #222;
|
|
$lightBg: #eee;
|
|
$medBg: #CCC;
|
|
|
|
* {
|
|
color: inherit;
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
body {
|
|
color: $darkTxt;
|
|
width: 75%;
|
|
margin: auto;
|
|
|
|
}
|
|
|
|
input {
|
|
border: solid thin lighten($darkTxt, 20%);
|
|
-webkit-box-shadow: inset 0px 2px 4px #CCC;
|
|
box-shadow: inset 0px 2px 4px #CCC;
|
|
margin-bottom: 0.5em; // IE fix
|
|
font-family: Cantarell;
|
|
}
|
|
|
|
#top {
|
|
background: $darkBg;
|
|
color: $lightTxt;
|
|
padding: 0.5em 0; // IE Fix
|
|
padding: 0.5rem 0;
|
|
position: fixed;
|
|
top: 0px;
|
|
width: 75%;
|
|
|
|
#fade-bar {
|
|
background: url('img/fade.png') repeat-x;
|
|
height: 32px;
|
|
width: 100%;
|
|
}
|
|
}
|
|
|
|
#timeline {
|
|
|
|
border-bottom: thin solid $lightBg;
|
|
font-family: Arvo;
|
|
font-size: 1.5em;
|
|
padding: 0 2em;
|
|
padding: 0 2rem;
|
|
|
|
.timeline-desc {
|
|
display: inline-block;
|
|
width: 70%;
|
|
}
|
|
|
|
.timeline-desc-input { width: 70% }
|
|
|
|
.timeline-id { display: inline-block; }
|
|
|
|
.timeline-desc-input, .timeline-id-input {
|
|
font-family: inherit;
|
|
font-size: inherit;
|
|
color: $darkBg;
|
|
display: none;
|
|
}
|
|
|
|
&.edit-id {
|
|
.timeline-id-input { display: inline-block; }
|
|
.timeline-id { display: none; }
|
|
}
|
|
|
|
&.edit-desc {
|
|
.timeline-desc-input { display: inline-block; }
|
|
.timeline-desc { display: none; }
|
|
}
|
|
|
|
.drop-menu {
|
|
text-align: right;
|
|
display: inline-block;
|
|
width: 29%;
|
|
|
|
.drop-menu-items {
|
|
text-align: right;
|
|
right: 0;
|
|
width: 172.41%;
|
|
|
|
.timeline-link {
|
|
font-size: medium;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#login {
|
|
|
|
background: white;
|
|
color: $lightTxt;
|
|
opacity: 1;
|
|
|
|
position: fixed;
|
|
top: 0px;
|
|
left: 0px;
|
|
|
|
width: 100%;
|
|
height: 100em;
|
|
|
|
z-index: 10;
|
|
|
|
div.container {
|
|
|
|
background: $darkBg;
|
|
border-radius: 10px;
|
|
font-family: Cantarell;
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
margin-top: 4em;
|
|
padding: 1em;
|
|
width: 20em;
|
|
|
|
h2 {
|
|
border-bottom: thin solid $lightBg;
|
|
font-family: Arvo;
|
|
padding-bottom: 0.5em;
|
|
margin-bottom: 0.5em;
|
|
}
|
|
|
|
label {
|
|
display: inline-block;
|
|
width: 6em;
|
|
}
|
|
|
|
input {
|
|
color: $darkTxt;
|
|
}
|
|
|
|
#login-button {
|
|
|
|
text-align: right;
|
|
margin-top: 0.5em;
|
|
|
|
font-family: Arvo;
|
|
font-size: 1.2em;
|
|
|
|
.validate-tips { font-size: 1em; }
|
|
|
|
a { color: $lightBg; }
|
|
}
|
|
}
|
|
}
|
|
|
|
#user {
|
|
|
|
font-family: "Josefin Sans";
|
|
margin-top: -0.3em; // IE fix
|
|
padding: 0 2em;
|
|
margin-top: -0.3rem;
|
|
padding: 0 2rem;
|
|
width: 100%;
|
|
|
|
.fullname, .username {
|
|
display: inline-block;
|
|
font-size: larger;
|
|
}
|
|
|
|
.fullname-input {
|
|
font-family: inherit;
|
|
font-size: inherit;
|
|
color: $darkBg;
|
|
display: none;
|
|
}
|
|
|
|
&.edit-fullname{
|
|
.fullname-input { display: inline-block; }
|
|
.fullname { display: none; }
|
|
}
|
|
|
|
.drop-menu { display: inline-block; }
|
|
|
|
.drop-menu .drop-menu-items {
|
|
margin-top: -0.5em;
|
|
text-align: right;
|
|
right: 0;
|
|
list-style: none;
|
|
width: 10em;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
#entry-list {
|
|
|
|
margin-top: 6em;
|
|
padding-bottom: 1em;
|
|
margin-top: 6rem;
|
|
padding-bottom: 1rem;
|
|
|
|
.day-seperator {
|
|
|
|
background: $medBg;
|
|
color: $darkBg;
|
|
font-family: Cantarell;
|
|
font-weight: bold;
|
|
margin-top: 1em;
|
|
padding: 0 2em;
|
|
margin-top: 1rem;
|
|
padding: 0 2rem;
|
|
|
|
h4, h5 { display: inline-block; }
|
|
|
|
h5 { color: #667; }
|
|
}
|
|
|
|
#new-entry {
|
|
margin-top: 0.5em;
|
|
padding: 0 2em;
|
|
margin-top: 0.5rem;
|
|
padding: 0 2rem;
|
|
|
|
}
|
|
|
|
.timestamp, .timestamp-input, .duration {
|
|
text-align: right;
|
|
width: 14%;
|
|
}
|
|
|
|
.mark, .mark-input { width: 70%; }
|
|
|
|
.entry {
|
|
|
|
font-family: Cantarell;
|
|
padding: 0 2em;
|
|
padding: 0 2rem;
|
|
|
|
div { display: inline-block; }
|
|
|
|
.mark-input, .timestamp-input { display: none; }
|
|
|
|
.notes, .notes-input { display: none; }
|
|
|
|
&.edit-mark {
|
|
.mark-input { display: inline-block; }
|
|
.mark { display: none; }
|
|
}
|
|
|
|
&.edit-timestamp {
|
|
.timestamp-input { display: inline-block; }
|
|
.timestamp { display: none; }
|
|
}
|
|
|
|
&.edit-notes .notes-input { display: block; }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.drop-menu {
|
|
position: relative;
|
|
|
|
.drop-menu-items {
|
|
display: none;
|
|
list-style: none;
|
|
position: absolute;
|
|
|
|
li {
|
|
display: inline-block;
|
|
padding-left: 0.5em;
|
|
}
|
|
}
|
|
|
|
&:hover .drop-menu-items, .drop-menu-items:hover { display: block; }
|
|
|
|
a {
|
|
display: inline-block;
|
|
text-decoration: none;
|
|
|
|
&:hover {
|
|
text-decoration: underline;
|
|
}
|
|
}
|
|
}
|
|
|
|
.footer {
|
|
|
|
background: $darkBg;
|
|
color: $lightTxt;
|
|
font-family: Bentham;
|
|
padding: 1em 0;
|
|
padding: 1rem 0;
|
|
text-align: center;
|
|
width: 100%;
|
|
|
|
a {
|
|
color: lighten($lightTxt, 20%);
|
|
text-decoration: none;
|
|
|
|
&:hover { text-decoration: underline; }
|
|
|
|
}
|
|
}
|
|
|
|
.logo {
|
|
font-family: Bentham;
|
|
text-decoration: overline underline;
|
|
color: inherit;
|
|
}
|
|
|
|
.hidden { display: none; }
|