├── .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 |
2 | {{#each skills as |skill|}}
3 | -
4 | {{#if skill.selected}}
5 |
6 | {{else}}
7 |
8 | {{/if}}
9 |
10 | {{/each}}
11 |
--------------------------------------------------------------------------------
/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 |
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 |
5 | {{#if (and helpText (not hasImage))}}
6 |
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 |
4 | -
5 | {{#link-to 'slugged-route' organization.slug}}Projects{{/link-to}}
6 |
7 |
8 | {{#if (can 'manage organization' organization)}}
9 | -
10 | {{#link-to 'organizations.slugged-route.settings.profile' organization.slug}}Settings{{/link-to}}
11 |
12 | {{/if}}
13 |
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 |
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 |
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 |
3 | {{#each (slice 0 18 users) as |user|}}
4 | -
5 | {{#link-to 'slugged-route' user.username}}
6 | {{#if user.isLoaded}}
7 |
8 | {{else}}
9 |
10 | {{/if}}
11 | {{/link-to}}
12 |
13 | {{/each}}
14 |
15 |
--------------------------------------------------------------------------------
/app/templates/components/related-skills.hbs:
--------------------------------------------------------------------------------
1 | {{skill-list-items
2 | isClickable=isClickable
3 | overflowHidden=overflowHidden
4 | skillItemHidden="skillItemHidden"
5 | skills=skills}}
6 |
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 |
3 | -
4 | {{link-to data-test-profile-link 'Profile' 'settings.profile'}}
5 |
6 | -
7 | {{link-to data-test-integrations-link 'Integrations' 'settings.integrations'}}
8 |
9 |
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 |
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 |
3 | {{else if canArchive}}
4 |
5 | {{/if}}
6 |
--------------------------------------------------------------------------------
/app/templates/components/task/sidebar/integrations-section.hbs:
--------------------------------------------------------------------------------
1 |
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 |
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 |
3 | {{#each user.userSkills as |userSkill|}}
4 | - {{userSkill.skill.title}}
5 | {{/each}}
6 |
7 | {{else}}
8 |
9 | {{user.username}} hasn't added any skills yet.
10 |
11 | {{/if}}
12 |
--------------------------------------------------------------------------------
/app/templates/components/volunteer-headshot.hbs:
--------------------------------------------------------------------------------
1 |
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 |
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 |
--------------------------------------------------------------------------------