diff --git a/services/web/app/views/modals.jade b/services/web/app/views/modals.jade deleted file mode 100644 index 4b19853548..0000000000 --- a/services/web/app/views/modals.jade +++ /dev/null @@ -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 diff --git a/services/web/app/views/project/list.jade b/services/web/app/views/project/list.jade index 77ba3b8862..a4abee9197 100644 --- a/services/web/app/views/project/list.jade +++ b/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 + include ./list/project-list - .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 - - 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 diff --git a/services/web/app/views/project/list/modals.jade b/services/web/app/views/project/list/modals.jade new file mode 100644 index 0000000000..4c7c743e64 --- /dev/null +++ b/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 diff --git a/services/web/app/views/project/list/project-list.jade b/services/web/app/views/project/list/project-list.jade new file mode 100644 index 0000000000..c285a5f602 --- /dev/null +++ b/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. \ No newline at end of file diff --git a/services/web/app/views/project/list/side-bar.jade b/services/web/app/views/project/list/side-bar.jade new file mode 100644 index 0000000000..b1bbf99a09 --- /dev/null +++ b/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. \ No newline at end of file diff --git a/services/web/app/views/templates.jade b/services/web/app/views/templates.jade deleted file mode 100644 index b679299a5a..0000000000 --- a/services/web/app/views/templates.jade +++ /dev/null @@ -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") - | Watch out! 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 → - button.btn.sync-pdf-to-code ← - - 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 - |   Share on Twitter - div.share-button - .btn.btn-facebook.btn-large - i.icon-facebook - |   Share on Facebook - div.share-button - .btn.btn-google-plus.btn-large - i.icon-google-plus - |   Share on Google+ - div.share-button - .btn.btn-large.btn-url - i.icon-link - |   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 {{ name }} - 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 diff --git a/services/web/public/coffee/main/project-list.coffee b/services/web/public/coffee/main/project-list.coffee index fbae8a339e..656be90840 100644 --- a/services/web/public/coffee/main/project-list.coffee +++ b/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) -> diff --git a/services/web/public/stylesheets/app/editor.less b/services/web/public/stylesheets/app/editor.less index 9a72122669..c71b6f6d78 100644 --- a/services/web/public/stylesheets/app/editor.less +++ b/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 { diff --git a/services/web/public/stylesheets/app/project-list.less b/services/web/public/stylesheets/app/project-list.less index 2831302b49..e6456f0c00 100644 --- a/services/web/public/stylesheets/app/project-list.less +++ b/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; } } } diff --git a/services/web/public/stylesheets/components/progress-bars.less b/services/web/public/stylesheets/components/progress-bars.less index 76c87be17c..062ec48df2 100755 --- a/services/web/public/stylesheets/components/progress-bars.less +++ b/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)); } diff --git a/services/web/public/stylesheets/core/variables.less b/services/web/public/stylesheets/core/variables.less index 341d506098..1561a5e4a5 100755 --- a/services/web/public/stylesheets/core/variables.less +++ b/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;