diff --git a/Gemfile b/Gemfile index 514796c69..b609b370c 100644 --- a/Gemfile +++ b/Gemfile @@ -66,6 +66,7 @@ gem 'delayed_paperclip', gem 'rubyzip' gem 'jbuilder' # JSON structures via a Builder-style DSL gem 'activerecord-import' +gem 'scenic', '~> 1.4' gem 'paperclip', '~> 5.1' # File attachment, image attachment library gem 'aws-sdk', '~> 2' @@ -111,6 +112,7 @@ group :test do gem 'poltergeist' gem 'phantomjs', :require => 'phantomjs/poltergeist' gem 'simplecov', require: false + gem 'json_matchers' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 0cc88726f..dc239f70d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -244,6 +244,10 @@ GEM js_cookie_rails (2.1.4) railties (>= 3.1) json (1.8.6) + json-schema (2.8.0) + addressable (>= 2.4) + json_matchers (0.7.2) + json-schema (~> 2.7) kaminari (1.1.1) activesupport (>= 4.1.0) kaminari-actionview (= 1.1.1) @@ -415,6 +419,9 @@ GEM sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) + scenic (1.4.0) + activerecord (>= 4.0.0) + railties (>= 4.0.0) scss_lint (0.55.0) rake (>= 0.9, < 13) sass (~> 3.4.20) @@ -530,6 +537,7 @@ DEPENDENCIES jquery-turbolinks jquery-ui-rails js_cookie_rails + json_matchers kaminari listen (~> 3.0) logging (~> 2.0.0) @@ -559,6 +567,7 @@ DEPENDENCIES rubyzip sanitize (~> 4.4) sass-rails (~> 5.0.6) + scenic (~> 1.4) scss_lint sdoc (~> 0.4.0) shoulda-matchers diff --git a/app/controllers/client_api/teams/teams_controller.rb b/app/controllers/client_api/teams/teams_controller.rb index 9d3fdfc02..f003a66da 100644 --- a/app/controllers/client_api/teams/teams_controller.rb +++ b/app/controllers/client_api/teams/teams_controller.rb @@ -4,8 +4,9 @@ module ClientApi include ClientApi::Users::UserTeamsHelper def index + teams = current_user.datatables_teams success_response(template: '/client_api/teams/index', - locals: { teams: current_user.teams_data }) + locals: { teams: teams }) end def create @@ -55,6 +56,11 @@ module ClientApi error_response(message: error.to_s) end + def current_team + success_response(template: '/client_api/teams/current_team', + locals: { team: current_user.current_team }) + end + private def team_params diff --git a/app/javascript/src/components/Navigation/components/TeamSwitch.jsx b/app/javascript/src/components/Navigation/components/TeamSwitch.jsx index 7ee9259ee..88ccc0f72 100644 --- a/app/javascript/src/components/Navigation/components/TeamSwitch.jsx +++ b/app/javascript/src/components/Navigation/components/TeamSwitch.jsx @@ -1,51 +1,71 @@ +// @flow import React, { Component } from "react"; import { connect } from "react-redux"; -import PropTypes from "prop-types"; import { FormattedMessage } from "react-intl"; import { NavDropdown, MenuItem, Glyphicon } from "react-bootstrap"; import styled from "styled-components"; import _ from "lodash"; -import { ROOT_PATH } from "../../../config/routes"; +import { ROOT_PATH, SETTINGS_NEW_TEAM_ROUTE } from "../../../config/routes"; import { BORDER_GRAY_COLOR } from "../../../config/constants/colors"; -import { changeTeam } from "../../actions/TeamsActions"; -import { getTeamsList } from "../../actions/TeamsActions"; +import { getCurrentTeam, changeTeam } from "../../actions/TeamsActions"; +import { getTeams } from "../../../services/api/teams_api"; const StyledNavDropdown = styled(NavDropdown)` border-left: 1px solid ${BORDER_GRAY_COLOR}; border-right: 1px solid ${BORDER_GRAY_COLOR}; `; -class TeamSwitch extends Component { - constructor(props) { +type State = { + allTeams: Array +} + +type Props = { + current_team: Teams$CurrentTeam, + eventKey: string, + getCurrentTeam: Function, + changeTeam: Function +} + +class TeamSwitch extends Component { + constructor(props: Props) { super(props); - this.displayTeams = this.displayTeams.bind(this); + (this: any).state = { allTeams: [] }; + (this: any).displayTeams = this.displayTeams.bind(this); + (this: any).setTeams = this.setTeams.bind(this); } componentDidMount() { - this.props.getTeamsList(); + this.props.getCurrentTeam(); + } + + setTeams() { + getTeams().then(response => (this: any).setState({ allTeams: response })); } changeTeam(teamId) { this.props.changeTeam(teamId); - window.location = ROOT_PATH; + setTimeout(() => { + window.location = ROOT_PATH; + }, 1500); } displayTeams() { - if (!_.isEmpty(this.props.all_teams)) { - return this.props.all_teams - .filter(team => !team.current_team) + if (!_.isEmpty((this: any).state.allTeams)) { + return (this: any).state.allTeams + .filter(team => team.id !== this.props.current_team.id) .map(team => ( this.changeTeam(team.id)} key={team.id}> {team.name} )); } + return ; } newTeamLink() { return ( - +   @@ -57,6 +77,7 @@ class TeamSwitch extends Component {  {this.props.current_team.name} @@ -72,38 +93,11 @@ class TeamSwitch extends Component { } } -TeamSwitch.propTypes = { - getTeamsList: PropTypes.func.isRequired, - eventKey: PropTypes.number.isRequired, - changeTeam: PropTypes.func.isRequired, - all_teams: PropTypes.arrayOf( - PropTypes.shape({ - id: PropTypes.number.isRequired, - name: PropTypes.string.isRequired, - current_team: PropTypes.bool.isRequired - }).isRequired - ), - current_team: PropTypes.shape({ - id: PropTypes.number.isRequired, - name: PropTypes.string.isRequired, - current_team: PropTypes.bool.isRequired - }).isRequired -}; - // Map the states from store to component -const mapStateToProps = ({ all_teams, current_team }) => ({ - current_team, - all_teams: all_teams.collection +const mapStateToProps = ({ current_team }) => ({ + current_team }); -// Map the fetch activity action to component -const mapDispatchToProps = dispatch => ({ - changeTeam(teamId) { - dispatch(changeTeam(teamId)); - }, - getTeamsList() { - dispatch(getTeamsList()); - } -}); - -export default connect(mapStateToProps, mapDispatchToProps)(TeamSwitch); +export default connect(mapStateToProps, { getCurrentTeam, changeTeam })( + TeamSwitch +); diff --git a/app/javascript/src/components/actions/TeamsActions.js b/app/javascript/src/components/actions/TeamsActions.js index 3784c4693..c9d70824b 100644 --- a/app/javascript/src/components/actions/TeamsActions.js +++ b/app/javascript/src/components/actions/TeamsActions.js @@ -5,7 +5,11 @@ import type { Actopm$SetCurrentTeam } from "flow-typed"; import type { Dispatch } from "redux-thunk"; -import { getTeams, changeCurrentTeam } from "../../services/api/teams_api"; +import { + getTeams, + changeCurrentTeam, + getCurrentTeam as fetchCurrentTeam +} from "../../services/api/teams_api"; import { GET_LIST_OF_TEAMS, SET_CURRENT_TEAM } from "../../config/action_types"; export function addTeamsData(data: Array): Action$AddTeamData { @@ -15,7 +19,7 @@ export function addTeamsData(data: Array): Action$AddTeamData { }; } -export function setCurrentTeam(team: Teams$Team): Actopm$SetCurrentTeam { +export function setCurrentTeam(team: Teams$CurrentTeam): Actopm$SetCurrentTeam { return { team, type: SET_CURRENT_TEAM @@ -26,9 +30,7 @@ export function getTeamsList(): Dispatch { return dispatch => { getTeams() .then(response => { - const { teams, currentTeam } = response; - dispatch(addTeamsData(teams)); - dispatch(setCurrentTeam(currentTeam)); + dispatch(addTeamsData(response)); }) .catch(error => { console.log("get Teams Error: ", error); @@ -36,14 +38,16 @@ export function getTeamsList(): Dispatch { }; } +export function getCurrentTeam(): Dispatch { + return dispatch => { + fetchCurrentTeam().then(response => dispatch(setCurrentTeam(response))); + }; +} + export function changeTeam(teamID: number): Dispatch { return dispatch => { changeCurrentTeam(teamID) - .then(response => { - const { teams, currentTeam } = response; - dispatch(addTeamsData(teams)); - dispatch(setCurrentTeam(currentTeam)); - }) + .then(response => dispatch(addTeamsData(response))) .catch(error => { console.log("get Teams Error: ", error); }); diff --git a/app/javascript/src/scenes/SettingsPage/scenes/teams/components/LeaveTeamModal.jsx b/app/javascript/src/scenes/SettingsPage/scenes/teams/components/LeaveTeamModal.jsx index b246d1e3d..feaa33253 100644 --- a/app/javascript/src/scenes/SettingsPage/scenes/teams/components/LeaveTeamModal.jsx +++ b/app/javascript/src/scenes/SettingsPage/scenes/teams/components/LeaveTeamModal.jsx @@ -8,7 +8,7 @@ import { leaveTeam } from "../../../../../services/api/teams_api"; import { addTeamsData, - setCurrentTeam + getCurrentTeam } from "../../../../../components/actions/TeamsActions"; type Team = { @@ -23,7 +23,7 @@ type Props = { team: Team, addTeamsData: Function, hideLeaveTeamModal: Function, - setCurrentTeam: Function + getCurrentTeam: Function }; class LeaveTeamModal extends Component { @@ -41,10 +41,9 @@ class LeaveTeamModal extends Component { const { id, user_team_id } = this.props.team; leaveTeam(id, user_team_id) .then(response => { - const { teams, currentTeam } = response; - this.props.updateTeamsState(teams); - this.props.addTeamsData(teams); - this.props.setCurrentTeam(currentTeam); + this.props.updateTeamsState(response); + this.props.addTeamsData(response); + this.props.getCurrentTeam(); }) .catch(error => { console.log("error: ", error.response.data.message); @@ -101,5 +100,5 @@ class LeaveTeamModal extends Component { export default connect(null, { addTeamsData, - setCurrentTeam + getCurrentTeam })(LeaveTeamModal); diff --git a/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsDataTable.jsx b/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsDataTable.jsx index a1baf336f..19bb229b3 100644 --- a/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsDataTable.jsx +++ b/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsDataTable.jsx @@ -12,7 +12,6 @@ import LeaveTeamModal from "./LeaveTeamModal"; const DefaultTeam = { id: 0, name: "", - current_team: false, user_team_id: 0, role: "", members: 0, diff --git a/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsPageDetails.jsx b/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsPageDetails.jsx index 1ac444075..1d946b66e 100644 --- a/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsPageDetails.jsx +++ b/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsPageDetails.jsx @@ -44,10 +44,10 @@ TeamsPageDetails.propTypes = { PropTypes.shape({ id: number.isRequired, name: string.isRequired, - current_team: bool.isRequired, role: string.isRequired, members: number.isRequired, - can_be_left: bool.isRequired + can_be_left: bool.isRequired, + user_team_id: number.isRequired }) ) }; diff --git a/app/javascript/src/scenes/SettingsPage/scenes/teams/index.jsx b/app/javascript/src/scenes/SettingsPage/scenes/teams/index.jsx index b8df7dcd4..4923908ec 100644 --- a/app/javascript/src/scenes/SettingsPage/scenes/teams/index.jsx +++ b/app/javascript/src/scenes/SettingsPage/scenes/teams/index.jsx @@ -1,5 +1,4 @@ // @flow - import React, { Component } from "react"; import styled from "styled-components"; import { Breadcrumb } from "react-bootstrap"; @@ -36,7 +35,7 @@ class SettingsTeams extends Component { { id: 0, name: "", - current_team: true, + user_team_id: 0, role: "", members: 0, can_be_left: false @@ -47,8 +46,8 @@ class SettingsTeams extends Component { } componentDidMount() { - getTeams().then(({ teams }) => { - this.updateTeamsState(teams); + getTeams().then(response => { + this.updateTeamsState(response); }); // set team tab on active this.props.tabState("2"); diff --git a/app/javascript/src/services/api/endpoints.js b/app/javascript/src/services/api/endpoints.js index f017c752e..8f879dbec 100644 --- a/app/javascript/src/services/api/endpoints.js +++ b/app/javascript/src/services/api/endpoints.js @@ -11,14 +11,15 @@ export const TEAMS_PATH = "/client_api/teams"; export const CHANGE_TEAM_PATH = "/client_api/teams/change_team"; export const TEAM_DETAILS_PATH = "/client_api/teams/:team_id/details"; export const TEAM_UPDATE_PATH = "/client_api/teams/update"; -export const CURRENT_USER_PATH = "/client_api/current_user_info" +export const CURRENT_TEAM_PATH = "/client_api/teams/current_team"; // users export const USER_PROFILE_INFO = "/client_api/users/profile_info"; export const UPDATE_USER_PATH = "/client_api/users/update"; -export const PREFERENCES_INFO_PATH = "/client_api/users/preferences_info" -export const STATISTICS_INFO_PATH = "/client_api/users/statistics_info" -export const SIGN_OUT_PATH = "/client_api/users/sign_out_user" +export const PREFERENCES_INFO_PATH = "/client_api/users/preferences_info"; +export const STATISTICS_INFO_PATH = "/client_api/users/statistics_info"; +export const SIGN_OUT_PATH = "/client_api/users/sign_out_user"; +export const CURRENT_USER_PATH = "/client_api/current_user_info"; // info dropdown_title export const CUSTOMER_SUPPORT_LINK = "http://scinote.net/support"; diff --git a/app/javascript/src/services/api/teams_api.js b/app/javascript/src/services/api/teams_api.js index c975e52de..af362cded 100644 --- a/app/javascript/src/services/api/teams_api.js +++ b/app/javascript/src/services/api/teams_api.js @@ -1,13 +1,13 @@ // @flow import type { Teams$NewTeam, Team$Update } from "flow-typed"; -import _ from "lodash"; import axiosInstance from "./config"; import { TEAM_DETAILS_PATH, TEAM_UPDATE_PATH, TEAMS_PATH, CHANGE_TEAM_PATH, - LEAVE_TEAM_PATH + LEAVE_TEAM_PATH, + CURRENT_TEAM_PATH } from "./endpoints"; export const getTeamDetails = (teamID: number): Promise<*> => { @@ -24,24 +24,17 @@ export const updateTeam = (teamID: number, teamData: Team$Update): Promise<*> => .then(({ data }) => data.team); export const getTeams = (): Promise<*> => - axiosInstance.get(TEAMS_PATH).then(({ data }) => { - const teams = data.teams.collection; - const currentTeam = _.find(teams, team => team.current_team); - return { teams, currentTeam }; - }); + axiosInstance.get(TEAMS_PATH).then(({ data }) => data.teams); export const changeCurrentTeam = (teamID: number): Promise<*> => - axiosInstance.post(CHANGE_TEAM_PATH, { team_id: teamID }).then(({ data }) => { - const teams = data.teams.collection; - const currentTeam = _.find(teams, team => team.current_team); - return { teams, currentTeam }; - }); + axiosInstance + .post(CHANGE_TEAM_PATH, { team_id: teamID }) + .then(({ data }) => data.teams); export const leaveTeam = (teamID: number, userTeamID: number): Promise<*> => { const teamUrl = `${LEAVE_TEAM_PATH}?team=${teamID}&user_team=${userTeamID}`; - return axiosInstance.delete(teamUrl).then(({ data }) => { - const teams = data.teams.collection; - const currentTeam = _.find(teams, team => team.current_team); - return { teams, currentTeam }; - }); + return axiosInstance.delete(teamUrl).then(({ data }) => data.teams); }; + +export const getCurrentTeam = (): Promise<*> => + axiosInstance.get(CURRENT_TEAM_PATH).then(({ data }) => data.team); diff --git a/app/models/user.rb b/app/models/user.rb index 0fec69c35..96afe98b2 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -198,6 +198,7 @@ class User < ApplicationRecord has_many :user_notifications, inverse_of: :user has_many :notifications, through: :user_notifications has_many :zip_exports, inverse_of: :user, dependent: :destroy + has_many :datatables_teams, class_name: '::Views::Datatables::DatatablesTeam' # If other errors besides parameter "avatar" exist, # they will propagate to "avatar" also, so remove them @@ -218,25 +219,6 @@ class User < ApplicationRecord Team.find_by_id(self.current_team_id) end - # Retrieves the data needed in all teams page - def teams_data - ActiveRecord::Base.connection.execute( - ActiveRecord::Base.send( - :sanitize_sql_array, - ['SELECT teams.id AS id, teams.name AS name, user_teams.role ' \ - 'AS role, (SELECT COUNT(*) FROM user_teams WHERE ' \ - 'user_teams.team_id = teams.id) AS members, ' \ - 'CASE WHEN teams.id=? THEN true ELSE false END AS current_team, ' \ - 'CASE WHEN (SELECT COUNT(*) FROM user_teams WHERE ' \ - 'user_teams.team_id=teams.id AND role=2) >= 2 THEN true ELSE false ' \ - 'END AS can_be_left, user_teams.id AS user_team_id ' \ - 'FROM teams INNER JOIN user_teams ON ' \ - 'teams.id=user_teams.team_id WHERE user_teams.user_id=?', - self.current_team_id, self.id] - ) - ) - end - # Search all active users for username & email. Can # also specify which team to ignore. def self.search( diff --git a/app/models/views/datatables/datatables_team.rb b/app/models/views/datatables/datatables_team.rb new file mode 100644 index 000000000..3caac3f06 --- /dev/null +++ b/app/models/views/datatables/datatables_team.rb @@ -0,0 +1,16 @@ +module Views + module Datatables + class DatatablesTeam < ApplicationRecord + belongs_to :user + default_scope { order(name: :asc) } + + private + + # this isn't strictly necessary, but it will prevent + # rails from calling save, which would fail anyway. + def readonly? + true + end + end + end +end diff --git a/app/services/client_api/teams_service.rb b/app/services/client_api/teams_service.rb index bd4adba82..e29046165 100644 --- a/app/services/client_api/teams_service.rb +++ b/app/services/client_api/teams_service.rb @@ -31,7 +31,7 @@ module ClientApi end def teams_data - { teams: @user.teams_data } + { teams: @user.datatables_teams } end end diff --git a/app/services/client_api/user_team_service.rb b/app/services/client_api/user_team_service.rb index 80c98e2b3..6cd5685a7 100644 --- a/app/services/client_api/user_team_service.rb +++ b/app/services/client_api/user_team_service.rb @@ -43,7 +43,7 @@ module ClientApi def teams_data { - teams: @user.teams_data, + teams: @user.datatables_teams, flash_message: I18n.t('client_api.user_teams.leave_flash', team: @team.name) } diff --git a/app/views/client_api/teams/current_team.json.jbuilder b/app/views/client_api/teams/current_team.json.jbuilder new file mode 100644 index 000000000..34e833e34 --- /dev/null +++ b/app/views/client_api/teams/current_team.json.jbuilder @@ -0,0 +1,4 @@ +json.team do + json.id team.id + json.name team.name +end diff --git a/app/views/client_api/teams/index.json.jbuilder b/app/views/client_api/teams/index.json.jbuilder index 8f3659017..d32ceeda1 100644 --- a/app/views/client_api/teams/index.json.jbuilder +++ b/app/views/client_api/teams/index.json.jbuilder @@ -1,11 +1,10 @@ json.teams do - json.collection teams do |team| - json.id team.fetch('id') - json.name team.fetch('name') - json.members team.fetch('members') - json.role retrive_role_name(team.fetch('role') { nil }) - json.current_team team.fetch('current_team') - json.can_be_left team.fetch('can_be_left') - json.user_team_id team.fetch('user_team_id') + json.array! teams do |team| + json.id team.id + json.name team.name + json.members team.members + json.role retrive_role_name(team.role) + json.can_be_left team.can_be_left + json.user_team_id team.user_team_id end end diff --git a/config/routes/teams.rb b/config/routes/teams.rb index dacaea158..c24e867e1 100644 --- a/config/routes/teams.rb +++ b/config/routes/teams.rb @@ -4,6 +4,7 @@ get '/teams', to: 'teams/teams#index' namespace :teams do get '/new', to: 'teams#new' get '/:team_id/details', to: 'teams#details' + get '/current_team', to: 'teams#current_team' post '/', to: 'teams#create' post '/change_team', to: 'teams#change_team' post '/update', to: 'teams#update' diff --git a/db/migrate/20171026090804_create_datatables_teams.rb b/db/migrate/20171026090804_create_datatables_teams.rb new file mode 100644 index 000000000..1aa9b0f19 --- /dev/null +++ b/db/migrate/20171026090804_create_datatables_teams.rb @@ -0,0 +1,5 @@ +class CreateDatatablesTeams < ActiveRecord::Migration[5.0] + def change + create_view :datatables_teams + end +end diff --git a/db/schema.rb b/db/schema.rb index 6046e0877..d8c47a9cb 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. @@ -11,802 +10,774 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170515141252) do +ActiveRecord::Schema.define(version: 20171026090804) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" enable_extension "pg_trgm" enable_extension "btree_gist" - create_table "activities", force: :cascade do |t| - t.integer "my_module_id" - t.integer "user_id" - t.integer "type_of", null: false - t.string "message", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "project_id", null: false - t.integer "experiment_id" + create_table "activities", id: :serial, force: :cascade do |t| + t.integer "my_module_id" + t.integer "user_id" + t.integer "type_of", null: false + t.string "message", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "project_id", null: false + t.integer "experiment_id" + t.index ["created_at"], name: "index_activities_on_created_at" + t.index ["experiment_id"], name: "index_activities_on_experiment_id" + t.index ["my_module_id"], name: "index_activities_on_my_module_id" + t.index ["project_id"], name: "index_activities_on_project_id" + t.index ["type_of"], name: "index_activities_on_type_of" + t.index ["user_id"], name: "index_activities_on_user_id" end - add_index "activities", ["created_at"], name: "index_activities_on_created_at", using: :btree - add_index "activities", ["experiment_id"], name: "index_activities_on_experiment_id", using: :btree - add_index "activities", ["my_module_id"], name: "index_activities_on_my_module_id", using: :btree - add_index "activities", ["project_id"], name: "index_activities_on_project_id", using: :btree - add_index "activities", ["type_of"], name: "index_activities_on_type_of", using: :btree - add_index "activities", ["user_id"], name: "index_activities_on_user_id", using: :btree - - create_table "asset_text_data", force: :cascade do |t| - t.text "data", null: false - t.integer "asset_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "asset_text_data", id: :serial, force: :cascade do |t| + t.text "data", null: false + t.integer "asset_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.tsvector "data_vector" + t.index ["asset_id"], name: "index_asset_text_data_on_asset_id", unique: true + t.index ["data_vector"], name: "index_asset_text_data_on_data_vector", using: :gin end - add_index "asset_text_data", ["asset_id"], name: "index_asset_text_data_on_asset_id", unique: true, using: :btree - add_index "asset_text_data", ["data_vector"], name: "index_asset_text_data_on_data_vector", using: :gin - - create_table "assets", force: :cascade do |t| - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "file_file_name" - t.string "file_content_type" - t.integer "file_file_size" + create_table "assets", id: :serial, force: :cascade do |t| + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "file_file_name" + t.string "file_content_type" + t.integer "file_file_size" t.datetime "file_updated_at" - t.integer "created_by_id" - t.integer "last_modified_by_id" - t.integer "estimated_size", default: 0, null: false - t.boolean "file_present", default: false, null: false - t.string "lock", limit: 1024 - t.integer "lock_ttl" - t.integer "version", default: 1 - t.boolean "file_processing" - t.integer "team_id" + t.integer "created_by_id" + t.integer "last_modified_by_id" + t.integer "estimated_size", default: 0, null: false + t.boolean "file_present", default: false, null: false + t.string "lock", limit: 1024 + t.integer "lock_ttl" + t.integer "version", default: 1 + t.boolean "file_processing" + t.integer "team_id" + t.index "trim_html_tags((file_file_name)::text) gin_trgm_ops", name: "index_assets_on_file_file_name", using: :gin + t.index ["created_at"], name: "index_assets_on_created_at" + t.index ["created_by_id"], name: "index_assets_on_created_by_id" + t.index ["last_modified_by_id"], name: "index_assets_on_last_modified_by_id" + t.index ["team_id"], name: "index_assets_on_team_id" end - add_index "assets", ["created_at"], name: "index_assets_on_created_at", using: :btree - add_index "assets", ["created_by_id"], name: "index_assets_on_created_by_id", using: :btree - add_index "assets", ["last_modified_by_id"], name: "index_assets_on_last_modified_by_id", using: :btree - add_index "assets", ["team_id"], name: "index_assets_on_team_id", using: :btree - - create_table "checklist_items", force: :cascade do |t| - t.string "text", null: false - t.boolean "checked", default: false, null: false - t.integer "checklist_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "created_by_id" - t.integer "last_modified_by_id" - t.integer "position" + create_table "checklist_items", id: :serial, force: :cascade do |t| + t.string "text", null: false + t.boolean "checked", default: false, null: false + t.integer "checklist_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "created_by_id" + t.integer "last_modified_by_id" + t.integer "position" + t.index "trim_html_tags((text)::text) gin_trgm_ops", name: "index_checklist_items_on_text", using: :gin + t.index ["checklist_id"], name: "index_checklist_items_on_checklist_id" + t.index ["created_by_id"], name: "index_checklist_items_on_created_by_id" + t.index ["last_modified_by_id"], name: "index_checklist_items_on_last_modified_by_id" end - add_index "checklist_items", ["checklist_id"], name: "index_checklist_items_on_checklist_id", using: :btree - add_index "checklist_items", ["created_by_id"], name: "index_checklist_items_on_created_by_id", using: :btree - add_index "checklist_items", ["last_modified_by_id"], name: "index_checklist_items_on_last_modified_by_id", using: :btree - - create_table "checklists", force: :cascade do |t| - t.string "name", null: false - t.integer "step_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "created_by_id" - t.integer "last_modified_by_id" + create_table "checklists", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.integer "step_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "created_by_id" + t.integer "last_modified_by_id" + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_checklists_on_name", using: :gin + t.index ["created_by_id"], name: "index_checklists_on_created_by_id" + t.index ["last_modified_by_id"], name: "index_checklists_on_last_modified_by_id" + t.index ["step_id"], name: "index_checklists_on_step_id" end - add_index "checklists", ["created_by_id"], name: "index_checklists_on_created_by_id", using: :btree - add_index "checklists", ["last_modified_by_id"], name: "index_checklists_on_last_modified_by_id", using: :btree - add_index "checklists", ["step_id"], name: "index_checklists_on_step_id", using: :btree - - create_table "comments", force: :cascade do |t| - t.string "message", null: false - t.integer "user_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "last_modified_by_id" - t.string "type" - t.integer "associated_id" + create_table "comments", id: :serial, force: :cascade do |t| + t.string "message", null: false + t.integer "user_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "last_modified_by_id" + t.string "type" + t.integer "associated_id" + t.index "trim_html_tags((message)::text) gin_trgm_ops", name: "index_comments_on_message", using: :gin + t.index ["associated_id"], name: "index_comments_on_associated_id" + t.index ["created_at"], name: "index_comments_on_created_at" + t.index ["last_modified_by_id"], name: "index_comments_on_last_modified_by_id" + t.index ["type"], name: "index_comments_on_type" + t.index ["user_id"], name: "index_comments_on_user_id" end - add_index "comments", ["associated_id"], name: "index_comments_on_associated_id", using: :btree - add_index "comments", ["created_at"], name: "index_comments_on_created_at", using: :btree - add_index "comments", ["last_modified_by_id"], name: "index_comments_on_last_modified_by_id", using: :btree - add_index "comments", ["type"], name: "index_comments_on_type", using: :btree - add_index "comments", ["user_id"], name: "index_comments_on_user_id", using: :btree - - create_table "connections", force: :cascade do |t| - t.integer "input_id", null: false + create_table "connections", id: :serial, force: :cascade do |t| + t.integer "input_id", null: false t.integer "output_id", null: false + t.index ["input_id"], name: "index_connections_on_input_id" + t.index ["output_id"], name: "index_connections_on_output_id" end - create_table "custom_fields", force: :cascade do |t| - t.string "name", null: false - t.integer "user_id", null: false - t.integer "team_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "last_modified_by_id" + create_table "custom_fields", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.integer "user_id", null: false + t.integer "team_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "last_modified_by_id" + t.index ["last_modified_by_id"], name: "index_custom_fields_on_last_modified_by_id" + t.index ["team_id"], name: "index_custom_fields_on_team_id" + t.index ["user_id"], name: "index_custom_fields_on_user_id" end - add_index "custom_fields", ["last_modified_by_id"], name: "index_custom_fields_on_last_modified_by_id", using: :btree - add_index "custom_fields", ["team_id"], name: "index_custom_fields_on_team_id", using: :btree - add_index "custom_fields", ["user_id"], name: "index_custom_fields_on_user_id", using: :btree - - create_table "delayed_jobs", force: :cascade do |t| - t.integer "priority", default: 0, null: false - t.integer "attempts", default: 0, null: false - t.text "handler", null: false - t.text "last_error" + create_table "delayed_jobs", id: :serial, force: :cascade do |t| + t.integer "priority", default: 0, null: false + t.integer "attempts", default: 0, null: false + t.text "handler", null: false + t.text "last_error" t.datetime "run_at" t.datetime "locked_at" t.datetime "failed_at" - t.string "locked_by" - t.string "queue" + t.string "locked_by" + t.string "queue" t.datetime "created_at" t.datetime "updated_at" + t.index ["priority", "run_at"], name: "delayed_jobs_priority" + t.index ["queue"], name: "delayed_jobs_queue" end - add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree - add_index "delayed_jobs", ["queue"], name: "delayed_jobs_queue", using: :btree - - create_table "experiments", force: :cascade do |t| - t.string "name", null: false - t.text "description" - t.integer "project_id", null: false - t.integer "created_by_id", null: false - t.integer "last_modified_by_id", null: false - t.boolean "archived", default: false, null: false - t.integer "archived_by_id" + create_table "experiments", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.text "description" + t.integer "project_id", null: false + t.integer "created_by_id", null: false + t.integer "last_modified_by_id", null: false + t.boolean "archived", default: false, null: false + t.integer "archived_by_id" t.datetime "archived_on" - t.integer "restored_by_id" + t.integer "restored_by_id" t.datetime "restored_on" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "workflowimg_file_name" - t.string "workflowimg_content_type" - t.integer "workflowimg_file_size" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "workflowimg_file_name" + t.string "workflowimg_content_type" + t.integer "workflowimg_file_size" t.datetime "workflowimg_updated_at" + t.index ["archived_by_id"], name: "index_experiments_on_archived_by_id" + t.index ["created_by_id"], name: "index_experiments_on_created_by_id" + t.index ["last_modified_by_id"], name: "index_experiments_on_last_modified_by_id" + t.index ["name"], name: "index_experiments_on_name" + t.index ["project_id"], name: "index_experiments_on_project_id" + t.index ["restored_by_id"], name: "index_experiments_on_restored_by_id" end - add_index "experiments", ["archived_by_id"], name: "index_experiments_on_archived_by_id", using: :btree - add_index "experiments", ["created_by_id"], name: "index_experiments_on_created_by_id", using: :btree - add_index "experiments", ["last_modified_by_id"], name: "index_experiments_on_last_modified_by_id", using: :btree - add_index "experiments", ["name"], name: "index_experiments_on_name", using: :btree - add_index "experiments", ["project_id"], name: "index_experiments_on_project_id", using: :btree - add_index "experiments", ["restored_by_id"], name: "index_experiments_on_restored_by_id", using: :btree - - create_table "my_module_groups", force: :cascade do |t| - t.string "name", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "created_by_id" - t.integer "experiment_id", default: 0, null: false + create_table "my_module_groups", id: :serial, force: :cascade do |t| + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "created_by_id" + t.integer "experiment_id", default: 0, null: false + t.index ["created_by_id"], name: "index_my_module_groups_on_created_by_id" + t.index ["experiment_id"], name: "index_my_module_groups_on_experiment_id" end - add_index "my_module_groups", ["created_by_id"], name: "index_my_module_groups_on_created_by_id", using: :btree - add_index "my_module_groups", ["experiment_id"], name: "index_my_module_groups_on_experiment_id", using: :btree - - create_table "my_module_repository_rows", force: :cascade do |t| - t.integer "repository_row_id", null: false - t.integer "my_module_id" - t.integer "assigned_by_id", null: false + create_table "my_module_repository_rows", id: :serial, force: :cascade do |t| + t.integer "repository_row_id", null: false + t.integer "my_module_id" + t.integer "assigned_by_id", null: false t.datetime "created_at" t.datetime "updated_at" + t.index ["my_module_id", "repository_row_id"], name: "index_my_module_ids_repository_row_ids" + t.index ["repository_row_id"], name: "index_my_module_repository_rows_on_repository_row_id" end - add_index "my_module_repository_rows", ["my_module_id", "repository_row_id"], name: "index_my_module_ids_repository_row_ids", using: :btree - add_index "my_module_repository_rows", ["repository_row_id"], name: "index_my_module_repository_rows_on_repository_row_id", using: :btree - - create_table "my_module_tags", force: :cascade do |t| + create_table "my_module_tags", id: :serial, force: :cascade do |t| t.integer "my_module_id" t.integer "tag_id" t.integer "created_by_id" + t.index ["created_by_id"], name: "index_my_module_tags_on_created_by_id" + t.index ["my_module_id"], name: "index_my_module_tags_on_my_module_id" + t.index ["tag_id"], name: "index_my_module_tags_on_tag_id" end - add_index "my_module_tags", ["created_by_id"], name: "index_my_module_tags_on_created_by_id", using: :btree - add_index "my_module_tags", ["my_module_id"], name: "index_my_module_tags_on_my_module_id", using: :btree - add_index "my_module_tags", ["tag_id"], name: "index_my_module_tags_on_tag_id", using: :btree - - create_table "my_modules", force: :cascade do |t| - t.string "name", null: false + create_table "my_modules", id: :serial, force: :cascade do |t| + t.string "name", null: false t.datetime "due_date" - t.string "description" - t.integer "x", default: 0, null: false - t.integer "y", default: 0, null: false - t.integer "my_module_group_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "archived", default: false, null: false + t.string "description" + t.integer "x", default: 0, null: false + t.integer "y", default: 0, null: false + t.integer "my_module_group_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "archived", default: false, null: false t.datetime "archived_on" - t.integer "created_by_id" - t.integer "last_modified_by_id" - t.integer "archived_by_id" - t.integer "restored_by_id" + t.integer "created_by_id" + t.integer "last_modified_by_id" + t.integer "archived_by_id" + t.integer "restored_by_id" t.datetime "restored_on" - t.integer "nr_of_assigned_samples", default: 0 - t.integer "workflow_order", default: -1, null: false - t.integer "experiment_id", default: 0, null: false - t.integer "state", limit: 2, default: 0 + t.integer "nr_of_assigned_samples", default: 0 + t.integer "workflow_order", default: -1, null: false + t.integer "experiment_id", default: 0, null: false + t.integer "state", limit: 2, default: 0 t.datetime "completed_on" + t.index "trim_html_tags((description)::text) gin_trgm_ops", name: "index_my_modules_on_description", using: :gin + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_my_modules_on_name", using: :gin + t.index ["archived_by_id"], name: "index_my_modules_on_archived_by_id" + t.index ["created_by_id"], name: "index_my_modules_on_created_by_id" + t.index ["experiment_id"], name: "index_my_modules_on_experiment_id" + t.index ["last_modified_by_id"], name: "index_my_modules_on_last_modified_by_id" + t.index ["my_module_group_id"], name: "index_my_modules_on_my_module_group_id" + t.index ["restored_by_id"], name: "index_my_modules_on_restored_by_id" end - add_index "my_modules", ["archived_by_id"], name: "index_my_modules_on_archived_by_id", using: :btree - add_index "my_modules", ["created_by_id"], name: "index_my_modules_on_created_by_id", using: :btree - add_index "my_modules", ["experiment_id"], name: "index_my_modules_on_experiment_id", using: :btree - add_index "my_modules", ["last_modified_by_id"], name: "index_my_modules_on_last_modified_by_id", using: :btree - add_index "my_modules", ["my_module_group_id"], name: "index_my_modules_on_my_module_group_id", using: :btree - add_index "my_modules", ["restored_by_id"], name: "index_my_modules_on_restored_by_id", using: :btree - - create_table "notifications", force: :cascade do |t| - t.string "title" - t.string "message" - t.integer "type_of", null: false - t.integer "generator_user_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "notifications", id: :serial, force: :cascade do |t| + t.string "title" + t.string "message" + t.integer "type_of", null: false + t.integer "generator_user_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["created_at"], name: "index_notifications_on_created_at" end - add_index "notifications", ["created_at"], name: "index_notifications_on_created_at", using: :btree - - create_table "projects", force: :cascade do |t| - t.string "name", null: false - t.integer "visibility", default: 0, null: false + create_table "projects", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.integer "visibility", default: 0, null: false t.datetime "due_date" - t.integer "team_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "archived", default: false, null: false + t.integer "team_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "archived", default: false, null: false t.datetime "archived_on" - t.integer "created_by_id" - t.integer "last_modified_by_id" - t.integer "archived_by_id" - t.integer "restored_by_id" + t.integer "created_by_id" + t.integer "last_modified_by_id" + t.integer "archived_by_id" + t.integer "restored_by_id" t.datetime "restored_on" - t.string "experiments_order" + t.string "experiments_order" + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_projects_on_name", using: :gin + t.index ["archived_by_id"], name: "index_projects_on_archived_by_id" + t.index ["created_by_id"], name: "index_projects_on_created_by_id" + t.index ["last_modified_by_id"], name: "index_projects_on_last_modified_by_id" + t.index ["restored_by_id"], name: "index_projects_on_restored_by_id" + t.index ["team_id"], name: "index_projects_on_team_id" end - add_index "projects", ["archived_by_id"], name: "index_projects_on_archived_by_id", using: :btree - add_index "projects", ["created_by_id"], name: "index_projects_on_created_by_id", using: :btree - add_index "projects", ["last_modified_by_id"], name: "index_projects_on_last_modified_by_id", using: :btree - add_index "projects", ["restored_by_id"], name: "index_projects_on_restored_by_id", using: :btree - add_index "projects", ["team_id"], name: "index_projects_on_team_id", using: :btree - - create_table "protocol_keywords", force: :cascade do |t| - t.string "name" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "nr_of_protocols", default: 0 - t.integer "team_id", null: false + create_table "protocol_keywords", id: :serial, force: :cascade do |t| + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "nr_of_protocols", default: 0 + t.integer "team_id", null: false + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_protocol_keywords_on_name", using: :gin + t.index ["team_id"], name: "index_protocol_keywords_on_team_id" end - add_index "protocol_keywords", ["team_id"], name: "index_protocol_keywords_on_team_id", using: :btree - - create_table "protocol_protocol_keywords", force: :cascade do |t| - t.integer "protocol_id", null: false + create_table "protocol_protocol_keywords", id: :serial, force: :cascade do |t| + t.integer "protocol_id", null: false t.integer "protocol_keyword_id", null: false + t.index ["protocol_id"], name: "index_protocol_protocol_keywords_on_protocol_id" + t.index ["protocol_keyword_id"], name: "index_protocol_protocol_keywords_on_protocol_keyword_id" end - add_index "protocol_protocol_keywords", ["protocol_id"], name: "index_protocol_protocol_keywords_on_protocol_id", using: :btree - add_index "protocol_protocol_keywords", ["protocol_keyword_id"], name: "index_protocol_protocol_keywords_on_protocol_keyword_id", using: :btree - - create_table "protocols", force: :cascade do |t| - t.string "name" - t.text "authors" - t.text "description" - t.integer "added_by_id" - t.integer "my_module_id" - t.integer "team_id", null: false - t.integer "protocol_type", default: 0, null: false - t.integer "parent_id" + create_table "protocols", id: :serial, force: :cascade do |t| + t.string "name" + t.text "authors" + t.text "description" + t.integer "added_by_id" + t.integer "my_module_id" + t.integer "team_id", null: false + t.integer "protocol_type", default: 0, null: false + t.integer "parent_id" t.datetime "parent_updated_at" - t.integer "archived_by_id" + t.integer "archived_by_id" t.datetime "archived_on" - t.integer "restored_by_id" + t.integer "restored_by_id" t.datetime "restored_on" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.datetime "published_on" - t.integer "nr_of_linked_children", default: 0 + t.integer "nr_of_linked_children", default: 0 + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_protocols_on_name", using: :gin + t.index "trim_html_tags(authors) gin_trgm_ops", name: "index_protocols_on_authors", using: :gin + t.index "trim_html_tags(description) gin_trgm_ops", name: "index_protocols_on_description", using: :gin + t.index ["added_by_id"], name: "index_protocols_on_added_by_id" + t.index ["archived_by_id"], name: "index_protocols_on_archived_by_id" + t.index ["my_module_id"], name: "index_protocols_on_my_module_id" + t.index ["parent_id"], name: "index_protocols_on_parent_id" + t.index ["protocol_type"], name: "index_protocols_on_protocol_type" + t.index ["restored_by_id"], name: "index_protocols_on_restored_by_id" + t.index ["team_id"], name: "index_protocols_on_team_id" end - add_index "protocols", ["added_by_id"], name: "index_protocols_on_added_by_id", using: :btree - add_index "protocols", ["archived_by_id"], name: "index_protocols_on_archived_by_id", using: :btree - add_index "protocols", ["my_module_id"], name: "index_protocols_on_my_module_id", using: :btree - add_index "protocols", ["parent_id"], name: "index_protocols_on_parent_id", using: :btree - add_index "protocols", ["protocol_type"], name: "index_protocols_on_protocol_type", using: :btree - add_index "protocols", ["restored_by_id"], name: "index_protocols_on_restored_by_id", using: :btree - add_index "protocols", ["team_id"], name: "index_protocols_on_team_id", using: :btree - - create_table "report_elements", force: :cascade do |t| - t.integer "position", null: false - t.integer "type_of", null: false - t.integer "sort_order", default: 0 - t.integer "report_id" - t.integer "parent_id" - t.integer "project_id" - t.integer "my_module_id" - t.integer "step_id" - t.integer "result_id" - t.integer "checklist_id" - t.integer "asset_id" - t.integer "table_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "experiment_id" - t.integer "repository_id" + create_table "report_elements", id: :serial, force: :cascade do |t| + t.integer "position", null: false + t.integer "type_of", null: false + t.integer "sort_order", default: 0 + t.integer "report_id" + t.integer "parent_id" + t.integer "project_id" + t.integer "my_module_id" + t.integer "step_id" + t.integer "result_id" + t.integer "checklist_id" + t.integer "asset_id" + t.integer "table_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "experiment_id" + t.integer "repository_id" + t.index ["asset_id"], name: "index_report_elements_on_asset_id" + t.index ["checklist_id"], name: "index_report_elements_on_checklist_id" + t.index ["experiment_id"], name: "index_report_elements_on_experiment_id" + t.index ["my_module_id"], name: "index_report_elements_on_my_module_id" + t.index ["parent_id"], name: "index_report_elements_on_parent_id" + t.index ["project_id"], name: "index_report_elements_on_project_id" + t.index ["report_id"], name: "index_report_elements_on_report_id" + t.index ["repository_id"], name: "index_report_elements_on_repository_id" + t.index ["result_id"], name: "index_report_elements_on_result_id" + t.index ["step_id"], name: "index_report_elements_on_step_id" + t.index ["table_id"], name: "index_report_elements_on_table_id" end - add_index "report_elements", ["asset_id"], name: "index_report_elements_on_asset_id", using: :btree - add_index "report_elements", ["checklist_id"], name: "index_report_elements_on_checklist_id", using: :btree - add_index "report_elements", ["experiment_id"], name: "index_report_elements_on_experiment_id", using: :btree - add_index "report_elements", ["my_module_id"], name: "index_report_elements_on_my_module_id", using: :btree - add_index "report_elements", ["parent_id"], name: "index_report_elements_on_parent_id", using: :btree - add_index "report_elements", ["project_id"], name: "index_report_elements_on_project_id", using: :btree - add_index "report_elements", ["report_id"], name: "index_report_elements_on_report_id", using: :btree - add_index "report_elements", ["repository_id"], name: "index_report_elements_on_repository_id", using: :btree - add_index "report_elements", ["result_id"], name: "index_report_elements_on_result_id", using: :btree - add_index "report_elements", ["step_id"], name: "index_report_elements_on_step_id", using: :btree - add_index "report_elements", ["table_id"], name: "index_report_elements_on_table_id", using: :btree - - create_table "reports", force: :cascade do |t| - t.string "name", null: false - t.string "description" - t.integer "project_id", null: false - t.integer "user_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "last_modified_by_id" + create_table "reports", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.string "description" + t.integer "project_id", null: false + t.integer "user_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "last_modified_by_id" + t.index "trim_html_tags((description)::text) gin_trgm_ops", name: "index_reports_on_description", using: :gin + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_reports_on_name", using: :gin + t.index ["last_modified_by_id"], name: "index_reports_on_last_modified_by_id" + t.index ["project_id"], name: "index_reports_on_project_id" + t.index ["user_id"], name: "index_reports_on_user_id" end - add_index "reports", ["last_modified_by_id"], name: "index_reports_on_last_modified_by_id", using: :btree - add_index "reports", ["project_id"], name: "index_reports_on_project_id", using: :btree - add_index "reports", ["user_id"], name: "index_reports_on_user_id", using: :btree - - create_table "repositories", force: :cascade do |t| - t.integer "team_id" - t.integer "created_by_id", null: false - t.string "name" + create_table "repositories", id: :serial, force: :cascade do |t| + t.integer "team_id" + t.integer "created_by_id", null: false + t.string "name" t.datetime "created_at" t.datetime "updated_at" + t.index ["team_id"], name: "index_repositories_on_team_id" end - add_index "repositories", ["team_id"], name: "index_repositories_on_team_id", using: :btree - - create_table "repository_cells", force: :cascade do |t| - t.integer "repository_row_id" - t.integer "repository_column_id" - t.integer "value_id" - t.string "value_type" + create_table "repository_cells", id: :serial, force: :cascade do |t| + t.integer "repository_row_id" + t.integer "repository_column_id" + t.string "value_type" + t.integer "value_id" t.datetime "created_at" t.datetime "updated_at" + t.index ["repository_column_id"], name: "index_repository_cells_on_repository_column_id" + t.index ["repository_row_id"], name: "index_repository_cells_on_repository_row_id" + t.index ["value_type", "value_id"], name: "index_repository_cells_on_value_type_and_value_id" end - add_index "repository_cells", ["repository_column_id"], name: "index_repository_cells_on_repository_column_id", using: :btree - add_index "repository_cells", ["repository_row_id"], name: "index_repository_cells_on_repository_row_id", using: :btree - add_index "repository_cells", ["value_type", "value_id"], name: "index_repository_cells_on_value_type_and_value_id", using: :btree - - create_table "repository_columns", force: :cascade do |t| - t.integer "repository_id" - t.integer "created_by_id", null: false - t.string "name" - t.integer "data_type", null: false + create_table "repository_columns", id: :serial, force: :cascade do |t| + t.integer "repository_id" + t.integer "created_by_id", null: false + t.string "name" + t.integer "data_type", null: false t.datetime "created_at" t.datetime "updated_at" + t.index ["repository_id"], name: "index_repository_columns_on_repository_id" end - add_index "repository_columns", ["repository_id"], name: "index_repository_columns_on_repository_id", using: :btree - - create_table "repository_date_values", force: :cascade do |t| + create_table "repository_date_values", id: :serial, force: :cascade do |t| t.datetime "data" t.datetime "created_at" t.datetime "updated_at" - t.integer "created_by_id", null: false - t.integer "last_modified_by_id", null: false + t.integer "created_by_id", null: false + t.integer "last_modified_by_id", null: false end - create_table "repository_rows", force: :cascade do |t| - t.integer "repository_id" - t.integer "created_by_id", null: false - t.integer "last_modified_by_id", null: false - t.string "name" + create_table "repository_rows", id: :serial, force: :cascade do |t| + t.integer "repository_id" + t.integer "created_by_id", null: false + t.integer "last_modified_by_id", null: false + t.string "name" t.datetime "created_at" t.datetime "updated_at" + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_repository_rows_on_name", using: :gin + t.index ["repository_id"], name: "index_repository_rows_on_repository_id" end - add_index "repository_rows", ["name"], name: "index_repository_rows_on_name", using: :btree - add_index "repository_rows", ["repository_id"], name: "index_repository_rows_on_repository_id", using: :btree - - create_table "repository_table_states", force: :cascade do |t| - t.jsonb "state", null: false - t.integer "user_id", null: false - t.integer "repository_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "repository_table_states", id: :serial, force: :cascade do |t| + t.jsonb "state", null: false + t.integer "user_id", null: false + t.integer "repository_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["repository_id"], name: "index_repository_table_states_on_repository_id" + t.index ["user_id"], name: "index_repository_table_states_on_user_id" end - add_index "repository_table_states", ["repository_id"], name: "index_repository_table_states_on_repository_id", using: :btree - add_index "repository_table_states", ["user_id"], name: "index_repository_table_states_on_user_id", using: :btree - - create_table "repository_text_values", force: :cascade do |t| - t.string "data" + create_table "repository_text_values", id: :serial, force: :cascade do |t| + t.string "data" t.datetime "created_at" t.datetime "updated_at" - t.integer "created_by_id", null: false - t.integer "last_modified_by_id", null: false + t.integer "created_by_id", null: false + t.integer "last_modified_by_id", null: false + t.index "trim_html_tags((data)::text) gin_trgm_ops", name: "index_repository_text_values_on_data", using: :gin end - create_table "result_assets", force: :cascade do |t| + create_table "result_assets", id: :serial, force: :cascade do |t| t.integer "result_id", null: false - t.integer "asset_id", null: false - end - - add_index "result_assets", ["result_id", "asset_id"], name: "index_result_assets_on_result_id_and_asset_id", using: :btree - - create_table "result_tables", force: :cascade do |t| - t.integer "result_id", null: false - t.integer "table_id", null: false - end - - add_index "result_tables", ["result_id", "table_id"], name: "index_result_tables_on_result_id_and_table_id", using: :btree - - create_table "result_texts", force: :cascade do |t| - t.string "text", null: false - t.integer "result_id", null: false - end - - add_index "result_texts", ["result_id"], name: "index_result_texts_on_result_id", using: :btree - - create_table "results", force: :cascade do |t| - t.string "name" - t.integer "my_module_id", null: false - t.integer "user_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "archived", default: false, null: false - t.datetime "archived_on" - t.integer "last_modified_by_id" - t.integer "archived_by_id" - t.integer "restored_by_id" - t.datetime "restored_on" - end - - add_index "results", ["archived_by_id"], name: "index_results_on_archived_by_id", using: :btree - add_index "results", ["created_at"], name: "index_results_on_created_at", using: :btree - add_index "results", ["last_modified_by_id"], name: "index_results_on_last_modified_by_id", using: :btree - add_index "results", ["my_module_id"], name: "index_results_on_my_module_id", using: :btree - add_index "results", ["restored_by_id"], name: "index_results_on_restored_by_id", using: :btree - add_index "results", ["user_id"], name: "index_results_on_user_id", using: :btree - - create_table "sample_custom_fields", force: :cascade do |t| - t.string "value", null: false - t.integer "custom_field_id", null: false - t.integer "sample_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - add_index "sample_custom_fields", ["custom_field_id"], name: "index_sample_custom_fields_on_custom_field_id", using: :btree - add_index "sample_custom_fields", ["sample_id"], name: "index_sample_custom_fields_on_sample_id", using: :btree - - create_table "sample_groups", force: :cascade do |t| - t.string "name", null: false - t.string "color", default: "#ff0000", null: false - t.integer "team_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "created_by_id" - t.integer "last_modified_by_id" - end - - add_index "sample_groups", ["created_by_id"], name: "index_sample_groups_on_created_by_id", using: :btree - add_index "sample_groups", ["last_modified_by_id"], name: "index_sample_groups_on_last_modified_by_id", using: :btree - add_index "sample_groups", ["team_id"], name: "index_sample_groups_on_team_id", using: :btree - - create_table "sample_my_modules", force: :cascade do |t| - t.integer "sample_id", null: false - t.integer "my_module_id", null: false - t.integer "assigned_by_id" - t.datetime "assigned_on" - end - - add_index "sample_my_modules", ["assigned_by_id"], name: "index_sample_my_modules_on_assigned_by_id", using: :btree - add_index "sample_my_modules", ["sample_id", "my_module_id"], name: "index_sample_my_modules_on_sample_id_and_my_module_id", using: :btree - - create_table "sample_types", force: :cascade do |t| - t.string "name", null: false - t.integer "team_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "created_by_id" - t.integer "last_modified_by_id" - end - - add_index "sample_types", ["created_by_id"], name: "index_sample_types_on_created_by_id", using: :btree - add_index "sample_types", ["last_modified_by_id"], name: "index_sample_types_on_last_modified_by_id", using: :btree - add_index "sample_types", ["team_id"], name: "index_sample_types_on_team_id", using: :btree - - create_table "samples", force: :cascade do |t| - t.string "name", null: false - t.integer "user_id", null: false - t.integer "team_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "sample_group_id" - t.integer "sample_type_id" - t.integer "last_modified_by_id" - t.integer "nr_of_modules_assigned_to", default: 0 - end - - add_index "samples", ["last_modified_by_id"], name: "index_samples_on_last_modified_by_id", using: :btree - add_index "samples", ["sample_group_id"], name: "index_samples_on_sample_group_id", using: :btree - add_index "samples", ["sample_type_id"], name: "index_samples_on_sample_type_id", using: :btree - add_index "samples", ["team_id"], name: "index_samples_on_team_id", using: :btree - add_index "samples", ["user_id"], name: "index_samples_on_user_id", using: :btree - - create_table "samples_tables", force: :cascade do |t| - t.jsonb "status", default: {"time"=>0, "order"=>[[2, "desc"]], "start"=>0, "length"=>10, "search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "columns"=>[{"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}], "ColReorder"=>[0, 1, 2, 3, 4, 5, 6]}, null: false - t.integer "user_id", null: false - t.integer "team_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - add_index "samples_tables", ["team_id"], name: "index_samples_tables_on_team_id", using: :btree - add_index "samples_tables", ["user_id"], name: "index_samples_tables_on_user_id", using: :btree - - create_table "settings", force: :cascade do |t| - t.text "type", null: false - t.jsonb "values", default: {}, null: false - end - - add_index "settings", ["type"], name: "index_settings_on_type", unique: true, using: :btree - - create_table "step_assets", force: :cascade do |t| - t.integer "step_id", null: false t.integer "asset_id", null: false + t.index ["result_id", "asset_id"], name: "index_result_assets_on_result_id_and_asset_id" end - add_index "step_assets", ["step_id", "asset_id"], name: "index_step_assets_on_step_id_and_asset_id", using: :btree - - create_table "step_tables", force: :cascade do |t| - t.integer "step_id", null: false + create_table "result_tables", id: :serial, force: :cascade do |t| + t.integer "result_id", null: false t.integer "table_id", null: false + t.index ["result_id", "table_id"], name: "index_result_tables_on_result_id_and_table_id" end - add_index "step_tables", ["step_id", "table_id"], name: "index_step_tables_on_step_id_and_table_id", unique: true, using: :btree + create_table "result_texts", id: :serial, force: :cascade do |t| + t.string "text", null: false + t.integer "result_id", null: false + t.index "trim_html_tags((text)::text) gin_trgm_ops", name: "index_result_texts_on_text", using: :gin + t.index ["result_id"], name: "index_result_texts_on_result_id" + end - create_table "steps", force: :cascade do |t| - t.string "name" - t.string "description" - t.integer "position", null: false - t.boolean "completed", null: false + create_table "results", id: :serial, force: :cascade do |t| + t.string "name" + t.integer "my_module_id", null: false + t.integer "user_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "archived", default: false, null: false + t.datetime "archived_on" + t.integer "last_modified_by_id" + t.integer "archived_by_id" + t.integer "restored_by_id" + t.datetime "restored_on" + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_results_on_name", using: :gin + t.index ["archived_by_id"], name: "index_results_on_archived_by_id" + t.index ["created_at"], name: "index_results_on_created_at" + t.index ["last_modified_by_id"], name: "index_results_on_last_modified_by_id" + t.index ["my_module_id"], name: "index_results_on_my_module_id" + t.index ["restored_by_id"], name: "index_results_on_restored_by_id" + t.index ["user_id"], name: "index_results_on_user_id" + end + + create_table "sample_custom_fields", id: :serial, force: :cascade do |t| + t.string "value", null: false + t.integer "custom_field_id", null: false + t.integer "sample_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index "trim_html_tags((value)::text) gin_trgm_ops", name: "index_sample_custom_fields_on_value", using: :gin + t.index ["custom_field_id"], name: "index_sample_custom_fields_on_custom_field_id" + t.index ["sample_id"], name: "index_sample_custom_fields_on_sample_id" + end + + create_table "sample_groups", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.string "color", default: "#ff0000", null: false + t.integer "team_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "created_by_id" + t.integer "last_modified_by_id" + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_sample_groups_on_name", using: :gin + t.index ["created_by_id"], name: "index_sample_groups_on_created_by_id" + t.index ["last_modified_by_id"], name: "index_sample_groups_on_last_modified_by_id" + t.index ["team_id"], name: "index_sample_groups_on_team_id" + end + + create_table "sample_my_modules", id: :serial, force: :cascade do |t| + t.integer "sample_id", null: false + t.integer "my_module_id", null: false + t.integer "assigned_by_id" + t.datetime "assigned_on" + t.index ["assigned_by_id"], name: "index_sample_my_modules_on_assigned_by_id" + t.index ["my_module_id"], name: "index_sample_my_modules_on_my_module_id" + t.index ["sample_id", "my_module_id"], name: "index_sample_my_modules_on_sample_id_and_my_module_id" + end + + create_table "sample_types", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.integer "team_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "created_by_id" + t.integer "last_modified_by_id" + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_sample_types_on_name", using: :gin + t.index ["created_by_id"], name: "index_sample_types_on_created_by_id" + t.index ["last_modified_by_id"], name: "index_sample_types_on_last_modified_by_id" + t.index ["team_id"], name: "index_sample_types_on_team_id" + end + + create_table "samples", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.integer "user_id", null: false + t.integer "team_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "sample_group_id" + t.integer "sample_type_id" + t.integer "last_modified_by_id" + t.integer "nr_of_modules_assigned_to", default: 0 + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_samples_on_name", using: :gin + t.index ["last_modified_by_id"], name: "index_samples_on_last_modified_by_id" + t.index ["sample_group_id"], name: "index_samples_on_sample_group_id" + t.index ["sample_type_id"], name: "index_samples_on_sample_type_id" + t.index ["team_id"], name: "index_samples_on_team_id" + t.index ["user_id"], name: "index_samples_on_user_id" + end + + create_table "samples_tables", id: :serial, force: :cascade do |t| + t.jsonb "status", default: {"time"=>0, "order"=>[[2, "desc"]], "start"=>0, "length"=>10, "search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "columns"=>[{"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}, {"search"=>{"regex"=>false, "smart"=>true, "search"=>"", "caseInsensitive"=>true}, "visible"=>true}], "assigned"=>"all", "ColReorder"=>[0, 1, 2, 3, 4, 5, 6]}, null: false + t.integer "user_id", null: false + t.integer "team_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["team_id"], name: "index_samples_tables_on_team_id" + t.index ["user_id"], name: "index_samples_tables_on_user_id" + end + + create_table "settings", id: :serial, force: :cascade do |t| + t.text "type", null: false + t.jsonb "values", default: {}, null: false + t.index ["type"], name: "index_settings_on_type", unique: true + end + + create_table "step_assets", id: :serial, force: :cascade do |t| + t.integer "step_id", null: false + t.integer "asset_id", null: false + t.index ["step_id", "asset_id"], name: "index_step_assets_on_step_id_and_asset_id" + end + + create_table "step_tables", id: :serial, force: :cascade do |t| + t.integer "step_id", null: false + t.integer "table_id", null: false + t.index ["step_id", "table_id"], name: "index_step_tables_on_step_id_and_table_id", unique: true + end + + create_table "steps", id: :serial, force: :cascade do |t| + t.string "name" + t.string "description" + t.integer "position", null: false + t.boolean "completed", null: false t.datetime "completed_on" - t.integer "user_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "last_modified_by_id" - t.integer "protocol_id", null: false + t.integer "user_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "last_modified_by_id" + t.integer "protocol_id", null: false + t.index "trim_html_tags((description)::text) gin_trgm_ops", name: "index_steps_on_description", using: :gin + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_steps_on_name", using: :gin + t.index ["created_at"], name: "index_steps_on_created_at" + t.index ["last_modified_by_id"], name: "index_steps_on_last_modified_by_id" + t.index ["position"], name: "index_steps_on_position" + t.index ["protocol_id"], name: "index_steps_on_protocol_id" + t.index ["user_id"], name: "index_steps_on_user_id" end - add_index "steps", ["created_at"], name: "index_steps_on_created_at", using: :btree - add_index "steps", ["last_modified_by_id"], name: "index_steps_on_last_modified_by_id", using: :btree - add_index "steps", ["position"], name: "index_steps_on_position", using: :btree - add_index "steps", ["protocol_id"], name: "index_steps_on_protocol_id", using: :btree - add_index "steps", ["user_id"], name: "index_steps_on_user_id", using: :btree - - create_table "tables", force: :cascade do |t| - t.binary "contents", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "created_by_id" - t.integer "last_modified_by_id" + create_table "tables", id: :serial, force: :cascade do |t| + t.binary "contents", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "created_by_id" + t.integer "last_modified_by_id" t.tsvector "data_vector" - t.string "name", default: "" - t.integer "team_id" + t.string "name", default: "" + t.integer "team_id" + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_tables_on_name", using: :gin + t.index ["created_at"], name: "index_tables_on_created_at" + t.index ["created_by_id"], name: "index_tables_on_created_by_id" + t.index ["data_vector"], name: "index_tables_on_data_vector", using: :gin + t.index ["last_modified_by_id"], name: "index_tables_on_last_modified_by_id" + t.index ["team_id"], name: "index_tables_on_team_id" end - add_index "tables", ["created_at"], name: "index_tables_on_created_at", using: :btree - add_index "tables", ["created_by_id"], name: "index_tables_on_created_by_id", using: :btree - add_index "tables", ["data_vector"], name: "index_tables_on_data_vector", using: :gin - add_index "tables", ["last_modified_by_id"], name: "index_tables_on_last_modified_by_id", using: :btree - add_index "tables", ["team_id"], name: "index_tables_on_team_id", using: :btree - - create_table "tags", force: :cascade do |t| - t.string "name", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "color", default: "#ff0000", null: false - t.integer "project_id", null: false - t.integer "created_by_id" - t.integer "last_modified_by_id" + create_table "tags", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "color", default: "#ff0000", null: false + t.integer "project_id", null: false + t.integer "created_by_id" + t.integer "last_modified_by_id" + t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_tags_on_name", using: :gin + t.index ["created_by_id"], name: "index_tags_on_created_by_id" + t.index ["last_modified_by_id"], name: "index_tags_on_last_modified_by_id" + t.index ["project_id"], name: "index_tags_on_project_id" end - add_index "tags", ["created_by_id"], name: "index_tags_on_created_by_id", using: :btree - add_index "tags", ["last_modified_by_id"], name: "index_tags_on_last_modified_by_id", using: :btree - add_index "tags", ["project_id"], name: "index_tags_on_project_id", using: :btree - - create_table "teams", force: :cascade do |t| - t.string "name", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "created_by_id" - t.integer "last_modified_by_id" - t.string "description" - t.integer "space_taken", limit: 8, default: 1048576, null: false + create_table "teams", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "created_by_id" + t.integer "last_modified_by_id" + t.string "description" + t.bigint "space_taken", default: 1048576, null: false + t.index ["created_by_id"], name: "index_teams_on_created_by_id" + t.index ["last_modified_by_id"], name: "index_teams_on_last_modified_by_id" + t.index ["name"], name: "index_teams_on_name" end - add_index "teams", ["created_by_id"], name: "index_teams_on_created_by_id", using: :btree - add_index "teams", ["last_modified_by_id"], name: "index_teams_on_last_modified_by_id", using: :btree - add_index "teams", ["name"], name: "index_teams_on_name", using: :btree - - create_table "temp_files", force: :cascade do |t| - t.string "session_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "file_file_name" - t.string "file_content_type" - t.integer "file_file_size" + create_table "temp_files", id: :serial, force: :cascade do |t| + t.string "session_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "file_file_name" + t.string "file_content_type" + t.integer "file_file_size" t.datetime "file_updated_at" end - create_table "tiny_mce_assets", force: :cascade do |t| - t.string "image_file_name" - t.string "image_content_type" - t.integer "image_file_size" + create_table "tiny_mce_assets", id: :serial, force: :cascade do |t| + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" t.datetime "image_updated_at" - t.integer "estimated_size", default: 0, null: false - t.integer "step_id" - t.integer "team_id" - t.integer "result_text_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.integer "estimated_size", default: 0, null: false + t.integer "step_id" + t.integer "team_id" + t.integer "result_text_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["result_text_id"], name: "index_tiny_mce_assets_on_result_text_id" + t.index ["step_id"], name: "index_tiny_mce_assets_on_step_id" + t.index ["team_id"], name: "index_tiny_mce_assets_on_team_id" end - add_index "tiny_mce_assets", ["result_text_id"], name: "index_tiny_mce_assets_on_result_text_id", using: :btree - add_index "tiny_mce_assets", ["step_id"], name: "index_tiny_mce_assets_on_step_id", using: :btree - add_index "tiny_mce_assets", ["team_id"], name: "index_tiny_mce_assets_on_team_id", using: :btree - - create_table "tokens", force: :cascade do |t| - t.string "token", null: false - t.integer "ttl", null: false + create_table "tokens", id: :serial, force: :cascade do |t| + t.string "token", null: false + t.integer "ttl", null: false t.integer "user_id", null: false end - create_table "user_my_modules", force: :cascade do |t| - t.integer "user_id", null: false - t.integer "my_module_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "assigned_by_id" + create_table "user_my_modules", id: :serial, force: :cascade do |t| + t.integer "user_id", null: false + t.integer "my_module_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "assigned_by_id" + t.index ["assigned_by_id"], name: "index_user_my_modules_on_assigned_by_id" + t.index ["my_module_id"], name: "index_user_my_modules_on_my_module_id" + t.index ["user_id"], name: "index_user_my_modules_on_user_id" end - add_index "user_my_modules", ["assigned_by_id"], name: "index_user_my_modules_on_assigned_by_id", using: :btree - add_index "user_my_modules", ["my_module_id"], name: "index_user_my_modules_on_my_module_id", using: :btree - add_index "user_my_modules", ["user_id"], name: "index_user_my_modules_on_user_id", using: :btree - - create_table "user_notifications", force: :cascade do |t| - t.integer "user_id" - t.integer "notification_id" - t.boolean "checked", default: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "user_notifications", id: :serial, force: :cascade do |t| + t.integer "user_id" + t.integer "notification_id" + t.boolean "checked", default: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["checked"], name: "index_user_notifications_on_checked" + t.index ["notification_id"], name: "index_user_notifications_on_notification_id" + t.index ["user_id"], name: "index_user_notifications_on_user_id" end - add_index "user_notifications", ["checked"], name: "index_user_notifications_on_checked", using: :btree - add_index "user_notifications", ["notification_id"], name: "index_user_notifications_on_notification_id", using: :btree - add_index "user_notifications", ["user_id"], name: "index_user_notifications_on_user_id", using: :btree - - create_table "user_projects", force: :cascade do |t| - t.integer "role" - t.integer "user_id", null: false - t.integer "project_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "assigned_by_id" + create_table "user_projects", id: :serial, force: :cascade do |t| + t.integer "role" + t.integer "user_id", null: false + t.integer "project_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "assigned_by_id" + t.index ["assigned_by_id"], name: "index_user_projects_on_assigned_by_id" + t.index ["project_id"], name: "index_user_projects_on_project_id" + t.index ["user_id"], name: "index_user_projects_on_user_id" end - add_index "user_projects", ["assigned_by_id"], name: "index_user_projects_on_assigned_by_id", using: :btree - add_index "user_projects", ["project_id"], name: "index_user_projects_on_project_id", using: :btree - add_index "user_projects", ["user_id"], name: "index_user_projects_on_user_id", using: :btree - - create_table "user_teams", force: :cascade do |t| - t.integer "role", default: 1, null: false - t.integer "user_id", null: false - t.integer "team_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "assigned_by_id" + create_table "user_teams", id: :serial, force: :cascade do |t| + t.integer "role", default: 1, null: false + t.integer "user_id", null: false + t.integer "team_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "assigned_by_id" + t.index ["assigned_by_id"], name: "index_user_teams_on_assigned_by_id" + t.index ["team_id"], name: "index_user_teams_on_team_id" + t.index ["user_id"], name: "index_user_teams_on_user_id" end - add_index "user_teams", ["assigned_by_id"], name: "index_user_teams_on_assigned_by_id", using: :btree - add_index "user_teams", ["team_id"], name: "index_user_teams_on_team_id", using: :btree - add_index "user_teams", ["user_id"], name: "index_user_teams_on_user_id", using: :btree - - create_table "users", force: :cascade do |t| - t.string "full_name", null: false - t.string "initials", null: false - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false - t.string "reset_password_token" + create_table "users", id: :serial, force: :cascade do |t| + t.string "full_name", null: false + t.string "initials", null: false + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0, null: false + t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" - t.string "current_sign_in_ip" - t.string "last_sign_in_ip" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "avatar_file_name" - t.string "avatar_content_type" - t.integer "avatar_file_size" + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "avatar_file_name" + t.string "avatar_content_type" + t.integer "avatar_file_size" t.datetime "avatar_updated_at" - t.string "confirmation_token" + t.string "confirmation_token" t.datetime "confirmed_at" t.datetime "confirmation_sent_at" - t.string "unconfirmed_email" - t.string "time_zone", default: "UTC" - t.string "invitation_token" + t.string "unconfirmed_email" + t.string "invitation_token" t.datetime "invitation_created_at" t.datetime "invitation_sent_at" t.datetime "invitation_accepted_at" - t.integer "invitation_limit" - t.integer "invited_by_id" - t.string "invited_by_type" - t.integer "invitations_count", default: 0 - t.integer "tutorial_status", default: 0, null: false - t.boolean "assignments_notification", default: true - t.boolean "recent_notification", default: true - t.boolean "assignments_notification_email", default: false - t.boolean "recent_notification_email", default: false - t.integer "current_team_id" - t.boolean "system_message_notification_email", default: false - t.string "authentication_token", limit: 30 + t.integer "invitation_limit" + t.string "invited_by_type" + t.integer "invited_by_id" + t.integer "invitations_count", default: 0 + t.integer "tutorial_status", default: 0, null: false + t.integer "current_team_id" + t.string "authentication_token", limit: 30 + t.jsonb "settings", default: {}, null: false + t.index "trim_html_tags((full_name)::text) gin_trgm_ops", name: "index_users_on_full_name", using: :gin + t.index ["authentication_token"], name: "index_users_on_authentication_token", unique: true + t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true + t.index ["email"], name: "index_users_on_email", unique: true + t.index ["invitation_token"], name: "index_users_on_invitation_token", unique: true + t.index ["invitations_count"], name: "index_users_on_invitations_count" + t.index ["invited_by_id"], name: "index_users_on_invited_by_id" + t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end - add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree - add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree - add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree - add_index "users", ["invitation_token"], name: "index_users_on_invitation_token", unique: true, using: :btree - add_index "users", ["invitations_count"], name: "index_users_on_invitations_count", using: :btree - add_index "users", ["invited_by_id"], name: "index_users_on_invited_by_id", using: :btree - add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree - - create_table "wopi_actions", force: :cascade do |t| - t.string "action", null: false - t.string "extension", null: false - t.string "urlsrc", null: false + create_table "wopi_actions", id: :serial, force: :cascade do |t| + t.string "action", null: false + t.string "extension", null: false + t.string "urlsrc", null: false t.integer "wopi_app_id", null: false + t.index ["extension", "action"], name: "index_wopi_actions_on_extension_and_action" end - add_index "wopi_actions", ["extension", "action"], name: "index_wopi_actions_on_extension_and_action", using: :btree - - create_table "wopi_apps", force: :cascade do |t| - t.string "name", null: false - t.string "icon", null: false + create_table "wopi_apps", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.string "icon", null: false t.integer "wopi_discovery_id", null: false end - create_table "wopi_discoveries", force: :cascade do |t| - t.integer "expires", null: false - t.string "proof_key_mod", null: false - t.string "proof_key_exp", null: false - t.string "proof_key_old_mod", null: false - t.string "proof_key_old_exp", null: false + create_table "wopi_discoveries", id: :serial, force: :cascade do |t| + t.integer "expires", null: false + t.string "proof_key_mod", null: false + t.string "proof_key_exp", null: false + t.string "proof_key_old_mod", null: false + t.string "proof_key_old_exp", null: false end - create_table "zip_exports", force: :cascade do |t| - t.integer "user_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "zip_file_file_name" - t.string "zip_file_content_type" - t.integer "zip_file_file_size" + create_table "zip_exports", id: :serial, force: :cascade do |t| + t.integer "user_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "zip_file_file_name" + t.string "zip_file_content_type" + t.integer "zip_file_file_size" t.datetime "zip_file_updated_at" + t.index ["user_id"], name: "index_zip_exports_on_user_id" end - add_index "zip_exports", ["user_id"], name: "index_zip_exports_on_user_id", using: :btree - add_foreign_key "activities", "experiments" add_foreign_key "activities", "my_modules" add_foreign_key "activities", "projects" @@ -932,4 +903,22 @@ ActiveRecord::Schema.define(version: 20170515141252) do add_foreign_key "wopi_actions", "wopi_apps" add_foreign_key "wopi_apps", "wopi_discoveries" add_foreign_key "zip_exports", "users" + + create_view "datatables_teams", sql_definition: <<-SQL + SELECT teams.id, + teams.name, + user_teams.role, + ( SELECT count(*) AS count + FROM user_teams user_teams_1 + WHERE (user_teams_1.team_id = teams.id)) AS members, + CASE + WHEN (teams.created_by_id = user_teams.user_id) THEN false + ELSE true + END AS can_be_left, + user_teams.id AS user_team_id, + user_teams.user_id + FROM (teams + JOIN user_teams ON ((teams.id = user_teams.team_id))); + SQL + end diff --git a/db/views/datatables_teams_v01.sql b/db/views/datatables_teams_v01.sql new file mode 100644 index 000000000..276290608 --- /dev/null +++ b/db/views/datatables_teams_v01.sql @@ -0,0 +1,13 @@ +SELECT + teams.id AS id, + teams.name AS name, + user_teams.role AS role, + ( + SELECT COUNT(*) + FROM user_teams + WHERE user_teams.team_id = teams.id + ) AS members, + CASE WHEN teams.created_by_id = user_teams.user_id THEN false ELSE true END AS can_be_left, + user_teams.id AS user_team_id, + user_teams.user_id AS user_id +FROM teams INNER JOIN user_teams ON teams.id=user_teams.team_id diff --git a/flow-typed/teams_types.js b/flow-typed/teams_types.js index e1e9b018c..ad460ca46 100644 --- a/flow-typed/teams_types.js +++ b/flow-typed/teams_types.js @@ -24,9 +24,13 @@ export type Teams$NewTeam = { export type Teams$Team = { id: number, name: string, - current_team: boolean, role: string, members: number, can_be_left: boolean, user_team_id: number }; + +export type Teams$CurrentTeam = { + id: number, + name: string +} diff --git a/package-lock.json b/package-lock.json index 45abc42ef..18e171e1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -133,9 +133,9 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", "dev": true }, "ansi-html": { @@ -299,9 +299,12 @@ "dev": true }, "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.4.1.tgz", + "integrity": "sha1-YqVrJ5yYoR0JhwlqAcw+6463u9c=", + "requires": { + "lodash": "4.17.4" + } }, "async-each": { "version": "1.0.1", @@ -425,15 +428,122 @@ } }, "babel-eslint": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", - "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.0.1.tgz", + "integrity": "sha512-h3moF6PCTQE06UjMMG+ydZSBvZ4Q7rqPE/5WAUOvUyHYUTqxm8JVhjZRiG1avI/tGVOK4BnZLDQapyLzh8DeKg==", "dev": true, "requires": { - "babel-code-frame": "6.22.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4" + "babel-code-frame": "7.0.0-beta.0", + "babel-traverse": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0", + "babylon": "7.0.0-beta.22" + }, + "dependencies": { + "babel-code-frame": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.0.tgz", + "integrity": "sha512-/xr1ADm5bnTjjN+xwoXb7lF4v2rnxMzNZzFU7h8SxB+qB6+IqSTOOqVcpaPTUC2Non/MbQxS3OIZnJpQ2X21aQ==", + "dev": true, + "requires": { + "chalk": "2.0.1", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-helper-function-name": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.0.tgz", + "integrity": "sha512-DaQccFBBWBEzMdqbKmNXamY0m1yLHJGOdbbEsNoGdJrrU7wAF3wwowtDDPzF0ZT3SqJXPgZW/P2kgBX9moMuAA==", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "7.0.0-beta.0", + "babel-template": "7.0.0-beta.0", + "babel-traverse": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0" + } + }, + "babel-helper-get-function-arity": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.0.tgz", + "integrity": "sha512-csqAic15/2Vm1951nJxkkL9K8E6ojyNF/eAOjk7pqJlO8kvgrccGNFCV9eDwcGHDPe5AjvJGwVSAcQ5fit9wuA==", + "dev": true, + "requires": { + "babel-types": "7.0.0-beta.0" + } + }, + "babel-messages": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-7.0.0-beta.0.tgz", + "integrity": "sha512-eXdShsm9ZTh9AQhlIaAn6HR3xWpxCnK9ZwIDA9QyjnwTgMctGxHHflw4b4RJ3/ZjTL0Vrmvm0tQXPkp49mTAUw==", + "dev": true + }, + "babel-template": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.0.tgz", + "integrity": "sha512-tmdH+MmmU0F6Ur8humpevSmFzYKbrN3Oru0g5Qyg4R6+sxjnzZmnvzUbsP0aKMr7tB0Ua6xhEb9arKTOsEMkyA==", + "dev": true, + "requires": { + "babel-traverse": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0", + "babylon": "7.0.0-beta.22", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.0.tgz", + "integrity": "sha512-IKzuTqUcQtMRZ0Vv5RjIrGGj33eBKmNTNeRexWSyjPPuAciyNkva1rt7WXPfHfkb+dX7coRAIUhzeTUEzhnwdA==", + "dev": true, + "requires": { + "babel-code-frame": "7.0.0-beta.0", + "babel-helper-function-name": "7.0.0-beta.0", + "babel-messages": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0", + "babylon": "7.0.0-beta.22", + "debug": "3.1.0", + "globals": "10.3.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.0.tgz", + "integrity": "sha512-rJc2kV9iPJGLlqIY71AM3nPcdkoeLRCDuR07GFgfd3lFl4TsBQq76TxYQQIZ2MONg1HpsqmuoCXr9aZ1Oa4wYw==", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "2.0.0" + } + }, + "babylon": { + "version": "7.0.0-beta.22", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.22.tgz", + "integrity": "sha512-Yl7iT8QGrS8OfR7p6R12AJexQm+brKwrryai4VWZ7NHUbPoZ5al3+klhvl/14shXZiLa7uK//OIFuZ1/RKHgoA==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-10.3.0.tgz", + "integrity": "sha512-1g6qO5vMbiPHbRTDtR9JVjRkAhkgH4nSANYGyx1eOfqgxcMnYMMD+7MjmjfzXjwFpVUE/7/NzF+jQxYE7P4r7A==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } } }, "babel-generator": { @@ -967,13 +1077,36 @@ } }, "babel-polyfill": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", - "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "requires": { - "babel-runtime": "6.25.0", - "core-js": "2.4.1", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", "regenerator-runtime": "0.10.5" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + } + } + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" + } } }, "babel-preset-env": { @@ -1013,6 +1146,37 @@ "semver": "5.4.1" } }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.24.1", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.24.1" + } + }, "babel-preset-flow": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", @@ -1131,6 +1295,16 @@ "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=" }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true, + "requires": { + "buffers": "0.1.1", + "chainsaw": "0.1.0" + } + }, "binary-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.9.0.tgz", @@ -1171,6 +1345,11 @@ "hoek": "2.16.3" } }, + "bootstrap-sass": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.3.7.tgz", + "integrity": "sha1-ZZbHq0D2Y3OTMjqwvIDQZPxjBJg=" + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -1288,6 +1467,12 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1391,6 +1576,20 @@ } } }, + "chain-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.0.tgz", + "integrity": "sha1-DUqzfn4Y6tC9xHuSB2QRjOWHM9w=" + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "requires": { + "traverse": "0.3.9" + } + }, "chalk": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", @@ -1401,6 +1600,12 @@ "supports-color": "4.2.1" } }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1469,18 +1674,18 @@ "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "2.0.0" } }, "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, "cliui": { @@ -1528,9 +1733,9 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "coffee-loader": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/coffee-loader/-/coffee-loader-0.7.3.tgz", - "integrity": "sha1-+tvG79b8fsyIxbMEaiwpIGa8tUo=", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/coffee-loader/-/coffee-loader-0.8.0.tgz", + "integrity": "sha512-jMxsuxagYouuhTcf1EoLz8pONTIl5gwuyIdTIOCuArGLQiNc2fS6G7KfTfadb8+hiOfwslhD60wjih2knTnAww==", "requires": { "loader-utils": "1.1.0" } @@ -1594,12 +1799,6 @@ "delayed-stream": "1.0.0" } }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "optional": true - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1635,13 +1834,12 @@ } }, "compression-webpack-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-0.4.0.tgz", - "integrity": "sha1-gR3gQhX4EepqEtTYrthFfXWPE6w=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-1.0.1.tgz", + "integrity": "sha512-ABF2AFb31gpIBeEy/w6Ct0u+K+jY8jFRfGwjUWGxVTidA9pf7iH/JzjcVBQ+KB1gNMycujMxA56/PznMPUV5jw==", "requires": { - "async": "0.2.10", - "node-zopfli": "2.0.2", - "webpack-sources": "0.1.5" + "async": "2.4.1", + "webpack-sources": "1.0.2" } }, "concat-map": { @@ -1802,6 +2000,12 @@ "which": "1.2.14" } }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", @@ -2169,33 +2373,27 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-7.2.3.tgz", "integrity": "sha512-AoFI37QS0S87Ft0r3Bdz4q9xSpm1Paa9lSeKLXgMPk/u/+QPIM5Gy4DHcZQS1seqPJH4gHLauPGn347z0HbsrA==" }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "1.0.0" + } + }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "optional": true - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "optional": true, - "requires": { - "clone": "1.0.2" - } - }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", @@ -2342,6 +2540,12 @@ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -2539,78 +2743,123 @@ } }, "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", + "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", "dev": true, "requires": { + "ajv": "5.3.0", "babel-code-frame": "6.22.0", - "chalk": "1.1.3", + "chalk": "2.3.0", "concat-stream": "1.6.0", - "debug": "2.6.8", + "cross-spawn": "5.1.0", + "debug": "3.1.0", "doctrine": "2.0.0", - "escope": "3.6.0", - "espree": "3.4.3", + "eslint-scope": "3.7.1", + "espree": "3.5.1", "esquery": "1.0.0", "estraverse": "4.2.0", "esutils": "2.0.2", "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", "glob": "7.1.2", "globals": "9.18.0", - "ignore": "3.3.3", + "ignore": "3.3.7", "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.0", + "inquirer": "3.3.0", "is-resolvable": "1.0.0", - "js-yaml": "3.9.0", + "js-yaml": "3.10.0", "json-stable-stringify": "1.0.1", "levn": "0.3.0", "lodash": "4.17.4", + "minimatch": "3.0.4", "mkdirp": "0.5.1", "natural-compare": "1.4.0", "optionator": "0.8.2", "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", + "pluralize": "7.0.0", + "progress": "2.0.0", "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", + "semver": "5.4.1", + "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "table": "4.0.2", + "text-table": "0.2.0" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "2.2.1", + "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "supports-color": "4.2.1" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.2.14" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } } } }, @@ -2633,13 +2882,10 @@ } }, "eslint-config-google": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.5.0.tgz", - "integrity": "sha1-W3rxpmZtXvWEB3dp11vROUCC5Vc=", - "dev": true, - "requires": { - "eslint-config-xo": "0.13.0" - } + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", + "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", + "dev": true }, "eslint-config-prettier": { "version": "2.3.0", @@ -2658,12 +2904,6 @@ } } }, - "eslint-config-xo": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.13.0.tgz", - "integrity": "sha1-+RZ2VDK6Z9L8enF3uLz+8/brBWQ=", - "dev": true - }, "eslint-import-resolver-node": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", @@ -2834,10 +3074,20 @@ "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", "dev": true }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, "espree": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", - "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", "dev": true, "requires": { "acorn": "5.1.1", @@ -2946,11 +3196,10 @@ } } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" }, "expand-brackets": { "version": "0.1.5", @@ -3026,6 +3275,17 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, + "external-editor": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.5.tgz", + "integrity": "sha512-Msjo64WT5W+NhOpQXh0nOHm+n0RfU1QUwDnKYvJ8dEJ8zlwLrqXNTv5mSUTJpepf41PDJGyhueTw2vNZW+Fr/w==", + "dev": true, + "requires": { + "iconv-lite": "0.4.18", + "jschardet": "1.6.0", + "tmp": "0.0.33" + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -3085,6 +3345,12 @@ "integrity": "sha1-CuoOTmBbaiGJ8Ok21Lf7rxt8/Zs=", "dev": true }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -3127,13 +3393,12 @@ } }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "1.0.5" } }, "file-entry-cache": { @@ -3142,7 +3407,7 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.2.2", + "flat-cache": "1.3.0", "object-assign": "4.1.1" } }, @@ -3226,9 +3491,9 @@ } }, "flat-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { "circular-json": "0.3.3", @@ -3242,6 +3507,102 @@ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" }, + "flow-bin": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.56.0.tgz", + "integrity": "sha1-zkMJIgOjRLqb9jwMq+ldlRRfbK0=", + "dev": true + }, + "flow-typed": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/flow-typed/-/flow-typed-2.2.3.tgz", + "integrity": "sha512-xCKOrKn/DnA4BPbNKyp3s2vW7Pzvff1zJhEdzNviTgwpiEkTG6uxQLjofcqvKdzTyZ/PjHBzkx02iyhP/2NrCg==", + "dev": true, + "requires": { + "babel-polyfill": "6.26.0", + "colors": "1.1.2", + "fs-extra": "4.0.2", + "github": "0.2.4", + "glob": "7.1.2", + "got": "7.1.0", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.4.1", + "table": "4.0.2", + "through": "2.3.8", + "unzip": "0.1.11", + "which": "1.2.14", + "yargs": "4.8.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "dev": true, + "requires": { + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "lodash.assign": "4.2.0", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "lodash.assign": "4.2.0" + } + } + } + }, "follow-redirects": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.2.4.tgz", @@ -3250,6 +3611,11 @@ "debug": "2.6.8" } }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -3329,22 +3695,17 @@ "rimraf": "2.6.1" } }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, "function-bind": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=" }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -3368,21 +3729,6 @@ "globule": "1.2.0" } }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", @@ -3413,6 +3759,15 @@ } } }, + "github": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/github/-/github-0.2.4.tgz", + "integrity": "sha1-JPp/DhP6EblGr5ETTFGYKpHOU4s=", + "dev": true, + "requires": { + "mime": "1.3.4" + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -3485,6 +3840,28 @@ } } }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-plain-obj": "1.1.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.0", + "p-cancelable": "0.3.0", + "p-timeout": "1.2.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "url-parse-lax": "1.0.0", + "url-to-options": "1.0.1" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -3531,6 +3908,21 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, + "has-symbol-support-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz", + "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "1.4.1" + } + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -3729,15 +4121,18 @@ "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" }, "ignore": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", - "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, - "immutable": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.1.tgz", - "integrity": "sha1-IAgH8Rqw9ycQ6khVQt4IgHX2jNI=" + "immutability-helper": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-2.4.0.tgz", + "integrity": "sha512-rW/L/56ZMo9NStMK85kFrUFFGy4NeJbCdhfrDHIZrFfxYtuwuxD+dT3mWMcdmrNO61hllc60AeGglCRhfZ1dZw==", + "requires": { + "invariant": "2.2.2" + } }, "imurmurhash": { "version": "0.1.4", @@ -3782,57 +4177,58 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "optional": true - }, "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.1.0", - "figures": "1.7.0", + "ansi-escapes": "3.0.0", + "chalk": "2.0.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.0.5", + "figures": "2.0.0", "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", "through": "2.3.8" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } } } }, @@ -3850,6 +4246,11 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=" }, + "intl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz", + "integrity": "sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94=" + }, "intl-format-cache": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-2.0.5.tgz", @@ -4001,18 +4402,6 @@ "is-extglob": "1.0.0" } }, - "is-my-json-valid": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -4021,6 +4410,12 @@ "kind-of": "3.2.2" } }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -4068,10 +4463,10 @@ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, "is-regex": { @@ -4092,6 +4487,12 @@ "tryit": "1.0.3" } }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -4150,6 +4551,16 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" + } + }, "javascript-natural-sort": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", @@ -4193,6 +4604,12 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, + "jschardet": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.6.0.tgz", + "integrity": "sha512-xYuhvQ7I9PDJIGBWev9xm0+SMSed3ZDBAmvVjbFR1ZRLAF+vlXcQu6cRI9uAlj81rzikElRVteehwV7DuX2ZmQ==", + "dev": true + }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -4250,12 +4667,6 @@ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", @@ -4508,6 +4919,12 @@ "signal-exit": "3.0.2" } }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", @@ -4535,6 +4952,42 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, + "match-stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", + "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=", + "dev": true, + "requires": { + "buffers": "0.1.1", + "readable-stream": "1.0.34" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "math-expression-evaluator": { "version": "1.2.17", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", @@ -4554,6 +5007,17 @@ "typed-function": "0.10.5" } }, + "md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "1.1.5" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -4666,6 +5130,12 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", + "dev": true + }, "minimalistic-assert": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", @@ -4713,6 +5183,11 @@ "minimist": "0.0.8" } }, + "moment": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.1.tgz", + "integrity": "sha1-VtoaLRy/AdOLfhr8McELz6GSkWc=" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4735,9 +5210,9 @@ "dev": true }, "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "nan": { @@ -4745,6 +5220,12 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" }, + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -4844,23 +5325,6 @@ } } }, - "node-pre-gyp": { - "version": "0.6.36", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", - "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.4.1", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, "node-sass": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.3.tgz", @@ -4910,28 +5374,6 @@ } } }, - "node-zopfli": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-zopfli/-/node-zopfli-2.0.2.tgz", - "integrity": "sha1-p6RzrpKq6oXUxo1Fu/LJRMRhFrg=", - "optional": true, - "requires": { - "commander": "2.11.0", - "defaults": "1.0.3", - "nan": "2.6.2", - "node-pre-gyp": "0.6.36" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -5066,10 +5508,13 @@ } }, "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } }, "opn": { "version": "4.0.2", @@ -5156,6 +5601,18 @@ "os-tmpdir": "1.0.2" } }, + "over": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", + "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=", + "dev": true + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -5180,6 +5637,15 @@ "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=", "dev": true }, + "p-timeout": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.0.tgz", + "integrity": "sha1-mCD5lDTFgXhotPNICe5SkWYNW2w=", + "dev": true, + "requires": { + "p-finally": "1.0.0" + } + }, "pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -5318,9 +5784,9 @@ } }, "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, "portfinder": { @@ -7446,9 +7912,9 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "prettier": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.5.3.tgz", - "integrity": "sha1-WdrcaDNF7GuI+IuU7Urn4do5S/4=", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.7.4.tgz", + "integrity": "sha1-XoYkrpNjyA+V7GRFhOzfVddPk/o=", "dev": true }, "private": { @@ -7467,9 +7933,9 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, "promise": { @@ -7537,6 +8003,44 @@ "randombytes": "2.0.5" } }, + "pullstream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", + "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=", + "dev": true, + "requires": { + "over": "0.0.5", + "readable-stream": "1.0.34", + "setimmediate": "1.0.5", + "slice-stream": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -7637,26 +8141,6 @@ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", "dev": true }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "optional": true - } - } - }, "react": { "version": "15.6.1", "resolved": "https://registry.npmjs.org/react/-/react-15.6.1.tgz", @@ -7687,6 +8171,17 @@ "warning": "3.0.0" } }, + "react-bootstrap-table": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-bootstrap-table/-/react-bootstrap-table-4.1.1.tgz", + "integrity": "sha1-X26fgh1nnpIPsM3aUv9cad7RYhM=", + "requires": { + "classnames": "2.2.5", + "prop-types": "15.5.10", + "react-modal": "3.1.0", + "react-s-alert": "1.3.2" + } + }, "react-bootstrap-timezone-picker": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/react-bootstrap-timezone-picker/-/react-bootstrap-timezone-picker-1.0.11.tgz", @@ -7696,6 +8191,20 @@ "prop-types": "15.5.10" } }, + "react-data-grid": { + "version": "2.0.71", + "resolved": "https://registry.npmjs.org/react-data-grid/-/react-data-grid-2.0.71.tgz", + "integrity": "sha1-bg2BIYhhVcdXtBKkw79UEEGhAbw=" + }, + "react-document-title": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/react-document-title/-/react-document-title-2.0.3.tgz", + "integrity": "sha1-u/kioNcUEvyUgkXkKDskEt9w8rk=", + "requires": { + "prop-types": "15.5.10", + "react-side-effect": "1.1.3" + } + }, "react-dom": { "version": "15.6.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.1.tgz", @@ -7727,6 +8236,20 @@ "warning": "3.0.0" } }, + "react-modal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.1.0.tgz", + "integrity": "sha512-4sVW7Flm6sdaQeWr8OxXqMOuothdg+jnCA4MqloP65g2iWtOtho8VeI+z3SCsqunWefbuCHCnncxIBmDgPehQQ==", + "requires": { + "exenv": "1.2.2", + "prop-types": "15.5.10" + } + }, + "react-moment": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/react-moment/-/react-moment-0.6.5.tgz", + "integrity": "sha512-W3uG9rvafSEhCFRChW/MwqtmzlMWLM82lfKUulenA/gh3irTdvlIXmWcCCEHQ0RddfQ8X/JuiNoemv1r9JHqrg==" + }, "react-overlays": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.7.0.tgz", @@ -7809,6 +8332,28 @@ "react-router": "4.1.2" } }, + "react-s-alert": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/react-s-alert/-/react-s-alert-1.3.2.tgz", + "integrity": "sha512-6Gz/s5Jw3LbuFR6liD3A4f7w0cDASo1Zas+HaUtUCEm6cVQhgHsUPOBMR9bP8mfiH6KWfRGhiX3t38FbFYrVOg==", + "requires": { + "babel-runtime": "6.25.0" + } + }, + "react-side-effect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.1.3.tgz", + "integrity": "sha1-USwlq+DewXKDTEAB7FxR4E1BvFw=", + "requires": { + "exenv": "1.2.2", + "shallowequal": "1.0.2" + } + }, + "react-tagsinput": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/react-tagsinput/-/react-tagsinput-3.19.0.tgz", + "integrity": "sha512-ni+/qnZrYrvLg83LtTFHErKy1KQHL0fi0Y6C5jgC1dNUePE9cS/OlQ4XH6JRSjv9GGoeVE0R/ujSBaS1uzCRYQ==" + }, "react-timezone": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/react-timezone/-/react-timezone-0.2.0.tgz", @@ -7817,6 +8362,19 @@ "classnames": "2.2.5" } }, + "react-transition-group": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.2.1.tgz", + "integrity": "sha512-q54UBM22bs/CekG8r3+vi9TugSqh0t7qcEVycaRc9M0p0aCEu+h6rp/RFiW7fHfgd1IKpd9oILFTl5QK+FpiPA==", + "requires": { + "chain-function": "1.0.0", + "classnames": "2.2.5", + "dom-helpers": "3.2.1", + "loose-envify": "1.3.1", + "prop-types": "15.5.10", + "warning": "3.0.0" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -7888,26 +8446,6 @@ "set-immediate-shim": "1.0.1" } }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.4.0" - } - }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -8160,13 +8698,13 @@ } }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "onetime": "2.0.1", + "signal-exit": "3.0.2" } }, "rework": { @@ -8221,20 +8759,29 @@ } }, "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "once": "1.4.0" + "is-promise": "2.1.0" } }, "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -8457,6 +9004,11 @@ } } }, + "shallowequal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.0.2.tgz", + "integrity": "sha512-zlVXeVUKvo+HEv1e2KQF/csyeMKx2oHvatQ9l6XjCUj3agvC8XGf6R9HvIPDSmp8FNPvx7b5kaEJTRi7CqxtEw==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -8470,16 +9022,10 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.0.3", - "rechoir": "0.6.2" - } + "shortid": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", + "integrity": "sha1-AzsRfWoul1gE9vCWnb59PQs1UTE=" }, "signal-exit": { "version": "3.0.2", @@ -8492,10 +9038,56 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "slice-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", + "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=", + "dev": true, + "requires": { + "readable-stream": "1.0.34" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } }, "sntp": { "version": "1.0.9", @@ -8704,14 +9296,6 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -8722,6 +9306,14 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", @@ -8759,7 +9351,8 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "style-loader": { "version": "0.18.2", @@ -8862,24 +9455,30 @@ "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", + "ajv": "5.3.0", + "ajv-keywords": "2.1.0", + "chalk": "2.3.0", "lodash": "4.17.4", - "slice-ansi": "0.0.4", + "slice-ansi": "1.0.0", "string-width": "2.1.1" }, "dependencies": { - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } }, "ansi-regex": { "version": "3.0.0", @@ -8887,23 +9486,15 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "2.2.1", + "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "supports-color": "4.2.1" } }, "is-fullwidth-code-point": { @@ -8920,24 +9511,16 @@ "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } } } }, @@ -8956,22 +9539,6 @@ "inherits": "2.0.3" } }, - "tar-pack": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", - "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, "tcomb": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-2.7.0.tgz", @@ -8995,6 +9562,12 @@ "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", "dev": true }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, "timers-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", @@ -9008,6 +9581,15 @@ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.0.tgz", "integrity": "sha1-utMnrbGAS0KiMa+nQVMr2ITNCa0=" }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -9026,6 +9608,12 @@ "punycode": "1.4.1" } }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -9166,12 +9754,6 @@ } } }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", - "optional": true - }, "uncontrollable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", @@ -9198,12 +9780,79 @@ "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unzip": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", + "integrity": "sha1-iXScY7BY19kNYZ+GuYqhU107l/A=", + "dev": true, + "requires": { + "binary": "0.3.0", + "fstream": "0.1.31", + "match-stream": "0.0.2", + "pullstream": "0.4.1", + "readable-stream": "1.0.34", + "setimmediate": "1.0.5" + }, + "dependencies": { + "fstream": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", + "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", + "dev": true, + "requires": { + "graceful-fs": "3.0.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "1.1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -9243,15 +9892,21 @@ } } }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "prepend-http": "1.0.4" } }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -9676,12 +10331,24 @@ } }, "webpack-sources": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.5.tgz", - "integrity": "sha1-qh86vw8NdNtxEcQOUAuE+WZkB1A=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.2.tgz", + "integrity": "sha512-Y7UddMCv6dGjy81nBv6nuQeFFIt5aalHm7uyDsAsW86nZwfOVPGRr3XMjEQLaT+WKo8rlzhC9qtbJvYKLtAwaw==", "requires": { - "source-list-map": "0.1.8", - "source-map": "0.5.6" + "source-list-map": "2.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } } }, "websocket-driver": { diff --git a/spec/controllers/client_api/teams/teams_controller_spec.rb b/spec/controllers/client_api/teams/teams_controller_spec.rb index 2ffd1484b..8785e207d 100644 --- a/spec/controllers/client_api/teams/teams_controller_spec.rb +++ b/spec/controllers/client_api/teams/teams_controller_spec.rb @@ -128,4 +128,9 @@ describe ClientApi::Teams::TeamsController, type: :controller do expect(response).to have_http_status(:unprocessable_entity) end end + + describe 'GET #current_team' do + let(:subject) { get :current_team, as: :json } + it { is_expected.to have_http_status(:ok) } + end end diff --git a/spec/factories/my_module_groups.rb b/spec/factories/my_module_groups.rb index 3688ad772..bb38bab2c 100644 --- a/spec/factories/my_module_groups.rb +++ b/spec/factories/my_module_groups.rb @@ -1,6 +1,5 @@ FactoryGirl.define do factory :my_module_group do - name Faker::Name.unique.name experiment { Experiment.first || create(:experiment_two) } end end diff --git a/spec/models/my_module_group_spec.rb b/spec/models/my_module_group_spec.rb index 507d74d8e..e4e6072b6 100644 --- a/spec/models/my_module_group_spec.rb +++ b/spec/models/my_module_group_spec.rb @@ -7,7 +7,6 @@ describe MyModuleGroup, type: :model do describe 'Database table' do it { should have_db_column :id } - it { should have_db_column :name } it { should have_db_column :created_at } it { should have_db_column :updated_at } it { should have_db_column :created_by_id } @@ -21,8 +20,6 @@ describe MyModuleGroup, type: :model do end describe 'Should be a valid object' do - it { should validate_presence_of :name } it { should validate_presence_of :experiment } - it { should validate_length_of(:name).is_at_most(Constants::NAME_MAX_LENGTH) } end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 38f65f2a3..1dc41319f 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -152,40 +152,10 @@ describe User, type: :model do end let(:user_two) { create :user, email: 'user2@asdf.com' } - it 'in a specific format: {id: .., name: .., members: .., role: ' \ - '.., current_team: .., can_be_left: ..}' do - user_team = create :user_team, team: team, user: user_one - expected_result = { - id: team.id, - name: team.name, - members: 1, - role: 2, - current_team: true, - can_be_left: false, - user_team_id: user_team.id - } - - user_one.teams_data.first.each do |k, v| - expect(v).to eq(expected_result.fetch(k.to_sym)) - end - end - it 'should return correct number of team members' do - user_team = create :user_team, team: team, user: user_one + create :user_team, team: team, user: user_one create :user_team, team: team, user: user_two - expected_result = { - id: team.id, - name: team.name, - members: 2, - role: 2, - current_team: true, - can_be_left: true, - user_team_id: user_team.id - } - - user_one.teams_data.first.each do |k, v| - expect(v).to eq(expected_result.fetch(k.to_sym)) - end + expect(user_one.datatables_teams.first.members).to eq 2 end end diff --git a/spec/models/views/datatables/teams_spec.rb b/spec/models/views/datatables/teams_spec.rb new file mode 100644 index 000000000..cc4095b8d --- /dev/null +++ b/spec/models/views/datatables/teams_spec.rb @@ -0,0 +1,23 @@ +require 'rails_helper' + +RSpec.describe Views::Datatables::DatatablesTeam, type: :model do + describe 'Database table' do + it { should have_db_column :id } + it { should have_db_column :name } + it { should have_db_column :members } + it { should have_db_column :role } + it { should have_db_column :user_team_id } + it { should have_db_column :user_id } + it { should have_db_column :can_be_left } + end + + describe 'is readonly' do + let(:user) { create :user } + it do + expect { + Views::Datatables::DatatablesTeam.create!(user_id: user.id) + }.to raise_error(ActiveRecord::ReadOnlyRecord, + 'Views::Datatables::DatatablesTeam is marked as readonly') + end + end +end diff --git a/spec/services/client_api/teams_service_spec.rb b/spec/services/client_api/teams_service_spec.rb index 201b2818c..40025f951 100644 --- a/spec/services/client_api/teams_service_spec.rb +++ b/spec/services/client_api/teams_service_spec.rb @@ -55,10 +55,11 @@ describe ClientApi::TeamsService do ClientApi::TeamsService.new(current_user: user_one, team_id: team_one.id) end - it 'should return user teams' do + it 'should return an array of valid teams' do create :user_team, user: user_one, team: team_one - data = team_service.teams_data.fetch(:teams) - expect(data.first.fetch('name')).to eq team_one.name + expect(team_service.teams_data).to( + match_response_schema('datatables_teams') + ) end end diff --git a/spec/services/client_api/user_team_service_spec.rb b/spec/services/client_api/user_team_service_spec.rb index 20ba3d102..7ffd02150 100644 --- a/spec/services/client_api/user_team_service_spec.rb +++ b/spec/services/client_api/user_team_service_spec.rb @@ -130,7 +130,7 @@ describe ClientApi::UserTeamService do user_team_id: user_team.id, role: 1 ) - team_id = ut_service.teams_data[:teams].first.fetch('id') + team_id = ut_service.teams_data[:teams].first.id expect(team_id).to eq team_one.id end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index b24b6926a..969041d15 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -18,6 +18,7 @@ require 'simplecov' require 'faker' require 'active_record' require 'bullet' +require "json_matchers/rspec" RSpec.configure do |config| # rspec-expectations config goes here. You can use an alternate diff --git a/spec/support/api/schemas/datatables_teams.json b/spec/support/api/schemas/datatables_teams.json new file mode 100644 index 000000000..27ad92d03 --- /dev/null +++ b/spec/support/api/schemas/datatables_teams.json @@ -0,0 +1,21 @@ +{ + "type": "object", + "required": ["teams"], + "properties": { + "teams": { + "type": "array", + "items":{ + "required": ["id", "name", "members", "role", "can_be_left", "user_team_id"], + "properties": { + "id": { "type": "integer" }, + "name": { "type": "string" }, + "members": { "type": "integer" }, + "role": { "type": "integer" }, + "can_be_left": { "type": "boolean" }, + "user_team_id": { "type": "integer" }, + "user_id": { "type": "integer" } + } + } + } + } +}