├── .bowerrc ├── .circleci └── config.yml ├── .editorconfig ├── .ember-cli ├── .env.deploy.production.example ├── .env.deploy.staging.example ├── .eslintrc.js ├── .github ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .nvmrc ├── .travis.yml ├── .watchmanconfig ├── LICENSE.txt ├── README.md ├── app ├── abilities │ ├── organization.js │ ├── project.js │ └── task.js ├── adapters │ ├── application.js │ ├── project.js │ ├── slugged-route.js │ ├── stripe-connect-account.js │ ├── stripe-connect-subscription.js │ ├── stripe-platform-card.js │ ├── stripe-platform-customer.js │ ├── stripe.js │ ├── task-list.js │ ├── task.js │ └── user.js ├── app.js ├── breakpoints.js ├── components │ ├── .gitkeep │ ├── animated-high-five.js │ ├── categories-list.js │ ├── category-checkboxes.js │ ├── category-item.js │ ├── code-theme-selector.js │ ├── comment-item.js │ ├── common │ │ └── busy-model-wrapper.js │ ├── conversations │ │ ├── conversation-composer.js │ │ ├── conversation-list-item-with-project.js │ │ ├── conversation-list-item-with-user.js │ │ ├── conversation-part-closed.js │ │ ├── conversation-part-comment.js │ │ ├── conversation-part-reopened.js │ │ ├── conversation-thread.js │ │ ├── new-conversation-modal.js │ │ ├── project-details.js │ │ ├── status-select.js │ │ └── user-details.js │ ├── create-comment-form.js │ ├── demo-categories.js │ ├── demo-category-item.js │ ├── demo-projects.js │ ├── demo-skills.js │ ├── donation-goal-edit.js │ ├── donation-goal.js │ ├── donation-goals-activation.js │ ├── donation-goals.js │ ├── donation │ │ ├── card-item.js │ │ ├── card-logo.js │ │ ├── donation-container.js │ │ └── project-header.js │ ├── donations │ │ ├── create-donation.js │ │ ├── donation-amount-button.js │ │ ├── donation-progress.js │ │ ├── donation-status.js │ │ └── show-donation.js │ ├── drag-zone.js │ ├── editor-with-preview.js │ ├── error-formatter.js │ ├── error-wrapper.js │ ├── flash-messages │ │ ├── fixed-position.js │ │ └── full-width.js │ ├── github-connect-state.js │ ├── github-connect.js │ ├── github-repo.js │ ├── github │ │ ├── connected-installation.js │ │ ├── install-link.js │ │ ├── issue-link.js │ │ ├── pull-request-icon.js │ │ ├── repo-disconnect-confirm-modal.js │ │ ├── repo-sync.js │ │ └── unconnected-installation.js │ ├── image-drop.js │ ├── landing-subsection.js │ ├── loading-bar.js │ ├── loading-spinner.js │ ├── login-form.js │ ├── modal-dialog.js │ ├── navigation-menu.js │ ├── organization-header.js │ ├── organization-menu.js │ ├── organization-profile.js │ ├── organization-settings-form.js │ ├── organization-settings.js │ ├── pager-control.js │ ├── password │ │ ├── forgot-password.js │ │ └── reset-password.js │ ├── payments │ │ ├── account-setup.js │ │ ├── bank-account.js │ │ ├── contact-info.js │ │ ├── create-account.js │ │ ├── donation-goals.js │ │ ├── funds-recipient.js │ │ └── funds-recipient │ │ │ ├── details-form.js │ │ │ ├── identity-document-file-upload.js │ │ │ ├── personal-id-number.js │ │ │ └── verification-document.js │ ├── power-select │ │ └── before-task-options.js │ ├── progress-bar-container.js │ ├── progress-bar.js │ ├── project-card-users.js │ ├── project-card.js │ ├── project-card │ │ ├── donation-progress.js │ │ └── project-users.js │ ├── project-categories-list.js │ ├── project-category-item.js │ ├── project-header.js │ ├── project-item.js │ ├── project-join-modal.js │ ├── project-list.js │ ├── project-long-description.js │ ├── project-menu.js │ ├── project-notifications.js │ ├── project-settings-form.js │ ├── project-skill-item.js │ ├── project-skills-list.js │ ├── project-switcher-menu.js │ ├── project-switcher.js │ ├── project-user-role-modal.js │ ├── project-users.js │ ├── related-skills.js │ ├── role-item.js │ ├── select-inline-dropdown │ │ └── list-item.js │ ├── select │ │ ├── birth-date.js │ │ ├── country-select.js │ │ ├── github-repo.js │ │ └── state-select.js │ ├── settings-menu.js │ ├── signup-email-input.js │ ├── signup-form.js │ ├── signup-password-input.js │ ├── signup-username-input.js │ ├── site-footer.js │ ├── skill-button.js │ ├── skill-list-item-link.js │ ├── skill-list-item.js │ ├── skill-list-items.js │ ├── skills-textfield.js │ ├── skills-typeahead-result.js │ ├── skills-typeahead.js │ ├── slugged-route-model-details.js │ ├── submittable-textarea.js │ ├── svg │ │ ├── sprite-icon.js │ │ └── sprite-map.js │ ├── task-assignment.js │ ├── task-board.js │ ├── task-card.js │ ├── task-card │ │ └── user │ │ │ ├── selected-item.js │ │ │ └── unselected-item.js │ ├── task-comment-list.js │ ├── task-details.js │ ├── task-header.js │ ├── task-list-cards.js │ ├── task-new-form.js │ ├── task-status-button.js │ ├── task-status.js │ ├── task-title.js │ ├── task │ │ ├── archive-task.js │ │ └── sidebar │ │ │ └── integrations-section.js │ ├── team-member.js │ ├── thank-you-container.js │ ├── user-byline.js │ ├── user-details.js │ ├── user-dropdown.js │ ├── user-list-item.js │ ├── user-menu.js │ ├── user-projects-list.js │ ├── user-settings-form.js │ ├── user-sidebar.js │ ├── user │ │ ├── display-username.js │ │ └── skills-list.js │ └── volunteer-headshot.js ├── controllers │ ├── .gitkeep │ ├── admin │ │ ├── github-events │ │ │ ├── github-event.js │ │ │ └── index.js │ │ ├── organization-invites │ │ │ ├── index.js │ │ │ └── new.js │ │ └── projects │ │ │ └── index.js │ ├── application.js │ ├── conversations │ │ └── conversation.js │ ├── index.js │ ├── organizations │ │ └── new.js │ ├── project.js │ ├── project │ │ ├── checkout.js │ │ ├── conversations.js │ │ ├── conversations │ │ │ └── conversation.js │ │ ├── donate.js │ │ ├── index.js │ │ ├── settings │ │ │ ├── donations │ │ │ │ ├── goals.js │ │ │ │ └── payments.js │ │ │ ├── integrations.js │ │ │ └── profile.js │ │ └── tasks │ │ │ ├── index.js │ │ │ ├── new.js │ │ │ └── task.js │ ├── projects-list.js │ ├── projects │ │ └── new.js │ ├── settings │ │ └── profile.js │ └── start │ │ ├── expertise.js │ │ ├── hello.js │ │ ├── interests.js │ │ └── skills.js ├── helpers │ ├── .gitkeep │ ├── capitalize.js │ ├── end-with-period.js │ ├── float.js │ ├── format-currency.js │ ├── format-number.js │ ├── format-percentage.js │ └── highlight-substrings.js ├── index.html ├── initializers │ ├── promise.js │ └── responsive.js ├── locales │ └── en-us │ │ ├── config.js │ │ └── translations.js ├── macros │ └── project-member.js ├── mixins │ ├── admin-route-mixin.js │ ├── can-animate.js │ ├── contains-code.js │ ├── loading-bar.js │ ├── marketing-route-mixin.js │ ├── onboarding-controller.js │ ├── repo-sync-progress.js │ └── tooltip-for-dropdown.js ├── models │ ├── .gitkeep │ ├── category.js │ ├── comment-user-mention.js │ ├── comment.js │ ├── conversation-part.js │ ├── conversation.js │ ├── donation-goal.js │ ├── github-app-installation.js │ ├── github-event.js │ ├── github-issue.js │ ├── github-pull-request.js │ ├── github-repo.js │ ├── message.js │ ├── organization-github-app-installation.js │ ├── organization-invite.js │ ├── organization.js │ ├── preview-user-mention.js │ ├── preview.js │ ├── project-category.js │ ├── project-skill.js │ ├── project-user.js │ ├── project.js │ ├── role.js │ ├── skill.js │ ├── slugged-route.js │ ├── stripe-connect-account.js │ ├── stripe-connect-plan.js │ ├── stripe-connect-subscription.js │ ├── stripe-platform-card.js │ ├── stripe-platform-customer.js │ ├── task-list.js │ ├── task-skill.js │ ├── task-user-mention.js │ ├── task.js │ ├── user-category.js │ ├── user-role.js │ ├── user-skill.js │ ├── user-task.js │ └── user.js ├── resolver.js ├── router.js ├── routes │ ├── .gitkeep │ ├── about.js │ ├── admin.js │ ├── admin │ │ ├── github-events │ │ │ ├── github-event.js │ │ │ └── index.js │ │ ├── organization-invites │ │ │ ├── index.js │ │ │ └── new.js │ │ └── projects │ │ │ └── index.js │ ├── application.js │ ├── conversations.js │ ├── conversations │ │ ├── conversation.js │ │ └── index.js │ ├── github.js │ ├── index.js │ ├── login.js │ ├── organizations │ │ ├── new.js │ │ ├── slugged-route.js │ │ └── slugged-route │ │ │ └── settings.js │ ├── password │ │ ├── forgot.js │ │ └── reset.js │ ├── privacy.js │ ├── project.js │ ├── project │ │ ├── checkout.js │ │ ├── conversations.js │ │ ├── conversations │ │ │ ├── conversation.js │ │ │ └── index.js │ │ ├── donate.js │ │ ├── index.js │ │ ├── people.js │ │ ├── settings.js │ │ ├── settings │ │ │ ├── donations │ │ │ │ ├── goals.js │ │ │ │ └── payments.js │ │ │ ├── integrations.js │ │ │ └── profile.js │ │ ├── tasks.js │ │ ├── tasks │ │ │ ├── index.js │ │ │ ├── new.js │ │ │ └── task.js │ │ └── thank-you.js │ ├── projects-list.js │ ├── projects │ │ ├── index.js │ │ └── new.js │ ├── settings.js │ ├── settings │ │ └── profile.js │ ├── signup.js │ ├── slugged-route.js │ ├── start.js │ ├── start │ │ ├── expertise.js │ │ ├── hello.js │ │ ├── interests.js │ │ └── skills.js │ ├── team.js │ └── terms.js ├── serializers │ ├── application.js │ ├── message.js │ ├── stripe-connect-account.js │ └── task.js ├── services │ ├── ajax.js │ ├── background.js │ ├── code-theme.js │ ├── conversation-channel.js │ ├── conversations.js │ ├── current-user.js │ ├── drag-state.js │ ├── github-state.js │ ├── loading-bar.js │ ├── mention-fetcher.js │ ├── navigation-menu.js │ ├── onboarding.js │ ├── project-skills-list.js │ ├── project-task-board.js │ ├── project-user.js │ ├── raven.js │ ├── session.js │ ├── site-footer.js │ ├── socket.js │ ├── sounds.js │ ├── task-assignment.js │ ├── task-skills-list.js │ ├── user-categories.js │ ├── user-roles.js │ ├── user-skills-list.js │ └── user-subscriptions.js ├── styles │ ├── _alerts.scss │ ├── _buttons.scss │ ├── _code.scss │ ├── _icons.scss │ ├── _images.scss │ ├── _inputs.scss │ ├── _markdown.scss │ ├── _shame.scss │ ├── addons │ │ └── ember-stripe-elements │ │ │ └── stripe-element.scss │ ├── app.scss │ ├── base │ │ ├── _animations.scss │ │ ├── _base.scss │ │ ├── _colors.scss │ │ ├── _fonts.scss │ │ ├── _helpers.scss │ │ └── _mixins.scss │ ├── components │ │ ├── animated-high-five.scss │ │ ├── callout-item.scss │ │ ├── categories-list.scss │ │ ├── category-item.scss │ │ ├── code-theme-selector.scss │ │ ├── comment-item.scss │ │ ├── conversations │ │ │ ├── conversation-composer.scss │ │ │ ├── conversation-list-item.scss │ │ │ ├── conversation-part.scss │ │ │ ├── new-conversation-modal.scss │ │ │ └── status-select.scss │ │ ├── create-comment-form.scss │ │ ├── donation-goal-edit.scss │ │ ├── donation-goal.scss │ │ ├── donation-payment.scss │ │ ├── donation │ │ │ ├── card-item.scss │ │ │ ├── card-logo.scss │ │ │ └── project-header.scss │ │ ├── donations │ │ │ ├── create-donation.scss │ │ │ ├── donation-progress.scss │ │ │ └── donation-status.scss │ │ ├── dropdown-menu.scss │ │ ├── editor-with-preview.scss │ │ ├── error-wrapper.scss │ │ ├── github-app-installation.scss │ │ ├── github-connect-state.scss │ │ ├── github-repo.scss │ │ ├── github │ │ │ ├── issue-link.scss │ │ │ └── repo-sync.scss │ │ ├── image-drop.scss │ │ ├── loading-bar.scss │ │ ├── loading-spinner.scss │ │ ├── organization-header.scss │ │ ├── organization-profile.scss │ │ ├── pager-control.scss │ │ ├── payments │ │ │ ├── account-setup.scss │ │ │ ├── bank-account.scss │ │ │ └── funds-recipient │ │ │ │ └── details-form.scss │ │ ├── progress-bar.scss │ │ ├── project-card.scss │ │ ├── project-card │ │ │ ├── donation-progress.scss │ │ │ └── project-users.scss │ │ ├── project-header.scss │ │ ├── project-item.scss │ │ ├── project-join-modal.scss │ │ ├── project-list.scss │ │ ├── project-long-description.scss │ │ ├── project-menu.scss │ │ ├── project-skills-list.scss │ │ ├── project-switcher-menu.scss │ │ ├── project-users.scss │ │ ├── related-skills.scss │ │ ├── select │ │ │ └── github-repo.scss │ │ ├── settings-menu.scss │ │ ├── signup-form.scss │ │ ├── skill-list-item.scss │ │ ├── skills-typeahead.scss │ │ ├── svg │ │ │ └── sprite-icon.scss │ │ ├── task-board.scss │ │ ├── task-card.scss │ │ ├── task-comment-list.scss │ │ ├── task-details.scss │ │ ├── task-header.scss │ │ ├── task-list-cards.scss │ │ ├── task-new-form.scss │ │ ├── task-status-button.scss │ │ ├── task-status.scss │ │ ├── task-title.scss │ │ ├── task │ │ │ └── user │ │ │ │ ├── user-select.scss │ │ │ │ └── users-list-item.scss │ │ ├── user-details.scss │ │ ├── user-list-item.scss │ │ ├── user-menu.scss │ │ ├── user-projects-list.scss │ │ ├── user-sidebar.scss │ │ ├── user │ │ │ └── skills-list.scss │ │ └── volunteer-headshot.scss │ ├── layout │ │ ├── _breakpoints.scss │ │ ├── _content.scss │ │ ├── _footer.scss │ │ ├── _forms.scss │ │ ├── _header.scss │ │ ├── _loading.scss │ │ ├── _modals.scss │ │ ├── _panel.scss │ │ ├── _select-dropdown.scss │ │ ├── _select-inline.scss │ │ └── _tooltips.scss │ ├── shared │ │ ├── conversation.scss │ │ └── conversations.scss │ └── templates │ │ ├── about.scss │ │ ├── admin │ │ ├── admin.scss │ │ └── github-events.scss │ │ ├── index.scss │ │ ├── project │ │ ├── index.scss │ │ ├── people.scss │ │ ├── settings │ │ │ ├── integrations.scss │ │ │ ├── profile.scss │ │ │ └── settings.scss │ │ ├── tasks │ │ │ ├── index.scss │ │ │ ├── task-new.scss │ │ │ └── task.scss │ │ └── thank-you.scss │ │ ├── settings │ │ └── profile.scss │ │ ├── start │ │ ├── expertise.scss │ │ ├── hello.scss │ │ ├── skills.scss │ │ └── start.scss │ │ └── team.scss ├── templates │ ├── about.hbs │ ├── admin.hbs │ ├── admin │ │ ├── github-events.hbs │ │ ├── github-events │ │ │ ├── github-event.hbs │ │ │ └── index.hbs │ │ ├── organization-invites.hbs │ │ ├── organization-invites │ │ │ ├── index.hbs │ │ │ └── new.hbs │ │ ├── projects.hbs │ │ └── projects │ │ │ └── index.hbs │ ├── application-error.hbs │ ├── application.hbs │ ├── components │ │ ├── .gitkeep │ │ ├── animated-high-five.hbs │ │ ├── categories-list.hbs │ │ ├── category-checkboxes.hbs │ │ ├── category-item.hbs │ │ ├── code-theme-selector.hbs │ │ ├── comment-item.hbs │ │ ├── common │ │ │ └── busy-model-wrapper.hbs │ │ ├── conversations │ │ │ ├── conversation-composer.hbs │ │ │ ├── conversation-list-item-with-project.hbs │ │ │ ├── conversation-list-item-with-user.hbs │ │ │ ├── conversation-part-closed.hbs │ │ │ ├── conversation-part-comment.hbs │ │ │ ├── conversation-part-reopened.hbs │ │ │ ├── conversation-thread.hbs │ │ │ ├── new-conversation-modal.hbs │ │ │ ├── project-details.hbs │ │ │ ├── status-select.hbs │ │ │ └── user-details.hbs │ │ ├── create-comment-form.hbs │ │ ├── demo-categories.hbs │ │ ├── demo-category-item.hbs │ │ ├── demo-projects.hbs │ │ ├── demo-skills.hbs │ │ ├── donation-goal-edit.hbs │ │ ├── donation-goal.hbs │ │ ├── donation-goals-activation.hbs │ │ ├── donation-goals.hbs │ │ ├── donation │ │ │ ├── card-item.hbs │ │ │ ├── card-list.hbs │ │ │ ├── card-logo.hbs │ │ │ ├── donation-container.hbs │ │ │ └── project-header.hbs │ │ ├── donations │ │ │ ├── create-donation.hbs │ │ │ ├── donation-amount-button.hbs │ │ │ ├── donation-progress.hbs │ │ │ ├── donation-status.hbs │ │ │ └── show-donation.hbs │ │ ├── drag-zone.hbs │ │ ├── editor-with-preview.hbs │ │ ├── error-formatter.hbs │ │ ├── error-wrapper.hbs │ │ ├── flash-messages │ │ │ ├── fixed-position.hbs │ │ │ └── full-width.hbs │ │ ├── github-connect-state.hbs │ │ ├── github-connect.hbs │ │ ├── github-repo.hbs │ │ ├── github │ │ │ ├── connected-installation.hbs │ │ │ ├── install-link.hbs │ │ │ ├── issue-link.hbs │ │ │ ├── pull-request-icon.hbs │ │ │ ├── repo-disconnect-confirm-modal.hbs │ │ │ ├── repo-sync.hbs │ │ │ └── unconnected-installation.hbs │ │ ├── image-drop.hbs │ │ ├── landing-subsection.hbs │ │ ├── loading-spinner.hbs │ │ ├── login-form.hbs │ │ ├── navigation-menu.hbs │ │ ├── organization-header.hbs │ │ ├── organization-menu.hbs │ │ ├── organization-profile.hbs │ │ ├── organization-settings-form.hbs │ │ ├── organization-settings.hbs │ │ ├── pager-control.hbs │ │ ├── password │ │ │ ├── forgot-password.hbs │ │ │ └── reset-password.hbs │ │ ├── payments │ │ │ ├── account-setup.hbs │ │ │ ├── bank-account.hbs │ │ │ ├── contact-info.hbs │ │ │ ├── create-account.hbs │ │ │ ├── donation-goals.hbs │ │ │ ├── funds-recipient.hbs │ │ │ └── funds-recipient │ │ │ │ ├── details-form.hbs │ │ │ │ ├── personal-id-number.hbs │ │ │ │ └── verification-document.hbs │ │ ├── power-select │ │ │ └── before-task-options.hbs │ │ ├── progress-bar-container.hbs │ │ ├── progress-bar.hbs │ │ ├── project-card.hbs │ │ ├── project-card │ │ │ ├── donation-progress.hbs │ │ │ └── project-users.hbs │ │ ├── project-categories-list.hbs │ │ ├── project-category-item.hbs │ │ ├── project-header.hbs │ │ ├── project-item.hbs │ │ ├── project-join-modal.hbs │ │ ├── project-list.hbs │ │ ├── project-long-description.hbs │ │ ├── project-menu.hbs │ │ ├── project-notifications.hbs │ │ ├── project-settings-form.hbs │ │ ├── project-skill-item.hbs │ │ ├── project-skills-list.hbs │ │ ├── project-switcher-menu.hbs │ │ ├── project-switcher.hbs │ │ ├── project-user-role-modal.hbs │ │ ├── project-users.hbs │ │ ├── related-skills.hbs │ │ ├── role-item.hbs │ │ ├── select-inline-dropdown │ │ │ └── list-item.hbs │ │ ├── select │ │ │ ├── birth-date.hbs │ │ │ ├── country-select.hbs │ │ │ ├── github-repo.hbs │ │ │ └── state-select.hbs │ │ ├── settings-menu.hbs │ │ ├── signup-email-input.hbs │ │ ├── signup-form.hbs │ │ ├── signup-password-input.hbs │ │ ├── signup-username-input.hbs │ │ ├── site-footer.hbs │ │ ├── skill-button.hbs │ │ ├── skill-list-item-link.hbs │ │ ├── skill-list-item.hbs │ │ ├── skill-list-items.hbs │ │ ├── skills-typeahead-result.hbs │ │ ├── skills-typeahead.hbs │ │ ├── slugged-route-model-details.hbs │ │ ├── stripe-connect-button.hbs │ │ ├── submittable-textarea.hbs │ │ ├── svg │ │ │ ├── sprite-icon.hbs │ │ │ └── sprite-map.hbs │ │ ├── task-assignment.hbs │ │ ├── task-card.hbs │ │ ├── task-card │ │ │ └── user │ │ │ │ ├── selected-item.hbs │ │ │ │ └── unselected-item.hbs │ │ ├── task-comment-list.hbs │ │ ├── task-details.hbs │ │ ├── task-header.hbs │ │ ├── task-list-cards.hbs │ │ ├── task-new-form.hbs │ │ ├── task-status-button.hbs │ │ ├── task-status.hbs │ │ ├── task-title.hbs │ │ ├── task │ │ │ ├── archive-task.hbs │ │ │ └── sidebar │ │ │ │ └── integrations-section.hbs │ │ ├── team-member.hbs │ │ ├── thank-you-container.hbs │ │ ├── user-byline.hbs │ │ ├── user-details.hbs │ │ ├── user-dropdown.hbs │ │ ├── user-list-item.hbs │ │ ├── user-menu.hbs │ │ ├── user-projects-list.hbs │ │ ├── user-settings-form.hbs │ │ ├── user-sidebar.hbs │ │ ├── user │ │ │ ├── display-username.hbs │ │ │ └── skills-list.hbs │ │ └── volunteer-headshot.hbs │ ├── conversations.hbs │ ├── conversations │ │ ├── conversation.hbs │ │ └── index.hbs │ ├── github.hbs │ ├── head.hbs │ ├── index.hbs │ ├── loading.hbs │ ├── login.hbs │ ├── organization.hbs │ ├── organizations │ │ ├── new.hbs │ │ ├── slugged-route.hbs │ │ └── slugged-route │ │ │ ├── settings.hbs │ │ │ └── settings │ │ │ └── profile.hbs │ ├── password │ │ ├── forgot.hbs │ │ └── reset.hbs │ ├── privacy.hbs │ ├── project.hbs │ ├── project │ │ ├── checkout.hbs │ │ ├── conversations.hbs │ │ ├── conversations │ │ │ ├── conversation.hbs │ │ │ └── index.hbs │ │ ├── donate.hbs │ │ ├── index.hbs │ │ ├── people.hbs │ │ ├── settings.hbs │ │ ├── settings │ │ │ ├── donations │ │ │ │ ├── goals.hbs │ │ │ │ └── payments.hbs │ │ │ ├── integrations.hbs │ │ │ └── profile.hbs │ │ ├── tasks.hbs │ │ ├── tasks │ │ │ ├── index.hbs │ │ │ ├── new.hbs │ │ │ └── task.hbs │ │ └── thank-you.hbs │ ├── projects-list.hbs │ ├── projects.hbs │ ├── projects │ │ ├── index.hbs │ │ └── new.hbs │ ├── settings.hbs │ ├── settings │ │ ├── integrations.hbs │ │ └── profile.hbs │ ├── signup.hbs │ ├── slugged-route.hbs │ ├── start.hbs │ ├── start │ │ ├── expertise.hbs │ │ ├── hello.hbs │ │ ├── interests.hbs │ │ └── skills.hbs │ ├── team.hbs │ ├── terms.hbs │ └── user.hbs ├── transforms │ ├── array.js │ └── dollar-cents.js └── utils │ ├── array-utils.js │ ├── create-task-user-options.js │ ├── error-utils.js │ ├── friendly-error.js │ ├── mention-parser.js │ ├── pretty-float.js │ └── records-list.js ├── bower.json ├── civic.json ├── config ├── coverage.js ├── deploy.js ├── ember-try.js ├── environment.js └── targets.js ├── docs ├── INSTALLING.md ├── SQUASHING.md ├── STYLEGUIDE.md ├── USAGE.md └── assets │ ├── branch.png │ ├── code-corps-ember.png │ ├── master.png │ └── rebase.png ├── ember-cli-build.js ├── inch.json ├── mirage ├── config.js ├── factories │ ├── category.js │ ├── comment.js │ ├── conversation-part.js │ ├── conversation.js │ ├── donation-goal.js │ ├── github-app-installation.js │ ├── github-event.js │ ├── github-repo.js │ ├── message.js │ ├── organization.js │ ├── project-github-repo.js │ ├── project-user.js │ ├── project.js │ ├── role.js │ ├── slugged-route.js │ ├── stripe-platform-card.js │ ├── task-list.js │ ├── task.js │ └── user.js ├── scenarios │ └── default.js ├── serializers │ ├── application.js │ ├── comment.js │ ├── github-event.js │ └── task.js └── utils │ └── pagination.js ├── package-lock.json ├── package.json ├── public ├── assets │ └── images │ │ ├── code-corps-github.png │ │ ├── code-corps-github@2x.png │ │ ├── github-sync.png │ │ ├── github-sync@2x.png │ │ ├── icons-header.png │ │ ├── icons-header@2x.png │ │ ├── icons │ │ ├── about-sprite.png │ │ ├── about-sprite@2x.png │ │ ├── button-spinner-on-clear.gif │ │ ├── button-spinner-on-clear@2x.gif │ │ ├── button-spinner-on-default.gif │ │ ├── button-spinner-on-default@2x.gif │ │ ├── categories.png │ │ ├── categories@2x.png │ │ ├── emoji-1f64c-sprite.png │ │ ├── emoji-1f64c-sprite@2x.png │ │ ├── fireworks-small.png │ │ ├── fireworks-small@2x.png │ │ ├── integration-github.png │ │ ├── integration-github@2x.png │ │ ├── interests.png │ │ ├── interests@2x.png │ │ ├── roles-sprite.png │ │ ├── roles-sprite@2x.png │ │ ├── spinner-large.gif │ │ ├── spinner-large@2x.gif │ │ ├── spinner-small.gif │ │ ├── spinner-small@2x.gif │ │ ├── sprite.png │ │ └── sprite@2x.png │ │ ├── people-signup.png │ │ └── people-signup@2x.png ├── crossdomain.xml └── robots.txt ├── testem.js ├── tests ├── .eslintrc.js ├── acceptance │ ├── admin-github-event-test.js │ ├── admin-github-events-test.js │ ├── admin-organization-invite-new-test.js │ ├── admin-organization-invites-index-test.js │ ├── admin-projects-test.js │ ├── admin-test.js │ ├── code-theme-test.js │ ├── footer-test.js │ ├── github-test.js │ ├── login-test.js │ ├── logout-test.js │ ├── navigation-test.js │ ├── onboarding-test.js │ ├── organization-creation-test.js │ ├── organization-projects-test.js │ ├── organization-settings-profile-test.js │ ├── organization-test.js │ ├── password-test.js │ ├── profile-test.js │ ├── project-about-test.js │ ├── project-checkout-test.js │ ├── project-conversations-test.js │ ├── project-creation-test.js │ ├── project-donate-test.js │ ├── project-donation-goals-test.js │ ├── project-payments-test.js │ ├── project-people-test.js │ ├── project-settings-integrations-test.js │ ├── project-settings-test.js │ ├── project-test.js │ ├── project-thank-you-test.js │ ├── projects-test.js │ ├── settings-integrations-test.js │ ├── settings-profile-test.js │ ├── signup-test.js │ ├── slugged-route-test.js │ ├── svg-sprite-map-test.js │ ├── task-comments-test.js │ ├── task-creation-test.js │ ├── task-editing-test.js │ ├── task-list-test.js │ ├── team-test.js │ └── user-conversations-test.js ├── fixtures │ └── stripe │ │ ├── failed.png │ │ └── success.png ├── helpers │ ├── attributes.js │ ├── destroy-app.js │ ├── fill-in-file-input.js │ ├── flash-message.js │ ├── has-attributes.js │ ├── mock-routing.js │ ├── module-for-acceptance.js │ ├── project-user.js │ ├── relationship.js │ ├── remove-double-quotes.js │ ├── responsive.js │ ├── setup-mirage-for-integration.js │ ├── start-app.js │ └── stub-service.js ├── index.html ├── integration │ └── components │ │ ├── animated-high-five-test.js │ │ ├── categories-list-test.js │ │ ├── category-checkboxes-test.js │ │ ├── category-item-test.js │ │ ├── code-theme-selector-test.js │ │ ├── comment-item-test.js │ │ ├── common │ │ └── busy-model-wrapper-test.js │ │ ├── conversations │ │ ├── conversation-composer-test.js │ │ ├── conversation-list-item-with-project-test.js │ │ ├── conversation-list-item-with-user-test.js │ │ ├── conversation-part-closed-test.js │ │ ├── conversation-part-comment-test.js │ │ ├── conversation-part-reopened-test.js │ │ ├── conversation-thread-test.js │ │ ├── new-conversation-modal-test.js │ │ ├── project-details-test.js │ │ ├── status-select-test.js │ │ └── user-details-test.js │ │ ├── create-comment-form-test.js │ │ ├── demo-categories-test.js │ │ ├── demo-category-item-test.js │ │ ├── demo-projects-test.js │ │ ├── demo-skills-test.js │ │ ├── donation-goal-edit-test.js │ │ ├── donation-goal-test.js │ │ ├── donation-goals-activation-test.js │ │ ├── donation-goals-test.js │ │ ├── donation │ │ ├── card-item-test.js │ │ ├── card-logo-test.js │ │ ├── donation-container-test.js │ │ └── project-header-test.js │ │ ├── donations │ │ ├── create-donation-test.js │ │ ├── donation-amount-button-test.js │ │ ├── donation-progress-test.js │ │ ├── donation-status-test.js │ │ └── show-donation-test.js │ │ ├── drag-zone-test.js │ │ ├── editor-with-preview-test.js │ │ ├── error-formatter-test.js │ │ ├── error-wrapper-test.js │ │ ├── flash-messages │ │ ├── fixed-position-test.js │ │ └── full-width-test.js │ │ ├── github-connect-state-test.js │ │ ├── github-connect-test.js │ │ ├── github-repo-test.js │ │ ├── github │ │ ├── connected-installation-test.js │ │ ├── install-link-test.js │ │ ├── issue-link-test.js │ │ ├── pull-request-icon-test.js │ │ ├── repo-disconnect-confirm-modal-test.js │ │ ├── repo-sync-test.js │ │ └── unconnected-installation-test.js │ │ ├── image-drop-test.js │ │ ├── login-form-test.js │ │ ├── navigation-menu-test.js │ │ ├── organization-header-test.js │ │ ├── organization-menu-test.js │ │ ├── organization-profile-test.js │ │ ├── organization-settings-form-test.js │ │ ├── organization-settings-test.js │ │ ├── pager-control-test.js │ │ ├── password │ │ ├── forgot-password-test.js │ │ └── reset-password-test.js │ │ ├── payments │ │ ├── account-setup-test.js │ │ ├── bank-account-test.js │ │ ├── contact-info-test.js │ │ ├── create-account-test.js │ │ ├── donation-goals-test.js │ │ ├── funds-recipient-test.js │ │ └── funds-recipient │ │ │ ├── details-form-test.js │ │ │ ├── identity-document-file-upload-test.js │ │ │ ├── personal-id-number-test.js │ │ │ └── verification-document-test.js │ │ ├── progress-bar-container-test.js │ │ ├── progress-bar-test.js │ │ ├── project-card-test.js │ │ ├── project-card │ │ ├── donation-progress-test.js │ │ └── project-users-test.js │ │ ├── project-categories-list-test.js │ │ ├── project-category-item-test.js │ │ ├── project-header-test.js │ │ ├── project-item-test.js │ │ ├── project-join-modal-test.js │ │ ├── project-list-test.js │ │ ├── project-long-description-test.js │ │ ├── project-menu-test.js │ │ ├── project-notifications-test.js │ │ ├── project-settings-form-test.js │ │ ├── project-skill-item-test.js │ │ ├── project-skills-list-test.js │ │ ├── project-switcher-menu-test.js │ │ ├── project-switcher-test.js │ │ ├── project-user-role-modal-test.js │ │ ├── project-users-test.js │ │ ├── related-skills-test.js │ │ ├── role-item-test.js │ │ ├── select-inline-dropdown │ │ └── list-item-test.js │ │ ├── select │ │ ├── birth-date-test.js │ │ ├── country-select-test.js │ │ ├── github-repo-test.js │ │ └── state-select-test.js │ │ ├── settings-menu-test.js │ │ ├── signup-email-input-test.js │ │ ├── signup-form-test.js │ │ ├── signup-password-input-test.js │ │ ├── signup-username-input-test.js │ │ ├── site-footer-test.js │ │ ├── skill-button-test.js │ │ ├── skill-list-item-link-test.js │ │ ├── skill-list-item-test.js │ │ ├── skill-list-items-test.js │ │ ├── skills-typeahead-result-test.js │ │ ├── skills-typeahead-test.js │ │ ├── slugged-route-model-details-test.js │ │ ├── stripe-connect-button-test.js │ │ ├── submittable-textarea-test.js │ │ ├── svg │ │ └── sprite-icon-test.js │ │ ├── task-assignment-test.js │ │ ├── task-card-test.js │ │ ├── task-card │ │ └── user │ │ │ ├── selected-item-test.js │ │ │ └── unselected-item-test.js │ │ ├── task-comment-list-test.js │ │ ├── task-details-test.js │ │ ├── task-header-test.js │ │ ├── task-list-cards-test.js │ │ ├── task-new-form-test.js │ │ ├── task-status-button-test.js │ │ ├── task-status-test.js │ │ ├── task-title-test.js │ │ ├── task │ │ ├── archive-task-test.js │ │ ├── sidebar │ │ │ └── integrations-section-test.js │ │ └── user │ │ │ └── users-list.js │ │ ├── team-member-test.js │ │ ├── thank-you-container-test.js │ │ ├── user-byline-test.js │ │ ├── user-details-test.js │ │ ├── user-dropdown-test.js │ │ ├── user-list-item-test.js │ │ ├── user-menu-test.js │ │ ├── user-projects-list-test.js │ │ ├── user-settings-form-test.js │ │ ├── user-sidebar-test.js │ │ ├── user │ │ ├── display-username-test.js │ │ └── skills-list-test.js │ │ └── volunteer-headshot-test.js ├── pages │ ├── admin.js │ ├── admin │ │ ├── github-events │ │ │ ├── index.js │ │ │ └── show.js │ │ ├── organization-invites │ │ │ ├── index.js │ │ │ └── new.js │ │ └── projects │ │ │ └── index.js │ ├── component │ │ ├── donation-goals-activation.js │ │ └── user-dropdown.js │ ├── components │ │ ├── _suggestions-area.js │ │ ├── animated-high-five.js │ │ ├── categories-list.js │ │ ├── category-checkboxes.js │ │ ├── category-item.js │ │ ├── code-theme-selector.js │ │ ├── comment-item.js │ │ ├── conversations │ │ │ ├── conversation-composer.js │ │ │ ├── conversation-list-item-with-project.js │ │ │ ├── conversation-list-item-with-user.js │ │ │ ├── conversation-part.js │ │ │ ├── conversation-thread.js │ │ │ ├── new-conversation-modal.js │ │ │ ├── project-details.js │ │ │ ├── status-select.js │ │ │ └── user-details.js │ │ ├── create-comment-form.js │ │ ├── donation-goal-edit.js │ │ ├── donation-goal.js │ │ ├── donation-goals.js │ │ ├── donation │ │ │ ├── card-item.js │ │ │ ├── card-logo.js │ │ │ ├── donation-container.js │ │ │ └── project-header.js │ │ ├── donations │ │ │ ├── create-donation.js │ │ │ ├── donation-amount-button.js │ │ │ ├── donation-progress.js │ │ │ ├── donation-status.js │ │ │ └── show-donation.js │ │ ├── drag-zone.js │ │ ├── editor-with-preview.js │ │ ├── error-formatter.js │ │ ├── error-wrapper.js │ │ ├── flash-messages │ │ │ ├── fixed-position.js │ │ │ └── full-width.js │ │ ├── github-connect-state.js │ │ ├── github-connect.js │ │ ├── github-repo.js │ │ ├── github │ │ │ ├── connected-installation.js │ │ │ ├── install-link.js │ │ │ ├── issue-link.js │ │ │ ├── pull-request-icon.js │ │ │ ├── repo-disconnect-confirm-modal.js │ │ │ ├── repo-sync.js │ │ │ └── unconnected-installation.js │ │ ├── image-drop.js │ │ ├── login-form.js │ │ ├── modal-confirm.js │ │ ├── navigation-menu.js │ │ ├── organization-header.js │ │ ├── organization-menu.js │ │ ├── organization-profile.js │ │ ├── organization-settings-form.js │ │ ├── organization-settings.js │ │ ├── pager-control.js │ │ ├── password │ │ │ ├── forgot-password.js │ │ │ └── reset-password.js │ │ ├── payments │ │ │ ├── account-setup.js │ │ │ ├── bank-account.js │ │ │ ├── contact-info.js │ │ │ ├── create-account.js │ │ │ ├── donation-goals.js │ │ │ ├── funds-recipient.js │ │ │ └── funds-recipient │ │ │ │ ├── details-form.js │ │ │ │ ├── identity-document-file-upload.js │ │ │ │ ├── personal-id-number.js │ │ │ │ └── verification-document.js │ │ ├── power-select.js │ │ ├── power-select │ │ │ └── before-task-options.js │ │ ├── progress-bar-container.js │ │ ├── progress-bar.js │ │ ├── project-card.js │ │ ├── project-card │ │ │ ├── donation-progress.js │ │ │ └── project-users.js │ │ ├── project-categories-list.js │ │ ├── project-category-item.js │ │ ├── project-header.js │ │ ├── project-item.js │ │ ├── project-join-modal.js │ │ ├── project-list.js │ │ ├── project-long-description.js │ │ ├── project-menu.js │ │ ├── project-notifications.js │ │ ├── project-settings-form.js │ │ ├── project-skill-item.js │ │ ├── project-skills-list.js │ │ ├── project-switcher-menu.js │ │ ├── project-switcher.js │ │ ├── project-user-role-modal.js │ │ ├── project-users.js │ │ ├── related-skills.js │ │ ├── role-item.js │ │ ├── select-inline-dropdown │ │ │ └── list-item.js │ │ ├── select │ │ │ ├── birth-date.js │ │ │ ├── country-select.js │ │ │ ├── github-repo.js │ │ │ └── state-select.js │ │ ├── settings-menu.js │ │ ├── signup-email-input.js │ │ ├── signup-form.js │ │ ├── signup-password-input.js │ │ ├── signup-username-input.js │ │ ├── site-footer.js │ │ ├── skill-button.js │ │ ├── skill-list-item-link.js │ │ ├── skill-list-item.js │ │ ├── skill-list-items.js │ │ ├── skills-typeahead-result.js │ │ ├── skills-typeahead.js │ │ ├── slugged-route-model-details.js │ │ ├── stripe-connect-button.js │ │ ├── submittable-textarea.js │ │ ├── svg │ │ │ ├── sprite-icon.js │ │ │ └── sprite-map.js │ │ ├── task-assignment.js │ │ ├── task-board.js │ │ ├── task-card.js │ │ ├── task-card │ │ │ └── user │ │ │ │ ├── selected-item.js │ │ │ │ └── unselected-item.js │ │ ├── task-comment-list.js │ │ ├── task-details.js │ │ ├── task-header.js │ │ ├── task-list-cards.js │ │ ├── task-new-form.js │ │ ├── task-status-button.js │ │ ├── task-status.js │ │ ├── task-title.js │ │ ├── task │ │ │ ├── archive-task.js │ │ │ └── sidebar │ │ │ │ └── integrations-section.js │ │ ├── thank-you-container.js │ │ ├── user-byline.js │ │ ├── user-details.js │ │ ├── user-list-item.js │ │ ├── user-menu.js │ │ ├── user-projects-list.js │ │ ├── user-settings-form.js │ │ ├── user-sidebar.js │ │ ├── user │ │ │ ├── display-username.js │ │ │ └── skills-list.js │ │ └── volunteer-headshot.js │ ├── conversations.js │ ├── github.js │ ├── helpers │ │ ├── clickable-native.js │ │ └── tooltip.js │ ├── index.js │ ├── login.js │ ├── onboarding.js │ ├── organization-projects.js │ ├── organization.js │ ├── organizations │ │ └── new.js │ ├── password.js │ ├── project │ │ ├── about.js │ │ ├── checkout.js │ │ ├── conversations.js │ │ ├── donate.js │ │ ├── people.js │ │ ├── settings │ │ │ ├── donations.js │ │ │ ├── donations │ │ │ │ └── payments.js │ │ │ ├── integrations.js │ │ │ └── profile.js │ │ ├── tasks │ │ │ ├── index.js │ │ │ ├── new.js │ │ │ └── task.js │ │ └── thank-you.js │ ├── projects.js │ ├── projects │ │ └── new.js │ ├── settings │ │ ├── integrations.js │ │ └── profile.js │ ├── signup.js │ ├── slugged-route.js │ ├── team.js │ └── user.js ├── test-helper.js └── unit │ ├── .gitkeep │ ├── abilities │ ├── organization-test.js │ ├── project-test.js │ └── task-test.js │ ├── adapters │ └── task-test.js │ ├── components │ └── power-select │ │ └── before-task-options-test.js │ ├── controllers │ ├── application-test.js │ ├── index-test.js │ ├── project │ │ ├── checkout-test.js │ │ └── settings │ │ │ └── donations │ │ │ ├── goals-test.js │ │ │ └── payments-test.js │ ├── projects-list-test.js │ └── start │ │ ├── expertise-test.js │ │ ├── hello-test.js │ │ ├── interests-test.js │ │ └── skills-test.js │ ├── helpers │ ├── capitalize-test.js │ ├── end-with-period-test.js │ ├── format-currency-test.js │ ├── format-number-test.js │ ├── format-percentage-test.js │ └── highlight-substrings-test.js │ ├── macros │ └── project-member-test.js │ ├── mirage │ └── utils │ │ └── pagination-test.js │ ├── mixins │ ├── admin-route-mixin-test.js │ ├── can-animate-test.js │ ├── contains-code-test.js │ ├── marketing-route-mixin-test.js │ ├── onboarding-controller-test.js │ ├── repo-sync-progress-test.js │ └── tooltip-for-dropdown-test.js │ ├── models │ ├── category-test.js │ ├── comment-test.js │ ├── comment-user-mention-test.js │ ├── conversation-test.js │ ├── donation-goal-test.js │ ├── github-app-installation-test.js │ ├── github-event-test.js │ ├── github-issue-test.js │ ├── github-pull-request-test.js │ ├── github-repo-test.js │ ├── message-test.js │ ├── organization-github-app-installation-test.js │ ├── organization-invite-test.js │ ├── organization-test.js │ ├── preview-test.js │ ├── preview-user-mention-test.js │ ├── project-category-test.js │ ├── project-skill-test.js │ ├── project-test.js │ ├── project-user-test.js │ ├── skill-test.js │ ├── slugged-route-test.js │ ├── stripe-connect-account-test.js │ ├── stripe-connect-plan-test.js │ ├── stripe-connect-subscription-test.js │ ├── stripe-platform-card-test.js │ ├── stripe-platform-customer-test.js │ ├── task-list-test.js │ ├── task-skill.js │ ├── task-test.js │ ├── task-user-mention-test.js │ ├── user-category-test.js │ ├── user-role-test.js │ ├── user-skill-test.js │ ├── user-task-test.js │ └── user-test.js │ ├── routes │ ├── about-test.js │ ├── application-test.js │ ├── conversations-test.js │ ├── conversations │ │ ├── conversation-test.js │ │ └── index-test.js │ ├── github-test.js │ ├── index-test.js │ ├── login-test.js │ ├── project-test.js │ ├── project │ │ ├── checkout-test.js │ │ ├── conversations │ │ │ └── conversation-test.js │ │ ├── donate-test.js │ │ ├── people-test.js │ │ ├── settings │ │ │ └── donations │ │ │ │ ├── goals-test.js │ │ │ │ └── payments-test.js │ │ └── tasks │ │ │ ├── index-test.js │ │ │ ├── new-test.js │ │ │ └── task-test.js │ ├── projects-list-test.js │ ├── signup-test.js │ ├── slugged-route-test.js │ ├── start-test.js │ ├── start │ │ ├── expertise-test.js │ │ ├── hello-test.js │ │ ├── interests-test.js │ │ └── skills-test.js │ ├── team-test.js │ └── terms.js │ ├── serializers │ ├── application-test.js │ └── task-test.js │ ├── services │ ├── ajax-test.js │ ├── background-test.js │ ├── code-theme-test.js │ ├── conversation-channel-test.js │ ├── conversations-test.js │ ├── current-user-test.js │ ├── drag-state-test.js │ ├── github-state-test.js │ ├── mention-fetcher-test.js │ ├── navigation-menu-test.js │ ├── onboarding-test.js │ ├── project-user-test.js │ ├── site-footer-test.js │ ├── socket-test.js │ ├── sounds-test.js │ ├── task-assignment-test.js │ ├── user-categories-test.js │ ├── user-roles-test.js │ └── user-skills-list-test.js │ ├── transforms │ ├── array-test.js │ └── dollar-cents-test.js │ └── utils │ ├── array-utils-test.js │ ├── error-utils-test.js │ ├── mention-parser-test.js │ ├── pretty-float-test.js │ └── records-list-test.js ├── yarn.lock └── yuidoc.json /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "bower_components", 3 | "analytics": false 4 | } 5 | -------------------------------------------------------------------------------- /.ember-cli: -------------------------------------------------------------------------------- 1 | { 2 | /** 3 | Ember CLI sends analytics information by default. The data is completely 4 | anonymous, but there are times when you might want to disable this behavior. 5 | 6 | Setting `disableAnalytics` to true will prevent any data from being sent. 7 | */ 8 | "disableAnalytics": false 9 | } 10 | -------------------------------------------------------------------------------- /.env.deploy.production.example: -------------------------------------------------------------------------------- 1 | AWS_ACCESS_KEY_ID= 2 | AWS_SECRET_ACCESS_KEY= 3 | PRODUCTION_S3_BUCKET= 4 | PRODUCTION_S3_REGION= 5 | PRODUCTION_S3_INDEX_BUCKET= 6 | PRODUCTION_S3_INDEX_REGION= 7 | PRODUCTION_SENTRY_SITE_URL= 8 | PRODUCTION_SENTRY_ORGANIZATION_SLUG= 9 | PRODUCTION_SENTRY_PROJECT_SLUG= 10 | PRODUCTION_SENTRY_API_KEY= 11 | SENTRY_BASE_URL=https://sentry.io/ 12 | -------------------------------------------------------------------------------- /.env.deploy.staging.example: -------------------------------------------------------------------------------- 1 | AWS_ACCESS_KEY_ID= 2 | AWS_SECRET_ACCESS_KEY= 3 | STAGING_S3_BUCKET= 4 | STAGING_S3_REGION= 5 | STAGING_S3_INDEX_BUCKET= 6 | STAGING_S3_INDEX_REGION= 7 | STAGING_SENTRY_SITE_URL= 8 | STAGING_SENTRY_ORGANIZATION_SLUG= 9 | STAGING_SENTRY_PROJECT_SLUG= 10 | STAGING_SENTRY_API_KEY= 11 | SENTRY_BASE_URL=https://sentry.io/ 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | # Problem 2 | 3 | Detail the problem here, including any possible solutions. 4 | 5 | ## Subtasks 6 | - [ ] 7 | - [ ] 8 | - [ ] 9 | 10 | ## References 11 | 12 | Progress on: # 13 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | # What's in this PR? 2 | 3 | List the changes you made and your reasons for them. 4 | 5 | Make sure any changes to code include changes to documentation. 6 | 7 | ## References 8 | Fixes # 9 | 10 | Progress on: # 11 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | lts/* 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | --- 2 | language: node_js 3 | node_js: 4 | - "6" 5 | 6 | sudo: false 7 | dist: trusty 8 | 9 | addons: 10 | chrome: stable 11 | 12 | cache: 13 | yarn: true 14 | 15 | env: 16 | global: 17 | # See https://git.io/vdao3 for details. 18 | - JOBS=1 19 | 20 | before_install: 21 | - curl -o- -L https://yarnpkg.com/install.sh | bash 22 | - export PATH=$HOME/.yarn/bin:$PATH 23 | 24 | install: 25 | - yarn install --non-interactive 26 | 27 | script: 28 | - yarn lint:js 29 | - yarn test 30 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | { 2 | "ignore_dirs": ["tmp", "dist"] 3 | } 4 | -------------------------------------------------------------------------------- /app/abilities/organization.js: -------------------------------------------------------------------------------- 1 | import { alias } from '@ember/object/computed'; 2 | import { get, computed } from '@ember/object'; 3 | import { inject as service } from '@ember/service'; 4 | import { Ability } from 'ember-can'; 5 | 6 | export default Ability.extend({ 7 | currentUser: service(), 8 | 9 | canManage: computed('organization.owner.id', 'currentUser.user.id', function() { 10 | return get(this, 'organization.owner.id') === get(this, 'currentUser.user.id'); 11 | }), 12 | 13 | organization: alias('model') 14 | }); 15 | -------------------------------------------------------------------------------- /app/adapters/stripe-connect-account.js: -------------------------------------------------------------------------------- 1 | import StripeAdapter from './stripe'; 2 | 3 | export default StripeAdapter.extend({ 4 | }); 5 | -------------------------------------------------------------------------------- /app/adapters/stripe-connect-subscription.js: -------------------------------------------------------------------------------- 1 | import StripeAdapter from './stripe'; 2 | 3 | export default StripeAdapter.extend({ 4 | }); 5 | -------------------------------------------------------------------------------- /app/adapters/stripe-platform-card.js: -------------------------------------------------------------------------------- 1 | import StripeAdapter from './stripe'; 2 | 3 | export default StripeAdapter.extend({ 4 | }); 5 | -------------------------------------------------------------------------------- /app/adapters/stripe-platform-customer.js: -------------------------------------------------------------------------------- 1 | import StripeAdapter from './stripe'; 2 | 3 | export default StripeAdapter.extend({ 4 | }); 5 | -------------------------------------------------------------------------------- /app/adapters/stripe.js: -------------------------------------------------------------------------------- 1 | import ApplicationAdapter from './application'; 2 | 3 | export default ApplicationAdapter.extend({ 4 | coalesceFindRequests: false 5 | }); 6 | -------------------------------------------------------------------------------- /app/adapters/task-list.js: -------------------------------------------------------------------------------- 1 | import ApplicationAdapter from './application'; 2 | 3 | export default ApplicationAdapter.extend({ 4 | shouldBackgroundReloadRecord() { 5 | return false; 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /app/app.js: -------------------------------------------------------------------------------- 1 | import Application from '@ember/application'; 2 | import Resolver from './resolver'; 3 | import loadInitializers from 'ember-load-initializers'; 4 | import config from './config/environment'; 5 | 6 | const App = Application.extend({ 7 | modulePrefix: config.modulePrefix, 8 | podModulePrefix: config.podModulePrefix, 9 | Resolver 10 | }); 11 | 12 | loadInitializers(App, config.modulePrefix); 13 | 14 | export default App; 15 | -------------------------------------------------------------------------------- /app/breakpoints.js: -------------------------------------------------------------------------------- 1 | // also refer to breakpoints in app/styles/layout/_breakpoints.scss 2 | 3 | export default { 4 | extraSmall: '(max-width: 479px)', 5 | small: '(max-width: 599px)', 6 | medium: '(max-width: 767px)', 7 | large: '(max-width: 991px)', 8 | full: '(min-width: 992px)' // ensures default above the large 9 | }; 10 | -------------------------------------------------------------------------------- /app/components/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/app/components/.gitkeep -------------------------------------------------------------------------------- /app/components/category-checkboxes.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['category-checkboxes', 'checkboxes--inline'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/common/busy-model-wrapper.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | model: null, 5 | 6 | onDeleting: 'Deleting...', 7 | onSaving: 'Saving...' 8 | }); 9 | -------------------------------------------------------------------------------- /app/components/conversations/conversation-list-item-with-project.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | }); 5 | -------------------------------------------------------------------------------- /app/components/conversations/conversation-list-item-with-user.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | }); 5 | -------------------------------------------------------------------------------- /app/components/conversations/project-details.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['conversation-details'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/conversations/status-select.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['conversations__status-select', 'dropdown'], 5 | 6 | showDropdown: false 7 | }); 8 | -------------------------------------------------------------------------------- /app/components/conversations/user-details.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['conversation-details'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/demo-category-item.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { get, computed } from '@ember/object'; 3 | 4 | export default Component.extend({ 5 | classNames: ['category-item'], 6 | 7 | iconClass: computed('category.slug', 'selected', function() { 8 | let slug = get(this, 'category.slug'); 9 | if (get(this, 'selected')) { 10 | return `category-item__icon--${slug}--selected`; 11 | } else { 12 | return `category-item__icon--${slug}`; 13 | } 14 | }) 15 | }); 16 | -------------------------------------------------------------------------------- /app/components/donation-goals-activation.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['donation-goals-activation'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/donation/card-item.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['card-item'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/donation/card-logo.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['card-logo__container'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/donation/project-header.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['project-header'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/donations/donation-amount-button.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['preset-amount'], 5 | classNameBindings: ['presetAmount', 'selected:default:clear'], 6 | tagName: 'button', 7 | presetAmount: 0 8 | }); 9 | -------------------------------------------------------------------------------- /app/components/donations/donation-status.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['donation-status'], 5 | donationStatusExpanded: false 6 | }); 7 | -------------------------------------------------------------------------------- /app/components/donations/show-donation.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['show-donation'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/drag-zone.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { get } from '@ember/object'; 3 | import { inject as service } from '@ember/service'; 4 | 5 | export default Component.extend({ 6 | classNames: ['drag-zone', 'flexbox-container'], 7 | 8 | dragState: service(), 9 | 10 | dragLeave() { 11 | get(this, 'dragState').leaving(); 12 | }, 13 | 14 | dragOver() { 15 | get(this, 'dragState').dragging(); 16 | } 17 | }); 18 | -------------------------------------------------------------------------------- /app/components/flash-messages/fixed-position.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { inject as service } from '@ember/service'; 3 | 4 | export default Component.extend({ 5 | classNames: ['flash-messages', 'flash-messages--fixed'], 6 | 7 | flashMessages: service() 8 | }); 9 | -------------------------------------------------------------------------------- /app/components/flash-messages/full-width.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { inject as service } from '@ember/service'; 3 | 4 | export default Component.extend({ 5 | classNames: ['flash-messages', 'flash-messages--full-width'], 6 | 7 | flashMessages: service() 8 | }); 9 | -------------------------------------------------------------------------------- /app/components/github/issue-link.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { get } from '@ember/object'; 3 | import { inject as service } from '@ember/service'; 4 | 5 | export default Component.extend({ 6 | classNames: ['github__issue-link'], 7 | 8 | metrics: service(), 9 | 10 | githubIssue: null, 11 | githubRepo: null, 12 | size: 'large', 13 | 14 | actions: { 15 | trackClick() { 16 | get(this, 'metrics').trackEvent({ 17 | event: 'Clicked GitHub Link for Task' 18 | }); 19 | } 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /app/components/github/pull-request-icon.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { alias } from '@ember/object/computed'; 3 | 4 | export default Component.extend({ 5 | classNames: ['github__pull-request-icon'], 6 | 7 | merged: alias('githubPullRequest.merged'), 8 | state: alias('githubPullRequest.state') 9 | }); 10 | -------------------------------------------------------------------------------- /app/components/github/repo-sync.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import RepoSyncProgressMixin from 'code-corps-ember/mixins/repo-sync-progress'; 3 | 4 | export default Component.extend(RepoSyncProgressMixin, { 5 | classNames: ['github__repo-sync'], 6 | 7 | githubRepo: null 8 | }); 9 | -------------------------------------------------------------------------------- /app/components/github/unconnected-installation.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['github-app-installation unconnected'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/loading-bar.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { alias } from '@ember/object/computed'; 3 | import { inject as service } from '@ember/service'; 4 | 5 | export default Component.extend({ 6 | classNameBindings: ['isLoading'], 7 | classNames: ['loading-bar'], 8 | 9 | loadingBar: service(), 10 | 11 | isLoading: alias('loadingBar.isLoading') 12 | }); 13 | -------------------------------------------------------------------------------- /app/components/loading-spinner.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['loading-spinner'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/organization-header.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['organization-header'], 5 | classNameBindings: ['expanded'], 6 | expanded: false 7 | }); 8 | -------------------------------------------------------------------------------- /app/components/organization-menu.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['organization-menu', 'organization-menu--horizontal'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/organization-profile.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['organization-profile'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/organization-settings.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({}); 4 | -------------------------------------------------------------------------------- /app/components/payments/account-setup.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['account-setup'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/payments/contact-info.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['contact-info'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/payments/funds-recipient/personal-id-number.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { alias } from '@ember/object/computed'; 3 | 4 | export default Component.extend({ 5 | classNames: ['personal-id-number'], 6 | tagName: 'section', 7 | 8 | status: alias('stripeConnectAccount.personalIdNumberStatus') 9 | }); 10 | -------------------------------------------------------------------------------- /app/components/project-card-users.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/app/components/project-card-users.js -------------------------------------------------------------------------------- /app/components/project-item.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | /** 4 | `project-item` presents a project with the icon, title and description. Each 5 | `project-item` links to the corresponding project. 6 | 7 | ## default usage 8 | 9 | ```handlebars 10 | {{project-item project=project}} 11 | ``` 12 | 13 | @class project-item 14 | @module Component 15 | @extends Ember.Component 16 | */ 17 | export default Component.extend({ 18 | classNames: ['project-item'] 19 | }); 20 | -------------------------------------------------------------------------------- /app/components/project-list.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | /** 4 | `project-list` presents a list of projects. 5 | 6 | ## default usage 7 | 8 | ```handlebars 9 | {{project-list projects=projects}} 10 | ``` 11 | 12 | @class project-list 13 | @module Component 14 | @extends Ember.Component 15 | */ 16 | export default Component.extend({ 17 | classNames: ['project-list'] 18 | }); 19 | -------------------------------------------------------------------------------- /app/components/project-notifications.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['project-notifications'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/project-skill-item.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { getProperties } from '@ember/object'; 3 | 4 | export default Component.extend({ 5 | classNames: ['skill', 'has-spinner', 'small'], 6 | tagName: 'button', 7 | 8 | click() { 9 | let { skill, onClicked } = getProperties(this, 'skill', 'onClicked'); 10 | onClicked(skill); 11 | } 12 | }); 13 | -------------------------------------------------------------------------------- /app/components/project-switcher-menu.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['project-switcher-menu'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/project-users.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { alias } from '@ember/object/computed'; 3 | 4 | export default Component.extend({ 5 | classNames: ['project-users'], 6 | count: alias('users.length') 7 | }); 8 | -------------------------------------------------------------------------------- /app/components/select-inline-dropdown/list-item.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | tagName: '', 5 | 6 | iconUrl: null, 7 | primaryText: null, 8 | secondaryText: null 9 | }); 10 | -------------------------------------------------------------------------------- /app/components/select/country-select.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['select-country'], 5 | countryOptions: [ 6 | { name: 'United States', id: 'US' } 7 | ] 8 | }); 9 | -------------------------------------------------------------------------------- /app/components/select/github-repo.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['select-github-repo'], 5 | 6 | githubRepos: null 7 | }); 8 | -------------------------------------------------------------------------------- /app/components/settings-menu.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | /** 4 | `settings-menu` allows navigation within a user's settings. 5 | 6 | ## Default usage 7 | ```Handlebars 8 | {{settings-menu}} 9 | ``` 10 | 11 | @module Component 12 | @extends Ember.Component 13 | @class settings-menu 14 | */ 15 | export default Component.extend({ 16 | classNames: ['page-menu', 'page-menu--horizontal', 'settings__menu'], 17 | tagName: 'nav' 18 | }); 19 | -------------------------------------------------------------------------------- /app/components/site-footer.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { alias } from '@ember/object/computed'; 3 | import { inject as service } from '@ember/service'; 4 | 5 | export default Component.extend({ 6 | tagName: 'footer', 7 | classNames: ['site-footer', 'container'], 8 | classNameBindings: ['isMedium:site-footer--is-medium'], 9 | 10 | media: service(), 11 | siteFooter: service(), 12 | 13 | isMedium: alias('media.isMedium') 14 | }); 15 | -------------------------------------------------------------------------------- /app/components/slugged-route-model-details.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['slugged-route-model-details'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/submittable-textarea.js: -------------------------------------------------------------------------------- 1 | import TextArea from '@ember/component/text-area'; 2 | import { on } from '@ember/object/evented'; 3 | import { EKMixin, EKOnFocusMixin, keyDown } from 'ember-keyboard'; 4 | 5 | export default TextArea.extend(EKMixin, EKOnFocusMixin, { 6 | init() { 7 | this._super(...arguments); 8 | this.set('keyboardActivated', true); 9 | }, 10 | 11 | customSubmit: on(keyDown('Enter+cmd'), function(e) { 12 | e.preventDefault(); 13 | this.sendAction('modifiedSubmit'); 14 | }) 15 | }); 16 | -------------------------------------------------------------------------------- /app/components/svg/sprite-icon.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | tagName: 'span', 5 | classNames: ['sprite-icon'], 6 | 7 | size: '16' 8 | }); 9 | -------------------------------------------------------------------------------- /app/components/svg/sprite-map.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['svg__sprite-map'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/task-board.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['task-board'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/task-card/user/selected-item.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import TooltipForDropdownMixin from 'code-corps-ember/mixins/tooltip-for-dropdown'; 3 | 4 | export default Component.extend(TooltipForDropdownMixin, { 5 | classNames: ['select-inline', 'select-inline__selected-item'], 6 | 7 | dropdownOpen: false, 8 | tooltipShown: false 9 | }); 10 | -------------------------------------------------------------------------------- /app/components/task-card/user/unselected-item.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import TooltipForDropdownMixin from 'code-corps-ember/mixins/tooltip-for-dropdown'; 3 | 4 | export default Component.extend(TooltipForDropdownMixin, { 5 | classNames: ['select-inline', 'select-inline__unselected-item'], 6 | 7 | dropdownOpen: false, 8 | tooltipShown: false 9 | }); 10 | -------------------------------------------------------------------------------- /app/components/task-comment-list.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | /** 4 | The task-comment-list component composes the list of comments for a task. 5 | 6 | ## default usage 7 | 8 | ```handlebars 9 | {{task-comment-list comments=comments}} 10 | ``` 11 | 12 | @class task-comment-list 13 | @module Component 14 | @extends Ember.Component 15 | */ 16 | export default Component.extend({ 17 | classNames: ['task-comment-list'] 18 | }); 19 | -------------------------------------------------------------------------------- /app/components/task-header.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | /** 4 | The task-header component represents the header of a task. It is composed of 5 | the task title and number. 6 | 7 | ## default usage 8 | 9 | ```handlebars 10 | {{task-header task=task saveTitle="saveTaskTitleAction"}} 11 | ``` 12 | 13 | @class task-header 14 | @module Component 15 | @extends Ember.Component 16 | */ 17 | export default Component.extend({ 18 | classNames: ['task-header'] 19 | }); 20 | -------------------------------------------------------------------------------- /app/components/task-list-cards.js: -------------------------------------------------------------------------------- 1 | import { alias } from '@ember/object/computed'; 2 | import EmberDragulaContainer from 'ember-dragula/components/ember-dragula-container'; 3 | 4 | export default EmberDragulaContainer.extend({ 5 | attributeBindings: ['data-model-id', 'data-model-type'], 6 | classNames: ['task-list-cards'], 7 | 8 | orderedTasks: alias('taskList.orderedTasks'), 9 | 10 | 'data-model-id': alias('taskList.id'), 11 | 'data-model-type': 'task-list' 12 | }); 13 | -------------------------------------------------------------------------------- /app/components/task/sidebar/integrations-section.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['task-sidebar-section'], 5 | 6 | task: null 7 | }); 8 | -------------------------------------------------------------------------------- /app/components/team-member.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { computed } from '@ember/object'; 3 | 4 | export default Component.extend({ 5 | tagName: 'li', 6 | 7 | src: computed('imageSlug', function() { 8 | let imageSlug = this.get('imageSlug'); 9 | return `https://d3pgew4wbk2vb1.cloudfront.net/images/team/${imageSlug}.png`; 10 | }) 11 | }); 12 | -------------------------------------------------------------------------------- /app/components/user-byline.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | tagName: 'span', 5 | classNames: ['user-byline'] 6 | }); 7 | -------------------------------------------------------------------------------- /app/components/user-details.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | import { mapBy } from '@ember/object/computed'; 3 | 4 | export default Component.extend({ 5 | classNames: ['user-details'], 6 | 7 | userProjects: mapBy('user.projectUsers', 'project') 8 | }); 9 | -------------------------------------------------------------------------------- /app/components/user-projects-list.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['user-projects-list'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/components/user-sidebar.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | /** 4 | `user-sidebar` is a sidebar on the user's profile 5 | 6 | ```handlebars 7 | {{user-sidebar user=model}} 8 | ``` 9 | 10 | @class user-sidebar 11 | @module Component 12 | @extends Ember.Component 13 | */ 14 | export default Component.extend({ 15 | classNames: ['user-sidebar'] 16 | }); 17 | -------------------------------------------------------------------------------- /app/components/user/skills-list.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | classNames: ['user__skills-list'] 5 | }); 6 | -------------------------------------------------------------------------------- /app/controllers/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/app/controllers/.gitkeep -------------------------------------------------------------------------------- /app/controllers/index.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | 3 | export default Controller.extend({ 4 | typedStrings: [ 5 | 'social good.', 6 | 'elections.', 7 | 'schools.', 8 | 'the environment.', 9 | 'science.', 10 | 'hospitals.', 11 | 'ending poverty.', 12 | 'political activism.', 13 | 'communities.', 14 | 'justice.', 15 | 'ending climate change.', 16 | 'families.', 17 | 'government.' 18 | ] 19 | }); 20 | -------------------------------------------------------------------------------- /app/controllers/project.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | import { inject as service } from '@ember/service'; 3 | 4 | export default Controller.extend({ 5 | session: service() 6 | }); 7 | -------------------------------------------------------------------------------- /app/controllers/project/donate.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | import { alias } from '@ember/object/computed'; 3 | import { get } from '@ember/object'; 4 | 5 | export default Controller.extend({ 6 | amount: 25, 7 | queryParams: ['amount'], 8 | 9 | project: alias('model'), 10 | 11 | actions: { 12 | continueToCheckout(amount) { 13 | let project = get(this, 'project'); 14 | let queryParams = { amount }; 15 | this.transitionToRoute('project.checkout', project, { queryParams }); 16 | } 17 | } 18 | }); 19 | -------------------------------------------------------------------------------- /app/controllers/project/index.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | import { mapBy, alias } from '@ember/object/computed'; 3 | import { inject as service } from '@ember/service'; 4 | 5 | export default Controller.extend({ 6 | currentUser: service(), 7 | 8 | projectUsers: mapBy('project.projectUsers', 'user'), 9 | usersCount: alias('users.length') 10 | }); 11 | -------------------------------------------------------------------------------- /app/controllers/projects-list.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | 3 | export default Controller.extend({ 4 | queryParams: ['approved'], 5 | 6 | approved: true 7 | }); 8 | -------------------------------------------------------------------------------- /app/controllers/start/expertise.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | import { inject as service } from '@ember/service'; 3 | import OnboardingControllerMixin from '../../mixins/onboarding-controller'; 4 | 5 | export default Controller.extend(OnboardingControllerMixin, { 6 | userRoles: service() 7 | }); 8 | -------------------------------------------------------------------------------- /app/controllers/start/interests.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | import { inject as service } from '@ember/service'; 3 | import OnboardingControllerMixin from '../../mixins/onboarding-controller'; 4 | 5 | export default Controller.extend(OnboardingControllerMixin, { 6 | userCategories: service() 7 | }); 8 | -------------------------------------------------------------------------------- /app/helpers/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/app/helpers/.gitkeep -------------------------------------------------------------------------------- /app/helpers/capitalize.js: -------------------------------------------------------------------------------- 1 | import { isEmpty } from '@ember/utils'; 2 | import Helper from '@ember/component/helper'; 3 | 4 | export function capitalize([string]) { 5 | if (isEmpty(string)) { 6 | return; 7 | } 8 | return string.capitalize(); 9 | } 10 | 11 | export default Helper.helper(capitalize); 12 | -------------------------------------------------------------------------------- /app/helpers/end-with-period.js: -------------------------------------------------------------------------------- 1 | import Helper from '@ember/component/helper'; 2 | 3 | export function endWithPeriod([string]) { 4 | let lastCharacter = string.slice(-1); 5 | if (lastCharacter !== '.') { 6 | string += '.'; 7 | } 8 | return string; 9 | } 10 | 11 | export default Helper.helper(endWithPeriod); 12 | -------------------------------------------------------------------------------- /app/helpers/float.js: -------------------------------------------------------------------------------- 1 | import { helper } from '@ember/component/helper'; 2 | 3 | function convertToFloat(value) { 4 | return parseFloat(value); 5 | } 6 | 7 | /** 8 | * Used to convert a value to float. Should help if the value is, for example, 9 | * a string indicating a float 10 | * 11 | * @param {String} value The value which could be a float or a string 12 | * @return {Number} The value, in float 13 | */ 14 | export function float([value]) { 15 | return convertToFloat(value); 16 | } 17 | 18 | export default helper(float); 19 | -------------------------------------------------------------------------------- /app/initializers/responsive.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Ember responsive initializer 3 | * 4 | * Supports auto injecting media service app-wide. 5 | * 6 | * Generated by the ember-responsive addon. Customize initialize to change 7 | * injection. 8 | */ 9 | 10 | export default { 11 | name: 'responsive', 12 | initialize() { 13 | // no-op to override 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /app/mixins/marketing-route-mixin.js: -------------------------------------------------------------------------------- 1 | import { get } from '@ember/object'; 2 | import Mixin from '@ember/object/mixin'; 3 | import { inject as service } from '@ember/service'; 4 | 5 | export default Mixin.create({ 6 | siteFooter: service(), 7 | 8 | actions: { 9 | didTransition() { 10 | get(this, 'siteFooter').enlarge(); 11 | return true; 12 | }, 13 | 14 | willTransition() { 15 | get(this, 'siteFooter').shrink(); 16 | return true; 17 | } 18 | } 19 | }); 20 | -------------------------------------------------------------------------------- /app/models/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/app/models/.gitkeep -------------------------------------------------------------------------------- /app/models/category.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { hasMany } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | description: attr('string'), 7 | name: attr('string'), 8 | slug: attr('string'), 9 | 10 | projects: hasMany('project', { async: true }), 11 | projectCategories: hasMany('project-category', { async: true }), 12 | userCategories: hasMany('user-category', { async: true }) 13 | }); 14 | -------------------------------------------------------------------------------- /app/models/comment-user-mention.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | indices: attr('array'), 7 | username: attr('string'), 8 | 9 | comment: belongsTo('comment', { async: true }), 10 | user: belongsTo('user', { async: true }) 11 | }); 12 | -------------------------------------------------------------------------------- /app/models/conversation-part.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | body: attr(), 7 | closedAt: attr(), 8 | insertedAt: attr(), 9 | readAt: attr(), 10 | updatedAt: attr(), 11 | 12 | author: belongsTo('user', { async: true }), 13 | conversation: belongsTo('conversation', { async: true }) 14 | }); 15 | -------------------------------------------------------------------------------- /app/models/donation-goal.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | achieved: attr(), 7 | /** 8 | * Donation amount, in cents 9 | * 10 | * @property amount 11 | * @type { Number } 12 | */ 13 | amount: attr('dollar-cents'), 14 | current: attr(), 15 | description: attr(), 16 | 17 | project: belongsTo('project', { async: true }) 18 | }); 19 | -------------------------------------------------------------------------------- /app/models/github-pull-request.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | githubCreatedAt: attr(), 7 | githubUpdatedAt: attr(), 8 | htmlUrl: attr(), 9 | merged: attr(), 10 | number: attr(), 11 | state: attr(), 12 | 13 | githubRepo: belongsTo('github-repo', { async: true }) 14 | }); 15 | -------------------------------------------------------------------------------- /app/models/message.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo, hasMany } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | body: attr(), 7 | initiatedBy: attr(), 8 | insertedAt: attr(), 9 | subject: attr(), 10 | updatedAt: attr(), 11 | 12 | author: belongsTo('user', { async: true }), 13 | project: belongsTo('project', { async: true }), 14 | 15 | conversations: hasMany('conversation', { aync: true }) 16 | }); 17 | -------------------------------------------------------------------------------- /app/models/organization-github-app-installation.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | insertedAt: attr(), 7 | updatedAt: attr(), 8 | 9 | githubAppInstallation: belongsTo('github-app-installation', { async: true }), 10 | organization: belongsTo('organization', { async: true }) 11 | }); 12 | -------------------------------------------------------------------------------- /app/models/organization-invite.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | email: attr(), 7 | organizationName: attr(), 8 | 9 | organization: belongsTo('organization', { async: true }) 10 | }); 11 | -------------------------------------------------------------------------------- /app/models/preview-user-mention.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | indices: attr('array'), 7 | username: attr('string'), 8 | 9 | preview: belongsTo('preview', { async: true }), 10 | user: belongsTo('user', { async: true }) 11 | }); 12 | -------------------------------------------------------------------------------- /app/models/preview.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo, hasMany } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | body: attr('string'), 7 | markdown: attr('string'), 8 | 9 | previewUserMentions: hasMany('preview-user-mention', { async: true }), 10 | user: belongsTo('user', { async: true }) 11 | }); 12 | -------------------------------------------------------------------------------- /app/models/project-category.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import { belongsTo } from 'ember-data/relationships'; 3 | 4 | export default Model.extend({ 5 | category: belongsTo('category', { async: true }), 6 | project: belongsTo('project', { async: true }) 7 | }); 8 | -------------------------------------------------------------------------------- /app/models/project-skill.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import { belongsTo } from 'ember-data/relationships'; 3 | 4 | export default Model.extend({ 5 | project: belongsTo('project', { async: true }), 6 | skill: belongsTo('skill', { async: true }) 7 | }); 8 | -------------------------------------------------------------------------------- /app/models/project-user.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | role: attr(), 7 | project: belongsTo('project', { async: true }), 8 | user: belongsTo('user', { async: true }) 9 | }); 10 | -------------------------------------------------------------------------------- /app/models/role.js: -------------------------------------------------------------------------------- 1 | import { equal } from '@ember/object/computed'; 2 | import Model from 'ember-data/model'; 3 | import attr from 'ember-data/attr'; 4 | import { hasMany } from 'ember-data/relationships'; 5 | 6 | export default Model.extend({ 7 | ability: attr(), 8 | kind: attr(), 9 | name: attr(), 10 | 11 | userRoles: hasMany('user-role', { async: true }), 12 | 13 | isCreative: equal('kind', 'creative'), 14 | isSupport: equal('kind', 'support'), 15 | isTechnology: equal('kind', 'technology') 16 | }); 17 | -------------------------------------------------------------------------------- /app/models/skill.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | 4 | export default Model.extend({ 5 | description: attr(), 6 | title: attr(), 7 | 8 | // Virtual attribute 9 | matched: attr('boolean') 10 | }); 11 | -------------------------------------------------------------------------------- /app/models/slugged-route.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | slug: attr('string'), 7 | 8 | organization: belongsTo('organization', { async: true }), 9 | user: belongsTo('user', { async: true }) 10 | }); 11 | -------------------------------------------------------------------------------- /app/models/stripe-connect-plan.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import { belongsTo } from 'ember-data/relationships'; 3 | 4 | export default Model.extend({ 5 | project: belongsTo('project', { async: true }) 6 | }); 7 | -------------------------------------------------------------------------------- /app/models/stripe-connect-subscription.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | quantity: attr('dollar-cents'), 7 | 8 | project: belongsTo('project', { async: true }), 9 | user: belongsTo('user', { async: true }) 10 | }); 11 | -------------------------------------------------------------------------------- /app/models/stripe-platform-card.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | brand: attr(), 7 | country: attr(), 8 | expMonth: attr(), 9 | expYear: attr(), 10 | last4: attr(), 11 | name: attr(), 12 | 13 | stripeToken: attr(), 14 | 15 | user: belongsTo('user', { async: true }) 16 | }); 17 | -------------------------------------------------------------------------------- /app/models/stripe-platform-customer.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | email: attr(), 7 | 8 | user: belongsTo('user', { async: true }) 9 | }); 10 | -------------------------------------------------------------------------------- /app/models/task-skill.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import { belongsTo } from 'ember-data/relationships'; 3 | 4 | export default Model.extend({ 5 | task: belongsTo('task', { async: true }), 6 | skill: belongsTo('skill', { async: true }) 7 | }); 8 | -------------------------------------------------------------------------------- /app/models/task-user-mention.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | indices: attr('array'), 7 | username: attr('string'), 8 | 9 | task: belongsTo('task', { async: true }), 10 | user: belongsTo('user', { async: true }) 11 | }); 12 | -------------------------------------------------------------------------------- /app/models/user-category.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import { belongsTo } from 'ember-data/relationships'; 3 | 4 | export default Model.extend({ 5 | category: belongsTo('category', { async: true }), 6 | user: belongsTo('user', { async: true }) 7 | }); 8 | -------------------------------------------------------------------------------- /app/models/user-role.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import { belongsTo } from 'ember-data/relationships'; 3 | 4 | export default Model.extend({ 5 | role: belongsTo('role', { async: true }), 6 | user: belongsTo('user', { async: true }) 7 | }); 8 | -------------------------------------------------------------------------------- /app/models/user-skill.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import { belongsTo } from 'ember-data/relationships'; 3 | 4 | export default Model.extend({ 5 | skill: belongsTo('skill', { async: true }), 6 | user: belongsTo('user', { async: true }) 7 | }); 8 | -------------------------------------------------------------------------------- /app/models/user-task.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import { belongsTo } from 'ember-data/relationships'; 3 | 4 | export default Model.extend({ 5 | task: belongsTo('task', { async: true }), 6 | user: belongsTo('user', { async: true }) 7 | }); 8 | -------------------------------------------------------------------------------- /app/resolver.js: -------------------------------------------------------------------------------- 1 | import Resolver from 'ember-resolver'; 2 | 3 | export default Resolver; 4 | -------------------------------------------------------------------------------- /app/routes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/app/routes/.gitkeep -------------------------------------------------------------------------------- /app/routes/about.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import MarketingRouteMixin from 'code-corps-ember/mixins/marketing-route-mixin'; 3 | 4 | export default Route.extend(MarketingRouteMixin, { }); 5 | -------------------------------------------------------------------------------- /app/routes/admin.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; 3 | import AdminRouteMixin from 'code-corps-ember/mixins/admin-route-mixin'; 4 | 5 | export default Route.extend(AuthenticatedRouteMixin, AdminRouteMixin, { }); 6 | -------------------------------------------------------------------------------- /app/routes/admin/github-events/github-event.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | 3 | export default Route.extend({ 4 | model(params) { 5 | return this.store.find('github-event', params.id); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /app/routes/admin/organization-invites/index.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | 3 | export default Route.extend({ 4 | model() { 5 | return this.store.findAll('organization-invite'); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /app/routes/admin/projects/index.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | 3 | export default Route.extend({ 4 | model() { 5 | return this.store.findAll('project'); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /app/routes/conversations/index.js: -------------------------------------------------------------------------------- 1 | import { get } from '@ember/object'; 2 | import Route from '@ember/routing/route'; 3 | import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; 4 | 5 | export default Route.extend(AuthenticatedRouteMixin, { 6 | redirect() { 7 | let { conversations } = this.modelFor('conversations'); 8 | if (get(conversations, 'length') > 0) { 9 | this.transitionTo('conversations.conversation', get(conversations, 'firstObject')); 10 | } 11 | } 12 | }); 13 | -------------------------------------------------------------------------------- /app/routes/index.js: -------------------------------------------------------------------------------- 1 | import { get } from '@ember/object'; 2 | import { inject as service } from '@ember/service'; 3 | import Route from '@ember/routing/route'; 4 | import MarketingRouteMixin from 'code-corps-ember/mixins/marketing-route-mixin'; 5 | 6 | export default Route.extend(MarketingRouteMixin, { 7 | session: service(), 8 | 9 | beforeModel() { 10 | if (get(this, 'session.isAuthenticated')) { 11 | this.transitionTo('projects-list'); 12 | } 13 | } 14 | }); 15 | -------------------------------------------------------------------------------- /app/routes/login.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin'; 3 | import MarketingRouteMixin from 'code-corps-ember/mixins/marketing-route-mixin'; 4 | 5 | export default Route.extend(MarketingRouteMixin, UnauthenticatedRouteMixin, { }); 6 | -------------------------------------------------------------------------------- /app/routes/organizations/slugged-route.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; 3 | 4 | export default Route.extend(AuthenticatedRouteMixin, { 5 | model(params) { 6 | return this.store.queryRecord('slugged-route', { 7 | slug: params.slugged_route_slug 8 | }).then((slugged_route) => { 9 | return slugged_route.get('organization'); 10 | }); 11 | } 12 | }); 13 | -------------------------------------------------------------------------------- /app/routes/password/forgot.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import { get } from '@ember/object'; 3 | import { inject as service } from '@ember/service'; 4 | 5 | export default Route.extend({ 6 | 7 | ajax: service(), 8 | 9 | actions: { 10 | forgotPassword(email) { 11 | return get(this, 'ajax').request('/password/forgot', { 12 | method: 'POST', 13 | data: { 14 | email 15 | } 16 | }).then(() => { 17 | this.transitionTo('index'); 18 | }); 19 | } 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /app/routes/privacy.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import MarketingRouteMixin from 'code-corps-ember/mixins/marketing-route-mixin'; 3 | 4 | export default Route.extend(MarketingRouteMixin, { 5 | }); 6 | -------------------------------------------------------------------------------- /app/routes/project/tasks.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | 3 | export default Route.extend({ 4 | model() { 5 | return this.modelFor('project').reload(); 6 | }, 7 | 8 | renderTemplate() { 9 | this.render('project/tasks', { into: 'application' }); 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /app/routes/project/thank-you.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; 3 | 4 | export default Route.extend(AuthenticatedRouteMixin, { 5 | model() { 6 | return this.modelFor('project').reload(); 7 | }, 8 | 9 | renderTemplate() { 10 | this.render('project/thank-you', { into: 'application' }); 11 | } 12 | }); 13 | -------------------------------------------------------------------------------- /app/routes/projects-list.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | 3 | export default Route.extend({ 4 | queryParams: { 5 | approved: { 6 | refreshModel: true 7 | } 8 | }, 9 | 10 | model(params) { 11 | return this.store.query('project', { 12 | approved: params.approved 13 | }); 14 | }, 15 | 16 | setupController(controller, model) { 17 | controller.set('projects', model); 18 | } 19 | }); 20 | -------------------------------------------------------------------------------- /app/routes/projects/index.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | 3 | export default Route.extend({ 4 | model() { 5 | let { slugged_route_slug: sluggedRouteSlug } = this.paramsFor('projects'); 6 | return this.store.query('project', { sluggedRouteSlug }); 7 | }, 8 | 9 | setupController(controller, model) { 10 | controller.set('projects', model); 11 | } 12 | }); 13 | -------------------------------------------------------------------------------- /app/routes/settings.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import { inject as service } from '@ember/service'; 3 | import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; 4 | 5 | export default Route.extend(AuthenticatedRouteMixin, { 6 | currentUser: service(), 7 | 8 | model() { 9 | let userId = this.get('currentUser.user.id'); 10 | return this.store.find('user', userId); 11 | }, 12 | 13 | setupController(controller, model) { 14 | controller.set('user', model); 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /app/routes/slugged-route.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import { get } from '@ember/object'; 3 | import { hash } from 'rsvp'; 4 | export default Route.extend({ 5 | 6 | async model({ slugged_route_slug: slug }) { 7 | let sluggedRoute = await get(this, 'store').queryRecord('slugged-route', { slug }); 8 | return hash({ 9 | organization: get(sluggedRoute, 'organization'), 10 | user: get(sluggedRoute, 'user') 11 | }); 12 | } 13 | }); 14 | -------------------------------------------------------------------------------- /app/routes/start.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; 3 | 4 | export default Route.extend(AuthenticatedRouteMixin, { }); 5 | -------------------------------------------------------------------------------- /app/routes/start/expertise.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import { inject as service } from '@ember/service'; 3 | 4 | export default Route.extend({ 5 | currentUser: service(), 6 | 7 | beforeModel() { 8 | this._super(...arguments); 9 | let user = this.get('currentUser.user'); 10 | return user.get('user-role'); 11 | }, 12 | 13 | model() { 14 | return this.store.findAll('role'); 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /app/routes/start/hello.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import { inject as service } from '@ember/service'; 3 | 4 | export default Route.extend({ 5 | currentUser: service(), 6 | 7 | model() { 8 | return this.get('currentUser.user'); 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /app/routes/start/interests.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | 3 | export default Route.extend({ 4 | model() { 5 | return this.store.findAll('category'); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /app/routes/team.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import MarketingRouteMixin from 'code-corps-ember/mixins/marketing-route-mixin'; 3 | 4 | export default Route.extend(MarketingRouteMixin, { }); 5 | -------------------------------------------------------------------------------- /app/routes/terms.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | import MarketingRouteMixin from 'code-corps-ember/mixins/marketing-route-mixin'; 3 | 4 | export default Route.extend(MarketingRouteMixin, { 5 | }); 6 | -------------------------------------------------------------------------------- /app/serializers/message.js: -------------------------------------------------------------------------------- 1 | import ApplicationSerializer from './application'; 2 | 3 | export default ApplicationSerializer.extend({ 4 | attrs: { 5 | conversations: { serialize: true } 6 | }, 7 | 8 | serialize(snapshot) { 9 | let json = this._super(...arguments); 10 | 11 | // support saving child conversations alongside record 12 | if (!json.id) { 13 | json.included = snapshot.hasMany('conversations').map((c) => c.serialize()); 14 | } 15 | 16 | return json; 17 | } 18 | }); 19 | -------------------------------------------------------------------------------- /app/services/background.js: -------------------------------------------------------------------------------- 1 | import $ from 'jquery'; 2 | import { computed } from '@ember/object'; 3 | import { run } from '@ember/runloop'; 4 | import Service from '@ember/service'; 5 | 6 | export default Service.extend({ 7 | reset() { 8 | $('html').removeClass('warning danger'); 9 | }, 10 | 11 | setBackgroundClass: computed(function() { 12 | return () => { 13 | $('html').addClass(this.get('class')); 14 | }; 15 | }), 16 | 17 | updateBackgroundClass() { 18 | run.once(this, this.get('setBackgroundClass')); 19 | } 20 | }); 21 | -------------------------------------------------------------------------------- /app/services/conversations.js: -------------------------------------------------------------------------------- 1 | import Service from '@ember/service'; 2 | import { computed, get, set } from '@ember/object'; 3 | 4 | export default Service.extend({ 5 | isViewing: false, 6 | 7 | className: computed('isViewing', function() { 8 | let isViewing = get(this, 'isViewing'); 9 | if (isViewing) { 10 | return 'fill-height'; 11 | } 12 | }), 13 | 14 | activate() { 15 | set(this, 'isViewing', true); 16 | }, 17 | 18 | deactivate() { 19 | set(this, 'isViewing', false); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /app/services/drag-state.js: -------------------------------------------------------------------------------- 1 | import Service from '@ember/service'; 2 | 3 | export default Service.extend({ 4 | isDragging: false, 5 | 6 | dragging() { 7 | this.set('isDragging', true); 8 | }, 9 | 10 | leaving() { 11 | this.set('isDragging', false); 12 | } 13 | }); 14 | -------------------------------------------------------------------------------- /app/services/loading-bar.js: -------------------------------------------------------------------------------- 1 | import Service from '@ember/service'; 2 | import { set } from '@ember/object'; 3 | 4 | export default Service.extend({ 5 | isLoading: false, 6 | 7 | start() { 8 | set(this, 'isLoading', true); 9 | }, 10 | 11 | stop() { 12 | set(this, 'isLoading', false); 13 | } 14 | }); 15 | -------------------------------------------------------------------------------- /app/services/session.js: -------------------------------------------------------------------------------- 1 | import ESASession from 'ember-simple-auth/services/session'; 2 | 3 | export default ESASession.extend(); 4 | -------------------------------------------------------------------------------- /app/services/site-footer.js: -------------------------------------------------------------------------------- 1 | import { set } from '@ember/object'; 2 | import Service from '@ember/service'; 3 | 4 | export default Service.extend({ 5 | isShrunken: true, 6 | 7 | enlarge() { 8 | set(this, 'isShrunken', false); 9 | }, 10 | 11 | shrink() { 12 | set(this, 'isShrunken', true); 13 | } 14 | }); 15 | -------------------------------------------------------------------------------- /app/styles/components/categories-list.scss: -------------------------------------------------------------------------------- 1 | .categories-list { 2 | display: flex; 3 | flex-direction: row; 4 | flex-wrap: wrap; 5 | margin-bottom: 2em; 6 | width: 100%; 7 | } 8 | 9 | .start__interests { 10 | @extend .categories-list; 11 | } 12 | -------------------------------------------------------------------------------- /app/styles/components/category-item.scss: -------------------------------------------------------------------------------- 1 | .category-item { 2 | text-align: center; 3 | width: 20%; 4 | @include media($lg-screen) { width: 25%; } 5 | @include media($md-screen) { width: 33%; } 6 | @include media($sm-screen) { width: 50%; } 7 | @include media($xs-screen) { width: 100%; } 8 | 9 | button { 10 | text-align: left; 11 | } 12 | 13 | p { 14 | color: $text--light; 15 | font-size: $body-font-size-small; 16 | margin: 10px 0; 17 | 18 | .selected & { 19 | color: $default-color; 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/styles/components/code-theme-selector.scss: -------------------------------------------------------------------------------- 1 | .code-theme-selector { 2 | cursor: pointer; 3 | height: 19px; 4 | width: 24px; 5 | 6 | &.code-theme--dark { 7 | @include sprite($dark-theme); 8 | } 9 | 10 | &.code-theme--light { 11 | @include sprite($light-theme); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/styles/components/conversations/conversation-composer.scss: -------------------------------------------------------------------------------- 1 | .conversation-composer { 2 | background: white; 3 | border: 1px solid $gray--lighter; 4 | border-radius: 4px; 5 | 6 | textarea { 7 | border: none; 8 | resize: none; 9 | width: 100%; 10 | } 11 | 12 | &__footer { 13 | border-top: 1px solid $gray--lighter; 14 | display: flex; 15 | flex-direction: row-reverse; 16 | padding: 0.5em; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/styles/components/conversations/new-conversation-modal.scss: -------------------------------------------------------------------------------- 1 | .new-conversation-modal-container { 2 | align-items: center; 3 | display: flex; 4 | height: 100%; 5 | justify-content: center; 6 | text-align: center; 7 | width: 100%; 8 | } 9 | 10 | .new-conversation-modal { 11 | width: 450px; 12 | } 13 | -------------------------------------------------------------------------------- /app/styles/components/create-comment-form.scss: -------------------------------------------------------------------------------- 1 | .create-comment-form { 2 | display: block; 3 | float: left; 4 | margin: 10px 0 0 0; 5 | padding-left: 60px; 6 | width: 100%; 7 | 8 | .icon { 9 | float: left; 10 | margin-left: -60px; 11 | } 12 | 13 | .comment-content { 14 | padding: 0 10px; 15 | } 16 | } 17 | 18 | .comment-signup { 19 | background: $blue--background; 20 | padding: 10px 20px; 21 | 22 | p { 23 | font-size: $body-font-size-small; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/styles/components/donation-goal-edit.scss: -------------------------------------------------------------------------------- 1 | .donation-goal-edit{ 2 | margin: 1em 0; 3 | .error { 4 | clear: left; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /app/styles/components/donation/card-logo.scss: -------------------------------------------------------------------------------- 1 | .card-logo__container { 2 | height: 100%; 3 | left: 0; 4 | perspective: 1000px; 5 | position: absolute; 6 | text-align: center; 7 | top: 0; 8 | width: 1.5em; 9 | } 10 | 11 | .card-logo { 12 | height: 100%; 13 | position: relative; 14 | } 15 | 16 | .card-logo__inner { 17 | margin: 0; 18 | padding: 0; 19 | position: absolute; 20 | height: 100%; 21 | width: 1.5em; 22 | z-index: 2; 23 | } 24 | -------------------------------------------------------------------------------- /app/styles/components/donation/project-header.scss: -------------------------------------------------------------------------------- 1 | .project-header { 2 | margin: 20px 0; 3 | text-align: center; 4 | 5 | h2 { 6 | margin: 5px 0; 7 | } 8 | 9 | p { 10 | color: $text--light; 11 | margin: 5px 0; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/styles/components/github-connect-state.scss: -------------------------------------------------------------------------------- 1 | .github-connect-state__user { 2 | align-items: center; 3 | display: inline-flex; 4 | flex-direction: row; 5 | 6 | img { 7 | border-radius: 4px; 8 | height: 50px; 9 | margin-right: 10px; 10 | width: 50px; 11 | } 12 | 13 | p { 14 | margin: 0; 15 | } 16 | } 17 | 18 | .github-connect.button { 19 | align-items: center; 20 | display: inline-flex; 21 | .sprite-icon { 22 | padding-right: 7px; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/styles/components/github/repo-sync.scss: -------------------------------------------------------------------------------- 1 | .github__repo-sync { 2 | padding-top: 10px; 3 | text-align: center; 4 | width: 100%; 5 | 6 | .progress-bar-container { 7 | height: 8px; 8 | } 9 | 10 | p { 11 | align-items: center; 12 | color: $text--light; 13 | display: inline-flex; 14 | line-height: 3em; 15 | margin: 0; 16 | 17 | span { 18 | padding-right: 5px; 19 | } 20 | 21 | strong { 22 | font-weight: 600; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/styles/components/organization-profile.scss: -------------------------------------------------------------------------------- 1 | .organization-main { 2 | @include span-columns(8); 3 | } 4 | 5 | .organization-sidebar { 6 | @include span-columns(4); 7 | 8 | .organization-sidebar__section { 9 | margin: 40px 0; 10 | 11 | &:first-child { 12 | margin-top: 0px; 13 | } 14 | } 15 | 16 | h3 { 17 | margin: 20px 0; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/styles/components/payments/account-setup.scss: -------------------------------------------------------------------------------- 1 | // 2 | // ACCOUNT SETUP SECTIONS 3 | // 4 | .account-setup > section, .account-setup__section { 5 | label { 6 | display: block; 7 | font-weight: 600; 8 | margin-bottom: .3em; 9 | } 10 | 11 | section { 12 | @include span-columns(9); 13 | } 14 | } 15 | 16 | // 17 | // STATES 18 | // 19 | .account-setup__section--required { 20 | @include outer-container; 21 | } 22 | -------------------------------------------------------------------------------- /app/styles/components/payments/bank-account.scss: -------------------------------------------------------------------------------- 1 | // 2 | // ACCOUNT INFORMATION 3 | // 4 | .bank-account__account { 5 | @extend .input-group; 6 | } 7 | 8 | .bank-account__bank-name { 9 | @extend .input-group; 10 | } 11 | 12 | .bank-account__routing { 13 | @extend .input-group; 14 | } 15 | -------------------------------------------------------------------------------- /app/styles/components/project-card/project-users.scss: -------------------------------------------------------------------------------- 1 | $height: 25px; 2 | 3 | .project-card__project-users { 4 | height: $height; 5 | margin: 10px 0 0 0; 6 | 7 | li { 8 | color: $text--light; 9 | display: inline-block; 10 | font-size: $body-font-size-small; 11 | height: $height; 12 | line-height: $height; 13 | margin-right: -5px; 14 | vertical-align: middle; 15 | 16 | &:last-child { 17 | padding-left: 5px; 18 | } 19 | } 20 | } 21 | 22 | .project-card__project-users__count { 23 | margin-left: 15px; 24 | } 25 | -------------------------------------------------------------------------------- /app/styles/components/project-item.scss: -------------------------------------------------------------------------------- 1 | .project-item { 2 | margin: 10px 0; 3 | 4 | @include clearfix; 5 | 6 | h4 { 7 | margin: 9px 0; 8 | font-size: $header-font-size-small; 9 | } 10 | 11 | p { 12 | margin: 8px 0 3px 0; 13 | font-size: $body-font-size-small; 14 | } 15 | 16 | .icon-container, .details-container { 17 | float: left; 18 | } 19 | 20 | .details-container { 21 | padding-left: 10px; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/styles/components/project-list.scss: -------------------------------------------------------------------------------- 1 | .project-list { 2 | @include span-columns(8); 3 | } 4 | 5 | .project-task-list { 6 | width: 100%; 7 | } 8 | -------------------------------------------------------------------------------- /app/styles/components/select/github-repo.scss: -------------------------------------------------------------------------------- 1 | .select-github-repo select { 2 | width: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /app/styles/components/signup-form.scss: -------------------------------------------------------------------------------- 1 | .signup-form { 2 | .suggestions { 3 | @include media($lg-screen) { 4 | position: relative; 5 | top: 5px; 6 | right: -8px; 7 | } 8 | } 9 | 10 | a { 11 | text-align: center; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/styles/components/svg/sprite-icon.scss: -------------------------------------------------------------------------------- 1 | .sprite-icon { 2 | svg { 3 | align-items: center; 4 | display: flex; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /app/styles/components/task-comment-list.scss: -------------------------------------------------------------------------------- 1 | .task-comment-list { 2 | @include span-columns(12); 3 | border-bottom: 1px solid $border-gray; 4 | margin-bottom: 10px; 5 | margin-top: 20px; 6 | } 7 | -------------------------------------------------------------------------------- /app/styles/components/task-details.scss: -------------------------------------------------------------------------------- 1 | .task-body { 2 | } 3 | -------------------------------------------------------------------------------- /app/styles/components/task-header.scss: -------------------------------------------------------------------------------- 1 | .task-header { 2 | @include clearfix; 3 | @include outer-container; 4 | @include span-columns(12); 5 | 6 | padding: 10px 0; 7 | 8 | .task-title { 9 | line-height: inherit; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/styles/components/task-new-form.scss: -------------------------------------------------------------------------------- 1 | .task-new-form { 2 | @include clearfix; 3 | padding-left: 60px; 4 | position: relative; 5 | 6 | .icon { 7 | float: left; 8 | margin-left: -60px; 9 | } 10 | 11 | .task-new-form-body { 12 | position: relative; 13 | border: 1px solid $background-gray; 14 | border-radius: 4px; 15 | padding: 10px 10px 0 10px; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/styles/components/task-status-button.scss: -------------------------------------------------------------------------------- 1 | .task-status-button { 2 | float: right; 3 | } 4 | -------------------------------------------------------------------------------- /app/styles/components/task-title.scss: -------------------------------------------------------------------------------- 1 | .task-title { 2 | display: flex; 3 | 4 | h2 { 5 | flex-grow: 1; 6 | font-weight: 600; 7 | margin: 0; 8 | } 9 | 10 | input { 11 | flex-grow: 1; 12 | height: 42px; 13 | margin-right: 10px; 14 | } 15 | 16 | .input-group { 17 | margin: 0; 18 | width: inherit; 19 | } 20 | 21 | .task-number { 22 | color: $text--lightest; 23 | font-weight: 300; 24 | margin-left: 5px; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/styles/components/user-details.scss: -------------------------------------------------------------------------------- 1 | .user-details { 2 | width: 100%; 3 | 4 | &__main { 5 | @include span-columns(9); 6 | } 7 | } 8 | 9 | .empty-state { 10 | color: $text--light; 11 | } 12 | -------------------------------------------------------------------------------- /app/styles/components/user/skills-list.scss: -------------------------------------------------------------------------------- 1 | .user__skills-list { 2 | ul { 3 | margin-top: 10px; 4 | 5 | li { 6 | background: #E8EBED; 7 | border-radius: 2px; 8 | color: #333; 9 | display: inline-block; 10 | font-weight: 600; 11 | margin: 0 3px 5px 0; 12 | padding: 4px 7px; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/styles/components/volunteer-headshot.scss: -------------------------------------------------------------------------------- 1 | .volunteer-headshot { 2 | @include omega(6n); 3 | @include span-columns(2); 4 | 5 | display: inline-block; 6 | margin-bottom: 1em; 7 | 8 | &__name { 9 | font-weight: 600; 10 | margin: 0; 11 | } 12 | 13 | &__role { 14 | font-size: $body-font-size-small; 15 | color: $text--light; 16 | margin-top: 0; 17 | } 18 | 19 | img { 20 | border-radius: 4px; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/styles/layout/_breakpoints.scss: -------------------------------------------------------------------------------- 1 | // also refer to breakpoints in app/breakpoints.js 2 | 3 | $xs-screen: new-breakpoint(max-width 479px); 4 | $sm-screen: new-breakpoint(max-width 599px); 5 | $md-screen: new-breakpoint(max-width 767px); 6 | $lg-screen: new-breakpoint(max-width 991px); 7 | 8 | .mobile-hide { 9 | @include media($sm-screen) { 10 | display: none !important; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/styles/layout/_content.scss: -------------------------------------------------------------------------------- 1 | .site-content { 2 | margin-top: 10px; 3 | 4 | &.fill-height { 5 | display: flex; 6 | flex-direction: column; 7 | flex-grow: 1; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /app/styles/layout/_tooltips.scss: -------------------------------------------------------------------------------- 1 | .tooltip { 2 | font-size: $body-font-size-small; 3 | } 4 | -------------------------------------------------------------------------------- /app/styles/templates/admin/github-events.scss: -------------------------------------------------------------------------------- 1 | .github-event__title { 2 | display: flex; 3 | justify-content: space-between; 4 | margin: 1em 0 0 0; 5 | 6 | h4 { 7 | margin: 0; 8 | } 9 | 10 | > span { 11 | align-items: center; 12 | display: inline-flex; 13 | 14 | > span { 15 | padding-left: 10px; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/styles/templates/project/settings/profile.scss: -------------------------------------------------------------------------------- 1 | .project-skills-list { 2 | &.centered { 3 | text-align: center; 4 | } 5 | 6 | > div { 7 | display: inline-block; 8 | } 9 | 10 | .skill { 11 | margin-bottom: 3px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/styles/templates/project/settings/settings.scss: -------------------------------------------------------------------------------- 1 | .settings { 2 | @include span-columns(12); 3 | } 4 | 5 | .settings-main { 6 | @include span-columns(8); 7 | } 8 | 9 | .settings-sidebar { 10 | @include span-columns(4); 11 | } 12 | -------------------------------------------------------------------------------- /app/styles/templates/project/tasks/index.scss: -------------------------------------------------------------------------------- 1 | .tasks-menu { 2 | @include clearfix; 3 | 4 | padding: 0 10px; 5 | margin-bottom: 10px; 6 | } 7 | -------------------------------------------------------------------------------- /app/styles/templates/project/tasks/task-new.scss: -------------------------------------------------------------------------------- 1 | .task-new-main { 2 | @include span-columns(9) 3 | } 4 | 5 | .task-new-sidebar { 6 | @include span-columns(3); 7 | } 8 | -------------------------------------------------------------------------------- /app/styles/templates/settings/profile.scss: -------------------------------------------------------------------------------- 1 | .user-skills-list { 2 | > div { 3 | display: inline-block; 4 | } 5 | 6 | .skill { 7 | margin-bottom: 3px; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /app/templates/admin/github-events.hbs: -------------------------------------------------------------------------------- 1 | 10 | 11 | {{outlet}} 12 | -------------------------------------------------------------------------------- /app/templates/admin/organization-invites.hbs: -------------------------------------------------------------------------------- 1 | 13 | 14 | {{outlet}} 15 | -------------------------------------------------------------------------------- /app/templates/admin/projects.hbs: -------------------------------------------------------------------------------- 1 | 10 | 11 | {{outlet}} 12 | -------------------------------------------------------------------------------- /app/templates/application-error.hbs: -------------------------------------------------------------------------------- 1 | {{error-wrapper error=model}} 2 | -------------------------------------------------------------------------------- /app/templates/components/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/app/templates/components/.gitkeep -------------------------------------------------------------------------------- /app/templates/components/animated-high-five.hbs: -------------------------------------------------------------------------------- 1 | {{yield}} 2 | -------------------------------------------------------------------------------- /app/templates/components/categories-list.hbs: -------------------------------------------------------------------------------- 1 | {{#each sortedCategories as |category|}} 2 | {{category-item category=category}} 3 | {{/each}} 4 | -------------------------------------------------------------------------------- /app/templates/components/category-checkboxes.hbs: -------------------------------------------------------------------------------- 1 | {{#multiselect-checkboxes 2 | labelProperty="name" 3 | onchange=(action updateCategories) 4 | options=options 5 | selection=selection 6 | as |category isSelected| 7 | }} 8 |
  • 9 | 13 |
  • 14 | {{/multiselect-checkboxes}} 15 | -------------------------------------------------------------------------------- /app/templates/components/code-theme-selector.hbs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/app/templates/components/code-theme-selector.hbs -------------------------------------------------------------------------------- /app/templates/components/common/busy-model-wrapper.hbs: -------------------------------------------------------------------------------- 1 | {{#if model.isSaving}} 2 | {{#if model.isDeleted}} 3 | {{onDeleting}} 4 | {{else}} 5 | {{onSaving}} 6 | {{/if}} 7 | {{else}} 8 | {{yield}} 9 | {{/if}} 10 | -------------------------------------------------------------------------------- /app/templates/components/conversations/conversation-part-closed.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | 5 | {{#if isSelf}} 6 | You closed this {{moment-from-now closedAt interval=60000}} 7 | {{else}} 8 | {{author.username}} closed this {{moment-from-now closedAt interval=60000}} 9 | {{/if}} 10 | 11 |
    12 |
    13 |
    14 | -------------------------------------------------------------------------------- /app/templates/components/demo-categories.hbs: -------------------------------------------------------------------------------- 1 | {{#each categories as |category|}} 2 | {{demo-category-item category=category}} 3 | {{/each}} -------------------------------------------------------------------------------- /app/templates/components/demo-skills.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/templates/components/donation-goal.hbs: -------------------------------------------------------------------------------- 1 |

    {{format-currency donationGoal.amount}}

    2 | 3 | {{#if canEdit}} 4 | Edit 5 | {{/if}} 6 | 7 |

    {{donationGoal.description}}

    8 | -------------------------------------------------------------------------------- /app/templates/components/donation/card-item.hbs: -------------------------------------------------------------------------------- 1 | {{#if card.isLoading}} 2 | Loading card... 3 | {{else}} 4 |
    5 | {{donation/card-logo brand=card.brand}} 6 |

    {{card.brand}} ending in {{card.last4}}

    7 |
    8 | {{card.expMonth}}/{{card.expYear}} 9 | {{/if}} 10 | -------------------------------------------------------------------------------- /app/templates/components/donation/card-list.hbs: -------------------------------------------------------------------------------- 1 |

    Select card

    2 | 3 | {{#each cards as |card|}} 4 | {{donation/card-item 5 | card=card 6 | click=(action selectCard card) 7 | selectedCard=selectedCard 8 | }} 9 | {{else}} 10 | There are no cards associated with your account yet 11 | {{/each}} 12 | -------------------------------------------------------------------------------- /app/templates/components/donation/project-header.hbs: -------------------------------------------------------------------------------- 1 | {{project.title}} 2 |

    3 | {{project.title}} 4 |

    5 |

    6 | {{project.description}} 7 |

    8 | -------------------------------------------------------------------------------- /app/templates/components/donations/donation-amount-button.hbs: -------------------------------------------------------------------------------- 1 | {{#if selected}}{{fa-icon "check"}}{{/if}} Donate {{format-currency presetAmount trimZero=true}} 2 | -------------------------------------------------------------------------------- /app/templates/components/donations/donation-status.hbs: -------------------------------------------------------------------------------- 1 | {{#if subscription}} 2 | {{donations/show-donation amount=subscription.quantity}} 3 | {{else}} 4 | {{#link-to 'project.donate' project class="button default large"}}Donate to project{{/link-to}} 5 | {{/if}} 6 | -------------------------------------------------------------------------------- /app/templates/components/donations/show-donation.hbs: -------------------------------------------------------------------------------- 1 |

    2 | You pledged {{format-currency amount trimZero=true}} each month. 3 |

    4 | -------------------------------------------------------------------------------- /app/templates/components/drag-zone.hbs: -------------------------------------------------------------------------------- 1 | {{yield}} 2 | -------------------------------------------------------------------------------- /app/templates/components/error-formatter.hbs: -------------------------------------------------------------------------------- 1 | {{#each messages as |message|}} 2 |

    {{message}}

    3 | {{else}} 4 |

    {{defaultMessage}}

    5 | {{/each}} 6 | -------------------------------------------------------------------------------- /app/templates/components/flash-messages/fixed-position.hbs: -------------------------------------------------------------------------------- 1 | {{#each (filter-by 'fixed' true flashMessages.queue) as |flash|}} 2 | {{#flash-message flash=flash as |component flash|}} 3 |
    4 |
    5 |

    {{#if flash.icon}}{{fa-icon flash.icon}} {{/if}}{{{flash.message}}}

    6 |
    7 |
    8 | {{/flash-message}} 9 | {{/each}} 10 | -------------------------------------------------------------------------------- /app/templates/components/flash-messages/full-width.hbs: -------------------------------------------------------------------------------- 1 | {{#each (reject-by 'fixed' true flashMessages.queue) as |flash|}} 2 | {{#flash-message flash=flash as |component flash|}} 3 |
    4 |
    5 |

    {{flash.message}}

    6 | × 7 |
    8 |
    9 | {{/flash-message}} 10 | {{/each}} 11 | -------------------------------------------------------------------------------- /app/templates/components/github-connect-state.hbs: -------------------------------------------------------------------------------- 1 | {{#if githubId}} 2 |
    3 | 4 |

    Connected to {{githubUsername}}.

    5 |
    6 | {{else}} 7 | {{github-connect}} 8 | {{/if}} 9 | -------------------------------------------------------------------------------- /app/templates/components/github-connect.hbs: -------------------------------------------------------------------------------- 1 | {{svg/sprite-icon icon="github-48" size="20" style="solid-white"}} Connect with GitHub 2 | -------------------------------------------------------------------------------- /app/templates/components/github/install-link.hbs: -------------------------------------------------------------------------------- 1 | Install on GitHub 2 | -------------------------------------------------------------------------------- /app/templates/components/github/unconnected-installation.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 |

    {{githubAppInstallation.githubAccountLogin}}

    5 |
    6 |
    7 | 10 |
    11 |
    12 | -------------------------------------------------------------------------------- /app/templates/components/image-drop.hbs: -------------------------------------------------------------------------------- 1 | {{yield}} 2 |
    3 |

    {{hoverText}}

    4 |
    5 | {{#if (and helpText (not hasImage))}} 6 |
    7 |

    {{helpText}}

    8 |
    9 | {{/if}} 10 | 11 | -------------------------------------------------------------------------------- /app/templates/components/landing-subsection.hbs: -------------------------------------------------------------------------------- 1 |
    2 |

    {{title}}

    3 |
    4 |
    5 | {{yield animated}} 6 |
    -------------------------------------------------------------------------------- /app/templates/components/organization-menu.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 14 |
    15 |
    16 | -------------------------------------------------------------------------------- /app/templates/components/organization-profile.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{organization-header organization=organization expanded=true}} 3 |
    4 | 5 | {{organization-menu organization=organization}} 6 | 7 |
    8 |
    9 | {{project-list projects=organization.projects}} 10 |
    11 |
    12 | -------------------------------------------------------------------------------- /app/templates/components/organization-settings.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{organization-header organization=organization}} 3 | {{organization-menu organization=organization membership=membership}} 4 |
    5 | -------------------------------------------------------------------------------- /app/templates/components/payments/contact-info.hbs: -------------------------------------------------------------------------------- 1 |
    2 | 3 | {{input type="email" name="email" value=email}} 4 |
    -------------------------------------------------------------------------------- /app/templates/components/progress-bar-container.hbs: -------------------------------------------------------------------------------- 1 | {{progress-bar animated=animated error=error percentage=percentage}} 2 | -------------------------------------------------------------------------------- /app/templates/components/progress-bar.hbs: -------------------------------------------------------------------------------- 1 | {{yield}} -------------------------------------------------------------------------------- /app/templates/components/project-card/project-users.hbs: -------------------------------------------------------------------------------- 1 | {{#each visibleUsers as |user|}} 2 |
  • 3 | {{#if user.isLoaded}} 4 | 5 | {{else}} 6 |
    7 | {{/if}} 8 |
  • 9 | {{/each}} 10 | {{#if hiddenUsersExist}} 11 |
  • +{{hiddenUsersCount}} more
  • 12 | {{/if}} 13 | -------------------------------------------------------------------------------- /app/templates/components/project-categories-list.hbs: -------------------------------------------------------------------------------- 1 | {{#each sortedCategories as |category|}} 2 | {{project-category-item category=category}} 3 | {{/each}} 4 | -------------------------------------------------------------------------------- /app/templates/components/project-category-item.hbs: -------------------------------------------------------------------------------- 1 | {{#link-to 'projects-list' 2 | class="category-item__icon--small" 3 | classNameBindings="iconClass" 4 | }} 5 | {{/link-to}} 6 | {{#tooltip-on-component 7 | effect='none' 8 | enableLazyRendering=true 9 | side='bottom' 10 | updateFor=category.isLoaded 11 | }} 12 | {{category.name}} 13 | {{/tooltip-on-component}} 14 | -------------------------------------------------------------------------------- /app/templates/components/project-item.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{#link-to 'project' project.organization.slug project.slug}} 3 | 4 | {{/link-to}} 5 |
    6 |
    7 |

    8 | {{#link-to 'project' project.organization.slug project.slug}} 9 | {{project.title}} 10 | {{/link-to}} 11 |

    12 |

    13 | {{project.description}} 14 |

    15 |
    -------------------------------------------------------------------------------- /app/templates/components/project-list.hbs: -------------------------------------------------------------------------------- 1 | {{#each (sort-by "id" projects) as |project|}} 2 | {{project-item project=project}} 3 | {{/each}} 4 | -------------------------------------------------------------------------------- /app/templates/components/project-skill-item.hbs: -------------------------------------------------------------------------------- 1 | {{#if skill.isLoading}} 2 | 3 | {{else}} 4 | {{skill.title}} 5 | {{/if}} 6 | -------------------------------------------------------------------------------- /app/templates/components/project-skills-list.hbs: -------------------------------------------------------------------------------- 1 | {{#if showHeader}} 2 |
    3 | {{header}} 4 |
    5 | {{/if}} 6 | {{#each skills as |skill|}} 7 | {{project-skill-item skill=skill onClicked=onSkillClicked}} 8 | {{else}} 9 |
    10 | You've added all the project's skills. 11 |
    12 | {{/each}} 13 | -------------------------------------------------------------------------------- /app/templates/components/project-switcher.hbs: -------------------------------------------------------------------------------- 1 | {{#click-outside action=(action "hide")}} 2 | 3 | {{fa-icon "folder"}} 4 | 5 | {{/click-outside}} 6 | 7 | {{#unless hidden}} 8 | {{project-switcher-menu user=user}} 9 | {{/unless}} 10 | -------------------------------------------------------------------------------- /app/templates/components/project-users.hbs: -------------------------------------------------------------------------------- 1 |

    People {{count}}

    2 | 15 | -------------------------------------------------------------------------------- /app/templates/components/related-skills.hbs: -------------------------------------------------------------------------------- 1 | {{skill-list-items 2 | isClickable=isClickable 3 | overflowHidden=overflowHidden 4 | skillItemHidden="skillItemHidden" 5 | skills=skills}} 6 |
    7 | {{#if overflowHidden}} 8 | show more 9 | {{else}} 10 | show less 11 | {{/if}} 12 |
    13 | -------------------------------------------------------------------------------- /app/templates/components/role-item.hbs: -------------------------------------------------------------------------------- 1 | {{#if selected}} 2 | 6 | {{else}} 7 | 11 | {{/if}} 12 | -------------------------------------------------------------------------------- /app/templates/components/select-inline-dropdown/list-item.hbs: -------------------------------------------------------------------------------- 1 |
    2 | 3 |
    4 |
    5 | 6 | {{{highlight-substrings primaryText lastSearchedText}}} 7 | 8 | 9 | {{{highlight-substrings secondaryText lastSearchedText}}} 10 | 11 |
    12 | -------------------------------------------------------------------------------- /app/templates/components/select/country-select.hbs: -------------------------------------------------------------------------------- 1 | {{#x-select value=country on-change=(action onChange) as |xs| }} 2 | {{#each countryOptions as |countryOption|}} 3 | {{#xs.option value=countryOption.id}}{{countryOption.name}}{{/xs.option}} 4 | {{/each}} 5 | {{/x-select}} 6 | -------------------------------------------------------------------------------- /app/templates/components/select/github-repo.hbs: -------------------------------------------------------------------------------- 1 | {{#x-select tabindex=tabindex value=selectedRepo action=onSelected as |xs|}} 2 | {{#xs.option value=null}}Don't sync (default){{/xs.option}} 3 | {{#each githubRepos as |githubRepo|}} 4 | {{#xs.option value=githubRepo}}{{githubRepo.name}}{{/xs.option}} 5 | {{/each}} 6 | {{/x-select}} 7 | -------------------------------------------------------------------------------- /app/templates/components/select/state-select.hbs: -------------------------------------------------------------------------------- 1 | {{#x-select value=state on-change=(action onChange) as |xs| }} 2 | {{#each stateOptions as |stateOption|}} 3 | {{#xs.option value=stateOption.id}}{{stateOption.name}}{{/xs.option}} 4 | {{/each}} 5 | {{/x-select}} -------------------------------------------------------------------------------- /app/templates/components/settings-menu.hbs: -------------------------------------------------------------------------------- 1 |
    2 | 10 |
    11 | -------------------------------------------------------------------------------- /app/templates/components/skill-button.hbs: -------------------------------------------------------------------------------- 1 | {{#if iconBefore}} 2 | 3 | {{/if}} 4 | {{skill.title}} 5 | {{#if iconAfter}} 6 | 7 | {{/if}} 8 | -------------------------------------------------------------------------------- /app/templates/components/skill-list-item-link.hbs: -------------------------------------------------------------------------------- 1 | {{skill.title}} 2 | -------------------------------------------------------------------------------- /app/templates/components/skill-list-item.hbs: -------------------------------------------------------------------------------- 1 | {{#if canClick}} 2 | {{skill-list-item-link matched=matched skill=skill toggleSkill=(action toggleSkill)}} 3 | {{else}} 4 | {{skill.title}} 5 | {{/if}} 6 | -------------------------------------------------------------------------------- /app/templates/components/skill-list-items.hbs: -------------------------------------------------------------------------------- 1 | {{#each sortedSkills as |skill|}} 2 | {{skill-list-item isClickable=isClickable skill=skill action="skillItemHidden"}} 3 | {{/each}} 4 | -------------------------------------------------------------------------------- /app/templates/components/skills-typeahead-result.hbs: -------------------------------------------------------------------------------- 1 | {{{highlight-substrings skill.title query}}} 2 | -------------------------------------------------------------------------------- /app/templates/components/slugged-route-model-details.hbs: -------------------------------------------------------------------------------- 1 | {{#if sluggedRoute.organization}} 2 | {{title sluggedRoute.organization.name}} 3 | {{organization-profile organization=sluggedRoute.organization}} 4 | {{/if}} 5 | {{#if sluggedRoute.user}} 6 | {{#if user.name}} 7 | {{title sluggedRoute.user.name " (" sluggedRoute.user.atUsername ")"}} 8 | {{else}} 9 | {{title sluggedRoute.user.username " (" sluggedRoute.user.atUsername ")"}} 10 | {{/if}} 11 | {{user-details user=sluggedRoute.user}} 12 | {{/if}} 13 | -------------------------------------------------------------------------------- /app/templates/components/stripe-connect-button.hbs: -------------------------------------------------------------------------------- 1 | Connect with Stripe 2 | -------------------------------------------------------------------------------- /app/templates/components/submittable-textarea.hbs: -------------------------------------------------------------------------------- 1 | {{yield}} -------------------------------------------------------------------------------- /app/templates/components/svg/sprite-icon.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/templates/components/task-card/user/selected-item.hbs: -------------------------------------------------------------------------------- 1 | {{#if select.selected}} 2 | 3 | {{#tooltip-on-component 4 | class='tooltip' 5 | effect='none' 6 | enableLazyRendering=true 7 | isShown=tooltipShown 8 | keepInWindow=true 9 | side='bottom' 10 | }} 11 | Assigned to {{select.selected.username}} 12 | {{/tooltip-on-component}} 13 | {{/if}} 14 | -------------------------------------------------------------------------------- /app/templates/components/task-comment-list.hbs: -------------------------------------------------------------------------------- 1 | {{#each (sort-by "createdAt:asc" comments) as |comment|}} 2 | {{comment-item comment=comment saveError=onSaveError}} 3 | {{/each}} 4 | -------------------------------------------------------------------------------- /app/templates/components/task-header.hbs: -------------------------------------------------------------------------------- 1 | {{task-title task=task saveTask=saveTask}} 2 | -------------------------------------------------------------------------------- /app/templates/components/task-list-cards.hbs: -------------------------------------------------------------------------------- 1 | {{#each orderedTasks as |task|}} 2 | {{task-card 3 | clickedTask=clickedTask 4 | task=task 5 | taskUser=task.userTask.user 6 | users=users 7 | }} 8 | {{/each}} 9 | -------------------------------------------------------------------------------- /app/templates/components/task-status-button.hbs: -------------------------------------------------------------------------------- 1 | {{#if isOpen}} 2 | 3 | {{else}} 4 | 5 | {{/if}} 6 | -------------------------------------------------------------------------------- /app/templates/components/task/archive-task.hbs: -------------------------------------------------------------------------------- 1 | {{#if task.archived}} 2 | {{fa-icon "archive"}} Archived 3 | {{else if canArchive}} 4 | {{fa-icon "archive"}} Archive 5 | {{/if}} 6 | -------------------------------------------------------------------------------- /app/templates/components/task/sidebar/integrations-section.hbs: -------------------------------------------------------------------------------- 1 |
    2 |

    Integrations

    3 |
    4 | 5 | {{#if task.githubIssue}} 6 | {{github/issue-link 7 | githubIssue=task.githubIssue 8 | githubRepo=task.githubRepo 9 | size="large" 10 | }} 11 | {{else}} 12 |

    None yet

    13 | {{/if}} 14 | -------------------------------------------------------------------------------- /app/templates/components/team-member.hbs: -------------------------------------------------------------------------------- 1 | 2 |

    {{name}}

    3 | -------------------------------------------------------------------------------- /app/templates/components/user-byline.hbs: -------------------------------------------------------------------------------- 1 | {{user/display-username user=user}} commented {{moment-from-now createdAt}} 2 | 3 | {{#if (eq createdFrom 'github')}} — from GitHub{{/if}} 4 | 5 | -------------------------------------------------------------------------------- /app/templates/components/user-details.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{user-sidebar user=user}} 3 |
    4 | {{user-projects-list user=user projects=userProjects}} 5 | 6 |
    7 |

    Skills

    8 | {{user/skills-list data-test-user-skills-list user=user}} 9 |
    10 |
    11 |
    12 | -------------------------------------------------------------------------------- /app/templates/components/user-menu.hbs: -------------------------------------------------------------------------------- 1 | {{#click-outside action=(action "hide")}} 2 | 3 | {{user.atUsername}} 4 | 5 | 6 | {{/click-outside}} 7 | 8 | {{user-dropdown user=user action="hide"}} 9 | -------------------------------------------------------------------------------- /app/templates/components/user/display-username.hbs: -------------------------------------------------------------------------------- 1 | {{#if username}} 2 | {{#link-to data-test-username 'slugged-route' username class="username"}}{{username}}{{/link-to}} 3 | {{else if githubUsername}} 4 | GitHub user {{githubUsername}} 5 | {{/if}} 6 | -------------------------------------------------------------------------------- /app/templates/components/user/skills-list.hbs: -------------------------------------------------------------------------------- 1 | {{#if user.userSkills}} 2 | 7 | {{else}} 8 |

    9 | {{user.username}} hasn't added any skills yet. 10 |

    11 | {{/if}} 12 | -------------------------------------------------------------------------------- /app/templates/components/volunteer-headshot.hbs: -------------------------------------------------------------------------------- 1 | {{volunteerName}} 2 |

    {{volunteerName}}

    3 |

    {{userRole.role.name}}

    4 | -------------------------------------------------------------------------------- /app/templates/conversations/conversation.hbs: -------------------------------------------------------------------------------- 1 | {{conversations/conversation-thread 2 | conversation=conversation 3 | sortedConversationParts=conversation.sortedConversationParts 4 | send=(action send) 5 | }} 6 | {{conversations/project-details 7 | project=conversation.message.project 8 | }} 9 | -------------------------------------------------------------------------------- /app/templates/conversations/index.hbs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/app/templates/conversations/index.hbs -------------------------------------------------------------------------------- /app/templates/github.hbs: -------------------------------------------------------------------------------- 1 | {{outlet}} 2 | -------------------------------------------------------------------------------- /app/templates/head.hbs: -------------------------------------------------------------------------------- 1 | {{model.title}} 2 | {{head-tags headTags=model.headTags}} 3 | -------------------------------------------------------------------------------- /app/templates/loading.hbs: -------------------------------------------------------------------------------- 1 | {{loading-spinner}} 2 | -------------------------------------------------------------------------------- /app/templates/login.hbs: -------------------------------------------------------------------------------- 1 | {{title "Sign in"}} 2 | 3 |
    4 | {{login-form}} 5 |
    6 | -------------------------------------------------------------------------------- /app/templates/organization.hbs: -------------------------------------------------------------------------------- 1 | {{outlet}} -------------------------------------------------------------------------------- /app/templates/organizations/slugged-route.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{organization-header organization=model}} 3 |
    4 | 5 | {{organization-menu organization=model}} 6 | 7 | {{outlet}} 8 | -------------------------------------------------------------------------------- /app/templates/organizations/slugged-route/settings.hbs: -------------------------------------------------------------------------------- 1 | {{outlet}} 2 | -------------------------------------------------------------------------------- /app/templates/organizations/slugged-route/settings/profile.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | 8 |
    9 | {{organization-settings-form organization=model}} 10 |
    11 |
    12 |
    13 |
    14 | -------------------------------------------------------------------------------- /app/templates/password/forgot.hbs: -------------------------------------------------------------------------------- 1 | {{password/forgot-password 2 | forgotPassword=(route-action "forgotPassword") 3 | }} 4 | -------------------------------------------------------------------------------- /app/templates/password/reset.hbs: -------------------------------------------------------------------------------- 1 | {{password/reset-password 2 | resetPassword=(route-action "resetPassword") 3 | }} 4 | -------------------------------------------------------------------------------- /app/templates/project.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{project-header project=model}} 3 |
    4 | 5 | {{project-menu project=model}} 6 | 7 | {{#if session.isAuthenticated}} 8 | {{#if (can "manage project" model)}} 9 | {{project-notifications 10 | project=model 11 | submitForReview=(route-action "submitForReview" model) 12 | }} 13 | {{/if}} 14 | {{/if}} 15 | 16 | {{outlet}} 17 | -------------------------------------------------------------------------------- /app/templates/project/checkout.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{donation/project-header project=project}} 3 | {{#donation/donation-container 4 | card=user.stripePlatformCard 5 | donate=(action 'donate' amount user.stripePlatformCard) 6 | donationAmount=amount 7 | isProcessing=isProcessing 8 | projectTitle=project.title 9 | saveAndDonate=(action 'saveAndDonate' amount) 10 | }} 11 | {{#if error}} 12 | {{error-formatter error=error}} 13 | {{/if}} 14 | {{/donation/donation-container}} 15 |
    16 | -------------------------------------------------------------------------------- /app/templates/project/conversations/conversation.hbs: -------------------------------------------------------------------------------- 1 | {{conversations/conversation-thread 2 | conversation=conversation 3 | sortedConversationParts=conversation.sortedConversationParts 4 | send=(action send) 5 | }} 6 | {{conversations/user-details 7 | user=conversation.user 8 | }} 9 | -------------------------------------------------------------------------------- /app/templates/project/conversations/index.hbs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/app/templates/project/conversations/index.hbs -------------------------------------------------------------------------------- /app/templates/project/donate.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{donation/project-header project=project}} 3 | 4 | {{donations/create-donation 5 | amount=amount 6 | continue=(action "continueToCheckout") 7 | onAmountChanged=(action (mut amount)) 8 | }} 9 |
    10 | -------------------------------------------------------------------------------- /app/templates/project/settings.hbs: -------------------------------------------------------------------------------- 1 | {{! this template should be renamed project-settings for consistency }} 2 | 3 | {{title "Settings" " « " model.title " by " model.organization.name}} 4 | 5 |
    6 |
    7 | {{outlet}} 8 |
    9 |
    10 | -------------------------------------------------------------------------------- /app/templates/project/tasks.hbs: -------------------------------------------------------------------------------- 1 | {{title "Tasks" " « " model.title " by " model.organization.name}} 2 | 3 |
    4 | {{project-header project=model}} 5 |
    6 | 7 | {{project-menu project=model wide=true}} 8 | 9 | {{outlet}} 10 | -------------------------------------------------------------------------------- /app/templates/project/thank-you.hbs: -------------------------------------------------------------------------------- 1 |
    2 | {{donation/project-header project=model}} 3 | {{thank-you-container project=model}} 4 |
    5 | -------------------------------------------------------------------------------- /app/templates/projects-list.hbs: -------------------------------------------------------------------------------- 1 | {{title "Projects"}} 2 | 3 |
    4 | {{#each projects as |project|}} 5 | {{#link-to 'project' project.organization.slug project.slug class="project-card-wrapper"}} 6 | {{project-card project=project}} 7 | {{/link-to}} 8 | {{/each}} 9 |
    10 | -------------------------------------------------------------------------------- /app/templates/projects.hbs: -------------------------------------------------------------------------------- 1 | {{outlet}} 2 | -------------------------------------------------------------------------------- /app/templates/projects/index.hbs: -------------------------------------------------------------------------------- 1 | {{project-list projects=projects}} 2 | -------------------------------------------------------------------------------- /app/templates/settings.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |

    Settings

    4 |
    5 | 6 | {{settings-menu}} 7 | 8 | {{outlet}} 9 |
    10 | -------------------------------------------------------------------------------- /app/templates/signup.hbs: -------------------------------------------------------------------------------- 1 | {{title "Sign up"}} 2 | 3 | {{signup-form 4 | handleErrors=(route-action "handleErrors") 5 | user=model 6 | signIn=(route-action "signIn")}} 7 | -------------------------------------------------------------------------------- /app/templates/slugged-route.hbs: -------------------------------------------------------------------------------- 1 | {{slugged-route-model-details sluggedRoute=model}} 2 | -------------------------------------------------------------------------------- /app/templates/start.hbs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | {{outlet}} 4 |
    5 |
    6 | -------------------------------------------------------------------------------- /app/templates/start/interests.hbs: -------------------------------------------------------------------------------- 1 |
    2 |

    What are you interested in?

    3 |

    We'll help you find projects you'll care about.

    4 |
    5 | 6 | {{categories-list categories=model}} 7 | 8 | 12 | -------------------------------------------------------------------------------- /app/templates/user.hbs: -------------------------------------------------------------------------------- 1 | {{outlet}} 2 | -------------------------------------------------------------------------------- /app/transforms/dollar-cents.js: -------------------------------------------------------------------------------- 1 | import DS from 'ember-data'; 2 | 3 | const { Transform } = DS; 4 | 5 | export default Transform.extend({ 6 | deserialize(serialized) { 7 | return serialized / 100; 8 | }, 9 | 10 | serialize(deserialized) { 11 | return Math.floor(deserialized * 100); 12 | } 13 | }); 14 | -------------------------------------------------------------------------------- /app/utils/array-utils.js: -------------------------------------------------------------------------------- 1 | export function range(start, end) { 2 | let range = []; 3 | for (let i = start; i <= end; i++) { 4 | range.push(i); 5 | } 6 | return range; 7 | } 8 | -------------------------------------------------------------------------------- /app/utils/friendly-error.js: -------------------------------------------------------------------------------- 1 | export default function FriendlyError(message) { 2 | this.isFriendlyError = true; 3 | this.message = message; 4 | } 5 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "code-corps-ember", 3 | "dependencies": { 4 | "Faker": "^3.1.0", 5 | "zxcvbn": "^4.4.2", 6 | "typed.js": "^1.1.1", 7 | "dragula": "^3.5.4" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /config/coverage.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | module.exports = { 3 | parallel: true, 4 | useBabelInstrumenter: true 5 | }; 6 | -------------------------------------------------------------------------------- /config/targets.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | browsers: [ 3 | 'ie 9', 4 | 'last 1 Chrome versions', 5 | 'last 1 Firefox versions', 6 | 'last 1 Safari versions' 7 | ] 8 | }; 9 | -------------------------------------------------------------------------------- /docs/assets/branch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/docs/assets/branch.png -------------------------------------------------------------------------------- /docs/assets/code-corps-ember.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/docs/assets/code-corps-ember.png -------------------------------------------------------------------------------- /docs/assets/master.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/docs/assets/master.png -------------------------------------------------------------------------------- /docs/assets/rebase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/docs/assets/rebase.png -------------------------------------------------------------------------------- /inch.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": { 3 | "included": [ 4 | "app/**/*.js" 5 | ], 6 | "excluded": [ 7 | "app/app.js", 8 | "app/resolver.js", 9 | "app/router.js", 10 | "app/services/ajax.js", 11 | "app/services/raven.js", 12 | "app/services/session.js" 13 | ] 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /mirage/factories/category.js: -------------------------------------------------------------------------------- 1 | import { Factory, faker } from 'ember-cli-mirage'; 2 | import Ember from 'ember'; 3 | 4 | const { String } = Ember; 5 | 6 | export default Factory.extend({ 7 | name() { 8 | return faker.name.jobArea(); 9 | }, 10 | slug() { 11 | if (this.name) { 12 | return String.dasherize(this.name.toLowerCase()); 13 | } 14 | } 15 | }); 16 | -------------------------------------------------------------------------------- /mirage/factories/comment.js: -------------------------------------------------------------------------------- 1 | import { Factory, faker } from 'ember-cli-mirage'; 2 | import moment from 'moment'; 3 | 4 | export default Factory.extend({ 5 | body: faker.lorem.paragraph, 6 | createdAt(i) { 7 | return moment().subtract(i, 'days'); 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /mirage/factories/conversation-part.js: -------------------------------------------------------------------------------- 1 | import { Factory, faker } from 'ember-cli-mirage'; 2 | import moment from 'moment'; 3 | 4 | export default Factory.extend({ 5 | body: faker.lorem.paragraph, 6 | 7 | insertedAt(i) { 8 | return moment().subtract(i, 'days'); 9 | }, 10 | readAt(i) { 11 | return moment().subtract(i, 'days'); 12 | }, 13 | updatedAt(i) { 14 | return moment().subtract(i, 'days'); 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /mirage/factories/donation-goal.js: -------------------------------------------------------------------------------- 1 | import { Factory, faker } from 'ember-cli-mirage'; 2 | 3 | export default Factory.extend({ 4 | amount: faker.list.cycle(10000, 20000, 15020), 5 | current: true, 6 | description: faker.lorem.paragraph 7 | }); 8 | -------------------------------------------------------------------------------- /mirage/factories/github-app-installation.js: -------------------------------------------------------------------------------- 1 | import { Factory, faker } from 'ember-cli-mirage'; 2 | 3 | export default Factory.extend({ 4 | githubAccountAvatarUrl: faker.image.imageUrl, 5 | githubAccountLogin: faker.internet.domainWord, 6 | githubAccountType: faker.list.cycle('Organization', 'User') 7 | }); 8 | -------------------------------------------------------------------------------- /mirage/factories/github-event.js: -------------------------------------------------------------------------------- 1 | import { Factory, faker } from 'ember-cli-mirage'; 2 | import moment from 'moment'; 3 | 4 | export default Factory.extend({ 5 | action: faker.hacker.verb, 6 | eventType: faker.hacker.noun, 7 | failureReason: faker.hacker.phrase, 8 | insertedAt: moment.utc(), 9 | status: faker.hacker.ingverb 10 | }); 11 | -------------------------------------------------------------------------------- /mirage/factories/github-repo.js: -------------------------------------------------------------------------------- 1 | import { Factory, faker } from 'ember-cli-mirage'; 2 | 3 | export default Factory.extend({ 4 | name: faker.internet.domainWord 5 | }); 6 | -------------------------------------------------------------------------------- /mirage/factories/message.js: -------------------------------------------------------------------------------- 1 | import { Factory, faker } from 'ember-cli-mirage'; 2 | 3 | export default Factory.extend({ 4 | body: faker.lorem.paragraph, 5 | subject: faker.lorem.sentence 6 | }); 7 | -------------------------------------------------------------------------------- /mirage/factories/project-github-repo.js: -------------------------------------------------------------------------------- 1 | import { Factory } from 'ember-cli-mirage'; 2 | 3 | export default Factory.extend({ 4 | // ensures creation of associated records if they were not otherwise specified 5 | afterCreate(record, server) { 6 | if (!record.githubRepo) { 7 | record.githubRepo = server.create('github-repo'); 8 | record.save(); 9 | } 10 | 11 | if (!record.project) { 12 | record.project = server.create('project'); 13 | record.save(); 14 | } 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /mirage/factories/project-user.js: -------------------------------------------------------------------------------- 1 | import { Factory } from 'ember-cli-mirage'; 2 | 3 | export default Factory.extend({ 4 | role: 'owner', 5 | 6 | // ensures creation of associated records if they were not otherwise specified 7 | afterCreate(projectUser, server) { 8 | if (!projectUser.user) { 9 | projectUser.user = server.create('user'); 10 | projectUser.save(); 11 | } 12 | 13 | if (!projectUser.project) { 14 | projectUser.project = server.create('project'); 15 | projectUser.save(); 16 | } 17 | } 18 | }); 19 | -------------------------------------------------------------------------------- /mirage/factories/role.js: -------------------------------------------------------------------------------- 1 | import { Factory, faker } from 'ember-cli-mirage'; 2 | import Ember from 'ember'; 3 | 4 | const { String } = Ember; 5 | 6 | export default Factory.extend({ 7 | name() { 8 | return faker.name.jobArea(); 9 | }, 10 | slug() { 11 | if (this.name) { 12 | return String.dasherize(this.name.toLowerCase()); 13 | } 14 | } 15 | }); 16 | -------------------------------------------------------------------------------- /mirage/factories/slugged-route.js: -------------------------------------------------------------------------------- 1 | import { Factory } from 'ember-cli-mirage'; 2 | 3 | export default Factory.extend({ 4 | }); 5 | -------------------------------------------------------------------------------- /mirage/factories/task-list.js: -------------------------------------------------------------------------------- 1 | import { Factory } from 'ember-cli-mirage'; 2 | 3 | export default Factory.extend({ 4 | order() { 5 | return (this.position || 0) * 100; 6 | }, 7 | position(i) { 8 | return i + 1; 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /mirage/serializers/application.js: -------------------------------------------------------------------------------- 1 | import { JSONAPISerializer } from 'ember-cli-mirage'; 2 | 3 | export default JSONAPISerializer.extend({ 4 | }); 5 | -------------------------------------------------------------------------------- /mirage/serializers/comment.js: -------------------------------------------------------------------------------- 1 | import { JSONAPISerializer } from 'ember-cli-mirage'; 2 | 3 | export default JSONAPISerializer.extend({ 4 | include: ['comment-user-mentions'] 5 | }); 6 | -------------------------------------------------------------------------------- /mirage/serializers/github-event.js: -------------------------------------------------------------------------------- 1 | import MirageApplicationSerializer from './application'; 2 | 3 | export default MirageApplicationSerializer.extend({ 4 | serialize(modelOrCollection) { 5 | let response = MirageApplicationSerializer.prototype.serialize.call(this, ...arguments); 6 | 7 | // simulate the pagination links object 8 | if (modelOrCollection.meta) { 9 | response.links = modelOrCollection.meta; 10 | } 11 | 12 | return response; 13 | } 14 | }); 15 | -------------------------------------------------------------------------------- /public/assets/images/code-corps-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/code-corps-github.png -------------------------------------------------------------------------------- /public/assets/images/code-corps-github@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/code-corps-github@2x.png -------------------------------------------------------------------------------- /public/assets/images/github-sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/github-sync.png -------------------------------------------------------------------------------- /public/assets/images/github-sync@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/github-sync@2x.png -------------------------------------------------------------------------------- /public/assets/images/icons-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons-header.png -------------------------------------------------------------------------------- /public/assets/images/icons-header@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons-header@2x.png -------------------------------------------------------------------------------- /public/assets/images/icons/about-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/about-sprite.png -------------------------------------------------------------------------------- /public/assets/images/icons/about-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/about-sprite@2x.png -------------------------------------------------------------------------------- /public/assets/images/icons/button-spinner-on-clear.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/button-spinner-on-clear.gif -------------------------------------------------------------------------------- /public/assets/images/icons/button-spinner-on-clear@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/button-spinner-on-clear@2x.gif -------------------------------------------------------------------------------- /public/assets/images/icons/button-spinner-on-default.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/button-spinner-on-default.gif -------------------------------------------------------------------------------- /public/assets/images/icons/button-spinner-on-default@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/button-spinner-on-default@2x.gif -------------------------------------------------------------------------------- /public/assets/images/icons/categories.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/categories.png -------------------------------------------------------------------------------- /public/assets/images/icons/categories@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/categories@2x.png -------------------------------------------------------------------------------- /public/assets/images/icons/emoji-1f64c-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/emoji-1f64c-sprite.png -------------------------------------------------------------------------------- /public/assets/images/icons/emoji-1f64c-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/emoji-1f64c-sprite@2x.png -------------------------------------------------------------------------------- /public/assets/images/icons/fireworks-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/fireworks-small.png -------------------------------------------------------------------------------- /public/assets/images/icons/fireworks-small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/fireworks-small@2x.png -------------------------------------------------------------------------------- /public/assets/images/icons/integration-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/integration-github.png -------------------------------------------------------------------------------- /public/assets/images/icons/integration-github@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/integration-github@2x.png -------------------------------------------------------------------------------- /public/assets/images/icons/interests.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/interests.png -------------------------------------------------------------------------------- /public/assets/images/icons/interests@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/interests@2x.png -------------------------------------------------------------------------------- /public/assets/images/icons/roles-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/roles-sprite.png -------------------------------------------------------------------------------- /public/assets/images/icons/roles-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/roles-sprite@2x.png -------------------------------------------------------------------------------- /public/assets/images/icons/spinner-large.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/spinner-large.gif -------------------------------------------------------------------------------- /public/assets/images/icons/spinner-large@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/spinner-large@2x.gif -------------------------------------------------------------------------------- /public/assets/images/icons/spinner-small.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/spinner-small.gif -------------------------------------------------------------------------------- /public/assets/images/icons/spinner-small@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/spinner-small@2x.gif -------------------------------------------------------------------------------- /public/assets/images/icons/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/sprite.png -------------------------------------------------------------------------------- /public/assets/images/icons/sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/icons/sprite@2x.png -------------------------------------------------------------------------------- /public/assets/images/people-signup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/people-signup.png -------------------------------------------------------------------------------- /public/assets/images/people-signup@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/public/assets/images/people-signup@2x.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # http://www.robotstxt.org 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /tests/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | embertest: true 4 | }, 5 | parserOptions: { 6 | ecmaVersion: 8 7 | }, 8 | globals: { 9 | setBreakpoint: true 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /tests/acceptance/code-theme-test.js: -------------------------------------------------------------------------------- 1 | import { test } from 'qunit'; 2 | import moduleForAcceptance from 'code-corps-ember/tests/helpers/module-for-acceptance'; 3 | import indexPage from '../pages/index'; 4 | 5 | moduleForAcceptance('Acceptance | Code Theme'); 6 | 7 | test('Code theme class exists on the main container', function(assert) { 8 | assert.expect(1); 9 | 10 | indexPage.visit(); 11 | 12 | andThen(function() { 13 | assert.ok(indexPage.isLightTheme); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/acceptance/svg-sprite-map-test.js: -------------------------------------------------------------------------------- 1 | import { test } from 'qunit'; 2 | import moduleForAcceptance from 'code-corps-ember/tests/helpers/module-for-acceptance'; 3 | import indexPage from '../pages/index'; 4 | 5 | moduleForAcceptance('Acceptance | Sprite Map'); 6 | 7 | test('the application renders the sprite map', function(assert) { 8 | assert.expect(1); 9 | 10 | indexPage.visit(); 11 | 12 | andThen(function() { 13 | assert.ok(indexPage.spriteMap.isVisible); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/fixtures/stripe/failed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/tests/fixtures/stripe/failed.png -------------------------------------------------------------------------------- /tests/fixtures/stripe/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/tests/fixtures/stripe/success.png -------------------------------------------------------------------------------- /tests/helpers/destroy-app.js: -------------------------------------------------------------------------------- 1 | import { run } from '@ember/runloop'; 2 | 3 | export default function destroyApp(application) { 4 | run(application, 'destroy'); 5 | server.shutdown(); 6 | } 7 | -------------------------------------------------------------------------------- /tests/helpers/project-user.js: -------------------------------------------------------------------------------- 1 | export default function projectUser(user, role = 'owner') { 2 | return { 3 | belongsTo() { 4 | return { 5 | id() { 6 | return user.id; 7 | } 8 | }; 9 | }, 10 | role, 11 | user 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /tests/helpers/remove-double-quotes.js: -------------------------------------------------------------------------------- 1 | export default function removeDoubleQuotes(string) { 2 | return string.replace(/"/g, ''); 3 | } 4 | -------------------------------------------------------------------------------- /tests/helpers/setup-mirage-for-integration.js: -------------------------------------------------------------------------------- 1 | import mirageInitializer from '../../initializers/ember-cli-mirage'; 2 | 3 | export default function startMirage(container) { 4 | mirageInitializer.initialize(container); 5 | } 6 | -------------------------------------------------------------------------------- /tests/pages/admin.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection, 3 | create, 4 | visitable 5 | } from 'ember-cli-page-object'; 6 | 7 | export default create({ 8 | visit: visitable('/admin'), 9 | flashMessages: collection('.flash-messages--full-width .flash-message') 10 | }); 11 | -------------------------------------------------------------------------------- /tests/pages/component/donation-goals-activation.js: -------------------------------------------------------------------------------- 1 | export default { 2 | scope: '.donation-goals-activation', 3 | 4 | activateDonationsButton: { 5 | scope: '[data-test-activate-donations]' 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /tests/pages/component/user-dropdown.js: -------------------------------------------------------------------------------- 1 | import { 2 | clickable, 3 | hasClass 4 | } from 'ember-cli-page-object'; 5 | 6 | export default { 7 | scope: '.dropdown-menu', 8 | 9 | clickDropdownMenu: clickable('.dropdown-menu'), 10 | dropdownIsHidden: hasClass('menu-hidden') 11 | }; 12 | -------------------------------------------------------------------------------- /tests/pages/components/_suggestions-area.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection, 3 | hasClass, 4 | isVisible, 5 | text 6 | } from 'ember-cli-page-object'; 7 | 8 | export default { 9 | scope: '.suggestions p', 10 | 11 | ok: hasClass('ok'), 12 | notOk: hasClass('not-ok'), 13 | visible: isVisible(), 14 | 15 | suggestions: collection('li', { text: text() }) 16 | }; 17 | -------------------------------------------------------------------------------- /tests/pages/components/animated-high-five.js: -------------------------------------------------------------------------------- 1 | import { 2 | clickable, hasClass 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.animated-high-five', 7 | 8 | click: clickable(''), 9 | isFollowOnAnimation: hasClass('follow-on-animation'), 10 | isInitialAnimation: hasClass('initial-animation') 11 | }; 12 | -------------------------------------------------------------------------------- /tests/pages/components/categories-list.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection, 3 | text 4 | } from 'ember-cli-page-object'; 5 | 6 | export default { 7 | scope: '.start__interests', 8 | items: collection('.category-item', { name: text('button') }) 9 | }; 10 | -------------------------------------------------------------------------------- /tests/pages/components/category-checkboxes.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection, 3 | property, 4 | text 5 | } from 'ember-cli-page-object'; 6 | 7 | export default { 8 | scope: '.category-checkboxes', 9 | 10 | checkboxes: collection('li', { 11 | isChecked: property('checked', 'input'), 12 | label: { scope: 'label', name: text() } 13 | }) 14 | }; 15 | -------------------------------------------------------------------------------- /tests/pages/components/code-theme-selector.js: -------------------------------------------------------------------------------- 1 | import { 2 | clickable, 3 | hasClass, 4 | isVisible 5 | } from 'ember-cli-page-object'; 6 | 7 | export default { 8 | scope: '.code-theme-selector', 9 | 10 | clickable, 11 | 12 | isDark: hasClass('dark'), 13 | isLight: hasClass('light'), 14 | isVisible: isVisible() 15 | }; 16 | -------------------------------------------------------------------------------- /tests/pages/components/conversations/conversation-composer.js: -------------------------------------------------------------------------------- 1 | import { attribute } from 'ember-cli-page-object'; 2 | import submittableTextarea from 'code-corps-ember/tests/pages/components/submittable-textarea'; 3 | 4 | export default { 5 | scope: '.conversation-composer', 6 | 7 | submittableTextarea, 8 | 9 | submitButton: { 10 | scope: '[data-test-submit-button]', 11 | isDisabled: attribute('disabled') 12 | } 13 | }; 14 | -------------------------------------------------------------------------------- /tests/pages/components/conversations/conversation-list-item-with-project.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.conversation-list-item', 7 | 8 | project: { 9 | photo: { 10 | scope: '[data-test-project-icon]', 11 | url: attribute('src') 12 | }, 13 | 14 | title: { 15 | scope: '[data-test-project-title]' 16 | } 17 | }, 18 | 19 | updatedAt: { 20 | scope: '[data-test-updated-at]' 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /tests/pages/components/conversations/conversation-thread.js: -------------------------------------------------------------------------------- 1 | import { collection } from 'ember-cli-page-object'; 2 | import conversationComposer from 'code-corps-ember/tests/pages/components/conversations/conversation-composer'; 3 | import conversationPart from 'code-corps-ember/tests/pages/components/conversations/conversation-part'; 4 | 5 | export default { 6 | scope: '.conversation-thread', 7 | conversationComposer, 8 | conversationParts: collection(`.conversation-thread__messages ${conversationPart.scope}`, conversationPart) 9 | }; 10 | -------------------------------------------------------------------------------- /tests/pages/components/conversations/user-details.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute 3 | } from 'ember-cli-page-object'; 4 | import userSkillsList from 'code-corps-ember/tests/pages/components/user/skills-list'; 5 | 6 | export default { 7 | scope: '.conversation-details', 8 | 9 | name: { 10 | scope: '[data-test-name]' 11 | }, 12 | 13 | photo: { 14 | scope: 'img', 15 | url: attribute('src') 16 | }, 17 | 18 | username: { 19 | scope: '[data-test-username]' 20 | }, 21 | 22 | userSkillsList 23 | }; 24 | -------------------------------------------------------------------------------- /tests/pages/components/donation-goal-edit.js: -------------------------------------------------------------------------------- 1 | import { 2 | clickable, 3 | fillable, 4 | isVisible 5 | } from 'ember-cli-page-object'; 6 | 7 | export default { 8 | scope: '.donation-goal-edit', 9 | 10 | cancelButtonIsVisible: isVisible('.cancel'), 11 | 12 | clickCancel: clickable('.cancel'), 13 | clickSave: clickable('.save'), 14 | 15 | fillInAmount: fillable('.amount'), 16 | fillInDescription: fillable('.description') 17 | }; 18 | -------------------------------------------------------------------------------- /tests/pages/components/donation-goal.js: -------------------------------------------------------------------------------- 1 | import { 2 | clickable, 3 | isVisible, 4 | text 5 | } from 'ember-cli-page-object'; 6 | 7 | export default { 8 | scope: '.donation-goal', 9 | 10 | amount: { 11 | scope: '.amount', 12 | text: text() 13 | }, 14 | 15 | click: clickable(), 16 | 17 | description: { 18 | scope: '.description', 19 | text: text() 20 | }, 21 | 22 | editButton: { 23 | scope: '.edit', 24 | isVisible: isVisible() 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /tests/pages/components/donation/card-item.js: -------------------------------------------------------------------------------- 1 | import { text } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.card-item', 5 | 6 | cardDescription: text('') 7 | }; 8 | -------------------------------------------------------------------------------- /tests/pages/components/donation/card-logo.js: -------------------------------------------------------------------------------- 1 | import { contains } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.card-logo__container', 5 | 6 | isAmex: contains('g#amex'), 7 | isDiners: contains('g#diners'), 8 | isDiscover: contains('g#discover'), 9 | isJCB: contains('g#jcb'), 10 | isMasterCard: contains('g#mastercard'), 11 | isVisa: contains('g#visa'), 12 | isUnknown: contains('g#unknown') 13 | }; 14 | -------------------------------------------------------------------------------- /tests/pages/components/donation/project-header.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute, 3 | text 4 | } from 'ember-cli-page-object'; 5 | 6 | export default { 7 | description: { 8 | scope: 'p', 9 | text: text() 10 | }, 11 | 12 | icon: { 13 | scope: 'img.icon', 14 | src: attribute('src') 15 | }, 16 | 17 | title: { 18 | scope: 'h2', 19 | text: text() 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /tests/pages/components/donations/donation-amount-button.js: -------------------------------------------------------------------------------- 1 | import { clickable, hasClass, isVisible } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.preset-amount', 5 | 6 | isRendered: isVisible(''), 7 | isActive: hasClass('default', ''), 8 | isInactive: hasClass('clear', ''), 9 | 10 | clickButton: clickable('') 11 | }; 12 | -------------------------------------------------------------------------------- /tests/pages/components/donations/donation-status.js: -------------------------------------------------------------------------------- 1 | import { clickable, isVisible } from 'ember-cli-page-object'; 2 | import showDonationComponent from './show-donation'; 3 | 4 | export default { 5 | scope: '.donation-status', 6 | 7 | clickLink: clickable('a'), 8 | 9 | rendersLink: isVisible('a'), 10 | rendersShowDonation: isVisible('.show-donation'), 11 | 12 | showDonation: showDonationComponent 13 | }; 14 | -------------------------------------------------------------------------------- /tests/pages/components/donations/show-donation.js: -------------------------------------------------------------------------------- 1 | import { text } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.show-donation', 5 | infoText: text('.info') 6 | }; 7 | -------------------------------------------------------------------------------- /tests/pages/components/drag-zone.js: -------------------------------------------------------------------------------- 1 | import { 2 | triggerable 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | dragleave: triggerable('dragleave', '.drag-zone'), 7 | dragover: triggerable('dragover', '.drag-zone') 8 | }; 9 | -------------------------------------------------------------------------------- /tests/pages/components/error-formatter.js: -------------------------------------------------------------------------------- 1 | import { collection, text } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.error-formatter', 5 | errors: collection('.error', { message: text() }) 6 | }; 7 | -------------------------------------------------------------------------------- /tests/pages/components/error-wrapper.js: -------------------------------------------------------------------------------- 1 | import { 2 | clickable, 3 | isVisible, 4 | text 5 | } from 'ember-cli-page-object'; 6 | 7 | export default { 8 | scope: '.error-wrapper', 9 | 10 | body: text('p:first'), 11 | 12 | button: { 13 | scope: 'a.button', 14 | text: text() 15 | }, 16 | 17 | clickLink: clickable('a'), 18 | 19 | has404Image: isVisible('.not-found-img'), 20 | hasMaintenanceIcon: isVisible('.maintenance-icon'), 21 | hasServerErrorImage: isVisible('.server-error-img'), 22 | 23 | title: text('h1') 24 | }; 25 | -------------------------------------------------------------------------------- /tests/pages/components/flash-messages/fixed-position.js: -------------------------------------------------------------------------------- 1 | import { 2 | text 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.flash-messages .fixed-flash .fixed-flash-inner', 7 | 8 | message: text('p') 9 | }; 10 | -------------------------------------------------------------------------------- /tests/pages/components/flash-messages/full-width.js: -------------------------------------------------------------------------------- 1 | import { 2 | text 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.flash-messages .container', 7 | 8 | message: text('p') 9 | }; 10 | -------------------------------------------------------------------------------- /tests/pages/components/github-connect-state.js: -------------------------------------------------------------------------------- 1 | import githubConnect from 'code-corps-ember/tests/pages/components/github-connect'; 2 | import { attribute } from 'ember-cli-page-object'; 3 | 4 | export default { 5 | scope: '.github-connect-state', 6 | githubConnect, 7 | githubUserInfo: { 8 | scope: '.github-connect-state__user', 9 | avatar: { 10 | scope: 'img', 11 | url: attribute('src') 12 | } 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /tests/pages/components/github-connect.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.github-connect', 7 | href: attribute('href') 8 | }; 9 | -------------------------------------------------------------------------------- /tests/pages/components/github/install-link.js: -------------------------------------------------------------------------------- 1 | export default { 2 | scope: '[data-test-installation-link]' 3 | }; 4 | -------------------------------------------------------------------------------- /tests/pages/components/github/pull-request-icon.js: -------------------------------------------------------------------------------- 1 | import spriteIcon from 'code-corps-ember/tests/pages/components/svg/sprite-icon'; 2 | 3 | export default { 4 | scope: '.github__pull-request-icon', 5 | 6 | loadingIcon: { 7 | scope: '[data-test-loading]' 8 | }, 9 | 10 | spriteIcon 11 | }; 12 | -------------------------------------------------------------------------------- /tests/pages/components/github/repo-sync.js: -------------------------------------------------------------------------------- 1 | import progressBar from 'code-corps-ember/tests/pages/components/progress-bar'; 2 | import spriteIcon from 'code-corps-ember/tests/pages/components/svg/sprite-icon'; 3 | 4 | export default { 5 | scope: '.github__repo-sync', 6 | 7 | progressBar, 8 | 9 | progressText: { 10 | scope: '[data-test-text]' 11 | }, 12 | 13 | spriteIcon 14 | }; 15 | -------------------------------------------------------------------------------- /tests/pages/components/github/unconnected-installation.js: -------------------------------------------------------------------------------- 1 | import { attribute } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.github-app-installation.unconnected', 5 | 6 | avatar: { 7 | scope: '[data-test-avatar]', 8 | url: attribute('src') 9 | }, 10 | 11 | login: { 12 | scope: '[data-test-login]' 13 | }, 14 | 15 | connect: { 16 | scope: '[data-test-connect]' 17 | } 18 | }; 19 | -------------------------------------------------------------------------------- /tests/pages/components/modal-confirm.js: -------------------------------------------------------------------------------- 1 | import { 2 | clickable, 3 | create, 4 | isHidden, 5 | text 6 | } from 'ember-cli-page-object'; 7 | 8 | export default create({ 9 | cancel: clickable('a#cancel'), 10 | cancelText: text('a#cancel'), 11 | dialogText: text('p', { scope: '.dialog-text' }), 12 | dialogTextIsHidden: isHidden('p', { scope: '.dialog-text' }), 13 | ok: clickable('button#ok'), 14 | okText: text('button#ok'), 15 | testContainer: 'body' 16 | }); 17 | -------------------------------------------------------------------------------- /tests/pages/components/organization-menu.js: -------------------------------------------------------------------------------- 1 | import { 2 | isVisible 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.organization-menu', 7 | isVisible: isVisible() 8 | }; 9 | -------------------------------------------------------------------------------- /tests/pages/components/organization-profile.js: -------------------------------------------------------------------------------- 1 | import organizationHeader from 'code-corps-ember/tests/pages/components/organization-header'; 2 | import organizationMenu from 'code-corps-ember/tests/pages/components/organization-menu'; 3 | import projectList from 'code-corps-ember/tests/pages/components/project-list'; 4 | 5 | export default { 6 | scope: '.organization-profile', 7 | 8 | organizationHeader, 9 | organizationMenu, 10 | projectList 11 | }; 12 | -------------------------------------------------------------------------------- /tests/pages/components/organization-settings.js: -------------------------------------------------------------------------------- 1 | import organizationHeader from 'code-corps-ember/tests/pages/components/organization-header'; 2 | import organizationMenu from 'code-corps-ember/tests/pages/components/organization-menu'; 3 | 4 | export default { 5 | organizationHeader, 6 | organizationMenu 7 | }; 8 | -------------------------------------------------------------------------------- /tests/pages/components/pager-control.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute, 3 | collection 4 | } from 'ember-cli-page-object'; 5 | 6 | export default { 7 | scope: '.pager-control', 8 | 9 | nextPage: { 10 | scope: '.next-page', 11 | href: attribute('href') 12 | }, 13 | 14 | pages: collection('.page', { href: attribute('href') }), 15 | 16 | previousPage: { 17 | scope: '.previous-page', 18 | href: attribute('href') 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /tests/pages/components/payments/contact-info.js: -------------------------------------------------------------------------------- 1 | import { value } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.contact-info', 5 | email: value('input[name=email]') 6 | }; 7 | -------------------------------------------------------------------------------- /tests/pages/components/payments/donation-goals.js: -------------------------------------------------------------------------------- 1 | import { hasClass, isVisible } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.donation-goals', 5 | 6 | hasPendingRequirementStatus: hasClass('panel'), 7 | hasRequiredStatus: hasClass('panel--highlighted'), 8 | hasVerifiedStatus: hasClass('panel--highlighted-green'), 9 | 10 | rendersHeader: isVisible('aside'), 11 | rendersLinkToDonationGoals: isVisible('a.activate-donations'), 12 | rendersSection: isVisible('[data-test-section]') 13 | }; 14 | -------------------------------------------------------------------------------- /tests/pages/components/power-select/before-task-options.js: -------------------------------------------------------------------------------- 1 | import { clickable } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | close: clickable('.select-inline-dropdown__header__close') 5 | }; 6 | -------------------------------------------------------------------------------- /tests/pages/components/progress-bar-container.js: -------------------------------------------------------------------------------- 1 | import progressBar from 'code-corps-ember/tests/pages/components/progress-bar'; 2 | 3 | export default { 4 | scope: '.progress-bar-container', 5 | 6 | progressBar 7 | }; 8 | -------------------------------------------------------------------------------- /tests/pages/components/progress-bar.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute, 3 | hasClass 4 | } from 'ember-cli-page-object'; 5 | 6 | export default { 7 | scope: '.progress-bar', 8 | 9 | displaysPercentage(n) { 10 | return this.style === `width: ${n}%;`; 11 | }, 12 | 13 | hasError: hasClass('progress-bar--error'), 14 | 15 | isAnimated: hasClass('progress-bar--animated'), 16 | 17 | style: attribute('style') 18 | }; 19 | -------------------------------------------------------------------------------- /tests/pages/components/project-card.js: -------------------------------------------------------------------------------- 1 | import projectJoinModal from 'code-corps-ember/tests/pages/components/project-join-modal'; 2 | import projectUsers from 'code-corps-ember/tests/pages/components/project-card/project-users'; 3 | 4 | export default { 5 | scope: '.project-card', 6 | 7 | projectJoinModal, 8 | projectUsers 9 | }; 10 | -------------------------------------------------------------------------------- /tests/pages/components/project-card/project-users.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.project-card__project-users', 7 | userCount: { scope: '[data-test-count]' }, 8 | users: collection('[data-test-user]') 9 | }; 10 | -------------------------------------------------------------------------------- /tests/pages/components/project-categories-list.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection 3 | } from 'ember-cli-page-object'; 4 | import projectCategoryItem from 'code-corps-ember/tests/pages/components/project-category-item'; 5 | 6 | export default { 7 | scope: '.categories', 8 | 9 | projectCategoryItems: collection('.project-category-item', projectCategoryItem) 10 | }; 11 | -------------------------------------------------------------------------------- /tests/pages/components/project-item.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute, text 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.project-item', 7 | 8 | description: text('p'), 9 | icon: { 10 | scope: 'img', 11 | src: attribute('src') 12 | }, 13 | title: text('h4') 14 | }; 15 | -------------------------------------------------------------------------------- /tests/pages/components/project-list.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute, 3 | collection, 4 | isVisible 5 | } from 'ember-cli-page-object'; 6 | 7 | export default { 8 | scope: '.project-list', 9 | isVisible: isVisible(), 10 | items: collection('.project-item', { href: attribute('href', 'a:eq(0)') }) 11 | }; 12 | -------------------------------------------------------------------------------- /tests/pages/components/project-menu.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute, 3 | collection, 4 | hasClass, 5 | isVisible, 6 | text 7 | } from 'ember-cli-page-object'; 8 | 9 | export default { 10 | scope: '.project__menu', 11 | 12 | links: collection('li a', { 13 | badge: { 14 | scope: 'span.info', 15 | isVisible: isVisible(), 16 | text: text() 17 | }, 18 | href: attribute('href'), 19 | isActive: hasClass('active'), 20 | isVisible: isVisible(), 21 | text: text() 22 | }) 23 | }; 24 | -------------------------------------------------------------------------------- /tests/pages/components/project-skill-item.js: -------------------------------------------------------------------------------- 1 | import { isVisible } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.skill', 5 | isLoading: isVisible('span') 6 | }; 7 | -------------------------------------------------------------------------------- /tests/pages/components/project-users.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection, 3 | count, 4 | isVisible, 5 | property 6 | } from 'ember-cli-page-object'; 7 | 8 | export default { 9 | scope: '.project-users', 10 | 11 | userCount: count('li'), 12 | 13 | users: collection('li', { 14 | imageSource: property('src', 'img'), 15 | imageIsVisible: isVisible('img'), 16 | placeholderIsVisible: isVisible('div.icon') 17 | }) 18 | }; 19 | -------------------------------------------------------------------------------- /tests/pages/components/role-item.js: -------------------------------------------------------------------------------- 1 | import { hasClass, notHasClass } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.role-item', 5 | 6 | isSelected: hasClass('selected'), 7 | isUnselected: notHasClass('selected'), 8 | 9 | button: { 10 | scope: 'button' 11 | }, 12 | 13 | icon: { 14 | scope: 'span', 15 | isLoading: hasClass('button-spinner') 16 | } 17 | }; 18 | -------------------------------------------------------------------------------- /tests/pages/components/select/birth-date.js: -------------------------------------------------------------------------------- 1 | import { 2 | selectable 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.select-birth-date', 7 | 8 | month: { 9 | scope: 'select:eq(0)', 10 | fillIn: selectable() 11 | }, 12 | day: { 13 | scope: 'select:eq(1)', 14 | fillIn: selectable() 15 | }, 16 | year: { 17 | scope: 'select:eq(2)', 18 | fillIn: selectable() 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /tests/pages/components/select/country-select.js: -------------------------------------------------------------------------------- 1 | import { 2 | selectable 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.select-country', 7 | 8 | country: { 9 | scope: 'select:eq(0)', 10 | fillIn: selectable() 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /tests/pages/components/select/github-repo.js: -------------------------------------------------------------------------------- 1 | import { collection } from 'ember-cli-page-object'; 2 | import { fullScope } from 'ember-cli-page-object/extend'; 3 | import { select } from 'code-corps-ember/tests/helpers/x-select'; 4 | 5 | export default { 6 | scope: '.select-github-repo', 7 | 8 | select: { 9 | scope: 'select:eq(0)', 10 | 11 | fillIn(text) { 12 | let scope = fullScope(this, this.scope); 13 | select(scope, text); 14 | return this; 15 | }, 16 | 17 | options: collection('option') 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /tests/pages/components/select/state-select.js: -------------------------------------------------------------------------------- 1 | import { 2 | selectable 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.select-state', 7 | 8 | state: { 9 | scope: 'select:eq(0)', 10 | fillIn: selectable() 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /tests/pages/components/settings-menu.js: -------------------------------------------------------------------------------- 1 | export default { 2 | scope: '.settings__menu', 3 | profileLink: { 4 | scope: '[data-test-profile-link]' 5 | }, 6 | integrationsLink: { 7 | scope: '[data-test-integrations-link]' 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /tests/pages/components/signup-email-input.js: -------------------------------------------------------------------------------- 1 | import { 2 | fillable, 3 | triggerable 4 | } from 'ember-cli-page-object'; 5 | 6 | import suggestionsArea from 'code-corps-ember/tests/pages/components/_suggestions-area'; 7 | 8 | export default { 9 | fillIn: fillable('input'), 10 | keydown: triggerable('keydown', 'input'), 11 | 12 | suggestionsArea 13 | }; 14 | -------------------------------------------------------------------------------- /tests/pages/components/signup-password-input.js: -------------------------------------------------------------------------------- 1 | import progressBar from 'code-corps-ember/tests/pages/components/progress-bar'; 2 | import suggestionsArea from 'code-corps-ember/tests/pages/components/_suggestions-area'; 3 | 4 | export default { 5 | progressBar, 6 | suggestionsArea 7 | }; 8 | -------------------------------------------------------------------------------- /tests/pages/components/signup-username-input.js: -------------------------------------------------------------------------------- 1 | import { 2 | fillable, 3 | triggerable 4 | } from 'ember-cli-page-object'; 5 | 6 | import suggestionsArea from 'code-corps-ember/tests/pages/components/_suggestions-area'; 7 | 8 | export default { 9 | fillIn: fillable('input'), 10 | keydown: triggerable('keydown', 'input'), 11 | 12 | suggestionsArea 13 | }; 14 | -------------------------------------------------------------------------------- /tests/pages/components/skill-button.js: -------------------------------------------------------------------------------- 1 | import { hasClass, is, triggerable } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: 'button', 5 | 6 | isDisabled: is(':disabled'), 7 | isLarge: hasClass('large'), 8 | 9 | mouseenter: triggerable('mouseenter'), 10 | mouseleave: triggerable('mouseleave'), 11 | 12 | span: { 13 | scope: 'span', 14 | 15 | hasCheck: hasClass('check-mark'), 16 | hasSpinner: hasClass('button-spinner'), 17 | hasX: hasClass('x-mark'), 18 | isLarge: hasClass('large') 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /tests/pages/components/skill-list-item-link.js: -------------------------------------------------------------------------------- 1 | import { clickable, hasClass, triggerable } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.skill-list-item-link', 5 | 6 | skillTitle: { 7 | scope: 'span' 8 | }, 9 | 10 | click: clickable(), 11 | mouseenter: triggerable('mouseenter'), 12 | mouseleave: triggerable('mouseleave'), 13 | 14 | hasJustClicked: hasClass('just-clicked'), 15 | hasJustRemoved: hasClass('just-removed'), 16 | hasMatched: hasClass('matched') 17 | }; 18 | -------------------------------------------------------------------------------- /tests/pages/components/skill-list-item.js: -------------------------------------------------------------------------------- 1 | import { hasClass, isVisible } from 'ember-cli-page-object'; 2 | import skillListItemLink from './skill-list-item-link'; 3 | 4 | export default { 5 | scope: 'li.skill-list-item', 6 | 7 | skillListItemLink, 8 | 9 | skillListItemSpan: { 10 | scope: 'span', 11 | 12 | hasMatched: hasClass('matched') 13 | }, 14 | 15 | rendersLogin: isVisible('a[href$=login]') 16 | }; 17 | -------------------------------------------------------------------------------- /tests/pages/components/skill-list-items.js: -------------------------------------------------------------------------------- 1 | import { collection, count } from 'ember-cli-page-object'; 2 | import skillListItem from './skill-list-item'; 3 | 4 | export default { 5 | scope: 'ul.skills', 6 | listItemCount: count('li'), 7 | listItems: collection('li', skillListItem) 8 | }; 9 | -------------------------------------------------------------------------------- /tests/pages/components/skills-typeahead-result.js: -------------------------------------------------------------------------------- 1 | import { collection, hasClass, triggerable } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.skill-dropdown-item', 5 | 6 | listItemIsSelected: hasClass('selected'), 7 | mouseenter: triggerable('mouseenter'), 8 | mousedown: triggerable('mousedown'), 9 | 10 | highlightedStrings: collection('strong') 11 | }; 12 | -------------------------------------------------------------------------------- /tests/pages/components/slugged-route-model-details.js: -------------------------------------------------------------------------------- 1 | import organizationProfile from 'code-corps-ember/tests/pages/components/organization-profile'; 2 | import userDetails from 'code-corps-ember/tests/pages/components/user-details'; 3 | 4 | export default { 5 | scope: '.slugged-route-model-details', 6 | 7 | organizationProfile, 8 | userDetails 9 | }; 10 | -------------------------------------------------------------------------------- /tests/pages/components/stripe-connect-button.js: -------------------------------------------------------------------------------- 1 | import { attribute } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | scope: '.stripe-connect', 5 | 6 | href: attribute('href') 7 | }; 8 | -------------------------------------------------------------------------------- /tests/pages/components/submittable-textarea.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute, fillable, hasClass, triggerable, value 3 | } from 'ember-cli-page-object'; 4 | import { triggerKeyDown } from 'ember-keyboard'; 5 | 6 | export default { 7 | scope: 'textarea', 8 | fillIn: fillable(), 9 | focus: triggerable('focus', ''), 10 | isFocused: hasClass('focused'), 11 | 12 | keySubmit() { 13 | this.focus(); 14 | triggerKeyDown('Enter+cmd'); 15 | return this; 16 | }, 17 | 18 | placeholder: attribute('placeholder'), 19 | value: value() 20 | }; 21 | -------------------------------------------------------------------------------- /tests/pages/components/svg/sprite-map.js: -------------------------------------------------------------------------------- 1 | export default { 2 | scope: '.svg__sprite-map' 3 | }; 4 | -------------------------------------------------------------------------------- /tests/pages/components/task-board.js: -------------------------------------------------------------------------------- 1 | import { collection } from 'ember-cli-page-object'; 2 | import taskListCards from 'code-corps-ember/tests/pages/components/task-list-cards'; 3 | 4 | export default { 5 | scope: '.task-board', 6 | taskLists: collection('', taskListCards) 7 | }; 8 | -------------------------------------------------------------------------------- /tests/pages/components/task-card/user/selected-item.js: -------------------------------------------------------------------------------- 1 | import { attribute, triggerable } from 'ember-cli-page-object'; 2 | import tooltip from 'code-corps-ember/tests/pages/helpers/tooltip'; 3 | 4 | export default { 5 | scope: '.select-inline__selected-item', 6 | 7 | selectedIcon: { 8 | scope: '[data-test-selected-icon]', 9 | src: attribute('src') 10 | }, 11 | 12 | mouseenter: triggerable('mouseenter'), 13 | mouseleave: triggerable('mouseleave'), 14 | 15 | tooltip 16 | }; 17 | -------------------------------------------------------------------------------- /tests/pages/components/task-card/user/unselected-item.js: -------------------------------------------------------------------------------- 1 | import { triggerable } from 'ember-cli-page-object'; 2 | import tooltip from 'code-corps-ember/tests/pages/helpers/tooltip'; 3 | 4 | export default { 5 | scope: '.select-inline__unselected-item', 6 | 7 | loadingIcon: { 8 | scope: '[data-test-loading-icon]' 9 | }, 10 | 11 | unselectedIcon: { 12 | scope: '[data-test-unselected-icon]' 13 | }, 14 | 15 | mouseenter: triggerable('mouseenter'), 16 | mouseleave: triggerable('mouseleave'), 17 | 18 | tooltip 19 | }; 20 | -------------------------------------------------------------------------------- /tests/pages/components/task-comment-list.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | comments: collection('.task-comment-list .comment-item') 7 | }; 8 | -------------------------------------------------------------------------------- /tests/pages/components/task-header.js: -------------------------------------------------------------------------------- 1 | import taskTitle from 'code-corps-ember/tests/pages/components/task-title'; 2 | 3 | export default { 4 | taskTitle 5 | }; 6 | -------------------------------------------------------------------------------- /tests/pages/components/task-list-cards.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection 3 | } from 'ember-cli-page-object'; 4 | import taskCard from './task-card'; 5 | 6 | export default { 7 | taskCards: collection('.task-card', taskCard) 8 | }; 9 | -------------------------------------------------------------------------------- /tests/pages/components/task-status-button.js: -------------------------------------------------------------------------------- 1 | import { 2 | clickable 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | clickClose: clickable('[name=close]'), 7 | clickOpen: clickable('[name=open]') 8 | }; 9 | -------------------------------------------------------------------------------- /tests/pages/components/task/archive-task.js: -------------------------------------------------------------------------------- 1 | export default { 2 | scope: '.archive-task', 3 | 4 | archiveLink: { 5 | scope: 'a' 6 | }, 7 | 8 | archivedStatus: { 9 | scope: 'span' 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /tests/pages/components/task/sidebar/integrations-section.js: -------------------------------------------------------------------------------- 1 | import issueLink from 'code-corps-ember/tests/pages/components/github/issue-link'; 2 | 3 | export default { 4 | scope: '.task-sidebar-section', 5 | 6 | emptyMessage: { 7 | scope: '[data-test-empty-message]' 8 | }, 9 | 10 | issueLink 11 | }; 12 | -------------------------------------------------------------------------------- /tests/pages/components/thank-you-container.js: -------------------------------------------------------------------------------- 1 | import { 2 | clickable, 3 | collection, 4 | text 5 | } from 'ember-cli-page-object'; 6 | 7 | export default { 8 | scope: '.thank-you-container', 9 | 10 | icon: { 11 | scope: '[data-test-project-icon]' 12 | }, 13 | 14 | clickLink: clickable('a'), 15 | 16 | thankYouText: text('[data-test-thank-you-message]'), 17 | 18 | volunteers: collection('[data-test-volunteer-headshot]') 19 | }; 20 | -------------------------------------------------------------------------------- /tests/pages/components/user-byline.js: -------------------------------------------------------------------------------- 1 | export default { 2 | scope: '.user-byline', 3 | 4 | createdAt: { 5 | scope: '[data-test-created-at]' 6 | }, 7 | 8 | createdFrom: { 9 | scope: '[data-test-created-from]' 10 | }, 11 | 12 | username: { 13 | scope: '[data-test-username]' 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /tests/pages/components/user-projects-list.js: -------------------------------------------------------------------------------- 1 | import { 2 | count, 3 | property, 4 | text 5 | } from 'ember-cli-page-object'; 6 | 7 | export default { 8 | scope: '.user-projects-list', 9 | 10 | header: text('h3'), 11 | emptyState: text('.empty-state strong'), 12 | listItemCount: count('li'), 13 | projectDescription: text('li:first p'), 14 | projectIconSrc: property('src', 'li:first img'), 15 | projectTitle: text('li:first h4') 16 | }; 17 | -------------------------------------------------------------------------------- /tests/pages/components/user/display-username.js: -------------------------------------------------------------------------------- 1 | export default { 2 | scope: '.user__display-username', 3 | 4 | githubUsername: { 5 | scope: '[data-test-github-username]' 6 | }, 7 | 8 | username: { 9 | scope: '[data-test-username]' 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /tests/pages/components/user/skills-list.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection 3 | } from 'ember-cli-page-object'; 4 | 5 | export default { 6 | scope: '.user__skills-list', 7 | 8 | emptyState: { 9 | scope: '[data-test-user-skills-list-empty-state]' 10 | }, 11 | 12 | skills: collection('[data-test-user-skills-list-item]') 13 | }; 14 | -------------------------------------------------------------------------------- /tests/pages/components/volunteer-headshot.js: -------------------------------------------------------------------------------- 1 | import { attribute, text } from 'ember-cli-page-object'; 2 | 3 | export default { 4 | image: { 5 | scope: 'img', 6 | 7 | alt: attribute('alt'), 8 | src: attribute('src') 9 | }, 10 | 11 | name: text('[data-test-volunteer-name]'), 12 | role: text('[data-test-volunteer-role]') 13 | }; 14 | -------------------------------------------------------------------------------- /tests/pages/github.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection, 3 | create, 4 | visitable 5 | } from 'ember-cli-page-object'; 6 | 7 | export default create({ 8 | visit: visitable('/oauth/github'), 9 | 10 | // we have a component under tests/pages/components/flash-messages.js 11 | // but it doesn't really seem that flexible for testing 12 | // this gives us a collection, so we can check count, as well as text for 13 | // each of them. 14 | flashMessages: collection('.flash-messages--full-width .flash-message') 15 | }); 16 | -------------------------------------------------------------------------------- /tests/pages/helpers/clickable-native.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Uses native javascript to click an element. Required in some cases where 4 | * the default clickable helper does not work due to relying on jQuery .click 5 | * 6 | * Right now, this is used in: 7 | * 8 | * - tests/pages/components/project-join-modal 9 | */ 10 | function clickable() { 11 | let selector = `${this.testContainer} ${this.scope}`; 12 | document.querySelector(selector).click(); 13 | } 14 | 15 | export { clickable }; 16 | -------------------------------------------------------------------------------- /tests/pages/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | create, 3 | visitable, 4 | hasClass 5 | } from 'ember-cli-page-object'; 6 | import navMenu from './components/navigation-menu'; 7 | import siteFooter from './components/site-footer'; 8 | import spriteMap from './components/svg/sprite-map'; 9 | 10 | export default create({ 11 | visit: visitable('/'), 12 | 13 | isLightTheme: hasClass('code-theme--light', '.site-content'), 14 | 15 | navMenu, 16 | siteFooter, 17 | spriteMap 18 | }); 19 | -------------------------------------------------------------------------------- /tests/pages/login.js: -------------------------------------------------------------------------------- 1 | import { 2 | create, 3 | visitable, 4 | clickable 5 | } from 'ember-cli-page-object'; 6 | import form from './components/login-form'; 7 | import navMenu from './components/navigation-menu'; 8 | 9 | export default create({ 10 | visit: visitable('/login'), 11 | 12 | form, 13 | navMenu, 14 | 15 | clickForgotPassword: clickable('.t-forgot-password') 16 | }); 17 | -------------------------------------------------------------------------------- /tests/pages/organization-projects.js: -------------------------------------------------------------------------------- 1 | import { 2 | create, 3 | visitable 4 | } from 'ember-cli-page-object'; 5 | import project from '../pages/components/project-list'; 6 | 7 | export default create({ 8 | visit: visitable('/:slug/projects'), 9 | 10 | project 11 | }); 12 | -------------------------------------------------------------------------------- /tests/pages/password.js: -------------------------------------------------------------------------------- 1 | import { 2 | create, 3 | visitable 4 | } from 'ember-cli-page-object'; 5 | import forgotPasswordForm from './components/password/forgot-password'; 6 | import resetPasswordForm from './components/password/reset-password'; 7 | import errorFormatter from './components/error-formatter'; 8 | 9 | export default create({ 10 | visitReset: visitable('/password/reset'), 11 | visitForgot: visitable('/password/forgot'), 12 | 13 | forgotPasswordForm, 14 | resetPasswordForm, 15 | errorFormatter 16 | }); 17 | -------------------------------------------------------------------------------- /tests/pages/project/checkout.js: -------------------------------------------------------------------------------- 1 | import { clickable, create, is, visitable } from 'ember-cli-page-object'; 2 | import donationContainer from '../components/donation/donation-container'; 3 | import errorFormatter from '../components/error-formatter'; 4 | 5 | export default create({ 6 | visit: visitable(':organization/:project/checkout'), 7 | 8 | clickDonate: clickable('button.donate'), 9 | donateButtonIsDisabled: is(':disabled', 'button.donate'), 10 | 11 | donationContainer, 12 | errorFormatter 13 | }); 14 | -------------------------------------------------------------------------------- /tests/pages/project/donate.js: -------------------------------------------------------------------------------- 1 | import { create, visitable } from 'ember-cli-page-object'; 2 | import createDonation from '../components/donations/create-donation'; 3 | 4 | export default create({ 5 | createDonation, 6 | visit: visitable(':organization/:project/donate') 7 | }); 8 | -------------------------------------------------------------------------------- /tests/pages/project/settings/donations/payments.js: -------------------------------------------------------------------------------- 1 | import { create, visitable } from 'ember-cli-page-object'; 2 | import accountSetup from 'code-corps-ember/tests/pages/components/payments/account-setup'; 3 | 4 | export default create({ 5 | visit: visitable(':organization/:project/settings/donations/payments'), 6 | accountSetup 7 | }); 8 | -------------------------------------------------------------------------------- /tests/pages/project/thank-you.js: -------------------------------------------------------------------------------- 1 | import { create, visitable } from 'ember-cli-page-object'; 2 | import thankYouContainer from 'code-corps-ember/tests/pages/components/thank-you-container'; 3 | 4 | export default create({ 5 | visit: visitable(':organization/:project/thank-you'), 6 | 7 | thankYouContainer 8 | }); 9 | -------------------------------------------------------------------------------- /tests/pages/projects.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection, 3 | create, 4 | visitable 5 | } from 'ember-cli-page-object'; 6 | import projectCard from './components/project-card'; 7 | 8 | export default create({ 9 | visit: visitable('/projects'), 10 | projects: collection('.project-card', projectCard) 11 | }); 12 | -------------------------------------------------------------------------------- /tests/pages/settings/integrations.js: -------------------------------------------------------------------------------- 1 | import { create, visitable } from 'ember-cli-page-object'; 2 | import githubConnectButton from 'code-corps-ember/tests/pages/components/github-connect'; 3 | 4 | export default create({ 5 | visit: visitable('/settings/integrations'), 6 | 7 | githubConnectButton 8 | }); 9 | -------------------------------------------------------------------------------- /tests/pages/slugged-route.js: -------------------------------------------------------------------------------- 1 | import { 2 | create, 3 | visitable 4 | } from 'ember-cli-page-object'; 5 | import errorWrapper from './components/error-wrapper'; 6 | import organizationProfile from './components/organization-profile'; 7 | import userDetails from './components/user-details'; 8 | 9 | export default create({ 10 | visit: visitable(':slug'), 11 | 12 | errorWrapper, 13 | organizationProfile, 14 | userDetails 15 | }); 16 | -------------------------------------------------------------------------------- /tests/pages/team.js: -------------------------------------------------------------------------------- 1 | import { 2 | collection, 3 | create, 4 | text, 5 | visitable 6 | } from 'ember-cli-page-object'; 7 | 8 | export default create({ 9 | visit: visitable('/team'), 10 | 11 | company: { 12 | scope: '.company', 13 | 14 | header: text('h2'), 15 | items: collection('li') 16 | }, 17 | 18 | contributors: { 19 | scope: '.contributors', 20 | 21 | header: text('h2'), 22 | items: collection('li') 23 | } 24 | }); 25 | -------------------------------------------------------------------------------- /tests/pages/user.js: -------------------------------------------------------------------------------- 1 | import { 2 | attribute, 3 | clickable, 4 | collection, 5 | create, 6 | visitable 7 | } from 'ember-cli-page-object'; 8 | import userDetails from './components/user-details'; 9 | 10 | export default create({ 11 | visit: visitable(':username'), 12 | 13 | projects: collection('.user-projects-list li h4 a', { 14 | click: clickable(), 15 | href: attribute('href') 16 | }), 17 | 18 | userDetails 19 | }); 20 | -------------------------------------------------------------------------------- /tests/test-helper.js: -------------------------------------------------------------------------------- 1 | import Application from '../app'; 2 | import config from '../config/environment'; 3 | import { setApplication } from '@ember/test-helpers'; 4 | import { start } from 'ember-qunit'; 5 | import { run } from '@ember/runloop'; 6 | import loadEmberExam from 'ember-exam/test-support/load'; 7 | import './helpers/flash-message'; 8 | 9 | loadEmberExam(); 10 | run.later = run.next; 11 | setApplication(Application.create(config.APP)); 12 | start(); 13 | -------------------------------------------------------------------------------- /tests/unit/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-corps/code-corps-ember/bc074964adcb23e8af61c38bcb6353ecc1022a0c/tests/unit/.gitkeep -------------------------------------------------------------------------------- /tests/unit/abilities/organization-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('ability:organization', 'Unit | Ability | organization', { 4 | // Specify the other units that are required for this test. 5 | needs: ['service:current-user'] 6 | }); 7 | 8 | // Replace this with your real tests. 9 | test('it exists', function(assert) { 10 | let ability = this.subject(); 11 | assert.ok(ability); 12 | }); 13 | -------------------------------------------------------------------------------- /tests/unit/controllers/index-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('controller:index', 'Unit | Controller | index', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler' 9 | ] 10 | }); 11 | 12 | // Replace this with your real tests. 13 | test('it exists', function(assert) { 14 | let controller = this.subject(); 15 | assert.ok(controller); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/unit/controllers/project/settings/donations/goals-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('controller:project/settings/donations/goals', 'Unit | Controller | project/settings/donations/goals', { 4 | needs: [ 5 | 'service:metrics', 6 | 'service:router-scroll', 7 | 'service:scheduler' 8 | ] 9 | }); 10 | 11 | // Replace this with your real tests. 12 | test('it exists', function(assert) { 13 | let controller = this.subject(); 14 | assert.ok(controller); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/unit/controllers/projects-list-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('controller:projects-list', 'Unit | Controller | projects list', { 4 | needs: [ 5 | 'service:metrics', 6 | 'service:router-scroll', 7 | 'service:scheduler' 8 | ] 9 | }); 10 | 11 | // Replace this with your real tests. 12 | test('it exists', function(assert) { 13 | let controller = this.subject(); 14 | assert.ok(controller); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/unit/helpers/capitalize-test.js: -------------------------------------------------------------------------------- 1 | import { capitalize } from 'code-corps-ember/helpers/capitalize'; 2 | import { module, test } from 'qunit'; 3 | 4 | module('Unit | Helper | capitalize'); 5 | 6 | test('it capitalizes', function(assert) { 7 | let result = capitalize(['lowercase string']); 8 | assert.equal(result, 'Lowercase string'); 9 | }); 10 | 11 | test('it returns null when empty', function(assert) { 12 | let result = capitalize([null]); 13 | assert.equal(result, null); 14 | }); 15 | -------------------------------------------------------------------------------- /tests/unit/mixins/admin-route-mixin-test.js: -------------------------------------------------------------------------------- 1 | import EmberObject from '@ember/object'; 2 | import AdminRouteMixin from 'code-corps-ember/mixins/admin-route-mixin'; 3 | import { module, test } from 'qunit'; 4 | 5 | module('Unit | Mixin | admin route mixin'); 6 | 7 | // Replace this with your real tests. 8 | test('it works', function(assert) { 9 | let AdminRouteObject = EmberObject.extend(AdminRouteMixin); 10 | let subject = AdminRouteObject.create(); 11 | assert.ok(subject); 12 | }); 13 | -------------------------------------------------------------------------------- /tests/unit/mixins/can-animate-test.js: -------------------------------------------------------------------------------- 1 | import Object from '@ember/object'; 2 | import CanAnimateMixin from 'code-corps-ember/mixins/can-animate'; 3 | import { module, test } from 'qunit'; 4 | 5 | module('Unit | Mixin | can animate'); 6 | 7 | // Replace this with your real tests. 8 | test('it works', function(assert) { 9 | let CanAnimateObject = Object.extend(CanAnimateMixin); 10 | let subject = CanAnimateObject.create(); 11 | assert.ok(subject); 12 | }); 13 | -------------------------------------------------------------------------------- /tests/unit/mixins/marketing-route-mixin-test.js: -------------------------------------------------------------------------------- 1 | import EmberObject from '@ember/object'; 2 | import MarketingRouteMixinMixin from 'code-corps-ember/mixins/marketing-route-mixin'; 3 | import { module, test } from 'qunit'; 4 | 5 | module('Unit | Mixin | marketing route mixin'); 6 | 7 | // Replace this with your real tests. 8 | test('it works', function(assert) { 9 | let MarketingRouteMixinObject = EmberObject.extend(MarketingRouteMixinMixin); 10 | let subject = MarketingRouteMixinObject.create(); 11 | assert.ok(subject); 12 | }); 13 | -------------------------------------------------------------------------------- /tests/unit/mixins/onboarding-controller-test.js: -------------------------------------------------------------------------------- 1 | import Object from '@ember/object'; 2 | import OnboardingControllerMixin from 'code-corps-ember/mixins/onboarding-controller'; 3 | import { module, test } from 'qunit'; 4 | 5 | module('Unit | Mixin | onboarding controller'); 6 | 7 | // Replace this with your real tests. 8 | test('it works', function(assert) { 9 | let OnboardingControllerObject = Object.extend(OnboardingControllerMixin); 10 | let subject = OnboardingControllerObject.create(); 11 | assert.ok(subject); 12 | }); 13 | -------------------------------------------------------------------------------- /tests/unit/models/skill-test.js: -------------------------------------------------------------------------------- 1 | import { moduleForModel, test } from 'ember-qunit'; 2 | import { testForAttributes } from 'code-corps-ember/tests/helpers/attributes'; 3 | 4 | moduleForModel('skill', 'Unit | Model | skill', { 5 | // Specify the other units that are required for this test. 6 | needs: [] 7 | }); 8 | 9 | test('it exists', function(assert) { 10 | let model = this.subject(); 11 | assert.ok(!!model); 12 | }); 13 | 14 | testForAttributes('skill', ['description', 'matched', 'title']); 15 | -------------------------------------------------------------------------------- /tests/unit/models/stripe-connect-plan-test.js: -------------------------------------------------------------------------------- 1 | import { moduleForModel, test } from 'ember-qunit'; 2 | import { testForBelongsTo } from 'code-corps-ember/tests/helpers/relationship'; 3 | 4 | moduleForModel('stripe-connect-plan', 'Unit | Model | stripe connect plan', { 5 | needs: ['model:project'] 6 | }); 7 | 8 | test('it exists', function(assert) { 9 | let model = this.subject(); 10 | assert.ok(!!model); 11 | }); 12 | 13 | testForBelongsTo('stripe-connect-plan', 'project'); 14 | -------------------------------------------------------------------------------- /tests/unit/models/task-skill.js: -------------------------------------------------------------------------------- 1 | import { moduleForModel, test } from 'ember-qunit'; 2 | import { testForBelongsTo } from '../../helpers/relationship'; 3 | 4 | moduleForModel('task-skill', 'Unit | Model | task skill', { 5 | // Specify the other units that are required for this test. 6 | needs: ['model:task', 'model:skill'] 7 | }); 8 | 9 | test('it exists', function(assert) { 10 | let model = this.subject(); 11 | assert.ok(!!model); 12 | }); 13 | 14 | testForBelongsTo('task-skill', 'task'); 15 | testForBelongsTo('task-skill', 'skill'); 16 | -------------------------------------------------------------------------------- /tests/unit/models/user-role-test.js: -------------------------------------------------------------------------------- 1 | import { moduleForModel, test } from 'ember-qunit'; 2 | import { testForBelongsTo } from '../../helpers/relationship'; 3 | 4 | moduleForModel('user-role', 'Unit | Model | user role', { 5 | // Specify the other units that are required for this test. 6 | needs: ['model:role', 'model:user'] 7 | }); 8 | 9 | test('it exists', function(assert) { 10 | let model = this.subject(); 11 | assert.ok(!!model); 12 | }); 13 | 14 | testForBelongsTo('user-role', 'role'); 15 | testForBelongsTo('user-role', 'user'); 16 | -------------------------------------------------------------------------------- /tests/unit/models/user-skill-test.js: -------------------------------------------------------------------------------- 1 | import { moduleForModel, test } from 'ember-qunit'; 2 | import { testForBelongsTo } from '../../helpers/relationship'; 3 | 4 | moduleForModel('user-skill', 'Unit | Model | user skill', { 5 | // Specify the other units that are required for this test. 6 | needs: ['model:skill', 'model:user'] 7 | }); 8 | 9 | test('it exists', function(assert) { 10 | let model = this.subject(); 11 | assert.ok(!!model); 12 | }); 13 | 14 | testForBelongsTo('user-skill', 'skill'); 15 | testForBelongsTo('user-skill', 'user'); 16 | -------------------------------------------------------------------------------- /tests/unit/models/user-task-test.js: -------------------------------------------------------------------------------- 1 | import { moduleForModel, test } from 'ember-qunit'; 2 | 3 | moduleForModel('user-task', 'Unit | Model | user task', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'model:task', 7 | 'model:user' 8 | ] 9 | }); 10 | 11 | test('it exists', function(assert) { 12 | let model = this.subject(); 13 | // let store = this.store(); 14 | assert.ok(!!model); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/unit/routes/about-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:about', 'Unit | Route | about', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler', 9 | 'service:site-footer' 10 | ] 11 | }); 12 | 13 | test('it exists', function(assert) { 14 | let route = this.subject(); 15 | assert.ok(route); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/unit/routes/conversations/index-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:conversations/index', 'Unit | Route | conversations/index', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler', 9 | 'service:session' 10 | ] 11 | }); 12 | 13 | test('it exists', function(assert) { 14 | let route = this.subject(); 15 | assert.ok(route); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/unit/routes/github-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:github', 'Unit | Route | github', { 4 | needs: [ 5 | 'service:ajax', 6 | 'service:current-user', 7 | 'service:flash-messages', 8 | 'service:github-state', 9 | 'service:metrics', 10 | 'service:router-scroll', 11 | 'service:scheduler', 12 | 'service:session' 13 | ] 14 | }); 15 | 16 | test('it exists', function(assert) { 17 | let route = this.subject(); 18 | assert.ok(route); 19 | }); 20 | -------------------------------------------------------------------------------- /tests/unit/routes/index-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:index', 'Unit | Route | index', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler', 9 | 'service:session', 10 | 'service:site-footer' 11 | ] 12 | }); 13 | 14 | test('it exists', function(assert) { 15 | let route = this.subject(); 16 | assert.ok(route); 17 | }); 18 | -------------------------------------------------------------------------------- /tests/unit/routes/login-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:login', 'Unit | Route | login', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler', 9 | 'service:session', 10 | 'service:site-footer' 11 | ] 12 | }); 13 | 14 | test('it exists', function(assert) { 15 | let route = this.subject(); 16 | assert.ok(route); 17 | }); 18 | -------------------------------------------------------------------------------- /tests/unit/routes/project-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:project', 'Unit | Route | project', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler' 9 | ] 10 | }); 11 | 12 | test('it exists', function(assert) { 13 | let route = this.subject(); 14 | assert.ok(route); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/unit/routes/project/donate-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:project/donate', 'Unit | Route | project/donate', { 4 | needs: [ 5 | 'service:flash-messages', 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler', 9 | 'service:session', 10 | 'service:user-subscriptions' 11 | ] 12 | }); 13 | 14 | test('it exists', function(assert) { 15 | let route = this.subject(); 16 | assert.ok(route); 17 | }); 18 | -------------------------------------------------------------------------------- /tests/unit/routes/project/people-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:project/people', 'Unit | Route | project/people', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:can', 7 | 'service:metrics', 8 | 'service:router-scroll', 9 | 'service:scheduler', 10 | 'service:session' 11 | ] 12 | }); 13 | 14 | test('it exists', function(assert) { 15 | let route = this.subject(); 16 | assert.ok(route); 17 | }); 18 | -------------------------------------------------------------------------------- /tests/unit/routes/project/settings/donations/goals-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:project/settings/donations/goals', 'Unit | Route | project/settings/donations/goals', { 4 | needs: [ 5 | 'service:metrics', 6 | 'service:router-scroll', 7 | 'service:scheduler' 8 | ] 9 | }); 10 | 11 | test('it exists', function(assert) { 12 | let route = this.subject(); 13 | assert.ok(route); 14 | }); 15 | -------------------------------------------------------------------------------- /tests/unit/routes/project/settings/donations/payments-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:project/settings/donations/payments', 'Unit | Route | project/settings/donations/payments', { 4 | needs: [ 5 | 'service:metrics', 6 | 'service:router-scroll', 7 | 'service:scheduler', 8 | 'service:stripe' 9 | ] 10 | }); 11 | 12 | test('it exists', function(assert) { 13 | let route = this.subject(); 14 | assert.ok(route); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/unit/routes/project/tasks/index-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:project/tasks/index', 'Unit | Route | project/tasks/index', { 4 | needs: [ 5 | 'service:metrics', 6 | 'service:project-task-board', 7 | 'service:router-scroll', 8 | 'service:scheduler' 9 | ] 10 | }); 11 | 12 | test('it exists', function(assert) { 13 | let route = this.subject(); 14 | assert.ok(route); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/unit/routes/project/tasks/new-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:project/tasks/new', 'Unit | Route | project/tasks/new', { 4 | needs: [ 5 | 'service:current-user', 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler', 9 | 'service:session' 10 | ] 11 | }); 12 | 13 | test('it exists', function(assert) { 14 | let route = this.subject(); 15 | assert.ok(route); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/unit/routes/projects-list-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:projects-list', 'Unit | Route | projects list', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler' 9 | ] 10 | }); 11 | 12 | test('it exists', function(assert) { 13 | let route = this.subject(); 14 | assert.ok(route); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/unit/routes/slugged-route-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:slugged-route', 'Unit | Route | slugged-route', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler' 9 | ] 10 | }); 11 | 12 | test('it exists', function(assert) { 13 | let route = this.subject(); 14 | assert.ok(route); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/unit/routes/start-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:start', 'Unit | Route | start', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler', 9 | 'service:session' 10 | ] 11 | }); 12 | 13 | test('it exists', function(assert) { 14 | let route = this.subject(); 15 | assert.ok(route); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/unit/routes/start/expertise-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:start/expertise', 'Unit | Route | start/expertise', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:current-user', 7 | 'service:metrics', 8 | 'service:router-scroll', 9 | 'service:scheduler', 10 | 'service:session' 11 | ] 12 | }); 13 | 14 | test('it exists', function(assert) { 15 | let route = this.subject(); 16 | assert.ok(route); 17 | }); 18 | -------------------------------------------------------------------------------- /tests/unit/routes/start/hello-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:start/hello', 'Unit | Route | start/hello', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:current-user', 7 | 'service:metrics', 8 | 'service:router-scroll', 9 | 'service:scheduler', 10 | 'service:session' 11 | ] 12 | }); 13 | 14 | test('it exists', function(assert) { 15 | let route = this.subject(); 16 | assert.ok(route); 17 | }); 18 | -------------------------------------------------------------------------------- /tests/unit/routes/start/interests-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:start/interests', 'Unit | Route | start/interests', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler', 9 | 'service:session' 10 | ] 11 | }); 12 | 13 | test('it exists', function(assert) { 14 | let route = this.subject(); 15 | assert.ok(route); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/unit/routes/team-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:team', 'Unit | Route | team', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:metrics', 7 | 'service:router-scroll', 8 | 'service:scheduler', 9 | 'service:site-footer' 10 | ] 11 | }); 12 | 13 | test('it exists', function(assert) { 14 | let route = this.subject(); 15 | assert.ok(route); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/unit/routes/terms.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('route:terms', 'Unit | Route | terms', { 4 | needs: [ 5 | 'service:metrics', 6 | 'service:router-scroll', 7 | 'service:scheduler' 8 | ] 9 | }); 10 | 11 | test('it exists', function(assert) { 12 | let route = this.subject(); 13 | assert.ok(route); 14 | }); 15 | -------------------------------------------------------------------------------- /tests/unit/services/ajax-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | import ENV from 'code-corps-ember/config/environment'; 3 | 4 | moduleFor('service:ajax', 'Unit | Service | ajax', { 5 | needs: ['service:session'] 6 | }); 7 | 8 | test('it sets the host to the API_BASE_URL', function(assert) { 9 | let service = this.subject(); 10 | assert.equal(service.get('host'), ENV.API_BASE_URL); 11 | }); 12 | -------------------------------------------------------------------------------- /tests/unit/services/background-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('service:background', 'Unit | Service | background', { 4 | // Specify the other units that are required for this test. 5 | // needs: ['service:foo'] 6 | }); 7 | 8 | // Replace this with your real tests. 9 | test('it exists', function(assert) { 10 | let service = this.subject(); 11 | assert.ok(service); 12 | }); 13 | -------------------------------------------------------------------------------- /tests/unit/services/conversation-channel-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('service:conversation-channel', 'Unit | Service | conversation channel', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:current-user', 7 | 'service:socket', 8 | 'service:sounds' 9 | ] 10 | }); 11 | 12 | // Replace this with your real tests. 13 | test('it exists', function(assert) { 14 | let service = this.subject(); 15 | assert.ok(service); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/unit/services/conversations-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('service:conversations', 'Unit | Service | conversations', { 4 | // Specify the other units that are required for this test. 5 | // needs: ['service:foo'] 6 | }); 7 | 8 | // Replace this with your real tests. 9 | test('it exists', function(assert) { 10 | let service = this.subject(); 11 | assert.ok(service); 12 | }); 13 | -------------------------------------------------------------------------------- /tests/unit/services/socket-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('service:socket', 'Unit | Service | socket', { 4 | // Specify the other units that are required for this test. 5 | needs: ['service:session'] 6 | }); 7 | 8 | // Replace this with your real tests. 9 | test('it exists', function(assert) { 10 | let service = this.subject(); 11 | assert.ok(service); 12 | }); 13 | -------------------------------------------------------------------------------- /tests/unit/services/sounds-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('service:sounds', 'Unit | Service | sounds', { 4 | // Specify the other units that are required for this test. 5 | // needs: ['service:foo'] 6 | }); 7 | 8 | // Replace this with your real tests. 9 | test('it exists', function(assert) { 10 | let service = this.subject(); 11 | assert.ok(service); 12 | }); 13 | -------------------------------------------------------------------------------- /tests/unit/services/user-categories-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('service:user-categories', 'Unit | Service | user categories', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:current-user' 7 | ] 8 | }); 9 | 10 | // Replace this with your real tests. 11 | test('it exists', function(assert) { 12 | let service = this.subject(); 13 | assert.ok(service); 14 | }); 15 | -------------------------------------------------------------------------------- /tests/unit/services/user-roles-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('service:user-roles', 'Unit | Service | user roles', { 4 | needs: [ 5 | 'service:current-user' 6 | ] 7 | }); 8 | 9 | // Replace this with your real tests. 10 | test('it exists', function(assert) { 11 | let service = this.subject(); 12 | assert.ok(service); 13 | }); 14 | -------------------------------------------------------------------------------- /tests/unit/services/user-skills-list-test.js: -------------------------------------------------------------------------------- 1 | import { moduleFor, test } from 'ember-qunit'; 2 | 3 | moduleFor('service:user-skills-list', 'Unit | Service | user skills list', { 4 | // Specify the other units that are required for this test. 5 | needs: [ 6 | 'service:current-user' 7 | ] 8 | }); 9 | 10 | // Replace this with your real tests. 11 | test('it exists', function(assert) { 12 | let service = this.subject(); 13 | assert.ok(service); 14 | }); 15 | -------------------------------------------------------------------------------- /tests/unit/utils/array-utils-test.js: -------------------------------------------------------------------------------- 1 | import { range } from 'code-corps-ember/utils/array-utils'; 2 | import { module, test } from 'qunit'; 3 | 4 | module('Unit | Utility | array-utils'); 5 | 6 | test('range returns an array of integers defined by parameters', function(assert) { 7 | assert.deepEqual(range(1, 1), [1]); 8 | assert.deepEqual(range(1, 2), [1, 2]); 9 | assert.deepEqual(range(1, 5), [1, 2, 3, 4, 5]); 10 | }); 11 | --------------------------------------------------------------------------------