Git Product home page Git Product logo

blogappangular's Introduction

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>blogapp</title>

	<style>
		/**
		 * Source:
		 * https://github.com/sindresorhus/github-markdown-css
		 */

		@font-face{font-family:octicons-anchor;src:url(data:font/woff;charset=utf-8;base64,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) format('woff')}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#333;overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6;word-wrap:break-word}.markdown-body a{background:transparent}.markdown-body a:active,.markdown-body a:hover{outline:0}.markdown-body strong{font-weight:bold}.markdown-body h1{font-size:2em;margin:.67em 0}.markdown-body img{border:0}.markdown-body hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}.markdown-body pre{overflow:auto}.markdown-body code,.markdown-body kbd,.markdown-body pre{font-family:monospace,monospace;font-size:1em}.markdown-body input{color:inherit;font:inherit;margin:0}.markdown-body html input[disabled]{cursor:default}.markdown-body input{line-height:normal}.markdown-body input[type="checkbox"]{-moz-box-sizing:border-box;box-sizing:border-box;padding:0}.markdown-body table{border-collapse:collapse;border-spacing:0}.markdown-body td,.markdown-body th{padding:0}.markdown-body *{-moz-box-sizing:border-box;box-sizing:border-box}.markdown-body input{font:13px/1.4 Helvetica,arial,freesans,clean,sans-serif,"Segoe UI Emoji","Segoe UI Symbol"}.markdown-body a{color:#4183c4;text-decoration:none}.markdown-body a:hover,.markdown-body a:focus,.markdown-body a:active{text-decoration:underline}.markdown-body hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border:0;border-bottom:1px solid #ddd}.markdown-body hr:before{display:table;content:""}.markdown-body hr:after{display:table;clear:both;content:""}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:15px;margin-bottom:15px;line-height:1.1}.markdown-body h1{font-size:30px}.markdown-body h2{font-size:21px}.markdown-body h3{font-size:16px}.markdown-body h4{font-size:14px}.markdown-body h5{font-size:12px}.markdown-body h6{font-size:11px}.markdown-body blockquote{margin:0}.markdown-body ul,.markdown-body ol{padding:0;margin-top:0;margin-bottom:0}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ul ul ol,.markdown-body ul ol ol,.markdown-body ol ul ol,.markdown-body ol ol ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}.markdown-body pre{margin-top:0;margin-bottom:0;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}.markdown-body .octicon{font:normal normal 16px octicons-anchor;line-height:1;display:inline-block;text-decoration:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.markdown-body .octicon-link:before{content:'\f05c'}.markdown-body>*:first-child{margin-top:0 !important}.markdown-body>*:last-child{margin-bottom:0 !important}.markdown-body .anchor{position:absolute;top:0;bottom:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown-body .anchor:focus{outline:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:bold;line-height:1.4}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{padding-left:8px;margin-left:-30px;line-height:1;text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{display:inline-block}.markdown-body h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown-body h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown-body h3{font-size:1.5em;line-height:1.43}.markdown-body h4{font-size:1.25em}.markdown-body h5{font-size:1em}.markdown-body h6{font-size:1em;color:#777}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre{margin-top:0;margin-bottom:16px}.markdown-body hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown-body ul,.markdown-body ol{padding-left:2em}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:bold}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:bold}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid #ddd}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.markdown-body img{max-width:100%;-moz-box-sizing:border-box;box-sizing:border-box}.markdown-body code{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,0.04);border-radius:3px}.markdown-body code:before,.markdown-body code:after{letter-spacing:-0.2em;content:"\00a0"}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body pre{word-wrap:normal}.markdown-body pre code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body pre code:before,.markdown-body pre code:after{content:normal}.markdown-body .pl-c{color:#969896}.markdown-body .pl-c1,.markdown-body .pl-mdh,.markdown-body .pl-mm,.markdown-body .pl-mp,.markdown-body .pl-mr,.markdown-body .pl-s1 .pl-v,.markdown-body .pl-s3,.markdown-body .pl-sc,.markdown-body .pl-sv{color:#0086b3}.markdown-body .pl-e,.markdown-body .pl-en{color:#795da3}.markdown-body .pl-s1 .pl-s2,.markdown-body .pl-smi,.markdown-body .pl-smp,.markdown-body .pl-stj,.markdown-body .pl-vo,.markdown-body .pl-vpf{color:#333}.markdown-body .pl-ent{color:#63a35c}.markdown-body .pl-k,.markdown-body .pl-s,.markdown-body .pl-st{color:#a71d5d}.markdown-body .pl-pds,.markdown-body .pl-s1,.markdown-body .pl-s1 .pl-pse .pl-s2,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre,.markdown-body .pl-src,.markdown-body .pl-v{color:#df5000}.markdown-body .pl-id{color:#b52a1d}.markdown-body .pl-ii{background-color:#b52a1d;color:#f8f8f8}.markdown-body .pl-sr .pl-cce{color:#63a35c;font-weight:bold}.markdown-body .pl-ml{color:#693a17}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{color:#1d3e81;font-weight:bold}.markdown-body .pl-mq{color:teal}.markdown-body .pl-mi{color:#333;font-style:italic}.markdown-body .pl-mb{color:#333;font-weight:bold}.markdown-body .pl-md,.markdown-body .pl-mdhf{background-color:#ffecec;color:#bd2c00}.markdown-body .pl-mdht,.markdown-body .pl-mi1{background-color:#eaffea;color:#55a532}.markdown-body .pl-mdr{color:#795da3;font-weight:bold}.markdown-body .pl-mo{color:#1d3e81}.markdown-body kbd{background-color:#e7e7e7;background-image:-webkit-linear-gradient(#fefefe,#e7e7e7);background-image:linear-gradient(#fefefe,#e7e7e7);background-repeat:repeat-x;display:inline-block;padding:3px 5px;font:11px Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:10px;color:#000;border:1px solid #cfcfcf;border-radius:2px}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item input{float:left;margin:.3em 0 .25em -1.6em;vertical-align:middle}.markdown-body :checked+.radio-label{z-index:1;position:relative;border-color:#4183c4}

		.markdown-body {
			min-width: 200px;
			max-width: 790px;
			margin: 0 auto;
			padding: 30px;
		}
	</style>
</head>
<body>
	<div class="markdown-body">
		<h1 id="blogapp-project">BlogApp Project</h1>
<h2 id="technologies-this-project-covers">Technologies this project covers</h2>
<ul>
<li>AngularJS</li>
<li>Node.js</li>
</ul>
<h2 id="behavior-requirements">Behavior Requirements</h2>
<h2 id="stage-1-viewing-posts">Stage 1 - Viewing posts</h2>
<h3 id="posts-">Posts:</h3>
<h4 id="menu">Menu</h4>
<ul>
<li>“Posts”<ul>
<li>URL - <code>#/posts</code></li>
<li>Should be active <em>(use <code>active</code> class on the <code>li</code>)</em></li>
<li>Show all posts <em>(3 at a time)</em>, sorted by date, most recent first</li>
<li>Make “Show All Posts” in the Sidebar as the active item</li>
</ul>
</li>
<li>Clicking “Admin” should redirect to the Admin view<ul>
<li>URL - <code>#/admin</code></li>
</ul>
</li>
<li>Clicking the logo should redirect to “Posts” <em>(using Routes)</em><ul>
<li>URL - <code>#/</code></li>
</ul>
</li>
</ul>
<h4 id="posts-feed">Posts feed</h4>
<ul>
<li>Reference<ul>
<li><code>examples/index.html</code> <em>(under <code>&lt;!-- Blog Entries Column --&gt;</code> section)</em></li>
</ul>
</li>
<li>Load all posts dynamically from <code>data/posts.json</code><ul>
<li>Make sure the file is fetched only once</li>
<li>Do not change the file contents manually</li>
<li>Cache the data for later use</li>
<li>Use each one of the keys of the post object</li>
<li>Notice the desired date format in the View</li>
</ul>
</li>
<li>Show 3 posts at a time<ul>
<li>Hide “Newer” button <em>(at the bottom)</em> if showing the first batch of posts</li>
<li>Hide “Older” button <em>(at the bottom)</em> if showing the last batch of posts</li>
<li>Clicking “Newer” should load the next 3 posts.<ul>
<li>URL - <code>#/posts/PAGE_NUMBER</code> <em>(e.g. <code>#/posts/2</code>)</em></li>
</ul>
</li>
</ul>
</li>
<li>Clicking a post title or the “Read More” button should redirect to the relevant post view<ul>
<li>URL - <code>#/post/POST_TITLE</code></li>
<li><code>POST_TITLE</code> should have only dashes as words delimiters<ul>
<li>All other non-word charaters should be removed</li>
<li>e.g. <code>jQuery - Selectors, DOM</code> becomes <code>#/post/jQuery-Selectors-DOM</code></li>
</ul>
</li>
</ul>
</li>
<li>Clicking the Author name should behave the same as clicking it in the Sidebar</li>
<li>Clicking a Tag name should behave the same as clicking it in the Sidebar</li>
</ul>
<h4 id="sidebar">Sidebar</h4>
<ul>
<li>Search<ul>
<li>Update URL - <code>#/posts?search=SEARCH_QUERY</code></li>
<li>Should be able to find posts by typing part of a Title, Author, Tag or Description <em>(non case sensitive)</em></li>
<li>When using the Search, all filters should be removed <em>(from the URL and the Active state in the Sidebar)</em></li>
</ul>
</li>
<li>Filter Posts<ul>
<li>Items data should be dynamic, initialized from <code>posts.json</code></li>
<li>Items should be ordered alphabetically <em>(ascending)</em><ul>
<li>Month filters should be ordered by newest first</li>
</ul>
</li>
<li>The selected item should be set as Active <em>(<code>active</code> class on the <code>a</code>)</em><ul>
<li>There should be only 1 selected item in the Sidebar</li>
</ul>
</li>
<li>Each item should have a badge indicating how many posts are attached to it <em>(value inside the <code>span</code>)</em></li>
<li>When clicked, should update the URL, which will trigger the filtering of the posts list to show only the posts that match that filter</li>
<li>If a filter has more than 1 page, the page number should come before the filter query (e.g. <code>#/posts/2?author=alex-ilyaev</code>)</li>
<li><strong>Show All Posts</strong><ul>
<li>Same as “Posts” in the top menu</li>
<li>When selected, remove all filters from the URL and remove their <code>active</code> state in the Sidebar</li>
</ul>
</li>
<li><strong>Category</strong><ul>
<li>Update URL - <code>#/posts?category=CATEGORY_NAME</code><ul>
<li>This is the tag name of the post</li>
<li>Should be lowercase, separated by a dash <em>(e.g. <code>angularjs</code>)</em></li>
</ul>
</li>
</ul>
</li>
<li><strong>Author</strong><ul>
<li>Update URL - <code>#/posts?author=AUTHOR_NAME</code><ul>
<li>Should be lowercase, separated by a dash <em>(e.g. <code>alex-ilyaev</code>)</em></li>
</ul>
</li>
</ul>
</li>
<li><strong>Month</strong><ul>
<li>Notice the desired month format in the View</li>
<li>Update URL - <code>#/posts?month=MONTH-YEAR</code><ul>
<li>Should be lowercase, separated by a dash <em>(e.g. <code>january-2015</code>)</em></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="single-post-view-">Single Post View:</h3>
<ul>
<li>Reference<ul>
<li><code>examples/post.html</code> <em>(under <code>&lt;!-- Blog Post Content Column --&gt;</code> section)</em></li>
</ul>
</li>
<li>Should show the full post content</li>
<li>Menu and Sidebar stay the same</li>
<li>The content body should be loaded from the relevant <code>.html</code> file <em>(<code>htmlPath</code> value in <code>posts.json</code>)</em><ul>
<li>The fetched HTML should not be interpolated <em>(see <code>ngSanitize</code>)</em></li>
</ul>
</li>
<li>Comments (<strong>TBD</strong>)</li>
</ul>
<h2 id="stage-2-editing-posts">Stage 2 - Editing posts</h2>
<h3 id="admin-">Admin:</h3>
<h4 id="admin-panel">Admin panel</h4>
<ul>
<li>Reference<ul>
<li><code>examples/admin.html</code> <em>(under <code>&lt;!-- Admin - Posts Table --&gt;</code> section)</em></li>
</ul>
</li>
<li>Posts data should be loaded dynamically from <code>data/posts.json</code><ul>
<li>Initially should be sorted by Date (descending)</li>
</ul>
</li>
<li>Clicking a column title should re-sort the posts by that column<ul>
<li>If already sorted by the clicked column, should reverse the sorting<ul>
<li>The opposite arrow icon should be shown</li>
</ul>
</li>
<li>If clicking a non sorted column, should sort by that column, at the same sorting order that was previously set <em>(i.e. sorting order should be remembered throughout the columns)</em></li>
<li>The <code>#</code> column should not be sorted</li>
</ul>
</li>
<li>Clicking “Add New Post” should redirect to the “Add New Post” view<ul>
<li>URL - <code>#/admin/new/post</code></li>
</ul>
</li>
<li>Clicking on a post row should redirect to the “Edit Post” view for that post<ul>
<li>URL - <code>#/admin/edit/post/POST_TITLE</code></li>
</ul>
</li>
<li>The Sidebar filters should work the same <em>(i.e. filter the posts data in the table)</em></li>
</ul>
<h4 id="add-new-post">Add New Post</h4>
<ul>
<li>Reference<ul>
<li><code>examples/new.html</code> <em>(under <code>&lt;!-- Admin - New Post --&gt;</code> section)</em></li>
</ul>
</li>
<li>The “Delete Post” button should be hidden</li>
<li>All form fields should be empty</li>
<li>Typing inside “Markdown” should convert the value to HTML <em>(using the Marked library)</em> and present it under “HTML Preview”<ul>
<li>Should trigger on each change under “Markdown”</li>
<li>The resulting HTML should not be interpolated <em>(see <code>ngSanitize</code>)</em></li>
<li>Setup and usage example - <a href="http://codepen.io/anon/pen/MYORbX?editors=001">CodePen - Marked Example</a></li>
</ul>
</li>
<li>Clicking “Save Post” button should:<ul>
<li>Validate the form<ul>
<li>All required fields should have a value<ul>
<li>If one of the fields doesn’t, the proper alert box should be shown <em>(under <code>&lt;!-- Invalid Input Alert --&gt;</code>)</em></li>
<li>Every invalid field should be set as an error <em>(set a <code>has-error</code> class on the wrapping <code>DIV</code> element)</em></li>
</ul>
</li>
<li>The “Title” must be unique<ul>
<li>If it’s not, the proper alert box should be shown</li>
</ul>
</li>
</ul>
</li>
<li>If all is valid<ul>
<li>The form data should be added as a new post in the cached Posts Data object<ul>
<li>The post <code>date</code> value should be a string of the current Date time</li>
<li>The converted HTML should not be saved, only the Markdown source <em>(under an <code>mdSource</code> key)</em></li>
<li>This won’t be persistent, but will prepare us for Stage 3</li>
<li>Once saved, the new post data should be seen throughout the app</li>
</ul>
</li>
<li>If the save was successful, redirect to the Admin panel</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="edit-post">Edit post</h4>
<ul>
<li>Reference<ul>
<li><code>examples/edit.html</code> <em>(under <code>&lt;!-- Admin - Edit Post --&gt;</code> section)</em></li>
</ul>
</li>
<li>Should use the same View file as “Add New Post”</li>
<li>The “Delete Post” button should be shown</li>
<li>The form fields should be populated with the post data<ul>
<li>The Markdown data should be loaded from <code>mdSource</code> if available, otherwise from the <code>mdPath</code> file</li>
<li>The Tags data should be loaded as a string of tags <em>(delimited by a comma <code>,</code>)</em></li>
</ul>
</li>
<li>The data under “Markdown” should be converted to HTML and shown under “HTML Preview”</li>
<li>Clicking “Save Post” button should behave the same as in “Add New Post”<ul>
<li>The <code>date</code> key should not be updated</li>
</ul>
</li>
<li>Clicking “Delete Post” should remove the relevant post object from the cached Posts Data object and redirect to the Admin panel</li>
</ul>
<h2 id="stage-3-persistent-data-on-the-server">Stage 3 - Persistent data on the server</h2>
<ul>
<li><strong>TBD</strong></li>
</ul>

	</div>
</body>
</html>

blogappangular's People

Contributors

hamatoyogi avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.