Ver Fonte

Merge branch 'master-redesign' of https://github.com/sharelatex/web-sharelatex into master-redesign

Henry Oswald há 12 anos atrás
pai
commit
4f91e40875

+ 0 - 113
services/web/app/views/modals.jade

@@ -1,113 +0,0 @@
-#archiveEntityModal(style='display: none')
-	.modal
-		.modal-header
-			h3 Delete Project
-		.modal-body
-			span.message Are you sure you want to delete 
-				strong.name Project
-				| ?
-		.modal-footer
-			button.btn.btn-danger.confirm Delete
-			button.btn.cancel No
-
-#deleteEntityModal(style='display: none')
-	.modal
-		.modal-header
-			h3 Delete Project
-		.modal-body
-			p Are you sure you want to delete 
-				strong.name Project
-				| ? 
-
-			p
-				strong It will not be possible to recover your project once deleted.
-		.modal-footer
-			button.btn.btn-danger.confirm Delete Forever
-			button.btn.cancel No
-
-#renameProjectModal(style='display: none')
-	.modal
-		.modal-header
-			h3 Rename Project
-		.modal-body
-			form.form-horizontal(onkeydown="if (event.keyCode == 13){event.preventDefault(); document.getElementById('confirmRename').click()}")
-				input.inputmodal#projectNewName(placeholder='name')
-		.modal-footer
-			button.btn.btn-primary#confirmRename Rename
-			button.btn.cancel Cancel
-
-#leaveProjectModal(style='display: none')
-	.modal
-		.modal-header
-			h3 Leave Project
-		.modal-body
-			span.message Are you sure you want to leave 
-				strong.name Project
-				| ?
-		.modal-footer
-			button.btn.btn-danger.confirm Leave
-			button.btn.cancel No
-
-#deleteUserAccountModal(style='display: none')
-	.modal
-		.modal-header
-			h3 Delete Account
-		.modal-body
-			span.message Type 
-				strong Delete 
-				| below to confirm you want to delete your account forever
-			div  
-			input.inputmodal(placeholder='')
-		.modal-footer
-			button.btn.btn-danger#confirmDeleteUser Delete Forever
-			button.btn.cancel Cancel
-
-#cloneProjectModal(style='display: none')
-	.modal
-		.modal-header
-			h3 Clone Project
-		.modal-body
-			form.form-horizontal(onkeydown="if (event.keyCode == 13){event.preventDefault(); document.getElementById('confirmCloneProject').click()}")
-				input.inputmodal#newProjectName(placeholder='New Name')
-		.modal-footer
-			button.btn.btn-primary#confirmCloneProject Create
-			button.btn.cancel Cancel
-
-#newProjectModal(style='display: none')
-	.modal
-		.modal-header
-			h3 New Project
-		.modal-body
-			form.form-horizontal(onkeydown="if (event.keyCode == 13){event.preventDefault(); document.getElementById('confirmNewProject').click()}")
-				input.inputmodal#newProjectName(placeholder='name')
-		.modal-footer
-			button.btn.btn-primary#confirmNewProject Create
-			button.btn.cancel Cancel
-
-#newEntityModal(style='display: none')
-	.modal
-		.modal-header
-			h3 
-		.modal-body
-			form.form-horizontal(onkeydown="if (event.keyCode == 13){event.preventDefault(); $('.in button#genericSave').click()}")
-				input.inputmodal.span3(placeholder='name')
-		.modal-footer
-			button.btn.btn-primary#genericSave.confirm Save
-			button.btn.cancel Cancel
-
-
-#errorModal(style='display: none')
-	.modal
-		.modal-header
-			h3
-		.modal-body
-			span.message
-
-#projectUploadModal(style='display: none')
-	.modal
-		.modal-header
-			h3 Upload Zipped Project
-		.modal-body#projectFileUpload
-			span Upload a zipped project
-		.modal-footer
-			button.btn.cancel Cancel

+ 3 - 443
services/web/app/views/project/list.jade

@@ -19,449 +19,9 @@ block content
 		.container
 			.row
 				.col-md-2
-					.dropdown
-						a.btn.btn-primary.dropdown-toggle(
-							href="#",
-							data-toggle="dropdown"
-						) New Project
-						ul.dropdown-menu(role="menu")
-							li
-								a(
-									href,
-									ng-click="openCreateProjectModal()"
-								) Blank Project
-							li
-								a(
-									href,
-									ng-click="openCreateProjectModal('example')"
-								) Example Project
-							li
-								a(
-									href,
-									ng-click="openUploadProjectModal()"
-								) Upload Project
-							li.divider
-							li.dropdown-header Templates
-							li
-								a.menu-indent(href="/templates/cv") CV or Resume
-							li
-								a.menu-indent(href="/templates/cover-letters") Cover Letter
-							li
-								a.menu-indent(href="/templates/journals") Journal Article
-							li
-								a.menu-indent(href="/templates/presentations") Presentation
-							li
-								a.menu-indent(href="/templates/thesis") Thesis
-							li
-								a.menu-indent(href="/templates/bibliographies") Bibliographies
-							li
-								a.menu-indent(href="/templates") View All »
-
-					.row-spaced(ng-if="projects.length > 0", ng-cloak)
-						ul.list-unstyled.folders-menu(
-							ng-controller="TagListController"
-						)
-							li(ng-class="{active: (filter == 'all')}")
-								a(href, ng-click="filterProjects('all')") All projects
-							li(ng-class="{active: (filter == 'owned')}")
-								a(href, ng-click="filterProjects('owned')") Your projects
-							li(ng-class="{active: (filter == 'shared')}")
-								a(href, ng-click="filterProjects('shared')") Shared projects
-							li(ng-class="{active: (filter == 'archived')}")
-								a(href, ng-click="filterProjects('archived')") Deleted projects
-							li(ng-if="tags.length > 0")
-								h2 Folders
-							li(
-								ng-repeat="tag in tags | filter:nonEmpty",
-								ng-controller="TagListItemController",
-								ng-class="{active: tag.selected}",
-								ng-cloak
-							)
-								a(href="#", ng-click="selectTag()")
-									i.icon.fa(
-										ng-class="{\
-											'fa-folder-open-o': tag.selected,\
-											'fa-folder-o': !tag.selected\
-										}"
-									)
-									|  {{tag.name}} 
-									span.subdued ({{tag.project_ids.length}})
-
-					.row-spaced(ng-if="projects.length == 0", ng-cloak)
-						.first-project
-							div
-								i.fa.fa-arrow-up.fa-2x
-							div
-								strong Create your first project!
-
-					- if (showUserDetailsArea)
-						.row-spaced#userProfileInformation(ng-if="projects.length > 0", ng-cloak)
-							div(ng-controller="UserProfileController")
-								hr(ng-show="percentComplete < 100")
-								.text-centered.user-profile(ng-show="percentComplete < 100")
-									.progress
-										.progress-bar.progress-bar-info(ng-style="{'width' : (percentComplete+'%')}")
-
-									p.small
-										| Your profile is 
-										strong {{percentComplete}}% 
-										| complete
-
-									button#completeUserProfileInformation.btn.btn-info(
-										ng-hide="formVisable",
-										ng-click="openUserProfileModal()"
-									) Complete
-
-					-if (settings.enableSubscriptions && !hasSubscription)
-						.row-spaced(ng-if="projects.length > 0", ng-cloak).text-centered
-							hr
-							p.small You are using the free version of ShareLaTeX.
-							p
-								a(href="/user/subscription/plans").btn.btn-primary Upgrade
-							p.small
-								| or unlock some free bonus features by 
-								a(href="/user/bonus") sharing ShareLaTeX.
+					include ./list/side-bar
 
 				.col-md-10
-					.container-fluid
-						.row
-							.col-md-12
-								form.project-search.form-horizontal(role="form")
-									.form-group.has-feedback.has-feedback-left.col-md-7
-										input.form-control.col-md-7(
-											placeholder='Search projects…',
-											autofocus='autofocus',
-											ng-model="searchText",
-											focus-on='search:clear'
-										)
-										i.fa.fa-search.form-control-feedback-left
-										i.fa.fa-times.form-control-feedback(
-											ng-click="clearSearchText()",
-											style="cursor: pointer;",
-											ng-show="searchText.length > 0"
-										)
-									//- i.fa.fa-remove
-
-								.project-tools(ng-cloak)
-									.btn-toolbar(ng-show="filter != 'archived'")
-										.btn-group(ng-hide="selectedProjects.length < 1")
-											a.btn.btn-default(
-												href='#',
-												tooltip="Download",
-												tooltip-placement="bottom",
-												ng-click="downloadSelectedProjects()"
-											)
-												i.fa.fa-cloud-download
-											a.btn.btn-default(
-												href='#',
-												tooltip="Delete",
-												tooltip-placement="bottom",
-												ng-click="openArchiveProjectsModal()"
-											)
-												i.fa.fa-trash-o
-
-										.btn-group.dropdown(ng-hide="selectedProjects.length < 1")
-											a.btn.btn-default.dropdown-toggle(
-												href="#",
-												data-toggle="dropdown",
-												tooltip="Add to folders",
-												tooltip-placement="bottom"
-											)
-												i.fa.fa-folder-open-o
-												|  
-												span.caret
-											ul.dropdown-menu.dropdown-menu-right.js-tags-dropdown-menu(
-												role="menu"
-												ng-controller="TagListController"
-											)
-												li.dropdown-header Add to folder
-												li(
-													ng-repeat="tag in tags | filter:nonEmpty | orderBy:'name'",
-													ng-controller="TagDropdownItemController"
-												)
-													a(href="#", ng-click="addOrRemoveProjectsFromTag()", stop-propagation="click")
-														i.fa(
-															ng-class="{\
-																'fa-check-square-o': areSelectedProjectsInTag == true,\
-																'fa-square-o': areSelectedProjectsInTag == false,\
-																'fa-minus-square-o': areSelectedProjectsInTag == 'partial'\
-															}"
-														)
-														|  {{tag.name}}
-												li.divider
-												li
-													a(href="#", ng-click="openNewTagModal()", stop-propagation="click") Create New Folder
-
-										.btn-group(ng-hide="selectedProjects.length != 1").dropdown
-											a.btn.btn-default.dropdown-toggle(
-												href='#',
-												data-toggle="dropdown"
-											) More 
-												span.caret
-											ul.dropdown-menu.dropdown-menu-right(role="menu")
-												li(ng-show="getFirstSelectedProject().accessLevel == 'owner'")
-													a(
-														href='#',
-														ng-click="openRenameProjectModal()"
-													) Rename
-												li
-													a(
-														href='#',
-														ng-click="openCloneProjectModal()"
-													) Make a copy
-
-									.btn-toolbar(ng-show="filter == 'archived'")
-										.btn-group(ng-hide="selectedProjects.length < 1")
-											a.btn.btn-default(
-												href='#',
-												data-original-title="Restore",
-												data-toggle="tooltip",
-												data-placement="bottom",
-												ng-click="restoreSelectedProjects()"
-											) Restore
-
-										.btn-group(ng-hide="selectedProjects.length < 1")
-											a.btn.btn-danger(
-												href='#',
-												data-original-title="Delete Forever",
-												data-toggle="tooltip",
-												data-placement="bottom",
-												ng-click="openDeleteProjectsModal()"
-											) Delete Forever
-
-						.row.row-spaced
-							.col-md-12
-								.card.card-thin
-									ul.list-unstyled.project-list.structured-list(
-										select-all-list,
-										ng-if="projects.length > 0",
-										max-height="windowHeight - 290",
-										ng-cloak
-									)
-										li.container-fluid
-											.row
-												.col-md-6
-													input.select-all(
-														select-all,
-														type="checkbox"
-													)
-													span.header Title
-												.col-md-2
-													span.header Owner
-												.col-md-4
-													span.header Last Modified
-										li.project_entry.container-fluid(
-											ng-repeat="project in visibleProjects | orderBy:'lastUpdated':true",
-											ng-controller="ProjectListItemController"
-										)
-											.row
-												.col-md-6
-													input.select-item(
-														select-individual,
-														type="checkbox",
-														ng-model="project.selected"
-													)
-													span
-														a.projectName(href="/project/{{project.id}}") {{project.name}}
-														span.label.label-default.tag-label(ng-repeat='tag in project.tags')
-															| {{tag.name}}
-												.col-md-2
-													span.owner {{ownerName()}}
-												.col-md-4
-													span.last-modified {{project.lastUpdated | formatDate}}
-										li(
-											ng-if="visibleProjects.length == 0",
-											ng-cloak
-										)
-											.row
-												.col-md-12.text-centered
-													small No projects
-									div.welcome.text-centered(ng-if="projects.length == 0", ng-cloak)
-										h2 Welcome to ShareLaTeX!
-										p New to LaTeX? Start by having a look at our
-											a(href="/templates")  templates
-											|  or
-											a(href="/learn")  help guides
-											| ,
-											br 
-											| or create your first project on the left.
-
-		script(type='text/ng-template', id='newTagModalTemplate')
-			.modal-header
-				h3 Create New Folder
-			.modal-body
-				form(name="newTagForm", novalidate)
-					input.form-control(
-						type="text",
-						placeholder="New Folder Name",
-						required,
-						ng-model="inputs.newTagName",
-						on-enter="create()",
-						focus-on="open"
-					)
-			.modal-footer
-				button.btn.btn-default(ng-click="cancel()") Cancel
-				button.btn.btn-primary(
-					ng-disabled="newTagForm.$invalid"
-					ng-click="create()"
-				) Create
-
-		script(type='text/ng-template', id='renameProjectModalTemplate')
-			.modal-header
-				h3 Rename Project
-			.modal-body
-				form(name="renameProjectForm", novalidate)
-					input.form-control(
-						type="text",
-						placeholder="Project Name",
-						ng-model="inputs.projectName",
-						required,
-						on-enter="rename()",
-						focus-on="open"
-					)
-			.modal-footer
-				button.btn.btn-default(ng-click="cancel()") Cancel
-				button.btn.btn-primary(
-					ng-click="rename()",
-					ng-disabled="renameProjectForm.$invalid"
-				) Rename
-
-		script(type='text/ng-template', id='cloneProjectModalTemplate')
-			.modal-header
-				h3 Copy Project
-			.modal-body
-				form(name="cloneProjectForm", novalidate)
-					.form-group
-						label New Name
-						input.form-control(
-							type="text",
-							placeholder="New Project Name",
-							required,
-							ng-model="inputs.projectName",
-							on-enter="clone()",
-							focus-on="open"
-						)
-			.modal-footer
-				button.btn.btn-default(
-					ng-disabled="state.inflight"
-					ng-click="cancel()"
-				) Cancel
-				button.btn.btn-primary(
-					ng-disabled="cloneProjectForm.$invalid || state.inflight"
-					ng-click="clone()"
-				)
-					span(ng-hide="state.inflight") Copy
-					span(ng-show="state.inflight") Copying...
-
-		script(type='text/ng-template', id='newProjectModalTemplate')
-			.modal-header
-				h3 New Project
-			.modal-body
-				form(novalidate, name="newProjectForm")
-					input.form-control(
-						type="text",
-						placeholder="Project Name",
-						required,
-						ng-model="inputs.projectName",
-						on-enter="create()",
-						focus-on="open"
-					)
-			.modal-footer
-				button.btn.btn-default(
-					ng-disabled="state.inflight"
-					ng-click="cancel()"
-				) Cancel
-				button.btn.btn-primary(
-					ng-disabled="newProjectForm.$invalid || state.inflight"
-					ng-click="create()"
-				)
-					span(ng-hide="state.inflight") Create
-					span(ng-show="state.inflight") Creating...
-
-		script(type='text/ng-template', id='deleteProjectsModalTemplate')
-			.modal-header
-				h3 {{action}} Projects
-			.modal-body
-				div(ng-show="projectsToDelete.length > 0")
-					p You are about to delete the following projects:
-					ul
-						li(ng-repeat="project in projectsToDelete | orderBy:'name'")
-							strong {{project.name}}
-				div(ng-show="projectsToLeave.length > 0")
-					p You are about to leave the following projects:
-					ul
-						li(ng-repeat="project in projectsToLeave | orderBy:'name'")
-							strong {{project.name}}
-			.modal-footer
-				button.btn.btn-default(
-					ng-click="cancel()"
-				) Cancel
-				button.btn.btn-danger(
-					ng-click="delete()"
-				) {{action}}
-
-		script(type="text/ng-template", id="uploadProjectModalTemplate")
-			.modal-header
-				h3 Upload Zipped Project
-			.modal-body(
-				fine-upload
-				endpoint="/project/new/upload"
-				waiting-for-response-text="Creating project..."
-				failed-upload-text="Upload failed. Is it a valid zip file?"
-				upload-button-text="Select a .zip file"
-				drag-area-text="drag .zip file"
-				multiple="false"
-				allowed-extensions="['zip']"
-				on-complete-callback="onComplete"
-			)
-				span Upload a zipped project
-			.modal-footer
-				button.btn.btn-default(ng-click="cancel()") Cancel
+					include ./list/project-list
 
-		script(type="text/ng-template", id="userProfileModalTemplate")
-			.modal-header
-				h3 Your Profile
-			.modal-body
-				form(enctype='multipart/form-data', method='post')
-					.form-group
-						label(for="first_name") First Name
-						input.form-control(
-							type='text',
-							name='first_name',
-							ng-model="userInfoForm.first_name",
-							ng-blur="sendUpdate()",
-							placeholder="First Name",
-							select-when="formVisable"
-						)
-					.form-group
-						label(for="last_name") Last Name
-						input.form-control(
-							type='text',
-							name='last_name',
-							ng-model="userInfoForm.last_name",
-							ng-blur="sendUpdate()",
-							placeholder='Last Name'
-						)
-					.form-group#institution_auto_complete
-						label(for="institution") Institution
-						autocomplete(
-							ng-model="userInfoForm.institution",
-							name="institution",
-							data="institutions",
-							ng-blur="sendUpdate()",
-							on-type="updateInstitutionsList",
-							attr-placeholder="Institution",
-							attr-inputclass="form-control"
-						)
-					.form-group
-						label(for="role") Role
-						input.form-control(
-							type='text',
-							name='role',
-							ng-model="userInfoForm.role",
-							placeholder='Role',
-							ng-blur="sendUpdate()",
-							typeahead="role for role in roles | filter:$viewValue"
-						)
-			.modal-footer
-				button.btn.btn-info(ng-click="done()") Done
+		include ./list/modals

+ 186 - 0
services/web/app/views/project/list/modals.jade

@@ -0,0 +1,186 @@
+script(type='text/ng-template', id='newTagModalTemplate')
+	.modal-header
+		h3 Create New Folder
+	.modal-body
+		form(name="newTagForm", novalidate)
+			input.form-control(
+				type="text",
+				placeholder="New Folder Name",
+				required,
+				ng-model="inputs.newTagName",
+				on-enter="create()",
+				focus-on="open",
+				stop-propagation="click"
+			)
+	.modal-footer
+		//- We stop propagation to stop the clicks from closing the
+		//- 'move to folder' menu.
+		button.btn.btn-default(
+			ng-click="cancel()"
+			stop-propagation="click"
+		) Cancel
+		button.btn.btn-primary(
+			ng-disabled="newTagForm.$invalid"
+			ng-click="create()"
+			stop-propagation="click"
+		) Create
+
+script(type='text/ng-template', id='renameProjectModalTemplate')
+	.modal-header
+		h3 Rename Project
+	.modal-body
+		form(name="renameProjectForm", novalidate)
+			input.form-control(
+				type="text",
+				placeholder="Project Name",
+				ng-model="inputs.projectName",
+				required,
+				on-enter="rename()",
+				focus-on="open"
+			)
+	.modal-footer
+		button.btn.btn-default(ng-click="cancel()") Cancel
+		button.btn.btn-primary(
+			ng-click="rename()",
+			ng-disabled="renameProjectForm.$invalid"
+		) Rename
+
+script(type='text/ng-template', id='cloneProjectModalTemplate')
+	.modal-header
+		h3 Copy Project
+	.modal-body
+		form(name="cloneProjectForm", novalidate)
+			.form-group
+				label New Name
+				input.form-control(
+					type="text",
+					placeholder="New Project Name",
+					required,
+					ng-model="inputs.projectName",
+					on-enter="clone()",
+					focus-on="open"
+				)
+	.modal-footer
+		button.btn.btn-default(
+			ng-disabled="state.inflight"
+			ng-click="cancel()"
+		) Cancel
+		button.btn.btn-primary(
+			ng-disabled="cloneProjectForm.$invalid || state.inflight"
+			ng-click="clone()"
+		)
+			span(ng-hide="state.inflight") Copy
+			span(ng-show="state.inflight") Copying...
+
+script(type='text/ng-template', id='newProjectModalTemplate')
+	.modal-header
+		h3 New Project
+	.modal-body
+		form(novalidate, name="newProjectForm")
+			input.form-control(
+				type="text",
+				placeholder="Project Name",
+				required,
+				ng-model="inputs.projectName",
+				on-enter="create()",
+				focus-on="open"
+			)
+	.modal-footer
+		button.btn.btn-default(
+			ng-disabled="state.inflight"
+			ng-click="cancel()"
+		) Cancel
+		button.btn.btn-primary(
+			ng-disabled="newProjectForm.$invalid || state.inflight"
+			ng-click="create()"
+		)
+			span(ng-hide="state.inflight") Create
+			span(ng-show="state.inflight") Creating...
+
+script(type='text/ng-template', id='deleteProjectsModalTemplate')
+	.modal-header
+		h3 {{action}} Projects
+	.modal-body
+		div(ng-show="projectsToDelete.length > 0")
+			p You are about to delete the following projects:
+			ul
+				li(ng-repeat="project in projectsToDelete | orderBy:'name'")
+					strong {{project.name}}
+		div(ng-show="projectsToLeave.length > 0")
+			p You are about to leave the following projects:
+			ul
+				li(ng-repeat="project in projectsToLeave | orderBy:'name'")
+					strong {{project.name}}
+	.modal-footer
+		button.btn.btn-default(
+			ng-click="cancel()"
+		) Cancel
+		button.btn.btn-danger(
+			ng-click="delete()"
+		) {{action}}
+
+script(type="text/ng-template", id="uploadProjectModalTemplate")
+	.modal-header
+		h3 Upload Zipped Project
+	.modal-body(
+		fine-upload
+		endpoint="/project/new/upload"
+		waiting-for-response-text="Creating project..."
+		failed-upload-text="Upload failed. Is it a valid zip file?"
+		upload-button-text="Select a .zip file"
+		drag-area-text="drag .zip file"
+		multiple="false"
+		allowed-extensions="['zip']"
+		on-complete-callback="onComplete"
+	)
+		span Upload a zipped project
+	.modal-footer
+		button.btn.btn-default(ng-click="cancel()") Cancel
+
+script(type="text/ng-template", id="userProfileModalTemplate")
+	.modal-header
+		h3 Your Profile
+	.modal-body
+		form(enctype='multipart/form-data', method='post')
+			.form-group
+				label(for="first_name") First Name
+				input.form-control(
+					type='text',
+					name='first_name',
+					ng-model="userInfoForm.first_name",
+					ng-blur="sendUpdate()",
+					placeholder="First Name",
+					select-when="formVisable"
+				)
+			.form-group
+				label(for="last_name") Last Name
+				input.form-control(
+					type='text',
+					name='last_name',
+					ng-model="userInfoForm.last_name",
+					ng-blur="sendUpdate()",
+					placeholder='Last Name'
+				)
+			.form-group#institution_auto_complete
+				label(for="institution") Institution
+				autocomplete(
+					ng-model="userInfoForm.institution",
+					name="institution",
+					data="institutions",
+					ng-blur="sendUpdate()",
+					on-type="updateInstitutionsList",
+					attr-placeholder="Institution",
+					attr-inputclass="form-control"
+				)
+			.form-group
+				label(for="role") Role
+				input.form-control(
+					type='text',
+					name='role',
+					ng-model="userInfoForm.role",
+					placeholder='Role',
+					ng-blur="sendUpdate()",
+					typeahead="role for role in roles | filter:$viewValue"
+				)
+	.modal-footer
+		button.btn.btn-info(ng-click="done()") Done

+ 167 - 0
services/web/app/views/project/list/project-list.jade

@@ -0,0 +1,167 @@
+.row
+	.col-md-12
+		form.project-search.form-horizontal(role="form")
+			.form-group.has-feedback.has-feedback-left.col-md-7
+				input.form-control.col-md-7(
+					placeholder='Search projects…',
+					autofocus='autofocus',
+					ng-model="searchText",
+					focus-on='search:clear'
+				)
+				i.fa.fa-search.form-control-feedback-left
+				i.fa.fa-times.form-control-feedback(
+					ng-click="clearSearchText()",
+					style="cursor: pointer;",
+					ng-show="searchText.length > 0"
+				)
+			//- i.fa.fa-remove
+
+		.project-tools(ng-cloak)
+			.btn-toolbar(ng-show="filter != 'archived'")
+				.btn-group(ng-hide="selectedProjects.length < 1")
+					a.btn.btn-default(
+						href='#',
+						tooltip="Download",
+						tooltip-placement="bottom",
+						ng-click="downloadSelectedProjects()"
+					)
+						i.fa.fa-cloud-download
+					a.btn.btn-default(
+						href='#',
+						tooltip="Delete",
+						tooltip-placement="bottom",
+						ng-click="openArchiveProjectsModal()"
+					)
+						i.fa.fa-trash-o
+
+				.btn-group.dropdown(ng-hide="selectedProjects.length < 1")
+					a.btn.btn-default.dropdown-toggle(
+						href="#",
+						data-toggle="dropdown",
+						tooltip="Add to folders",
+						tooltip-placement="bottom"
+					)
+						i.fa.fa-folder-open-o
+						|  
+						span.caret
+					ul.dropdown-menu.dropdown-menu-right.js-tags-dropdown-menu(
+						role="menu"
+						ng-controller="TagListController"
+					)
+						li.dropdown-header Add to folder
+						li(
+							ng-repeat="tag in tags | filter:nonEmpty | orderBy:'name'",
+							ng-controller="TagDropdownItemController"
+						)
+							a(href="#", ng-click="addOrRemoveProjectsFromTag()", stop-propagation="click")
+								i.fa(
+									ng-class="{\
+										'fa-check-square-o': areSelectedProjectsInTag == true,\
+										'fa-square-o': areSelectedProjectsInTag == false,\
+										'fa-minus-square-o': areSelectedProjectsInTag == 'partial'\
+									}"
+								)
+								|  {{tag.name}}
+						li.divider
+						li
+							a(href="#", ng-click="openNewTagModal()", stop-propagation="click") Create New Folder
+
+				.btn-group(ng-hide="selectedProjects.length != 1").dropdown
+					a.btn.btn-default.dropdown-toggle(
+						href='#',
+						data-toggle="dropdown"
+					) More 
+						span.caret
+					ul.dropdown-menu.dropdown-menu-right(role="menu")
+						li(ng-show="getFirstSelectedProject().accessLevel == 'owner'")
+							a(
+								href='#',
+								ng-click="openRenameProjectModal()"
+							) Rename
+						li
+							a(
+								href='#',
+								ng-click="openCloneProjectModal()"
+							) Make a copy
+
+			.btn-toolbar(ng-show="filter == 'archived'")
+				.btn-group(ng-hide="selectedProjects.length < 1")
+					a.btn.btn-default(
+						href='#',
+						data-original-title="Restore",
+						data-toggle="tooltip",
+						data-placement="bottom",
+						ng-click="restoreSelectedProjects()"
+					) Restore
+
+				.btn-group(ng-hide="selectedProjects.length < 1")
+					a.btn.btn-danger(
+						href='#',
+						data-original-title="Delete Forever",
+						data-toggle="tooltip",
+						data-placement="bottom",
+						ng-click="openDeleteProjectsModal()"
+					) Delete Forever
+
+.row.row-spaced
+	.col-md-12
+		.card.card-thin
+			ul.list-unstyled.project-list.structured-list(
+				select-all-list,
+				ng-if="projects.length > 0",
+				max-height="windowHeight - 290",
+				ng-cloak
+			)
+				li.container-fluid
+					.row
+						.col-md-6
+							input.select-all(
+								select-all,
+								type="checkbox"
+							)
+							span.header Title
+						.col-md-2
+							span.header Owner
+						.col-md-4
+							span.header Last Modified
+				li.project_entry.container-fluid(
+					ng-repeat="project in visibleProjects | orderBy:'lastUpdated':true",
+					ng-controller="ProjectListItemController"
+				)
+					.row
+						.col-md-6
+							input.select-item(
+								select-individual,
+								type="checkbox",
+								ng-model="project.selected"
+							)
+							span
+								a.projectName(href="/project/{{project.id}}") {{project.name}}
+								span(
+									ng-controller="TagListController"
+								)
+									a.label.label-default.tag-label(
+										href,
+										ng-repeat='tag in project.tags',
+										ng-click="selectTag(tag)"
+									) {{tag.name}}
+						.col-md-2
+							span.owner {{ownerName()}}
+						.col-md-4
+							span.last-modified {{project.lastUpdated | formatDate}}
+				li(
+					ng-if="visibleProjects.length == 0",
+					ng-cloak
+				)
+					.row
+						.col-md-12.text-centered
+							small No projects
+			div.welcome.text-centered(ng-if="projects.length == 0", ng-cloak)
+				h2 Welcome to ShareLaTeX!
+				p New to LaTeX? Start by having a look at our
+					a(href="/templates")  templates
+					|  or
+					a(href="/learn")  help guides
+					| ,
+					br 
+					| or create your first project on the left.

+ 105 - 0
services/web/app/views/project/list/side-bar.jade

@@ -0,0 +1,105 @@
+.dropdown
+	a.btn.btn-primary.dropdown-toggle(
+		href="#",
+		data-toggle="dropdown"
+	) New Project
+	ul.dropdown-menu(role="menu")
+		li
+			a(
+				href,
+				ng-click="openCreateProjectModal()"
+			) Blank Project
+		li
+			a(
+				href,
+				ng-click="openCreateProjectModal('example')"
+			) Example Project
+		li
+			a(
+				href,
+				ng-click="openUploadProjectModal()"
+			) Upload Project
+		li.divider
+		li.dropdown-header Templates
+		li
+			a.menu-indent(href="/templates/cv") CV or Resume
+		li
+			a.menu-indent(href="/templates/cover-letters") Cover Letter
+		li
+			a.menu-indent(href="/templates/journals") Journal Article
+		li
+			a.menu-indent(href="/templates/presentations") Presentation
+		li
+			a.menu-indent(href="/templates/thesis") Thesis
+		li
+			a.menu-indent(href="/templates/bibliographies") Bibliographies
+		li
+			a.menu-indent(href="/templates") View All »
+
+.row-spaced(ng-if="projects.length > 0", ng-cloak)
+	ul.list-unstyled.folders-menu(
+		ng-controller="TagListController"
+	)
+		li(ng-class="{active: (filter == 'all')}")
+			a(href, ng-click="filterProjects('all')") All projects
+		li(ng-class="{active: (filter == 'owned')}")
+			a(href, ng-click="filterProjects('owned')") Your projects
+		li(ng-class="{active: (filter == 'shared')}")
+			a(href, ng-click="filterProjects('shared')") Shared with you
+		li(ng-class="{active: (filter == 'archived')}")
+			a(href, ng-click="filterProjects('archived')") Deleted projects
+		li
+			h2 Folders
+		li(
+			ng-repeat="tag in tags | filter:nonEmpty",
+			ng-class="{active: tag.selected}",
+			ng-cloak
+		)
+			a.tag(href, ng-click="selectTag(tag)")
+				i.icon.fa.fa-fw(
+					ng-class="{\
+						'fa-folder-open-o': tag.selected,\
+						'fa-folder-o': !tag.selected\
+					}"
+				)
+				span.name {{tag.name}} 
+					span.subdued  ({{tag.project_ids.length}})
+		li(ng-cloak)
+			a(href, ng-click="openNewTagModal()")
+				i.fa.fa-fw.fa-plus
+				|  New Folder
+
+.row-spaced(ng-if="projects.length == 0", ng-cloak)
+	.first-project
+		div
+			i.fa.fa-arrow-up.fa-2x
+		div
+			strong Create your first project!
+
+- if (showUserDetailsArea)
+	.row-spaced#userProfileInformation(ng-if="projects.length > 0", ng-cloak)
+		div(ng-controller="UserProfileController")
+			hr(ng-show="percentComplete < 100")
+			.text-centered.user-profile(ng-show="percentComplete < 100")
+				.progress
+					.progress-bar.progress-bar-info(ng-style="{'width' : (percentComplete+'%')}")
+
+				p.small
+					| Your profile is 
+					strong {{percentComplete}}% 
+					| complete
+
+				button#completeUserProfileInformation.btn.btn-info(
+					ng-hide="formVisable",
+					ng-click="openUserProfileModal()"
+				) Complete
+
+-if (settings.enableSubscriptions && !hasSubscription)
+	.row-spaced(ng-if="projects.length > 0", ng-cloak).text-centered
+		hr
+		p.small You are using the free version of ShareLaTeX.
+		p
+			a(href="/user/subscription/plans").btn.btn-primary Upgrade
+		p.small
+			| or unlock some free bonus features by 
+			a(href="/user/bonus") sharing ShareLaTeX.

+ 0 - 495
services/web/app/views/templates.jade

@@ -1,495 +0,0 @@
-#templates(style='display : none')
-
-	script(type="text/template")#editorLayoutTemplate
-		div#mainSplitter
-			aside#sidebar.ui-layout-west
-				//input#search-field(type='search', placeholder='Filter Files by Name')
-				// Position:relative is to get scrolling while dragging to work:
-				// http://stackoverflow.com/questions/1718547/jquery-draggable-scroll-not-working-when-helper-clone-is-used
-				#sections(style="position: relative;")
-				#options
-					span#saving-area 
-
-			#content.content.ui-layout-center
-				#loading.fullEditorArea
-				#disconnect(style='display: none;').fullEditorArea
-					#mainAreaMessage Sorry, your browser has lost the connection to our server. Please try refreshing the page.
-				#projectDeleted(style='display: none;').fullEditorArea
-					#mainAreaMessage This project has been renamed or deleted.
-				#folderArea(style='display: none;').fullEditorArea
-				#imageArea(style='display: none;').fullEditorArea
-					iframe
-		
-	script(type="text/template")#tabTemplate
-		li(id="{{ id }}-tab-li")
-			a(href="#", data-toggle="tab", data-target="\\#{{ show }}-tab", class="tab-link {{ id }}-tab")
-				.content {{ name }}
-
-	script(type="text/template")#tabContentTemplate
-		div.tab-pane(id="{{ id }}-tab")
-
-	script(type="text/template")#fileTreeTemplate
-		.file-tree.js-file-tree
-
-	script(type="text/template")#fileTreeActionsTemplate
-		.actions
-			.new-entity.dropdown.js-new-entity-menu
-				a.dropdown-toggle(href="#", data-toggle="dropdown", title="New file, folder or upload")
-					i.icon-plus
-					span.text New
-				ul.dropdown-menu
-					li
-						a.js-new-file(href="#")
-							img(src="/img/nide/doc.png")
-							| New File
-					li
-						a.js-new-folder(href="#")
-							img(src="/img/nide/folder.png")
-							| New Folder
-					li
-						a.js-upload-file(href="#")
-							img(src="/img/upload-file.png")
-							| Upload file(s)
-			.js-rename-btn.rename-btn
-				a(href="#", title="Rename")
-					i.icon-pencil
-			.js-delete-btn.delete-btn
-				a(href="#", title="Delete")
-					i.icon-trash
-
-	script(type="text/template")#rootDocListEntity
-		option {{name}}
-
-	script(type="text/template")#entityTemplate
-		.entity-list-item(class="entity-{{ type }}", entity-type="{{ type }}", id="{{ id }}")
-			.clickable.js-clickable
-				i(class="sprite-{{ type }}")
-				span.name {{ name }}
-				input.rename.js-rename
-			.dropdown-caret
-				i.icon-chevron-down
-			.entity-label.label.label-success
-
-	script(type="text/template")#folderTemplate
-		.entity-list-item(class="entity-{{ type }}", entity-type="{{ type }}", id="{{ id }}")
-			.toggle.js-toggle
-				img(src="/img/nide/right-arrow.png").js-closed
-				img(src="/img/nide/down-arrow.png").js-open
-			.clickable.js-clickable
-				i(class="sprite-{{ type }}")
-				span.name {{ name }}
-				input.rename.js-rename
-			.dropdown-caret
-				i.icon-chevron-down
-			.entity-label.label.label-success
-
-	script(type="text/template")#deletedDocsFolderTemplate
-		.entity-list-item.entity-deleted-docs-folder(class="entity-{{ type }}", entity-type="{{ type }}", id="{{ id }}")
-			.clickable.js-clickable
-				span.name {{ name }}
-			.entity-label.label.label-success
-	
-	script(type="text/template")#entityListTemplate
-		.contents
-			.entity-list(id="{{ id }}-file-list")
-
-	script(type="text/template")#newEntityModalTemplate
-		div
-			input.inputmodal(placeholder="name")
-	
-	script(type="text/template")#messageTemplate
-		.chatMessage
-			span.name {{name}}
-			span :
-			span.message {{message}}
-
-	script(type="text/template")#spellingMenuTemplate
-		div.btn-group.spell-check-menu
-			a.btn.dropdown-toggle(data-toggle="dropdown", href="#")
-				span.underlined Ab
-			ul.dropdown-menu.pull-right
-				li.divider
-				li
-					a#learnWord(href="#") Learn word
-
-	script(type="text/template")#spellingMenuEntryTemplate
-		li.spelling-suggestion
-			a(href="#") {{word}}
-
-	script(type="text/template")#contextMenuTemplate
-		ul.dropdown-menu.context-menu
-
-	script(type="text/template")#contextMenuEntryTemplate
-		li
-			a(href="#") {{text}}
-
-	script(type="text/template")#contextMenuDividerTemplate
-		li.divider
-	
-	script(type="text/template")#genericModalTemplate
-		.modal
-			.modal-header
-				h3 {{ title }}
-			.modal-body
-				.message {{{ message }}}
-				.creditCardFreeTrialModal
-			.modal-footer
-
-
-	script(type="text/template")#creditCardFreeTrialModal
-		.modal
-			.modal-header
-				h3 {{ title }}
-			.modal-body
-				#subscribeForm
-			.modal-footer
-
-	script(type="text/template")#genericModalButtonTemplate
-		button(class="btn {{ class }}") {{ text }}
-
-	script(type="text/template")#editorPanelTemplate
-		#editorArea(style='display: none;')
-			#editorSplitter
-				#leftEditorPanel.ui-layout-center
-					#editorWrapper
-						#editor
-						#undoConflictWarning(style="display: none")
-							| <strong>Watch out!</strong> We had to undo some of your collaborators changes before we could undo yours.
-							a(href="#").js-hide Hide
-				#rightEditorPanel.ui-layout-east
-
-	script(type="text/template")#loadingIndicatorTemplate
-		.loading
-
-	script(type="text/template")#pdfSideBarLinkTemplate
-		ul
-			li.root.project#pdf(title='Show PDF', alt='pdf')
-				img(src='/img/pdf.png') 
-				span PDF
-	
-	script(type="text/template")#helpLinkTemplate
-		div
-			a(href="#", title="LaTeX Help") LaTeX Help
-
-	script(type="text/template")#editorTourTemplate
-		div
-			a(href="#", title="Editor Tour")#editorTourLink Editor Tour
-
-	script(type="text/template")#pdfPanelTemplate
-		#pdfArea(style='display: none;').fullEditorArea
-			#pdfToolBar.btn-toolbar
-				.btn-group
-					button#recompilePdf.btn.btn-success(type='button') Recompile
-				.btn-group#showLogGroup
-					button#showLog.btn Logs
-				.btn-group#showPdfGroup
-					button#showPdf.btn Back to PDF
-				.btn-group
-					button#downloadPdf.btn Download
-					button#downloadLinksButton.btn.dropdown-toggle(data-toggle="dropdown")
-						span.caret
-					ul.dropdown-menu
-						#downloadLinks
-						li.divider
-						li.delete-cached-files
-							a(href="#") Clear cached files
-				.btn-group.pull-right(data-toggle="buttons-radio")
-					button(type="button", title="Flat view")#flatViewButton.btn
-						i.icon-flatview
-					button(type="button", title="Split view")#splitViewButton.btn
-						i.icon-splitview
-			#pdfAreaContent
-				.not-compiled-yet-message
-					| Click here to preview your work as a PDF.
-				.compiling-message(style='display: none;') Compiling...
-				#logArea(style='display: none;')
-					ul
-					button.btn.btn-info.btn-large#showRawLog Show Raw Logs
-				#rawLogArea(style='display: none;')
-					pre
-
-	script(type="text/template")#syncButtonsTemplate
-		div.sync-buttons
-			button.btn.sync-code-to-pdf &rarr;
-			button.btn.sync-pdf-to-code &larr;
-
-	script(type="text/template")#outputFileLinkTemplate
-		li
-			a(href="/project/{{ project_id }}/output/{{ path }}", target="_blank") Download {{ name }}
-
-	script(type="text/template")#pdfjsViewerTemplate
-		.pdfjs-viewer
-			.pdfjs-list-view
-			.btn-group
-				button.btn.btn-info.js-fit-height
-					img(src="/img/iconshock/fit-to-height.png")
-				button.btn.btn-info.js-fit-width
-					img(src="/img/iconshock/fit-to-width.png")
-				button.btn.btn-info.js-zoom-out
-					img(src="/img/iconshock/zoom-out.png")
-				button.btn.btn-info.js-zoom-in
-					img(src="/img/iconshock/zoom-in.png")
-			.progress.progress-info
-				.bar
-				span Loading
-
-	script(type="text/template")#compileSuccessTemplate
-		li.alert.alert-success
-			strong No errors. 
-			span Great Job!
-	
-	script(type="text/template")#compileErrorTemplate
-		li.alert.alert-error
-			p
-				strong Server Error. 
-				span Sorry, something went wrong and the project could not be compiled. Please try again in a few moments.
-			p
-				| If the problem persists, try 
-				a(href='#').js-clear-cache clearing the cache.
-				|  If that doesn't work, please contact support.
-	script(type="text/template")#compileFailedTemplate
-		li.alert.alert-error
-			p
-				strong Compile Error. 
-				span Sorry, your LaTeX code couldn't compile for some reason. Please check the errors below for details, or view the raw log.
-			p
-				| If the problem persists, try 
-				a(href='#').js-clear-cache clearing the cache.
-	script(type="text/template")#compileTimeoutTemplate
-		li.alert.alert-error
-			strong Timed out. 
-			span Sorry, your compile was taking too long and timed out.
-				| This may be due to a large number of high-res images, or lots of complicated diagrams. 
-				| Please try to make your document simpler, or contact support for help.
-	script(type="text/template")#compileLogEntryTemplate
-		li.alert.clickable(class="alert-{{ type }}")
-			strong {{ title }}: 
-			span {{ message }}
-			.small {{ content }}
-
-	script(type="text/template")#projectMemberListTemplate
-		table.table
-			thead
-				tr
-					th Email
-					th Privileges
-					th
-			tbody
-		!= '{{#showAdminControls}}'
-		form.well.form-inline.addUserForm
-			input(type="email",placeholder="someone@email.com")#newEmail.email.input-large
-			select.privileges.input-medium
-				option(value="readAndWrite") Read and write
-				option(value="readOnly") Read Only
-			button.btn.btn-primary.addUser Add New Collaborator
-		!= '{{/showAdminControls}}'
-
-	script(type="text/template")#projectMemberListItemTemplate
-		tr.projectMember
-			td.email!= '{{ email }}'
-			td.privileges!= '{{ privileges }}'
-			td
-				!= '{{#showRemove}}'
-				button(href="#").btn.btn-danger.removeUser Remove
-				!= '{{/showRemove}}'
-
-	script(type="text/template")#socialSharingTemplate
-		.box
-			.page-header
-				h2 Share Publicly
-			div.share-button
-				a.btn.btn-twitter.btn-large(href="#")
-					i.icon-twitter
-					| &nbsp; Share on Twitter
-			div.share-button
-				.btn.btn-facebook.btn-large
-					i.icon-facebook
-					| &nbsp; Share on Facebook
-			div.share-button
-				.btn.btn-google-plus.btn-large
-					i.icon-google-plus
-					| &nbsp; Share on Google+
-			div.share-button
-				.btn.btn-large.btn-url
-					i.icon-link
-					| &nbsp; Share URL
-
-
-	script(type="text/template")#publishProjectTemplate
-		.box
-			.page-header
-				h2 Publish project as template
-				
-			#publishedAsTemplateArea.show-when-published.alert.alert-success
-				p
-					.btn.btn-warning#unPublishProjectAsTemplate.pull-right Unpublish
-					i.icon-ok 
-					|  Your project is currently published. 
-					a#templateLink(href='{{canonicalUrl}}') View in template gallery.
-				p
-					| Lastest version: {{publishedDate}}. 
-
-			#problemWithPublishingArea
-				p There is a problem with our publishing service, please try again in a few minutes.
-			#publishWorkingArea
-				p Working...
-			div.show-when-published.show-when-unpublished.project-description
-				label(for="project-description") Description
-				.row-fluid
-					textarea(placeholder="Template description", name="project-description").span12#projectDescription {{description}}
-			#unpublishedAsTemplateArea.show-when-unpublished
-				.btn.btn-success#publishProjectAsTemplate Publish
-			p.show-when-published
-				button.btn.btn-success#republishProjectAsTemplate Re-Publish
-
-
-	script(type="text/template")#settingsPanelTemplate
-		.fullEditorArea.projectSettings
-			include project/partials/manage
-
-	script(type="text/template")#userPanelTemplate
-		.fullEditorArea.projectSettings
-			.box
-				.page-header      
-					h2 Share Privately (via email)
-				#projectMembersList
-			#socialSharing
-			#publishProject
-
-	script(type='text/template')#fileViewTemplate
-		!= '{{#image}}'
-		div
-			img(src='{{ previewUrl }}')
-		!= '{{/image}}'
-		!= '{{^image}}'
-		.no-preview No preview available :(
-		!= '{{/image}}'
-		a(href='{{ downloadUrl }}', target="_blank").download.btn.btn-large!= 'Download {{ name }}'
-
-	script(type='text/template')#hotKeysLinkTemplate
-		div
-			a(href="#", title='Show Hot Keys List')#hotkeysLink Hot keys
-
-	script(type='text/template')#DebugLinkTemplate
-		div
-			a(href="#", title='Show Debug Information')#debugLink Debug
-
-	script(type='text/template')#trackChangesPanelTemplate
-		#trackChangesPanel
-			.track-changes-side-bar
-				.track-changes-header
-					h3 Recent changes
-					a(href="#").track-changes-close
-						i.icon-remove
-				.change-list-area
-			.track-changes-diff
-			.track-changes-upgrade-popup(style="display: none;")
-				.message.show-when-owner
-					p You need to upgrade your plan to use the History feature.
-					button.btn.btn-primary.start-free-trial Start free trial
-				.message.show-when-not-owner
-					p Please ask the project owner to upgrade to use the History feature.
-
-	script(type='text/template')#trackChangesDiffTemplate
-		.track-changes-diff-toolbar.btn-toolbar
-			.change-info
-				.number-of-changes {{ changes }} in <strong>{{ name }}</strong>
-				a(href="#").restore.btn.btn-small.btn-danger Restore to before these changes
-			.deleted-info(style="display:none;")
-				strong {{ name }}
-				.controls
-					span This file has been deleted 
-					a(href="#").restore-deleted.btn.btn-small.btn-success Restore
-		.track-changes-diff-editor
-
-	script(type='text/template')#changeListItemTemplate
-		div.track-changes-date-header {{ day }}
-
-		div.change-selectors
-			div.range
-			input(type="radio",name="fromVersion").change-selector-from
-			input(type="radio",name="toVersion").change-selector-to
-
-		div.change-description
-			div.change-time {{time}}
-			div.changed-docs {{docs}}
-			div {{{users}}}
-
-	script(type='text/template')#changeListItemUserTemplate
-		div(class='change-name')
-			div.color-square(style="background-color: hsl({{hue}}, 100%, 70%);")
-			span {{name}}
-
-	script(type='text/template')#changeListTemplate
-		ul.change-list.nav.nav-pills.nav-stacked
-			li.loading-changes Loading...
-			li.empty-message You haven't made any changes yet!
-
-	script(type='text/template')#hotKeysListTemplate
-		.hotkeys
-			h3 Common
-			.hotkeys-column
-				.hotkey
-					span.combination.win Ctrl + F
-					span.combination.mac Cmd + F
-					span.description     Find (and replace)
-				.hotkey
-					span.combination.win Ctrl + Enter
-					span.combination.mac Cmd + Enter
-					span.description     Compile
-				.hotkey
-					span.combination.win Ctrl + /
-					span.combination.mac Cmd + /
-					span.description     Toggle Comment
-			.hotkeys-column
-				.hotkey
-					span.combination.win Ctrl + Z
-					span.combination.mac Cmd + Z
-					span.description     Undo
-				.hotkey
-					span.combination.win Ctrl + Y
-					span.combination.mac Cmd + Y
-					span.description     Redo
-			.clear
-
-			h3 Navigation
-			.hotkeys-column
-				.hotkey
-					span.combination.win Ctrl + Home
-					span.combination.mac Cmd + Home
-					span.description     Beginning of document
-				.hotkey
-					span.combination.win Ctrl + End
-					span.combination.mac Cmd + End
-					span.description     End of document
-			.hotkeys-column
-				.hotkey
-					span.combination.win Ctrl + L
-					span.combination.mac Cmd + L
-					span.description     Go To Line
-			.clear
-
-			h3 Editing
-			.hotkeys-column
-				.hotkey
-					span.combination.win Ctrl + D
-					span.combination.mac Cmd + D
-					span.description     Delete Current Line
-				.hotkey
-					span.combination.win Ctrl + A
-					span.combination.mac Cmd + A
-					span.description     Select All
-				.hotkey
-					span.combination.win Tab
-					span.combination.mac Tab
-					span.description     Indent Selection
-			.hotkeys-column
-				.hotkey
-					span.combination.win Ctrl + U
-					span.combination.mac Ctrl + U 
-					span.description     To Uppercase
-				.hotkey
-					span.combination.win Ctrl + Shift + U
-					span.combination.mac Ctrl + Shift + U 
-					span.description     To Lowercase
-			.clear

+ 3 - 4
services/web/public/coffee/main/project-list.coffee

@@ -456,11 +456,10 @@ define [
 			# modified during this session. Otherwise, tags which are empty
 			# when loading the page are not shown.
 			tag.project_ids.length > 0 or !!tag.showWhenEmpty
-
-	App.controller "TagListItemController", ($scope) ->
-		$scope.selectTag = () ->
+			
+		$scope.selectTag = (tag) ->
 			$scope._clearTags()
-			$scope.tag.selected = true
+			tag.selected = true
 			$scope.setFilter("tag")
 
 	App.controller "TagDropdownItemController", ($scope) ->

+ 0 - 4
services/web/public/stylesheets/app/editor.less

@@ -58,10 +58,6 @@
 		width: 400px;
 		margin-left: -200px;
 	}
-	.progress {
-		background-color: white;
-		border: 1px solid @toolbar-border-color;
-	}
 }
 
 .loading-panel {

+ 22 - 1
services/web/public/stylesheets/app/project-list.less

@@ -40,7 +40,7 @@ ul.folders-menu {
 			color: #333;
 			padding: (@line-height-computed / 4);
 		}
-		}
+	}
 	li.active {
 		//border-right: 4px solid @red;
 		a {
@@ -53,6 +53,9 @@ ul.folders-menu {
 			}
 		}
 	}
+	li > a.small {
+		color: @gray;
+	}
 	h2 {
 		margin-top: @line-height-computed / 2;
 		margin-bottom: @line-height-computed / 4;
@@ -60,6 +63,21 @@ ul.folders-menu {
 		font-weight: 500;
 		font-family: @font-family-sans-serif;
 	}
+	a.tag {
+		padding: 2px (@line-height-computed / 4);
+		display: inline-block;
+		position: relative;
+		i {
+			position: absolute;
+			top: 7px;
+			left: 6px;
+		}
+		span.name {
+			display: inline-block;
+			padding-left: 22px;
+			line-height: 1.4;
+		}
+	}
 }
 
 form.project-search {
@@ -125,6 +143,9 @@ ul.project-list {
 			margin-left: @line-height-computed / 4;
 			position: relative;
 			top: -2px;
+			padding-top: 0.25em;
+			display: inline-block;
+			color: white;
 		}
 	}
 }

+ 1 - 0
services/web/public/stylesheets/components/progress-bars.less

@@ -30,6 +30,7 @@
   margin-bottom: @line-height-computed;
   background-color: @progress-bg;
   border-radius: @border-radius-base;
+  border: 1px solid @progress-border-color;
   .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
 }
 

+ 2 - 1
services/web/public/stylesheets/core/variables.less

@@ -599,7 +599,8 @@
 //##
 
 //** Background color of the whole progress component
-@progress-bg:                 #f5f5f5;
+@progress-bg:                 white;
+@progress-border-color:       @gray-lighter;
 //** Progress bar text color
 @progress-bar-color:          #fff;