UI and build process tweaks.
* Reworked the buid process to compile SCSS files and move WWW assets directories individually. * Added pulsing animation for the current marker. * Bugfix for View objects.
This commit is contained in:
parent
c42a3805c2
commit
e8bebb49fb
14
Makefile
14
Makefile
@ -1,5 +1,7 @@
|
|||||||
MODS = $(wildcard src/*.erl)
|
MODS = $(wildcard src/*.erl)
|
||||||
BEAMS = $(MODS:src/%.erl=build/ebin/%.beam)
|
BEAMS = $(MODS:src/%.erl=build/ebin/%.beam)
|
||||||
|
SCSS = $(wildcard www/css/*.scss)
|
||||||
|
CSS_FILES = $(SCSS:www/css/%.scss=build/www/css/%.css)
|
||||||
TEST_MODS = $(wildcard test/*.erl)
|
TEST_MODS = $(wildcard test/*.erl)
|
||||||
TEST_BEAMS = $(TEST_MODS:test/%.erl=build/test/%.beam)
|
TEST_BEAMS = $(TEST_MODS:test/%.erl=build/test/%.beam)
|
||||||
TS_ROOT=/usr/local/var/yaws/jdb-labs.com/timestamper
|
TS_ROOT=/usr/local/var/yaws/jdb-labs.com/timestamper
|
||||||
@ -9,7 +11,7 @@ default: build
|
|||||||
|
|
||||||
all : compile test
|
all : compile test
|
||||||
|
|
||||||
compile : init $(BEAMS)
|
compile : init $(BEAMS) $(CSS_FILES)
|
||||||
|
|
||||||
compile-test : init $(TEST_BEAMS)
|
compile-test : init $(TEST_BEAMS)
|
||||||
|
|
||||||
@ -33,6 +35,9 @@ clean:
|
|||||||
|
|
||||||
init:
|
init:
|
||||||
-mkdir -p build/ebin
|
-mkdir -p build/ebin
|
||||||
|
-mkdir -p build/www/css
|
||||||
|
-mkdir -p build/www/js
|
||||||
|
-mkdir -p build/www/img
|
||||||
|
|
||||||
build/ebin/%.beam : src/%.erl
|
build/ebin/%.beam : src/%.erl
|
||||||
erlc -W -o build/ebin $<
|
erlc -W -o build/ebin $<
|
||||||
@ -41,9 +46,14 @@ build/test/%.beam : test/%.erl
|
|||||||
@echo Compiling sources...
|
@echo Compiling sources...
|
||||||
erlc -W -o build/test $<
|
erlc -W -o build/test $<
|
||||||
|
|
||||||
|
build/www/css/%.css : www/css/%.scss
|
||||||
|
scss $< $@
|
||||||
|
|
||||||
build: compile
|
build: compile
|
||||||
-mkdir -p build/include
|
-mkdir -p build/include
|
||||||
cp -r www build
|
cp -r www/js build/www/
|
||||||
|
cp -r www/img build/www/
|
||||||
|
cp -r www/*.* build/www/
|
||||||
cp lib/* build/ebin
|
cp lib/* build/ebin
|
||||||
cp src/ts_db_records.hrl build/include
|
cp src/ts_db_records.hrl build/include
|
||||||
cp yaws.prod.conf build/yaws.conf
|
cp yaws.prod.conf build/yaws.conf
|
||||||
|
@ -1,369 +0,0 @@
|
|||||||
/*
|
|
||||||
* author: Jonathan Bernard
|
|
||||||
* TimeStamper main CSS for screen media types
|
|
||||||
*/
|
|
||||||
/* _rounded.scss */
|
|
||||||
* {
|
|
||||||
color: inherit; }
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: #222222;
|
|
||||||
width: 75%;
|
|
||||||
margin: auto;
|
|
||||||
padding: 0; }
|
|
||||||
|
|
||||||
input {
|
|
||||||
border: solid thin #555555;
|
|
||||||
-webkit-box-shadow: inset 0px 2px 4px #CCC;
|
|
||||||
box-shadow: inset 0px 2px 4px #CCC;
|
|
||||||
margin: 0;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
padding: 0;
|
|
||||||
font-family: Cantarell; }
|
|
||||||
|
|
||||||
#top {
|
|
||||||
background: #222222;
|
|
||||||
color: #eeeeee;
|
|
||||||
margin: 0;
|
|
||||||
opacity: 1;
|
|
||||||
padding: 0.5em 0;
|
|
||||||
padding: 0.5rem 0;
|
|
||||||
position: fixed;
|
|
||||||
top: 0px;
|
|
||||||
width: 75%;
|
|
||||||
z-index: 1; }
|
|
||||||
#top * {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0; }
|
|
||||||
#top #fade-bar {
|
|
||||||
background: url("img/fade.png") repeat-x;
|
|
||||||
height: 32px;
|
|
||||||
width: 100%; }
|
|
||||||
|
|
||||||
#timeline {
|
|
||||||
border-bottom: thin solid #eeeeee;
|
|
||||||
font-family: Arvo;
|
|
||||||
font-size: 1.5em;
|
|
||||||
padding: 0 2em;
|
|
||||||
padding: 0 2rem; }
|
|
||||||
#timeline .timeline-desc {
|
|
||||||
display: inline-block;
|
|
||||||
width: 70%; }
|
|
||||||
#timeline .timeline-desc-input {
|
|
||||||
width: 70%; }
|
|
||||||
#timeline .timeline-id {
|
|
||||||
display: inline-block; }
|
|
||||||
#timeline .timeline-desc-input, #timeline .timeline-id-input {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
color: #222222;
|
|
||||||
display: none; }
|
|
||||||
#timeline.edit-id .timeline-id-input {
|
|
||||||
display: inline-block; }
|
|
||||||
#timeline.edit-id .timeline-id {
|
|
||||||
display: none; }
|
|
||||||
#timeline.edit-desc .timeline-desc-input {
|
|
||||||
display: inline-block; }
|
|
||||||
#timeline.edit-desc .timeline-desc {
|
|
||||||
display: none; }
|
|
||||||
#timeline .drop-menu {
|
|
||||||
text-align: right;
|
|
||||||
display: inline-block;
|
|
||||||
width: 29%; }
|
|
||||||
#timeline .drop-menu .drop-menu-items {
|
|
||||||
text-align: right;
|
|
||||||
right: 0;
|
|
||||||
width: 172.41%; }
|
|
||||||
#timeline .drop-menu .drop-menu-items .new-timeline-link {
|
|
||||||
padding-right: 0.5em;
|
|
||||||
font-size: medium; }
|
|
||||||
#timeline .drop-menu .drop-menu-items .new-timeline-link a {
|
|
||||||
text-decoration: underline; }
|
|
||||||
#timeline .drop-menu .drop-menu-items .new-timeline-link img {
|
|
||||||
position: relative;
|
|
||||||
top: 4px;
|
|
||||||
left: -4px; }
|
|
||||||
#timeline .drop-menu .drop-menu-items .timeline-link {
|
|
||||||
padding: 0 0.5em;
|
|
||||||
font-size: medium;
|
|
||||||
border-left: thin solid white; }
|
|
||||||
|
|
||||||
.dialog {
|
|
||||||
background: white;
|
|
||||||
background: rgba(255, 255, 255, 0.5);
|
|
||||||
color: #eeeeee;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
position: fixed;
|
|
||||||
top: 0px;
|
|
||||||
left: 0px;
|
|
||||||
width: 100%;
|
|
||||||
height: 100em;
|
|
||||||
z-index: 10; }
|
|
||||||
.dialog * {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0; }
|
|
||||||
.dialog div.container {
|
|
||||||
background: #222222;
|
|
||||||
border-radius: 10px;
|
|
||||||
font-family: Cantarell;
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
margin-top: 4em;
|
|
||||||
padding: 1em;
|
|
||||||
width: 20em; }
|
|
||||||
.dialog div.container h2 {
|
|
||||||
border-bottom: thin solid #eeeeee;
|
|
||||||
font-family: Arvo;
|
|
||||||
padding-bottom: 0.5em;
|
|
||||||
margin-bottom: 0.5em; }
|
|
||||||
.dialog div.container label {
|
|
||||||
display: inline-block;
|
|
||||||
width: 6em; }
|
|
||||||
.dialog div.container input {
|
|
||||||
color: #222222; }
|
|
||||||
.dialog div.container .button-panel {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
overflow: hidden; }
|
|
||||||
.dialog div.container .button-panel .validate-tips {
|
|
||||||
font-size: 1em; }
|
|
||||||
.dialog div.container .button-panel .dialog-button {
|
|
||||||
float: right;
|
|
||||||
padding-left: 1em;
|
|
||||||
font-family: Arvo;
|
|
||||||
font-size: 1.2em; }
|
|
||||||
.dialog div.container .button-panel .dialog-button a {
|
|
||||||
color: #eeeeee; }
|
|
||||||
|
|
||||||
#login.dialog {
|
|
||||||
background: white;
|
|
||||||
opacity: 1; }
|
|
||||||
|
|
||||||
/*#login {
|
|
||||||
|
|
||||||
background: white;
|
|
||||||
color: $lightTxt;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
position: fixed;
|
|
||||||
top: 0px;
|
|
||||||
left: 0px;
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
height: 100em;
|
|
||||||
|
|
||||||
z-index: 10;
|
|
||||||
|
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
padding: 0 2em;
|
|
||||||
margin-top: -0.3rem;
|
|
||||||
padding: 0 2rem;
|
|
||||||
width: 100%; }
|
|
||||||
#user .fullname, #user .username {
|
|
||||||
display: inline-block;
|
|
||||||
font-size: larger; }
|
|
||||||
#user .fullname-input {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
color: #222222;
|
|
||||||
display: none; }
|
|
||||||
#user.edit-fullname .fullname-input {
|
|
||||||
display: inline-block; }
|
|
||||||
#user.edit-fullname .fullname {
|
|
||||||
display: none; }
|
|
||||||
#user .user-menu {
|
|
||||||
display: inline-block; }
|
|
||||||
#user .user-menu .user-menu-items {
|
|
||||||
list-style: none;
|
|
||||||
display: none; }
|
|
||||||
#user .user-menu .user-menu-items li {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 0.5em; }
|
|
||||||
#user .user-menu .user-menu-items a {
|
|
||||||
text-decoration: none; }
|
|
||||||
#user .user-menu .user-menu-items a:hover {
|
|
||||||
text-decoration: underline; }
|
|
||||||
#user .user-menu:hover .user-menu-items, #user .user-menu-items:hover {
|
|
||||||
display: inline-block; }
|
|
||||||
|
|
||||||
#entry-list {
|
|
||||||
margin: 6em 0 0 0;
|
|
||||||
margin: 6rem 0 0 0;
|
|
||||||
padding-bottom: 1em 0 0 0;
|
|
||||||
padding-bottom: 1rem 0 0 0; }
|
|
||||||
#entry-list .day-seperator {
|
|
||||||
background: #cccccc;
|
|
||||||
color: #222222;
|
|
||||||
font-family: Cantarell;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 1em 0 0 0;
|
|
||||||
margin: 1rem 0 0 0;
|
|
||||||
padding: 0 2em;
|
|
||||||
padding: 0 2rem; }
|
|
||||||
#entry-list .day-seperator * {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0; }
|
|
||||||
#entry-list .day-seperator h4, #entry-list .day-seperator h5 {
|
|
||||||
display: inline-block; }
|
|
||||||
#entry-list .day-seperator h5 {
|
|
||||||
color: #667; }
|
|
||||||
#entry-list #new-entry {
|
|
||||||
margin: 0.5em 0 0 0;
|
|
||||||
padding: 0 2em;
|
|
||||||
margin: 0.5rem 0 0 0;
|
|
||||||
padding: 0 2rem; }
|
|
||||||
#entry-list #new-entry * {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0; }
|
|
||||||
#entry-list .timestamp, #entry-list .timestamp-input, #entry-list .duration {
|
|
||||||
text-align: right;
|
|
||||||
width: 14%; }
|
|
||||||
#entry-list .mark, #entry-list .mark-input {
|
|
||||||
width: 70%; }
|
|
||||||
#entry-list .entry {
|
|
||||||
font-family: Cantarell;
|
|
||||||
padding: 0 2em;
|
|
||||||
padding: 0 2rem; }
|
|
||||||
#entry-list .entry div {
|
|
||||||
display: inline-block; }
|
|
||||||
#entry-list .entry .mark {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
position: relative; }
|
|
||||||
#entry-list .entry .mark * {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0; }
|
|
||||||
#entry-list .entry .mark img.expand-entry, #entry-list .entry .mark img.collapse-entry {
|
|
||||||
display: none;
|
|
||||||
left: -20px;
|
|
||||||
position: absolute;
|
|
||||||
top: 6px; }
|
|
||||||
#entry-list .entry:hover .mark img.expand-entry, #entry-list .entry.show-notes img.collapse-entry {
|
|
||||||
display: inline; }
|
|
||||||
#entry-list .entry .mark-input, #entry-list .entry .timestamp-input, #entry-list .entry.show-notes:hover img.expand-entry {
|
|
||||||
display: none; }
|
|
||||||
#entry-list .entry .notes {
|
|
||||||
display: none;
|
|
||||||
font-family: Cantarell;
|
|
||||||
font-size: small;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0 0 0 1em;
|
|
||||||
width: 70%; }
|
|
||||||
#entry-list .entry .notes :first-child {
|
|
||||||
margin-top: 0; }
|
|
||||||
#entry-list .entry .notes .notes-input, #entry-list .entry .notes pre, #entry-list .entry .notes code {
|
|
||||||
font-family: 'Anonymous Pro'; }
|
|
||||||
#entry-list .entry .notes * {
|
|
||||||
width: 100%; }
|
|
||||||
#entry-list .entry.edit-mark .mark-input {
|
|
||||||
display: inline-block; }
|
|
||||||
#entry-list .entry.edit-mark .mark {
|
|
||||||
display: none; }
|
|
||||||
#entry-list .entry.edit-timestamp .timestamp-input {
|
|
||||||
display: inline-block; }
|
|
||||||
#entry-list .entry.edit-timestamp .timestamp {
|
|
||||||
display: none; }
|
|
||||||
#entry-list .entry .notes-input {
|
|
||||||
display: none; }
|
|
||||||
#entry-list .entry.edit-notes .notes-input {
|
|
||||||
display: block; }
|
|
||||||
#entry-list .entry.edit-notes .notes-text {
|
|
||||||
display: none; }
|
|
||||||
|
|
||||||
.drop-menu {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
position: relative; }
|
|
||||||
.drop-menu * {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0; }
|
|
||||||
.drop-menu .drop-menu-items {
|
|
||||||
display: none;
|
|
||||||
list-style: none;
|
|
||||||
position: absolute; }
|
|
||||||
.drop-menu .drop-menu-items li {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 0.5em; }
|
|
||||||
.drop-menu:hover .drop-menu-items, .drop-menu .drop-menu-items:hover {
|
|
||||||
display: block; }
|
|
||||||
.drop-menu a {
|
|
||||||
display: inline-block;
|
|
||||||
text-decoration: none; }
|
|
||||||
.drop-menu a:hover {
|
|
||||||
text-decoration: underline; }
|
|
||||||
|
|
||||||
.footer {
|
|
||||||
background: #222222;
|
|
||||||
color: #eeeeee;
|
|
||||||
font-family: Bentham;
|
|
||||||
margin: 0;
|
|
||||||
padding: 1em 0;
|
|
||||||
padding: 1rem 0;
|
|
||||||
text-align: center;
|
|
||||||
width: 100%; }
|
|
||||||
.footer * {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0; }
|
|
||||||
.footer a {
|
|
||||||
color: white;
|
|
||||||
text-decoration: none; }
|
|
||||||
.footer a:hover {
|
|
||||||
text-decoration: underline; }
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
font-family: Bentham;
|
|
||||||
text-decoration: overline underline;
|
|
||||||
color: inherit; }
|
|
||||||
|
|
||||||
.hidden {
|
|
||||||
display: none; }
|
|
@ -414,6 +414,11 @@ input {
|
|||||||
|
|
||||||
&.edit-notes .notes-text { display: none; }
|
&.edit-notes .notes-text { display: none; }
|
||||||
|
|
||||||
|
&.current .duration {
|
||||||
|
-webkit-animation: pulse 1s infinite alternate;
|
||||||
|
-moz-animation: pulse 1s infinite alternate;
|
||||||
|
-o-animation: pulse 1s infinite alternate;
|
||||||
|
animation: pulse 1s infinite alternate; }
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -483,3 +488,20 @@ input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.hidden { display: none; }
|
.hidden { display: none; }
|
||||||
|
|
||||||
|
@-webkit-keyframes pulse {
|
||||||
|
from { opacity: 1; }
|
||||||
|
to { opacity: 0.2; } }
|
||||||
|
|
||||||
|
@-moz-keyframes pulse {
|
||||||
|
from { opacity: 1; }
|
||||||
|
to { opacity: 0.2; } }
|
||||||
|
|
||||||
|
@-o-keyframes pulse {
|
||||||
|
from { opacity: 1; }
|
||||||
|
to { opacity: 0.2; } }
|
||||||
|
|
||||||
|
@keyframes pulse {
|
||||||
|
from { opacity: 1; }
|
||||||
|
to { opacity: 0.2; } }
|
||||||
|
|
||||||
|
16
www/js/ts.js
16
www/js/ts.js
@ -296,7 +296,7 @@ $(document).ready(function(){
|
|||||||
|
|
||||||
TS.EntryListView = Backbone.View.extend({
|
TS.EntryListView = Backbone.View.extend({
|
||||||
|
|
||||||
el: $("#entry-list"),
|
el: $("#entry-list")[0],
|
||||||
|
|
||||||
events: { "keypress #new-entry-input" : "createNewEntryOnEnter" },
|
events: { "keypress #new-entry-input" : "createNewEntryOnEnter" },
|
||||||
|
|
||||||
@ -312,7 +312,9 @@ $(document).ready(function(){
|
|||||||
var lastEntry = this.collection.at(this.collection.length - 2);
|
var lastEntry = this.collection.at(this.collection.length - 2);
|
||||||
lastEntry.view.nextModel = entry;
|
lastEntry.view.nextModel = entry;
|
||||||
lastEntry.view.update();
|
lastEntry.view.update();
|
||||||
this.renderOne(entry, null); },
|
this.renderOne(entry, null);
|
||||||
|
$(".entry.current").removeClass("current");
|
||||||
|
$(entry.view.el).addClass("current"); },
|
||||||
|
|
||||||
renderOne: function(entry, nextEntry) {
|
renderOne: function(entry, nextEntry) {
|
||||||
// exclude if any exclusion RegExps match
|
// exclude if any exclusion RegExps match
|
||||||
@ -428,7 +430,7 @@ $(document).ready(function(){
|
|||||||
else if (dayDiff == 0) { return "Today"; } } });
|
else if (dayDiff == 0) { return "Today"; } } });
|
||||||
|
|
||||||
TS.TimelineListView = Backbone.View.extend({
|
TS.TimelineListView = Backbone.View.extend({
|
||||||
el: $("#timeline"),
|
el: $("#timeline")[0],
|
||||||
|
|
||||||
collection: TS.TimelineList,
|
collection: TS.TimelineList,
|
||||||
|
|
||||||
@ -487,7 +489,7 @@ $(document).ready(function(){
|
|||||||
|
|
||||||
TS.UserView = Backbone.View.extend({
|
TS.UserView = Backbone.View.extend({
|
||||||
|
|
||||||
el: $("#user"),
|
el: $("#user")[0],
|
||||||
|
|
||||||
model: TS.UserModel,
|
model: TS.UserModel,
|
||||||
|
|
||||||
@ -518,7 +520,7 @@ $(document).ready(function(){
|
|||||||
|
|
||||||
TS.AppView = Backbone.View.extend({
|
TS.AppView = Backbone.View.extend({
|
||||||
|
|
||||||
el: $("body"),
|
el: $("body")[0],
|
||||||
|
|
||||||
events: { 'click #timeline .drop-menu-items a': 'selectTimeline' },
|
events: { 'click #timeline .drop-menu-items a': 'selectTimeline' },
|
||||||
|
|
||||||
@ -635,7 +637,7 @@ $(document).ready(function(){
|
|||||||
this.entries.collection.fetch() } } });
|
this.entries.collection.fetch() } } });
|
||||||
|
|
||||||
TS.LoginView = Backbone.View.extend({
|
TS.LoginView = Backbone.View.extend({
|
||||||
el: $("#login"),
|
el: $("#login")[0],
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
"keypress #password-input" : "loginOnEnter",
|
"keypress #password-input" : "loginOnEnter",
|
||||||
@ -685,7 +687,7 @@ $(document).ready(function(){
|
|||||||
if (e.keyCode == 13) { this.doLogin(); } } });
|
if (e.keyCode == 13) { this.doLogin(); } } });
|
||||||
|
|
||||||
TS.NewTimelineView = Backbone.View.extend({
|
TS.NewTimelineView = Backbone.View.extend({
|
||||||
el: $("#new-timeline"),
|
el: $("#new-timeline")[0],
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
"click #new-timeline-create a" : "createTimeline",
|
"click #new-timeline-create a" : "createTimeline",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user