Fix latest posts and tags on the welcome screen
authorChip Black <bytex64@bytex64.net>
Mon, 16 Apr 2012 22:02:48 +0000 (15:02 -0700)
committerChip Black <bytex64@bytex64.net>
Mon, 16 Apr 2012 22:02:48 +0000 (15:02 -0700)
Created new Record kinds

www/css/blerg.css
www/jssrc/blerg/Link.js
www/jssrc/blerg/Post.js
www/jssrc/blerg/Record.js [new file with mode: 0644]
www/jssrc/blerg/Welcome.js
www/jssrc/blerg/package.js

index 2230014..24bb13e 100644 (file)
@@ -180,25 +180,25 @@ h1, h2, h3 {
        text-align: right;
 }
 
-#latest h2 {
+.latest h2 {
        font-size: 16pt;
 }
 
-#latest-tags {
+.latest-tags {
        text-align: center;
        line-height: 2em;
 }
 
-#latest-tags a {
+.latest-tags a {
        margin: 0 0.75em;
 }
 
-#latest-posts {
+.latest-posts {
        height: 184pt;
        overflow: hidden;
 }
 
-#latest-posts .record {
+.latest-posts .record {
        font-size: 12pt;
        margin: 8pt 0;
 }
index bb2d8d3..b2468bf 100644 (file)
@@ -2,12 +2,17 @@ enyo.kind({
        name: "blerg.Link",
        kind: "Control",
        tag: "a",
-       href: "#",
+       published: {
+               href: "#",
+       },
        handlers: {
                onclick: "muteLink",
        },
        create: function() {
                this.inherited(arguments);
+               this.hrefChanged();
+       },
+       hrefChanged: function() {
                this.setAttribute('href', this.href);
        },
        muteLink: function(inSender, inEvent) {
index 3ab4197..527ffc9 100644 (file)
@@ -29,10 +29,13 @@ enyo.kind({
                this.bubble('onPost', {data: this.getData()});
        },
        postVisibilityUpdate: function(inSender, inEvent) {
-               if (inEvent.showing)
+               if (inEvent.showing) {
                        this.show();
-               else
+                       if (inEvent.data && this.getData() == "")
+                               this.setData(inEvent.data);
+               } else {
                        this.hide();
+               }
        },
        resizePostContent: function(inSender, inEvent) {
                if (this.resizePostContentTimeout)
diff --git a/www/jssrc/blerg/Record.js b/www/jssrc/blerg/Record.js
new file mode 100644 (file)
index 0000000..2751042
--- /dev/null
@@ -0,0 +1,74 @@
+enyo.kind({
+       name: "blerg.Record",
+       kind: "Control",
+       classes: "record",
+       published: {
+               data: "",
+               timestamp: 0,
+               author: "",
+               record: null
+       },
+       components: [
+               {name: "data", noDom: true},
+               {classes: "info", components: [
+                       {noDom: true, content: "Posted "},
+                       {name: "date", noDom: true},
+                       {noDom: true, content: ". "},
+                       {name: "permalink", kind: "blerg.Link", content: "[permalink]"},
+                       {noDom: true, content: " "},
+                       {name: "reply", kind: "blerg.Link", content: "[reply]", onclick: "postPopup"}
+               ]}
+       ],
+       create: function() {
+               this.inherited(arguments);
+               this.dataChanged();
+               this.timestampChanged();
+               this.updateLinks();
+       },
+       dataChanged: function() {
+               this.$.data.setContent(postMangle(this.data));
+       },
+       timestampChanged: function() {
+               this.$.date.setContent(new Date(this.timestamp * 1000).toString());
+       },
+       authorChanged: function() {
+               this.updateLinks();
+       },
+       recordChanged: function() {
+               this.updateLinks();
+       },
+       updateLinks: function() {
+               this.$.permalink.setHref(baseURL + enyo.macroize("/#{$author}/{$record}", this));
+       },
+       postPopup: function() {
+               this.bubble('onPostVisibility', {
+                       showing: true,
+                       data: enyo.macroize("@{$author}/{$record}", this)
+               });
+               return true;
+       }
+});
+
+enyo.kind({
+       name: "blerg.TagRecord",
+       kind: "blerg.Record"
+});
+
+enyo.kind({
+       name: "blerg.BriefRecord",
+       kind: "blerg.Record",
+       components: [
+               {name: "authorlink", kind: "blerg.Link", classes: "author ref"},
+               {noDom: true, content: " "},
+               {name: "data", noDom: true}
+       ],
+       dataChanged: function() {
+               var d = this.data.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+               this.$.data.setContent(d);
+       },
+       timestampChanged: function() { },
+       updateLinks: function() {
+               this.$.authorlink.setHref(baseURL + '/#' + this.author);
+               this.$.authorlink.setContent('@' + this.author);
+       },
+});
index 2ac7bde..1d7d9db 100644 (file)
@@ -19,15 +19,22 @@ enyo.kind({
                {name: "moreLink", kind: "blerg.Link", onNavigate: "loadMore", content: "Tell me more..."},
                {style: "clear: both"},
                {name: "contentBox", allowHtml: true},
-               {tag: "h2", content: "Latest posts"},
-               {name: "latestPosts"},
-               {tag: "h2", content: "Latest tags"},
-               {name: "latestTags"}
+               {classes: "latest", components: [
+                       {tag: "h2", content: "Latest posts"},
+                       {name: "latestPosts", classes: "latest-posts", onmouseover: "pauseTicker", onmouseout: "startTicker"},
+                       {tag: "h2", content: "Latest tags"},
+                       {name: "latestTags", classes: "latest-tags"}
+               ]}
        ],
        rendered: function() {
                this.inherited(arguments);
 
                this.bubble("onSetTitle", {section: "Welcome!"});
+               this.loadLatest();
+       },
+       destroy: function() {
+               this.stopTicker();
+               this.inherited(arguments);
        },
        loadMore: function() {
                var req = new enyo.Ajax({
@@ -42,5 +49,63 @@ enyo.kind({
        },
        startSignup: function() {
                this.bubble('onStartSignup');
+       },
+       loadLatest: function() {
+               var req = new enyo.Ajax({
+                       url: baseURL + '/latest.json'
+               });
+               req.response(function(inSender, inResponse) {
+                       this.$.latestTags.destroyComponents();
+                       for (var i = 0; i < inResponse.tags.length; i++) {
+                               var v = inResponse.tags[i];
+                               this.$.latestTags.createComponent({
+                                       kind: "blerg.Link",
+                                       href: baseURL + "/#/tag/" + v,
+                                       content: "#" + v,
+                                       classes: "ref"
+                               });
+                               this.$.latestTags.createComponent({noDom: true, content: " "});
+                       }
+                       this.$.latestTags.render();
+
+                       this.$.latestPosts.destroyComponents();
+                       for (var i = 0; i < inResponse.records.length; i++) {
+                               var v = inResponse.records[i];
+                               this.$.latestPosts.createComponent({kind: "blerg.BriefRecord"}, v);
+                       }
+                       this.$.latestPosts.render();
+                       this.startTickerCycle();
+               }.bind(this));
+               req.go();
+       },
+       startTickerCycle: function() {
+               this.tickerTimeout = setTimeout(function() {
+                       this.$.latestPosts.node.scrollTop = 0;
+                       this.startTicker();
+               }.bind(this), 2500);
+       },
+       startTicker: function() {
+               if (this.tickerInterval)
+                       return;
+               this.tickerInterval = setInterval(this.ticker.bind(this), 100);
+       },
+       pauseTicker: function() {
+               clearInterval(this.tickerInterval);
+               this.tickerInterval = null;
+       },
+       stopTicker: function() {
+               clearTimeout(this.tickerTimeout);
+               this.tickerTimeout = null;
+               clearInterval(this.tickerInterval);
+               this.tickerInterval = null;
+       },
+       ticker: function() {
+               var n = this.$.latestPosts.node;
+               if (n.scrollTop < n.scrollHeight - n.clientHeight) {
+                       n.scrollTop += 2;
+               } else {
+                       this.stopTicker();
+                       this.startTickerCycle();
+               }
        }
 });
index 764a0d0..c3c3013 100644 (file)
@@ -1,6 +1,7 @@
 enyo.depends(
        'API.js',
        'Link.js',
+       'Record.js',
        'Title.js',
        'Controls.js',
        'Post.js',