mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-05-03 01:14:46 -04:00
Merge branch 'master' of https://github.com/codecombat/codecombat
This commit is contained in:
commit
a4c1a599da
15 changed files with 447 additions and 132 deletions
app
core
locale
schemas/models
styles/courses
templates/courses
views/courses
scripts/mongodb
|
@ -206,3 +206,40 @@ module.exports.getCoursesPrice = getSponsoredSubsAmount = (courses, seats=20) ->
|
||||||
else
|
else
|
||||||
pricePerSeat = parseInt(totalPricePerSeat)
|
pricePerSeat = parseInt(totalPricePerSeat)
|
||||||
seats * pricePerSeat
|
seats * pricePerSeat
|
||||||
|
|
||||||
|
module.exports.getCoursePraise = getCoursePraise = ->
|
||||||
|
praise = [
|
||||||
|
{
|
||||||
|
quote: "The kids love it."
|
||||||
|
source: "Leo Joseph Tran, Athlos Leadership Academy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
quote: "My students have been using the site for a couple of weeks and they love it."
|
||||||
|
source: "Scott Hatfield, Computer Applications Teacher, School Technology Coordinator, Eastside Middle School"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
quote: "Thanks for the captivating site. My eighth graders love it."
|
||||||
|
source: "Janet Cook, Ansbach Middle/High School"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
quote: "My students have started working on CodeCombat and love it! I love that they are learning coding and problem solving skills without them even knowing it!!"
|
||||||
|
source: "Kristin Huff, Special Education Teacher, Webb City School District"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
quote: "I recently introduced Code Combat to a few of my fifth graders and they are loving it!"
|
||||||
|
source: "Shauna Hamman, Fifth Grade Teacher, Four Peaks Elementary School"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
quote: "Overall I think it's a fantastic service. Variables, arrays, loops, all covered in very fun and imaginative ways. Every kid who has tried it is a fan."
|
||||||
|
source: "Aibinder Andrew, Technology Teacher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
quote: "I love what you have created. The kids are so engaged."
|
||||||
|
source: "Desmond Smith, 4KS Academy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
quote: "My students love the website and I hope on having content structured around it in the near future."
|
||||||
|
source: "Michael Leonard, Science Teacher, Clearwater Central Catholic High School"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
praise[_.random(0, praise.length - 1)]
|
||||||
|
|
|
@ -485,46 +485,46 @@ module.exports = nativeDescription: "български език", englishDescri
|
||||||
# subscribe_prepaid: "Click Subscribe to use prepaid code"
|
# subscribe_prepaid: "Click Subscribe to use prepaid code"
|
||||||
# using_prepaid: "Using prepaid code for monthly subscription"
|
# using_prepaid: "Using prepaid code for monthly subscription"
|
||||||
|
|
||||||
# choose_hero:
|
choose_hero:
|
||||||
# choose_hero: "Choose Your Hero"
|
choose_hero: "Избери си герой"
|
||||||
# programming_language: "Programming Language"
|
programming_language: "Език за програмиране"
|
||||||
# programming_language_description: "Which programming language do you want to use?"
|
programming_language_description: "Кой език за програмиране би искал да използваш?"
|
||||||
# default: "Default"
|
default: "По подразбиране"
|
||||||
# experimental: "Experimental"
|
experimental: "Експериментално"
|
||||||
# python_blurb: "Simple yet powerful, great for beginners and experts."
|
python_blurb: "Прост,но мощен, идеален за начинаещи и експерти."
|
||||||
# javascript_blurb: "The language of the web. (Not the same as Java.)"
|
javascript_blurb: "Езикът на мрежата. (Не е същия като Java.)"
|
||||||
# coffeescript_blurb: "Nicer JavaScript syntax."
|
coffeescript_blurb: "По-добър синтаксис от JavaScript."
|
||||||
# clojure_blurb: "A modern Lisp."
|
clojure_blurb: "Модерен Lisp."
|
||||||
# lua_blurb: "Game scripting language."
|
lua_blurb: "Скриптен език за игри."
|
||||||
# io_blurb: "Simple but obscure."
|
io_blurb: "Прост, но неизвестен."
|
||||||
# status: "Status"
|
status: "Статус"
|
||||||
# hero_type: "Type"
|
hero_type: "Тип"
|
||||||
# weapons: "Weapons"
|
weapons: "Оръжия"
|
||||||
# weapons_warrior: "Swords - Short Range, No Magic"
|
weapons_warrior: "Мечове - Къс Обсег, Без Магия"
|
||||||
# weapons_ranger: "Crossbows, Guns - Long Range, No Magic"
|
weapons_ranger: "Арбалети, Пистолети - Далечен Обсег, Без магия"
|
||||||
# weapons_wizard: "Wands, Staffs - Long Range, Magic"
|
weapons_wizard: "Жезли, Принадлежности - Далечен Обсег, Магия"
|
||||||
# attack: "Damage" # Can also translate as "Attack"
|
attack: "Щета" # Може също да се преведе като "Атака"
|
||||||
# health: "Health"
|
health: "Здраве"
|
||||||
# speed: "Speed"
|
speed: "Скорост"
|
||||||
# regeneration: "Regeneration"
|
regeneration: "Възстановяване"
|
||||||
# range: "Range" # As in "attack or visual range"
|
range: "Обсег" # както в "обсег на атаката или визуален обсег"
|
||||||
# blocks: "Blocks" # As in "this shield blocks this much damage"
|
blocks: "Защита" # както в "този щит може да те защити от много удари"
|
||||||
# backstab: "Backstab" # As in "this dagger does this much backstab damage"
|
backstab: "Удар в гърба" # както в "тази кама може да е много опасна при удар в гърба"
|
||||||
# skills: "Skills"
|
skills: "Умения"
|
||||||
# attack_1: "Deals"
|
attack_1: "Количество"
|
||||||
# attack_2: "of listed"
|
attack_2: "на изброените"
|
||||||
# attack_3: "weapon damage."
|
attack_3: "щети от оръжия."
|
||||||
# health_1: "Gains"
|
health_1: "Печалби"
|
||||||
# health_2: "of listed"
|
health_2: "от изброените"
|
||||||
# health_3: "armor health."
|
health_3: "защитни брони."
|
||||||
# speed_1: "Moves at"
|
speed_1: "Движения"
|
||||||
# speed_2: "meters per second."
|
speed_2: "в метри за секунда"
|
||||||
# available_for_purchase: "Available for Purchase" # Shows up when you have unlocked, but not purchased, a hero in the hero store
|
available_for_purchase: "На разположение за закупуване" # Показва се когато сте достигнали, но не сте закупили герой от магазина за герои "
|
||||||
# level_to_unlock: "Level to unlock:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
|
level_to_unlock: "Ниво на отключване:" # Етикет за нивото, което трябва да достигнеш за да отключиш определен герой (кликни на заключения герой в магазина за да видиш)
|
||||||
# restricted_to_certain_heroes: "Only certain heroes can play this level."
|
restricted_to_certain_heroes: "Само определени герои могат да играят това ниво."
|
||||||
|
|
||||||
# skill_docs:
|
# skill_docs:
|
||||||
# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
|
# writable: "writable" # Hover over "attack" in Your Skils while playing a level to see most of this
|
||||||
# read_only: "read-only"
|
# read_only: "read-only"
|
||||||
# action_name: "name"
|
# action_name: "name"
|
||||||
# action_cooldown: "Takes"
|
# action_cooldown: "Takes"
|
||||||
|
|
|
@ -255,8 +255,8 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
victory_new_item: "Objeto Nuevo"
|
victory_new_item: "Objeto Nuevo"
|
||||||
victory_viking_code_school: "Santo cielo, Holy smokes, el nivel que acabas de pasar era dificil! Si todavía no eres un desarrollador de software, deberías serlo. Acabas de conseguir una aceptación por vía rápida con la Escuela Vikinga de Có, donde tú puedes llevar tus habilidades al siguiente nivel y convertirteen un desarrollador web profesional en 14 semanas."
|
victory_viking_code_school: "Santo cielo, Holy smokes, el nivel que acabas de pasar era dificil! Si todavía no eres un desarrollador de software, deberías serlo. Acabas de conseguir una aceptación por vía rápida con la Escuela Vikinga de Có, donde tú puedes llevar tus habilidades al siguiente nivel y convertirteen un desarrollador web profesional en 14 semanas."
|
||||||
victory_become_a_viking: "Conviértete en un Vikingo"
|
victory_become_a_viking: "Conviértete en un Vikingo"
|
||||||
# victory_bloc: "Great work! Your skills are improving, and someone's taking notice. If you've considered becoming a software developer, this may be your lucky day. Bloc is an online bootcamp that pairs you 1-on-1 with an expert mentor who will help train you into a professional developer! By beating A Mayhem of Munchkins, you're now eligible for a $500 price reduction with the code: CCRULES"
|
# victory_bloc: "¡Buen trabajo! Tus habilidades están mejorando, y alguien ya se dió cuenta. Si has considerado convertirte en un desarrollador de software, este podría ser tu día de suerte. Bloc es un online bootcamp que te pairs 1-on-1 with an expert mentor who will help train you into a professional developer! By beating A Mayhem of Munchkins, you're now eligible for a $500 price reduction with the code: CCRULES"
|
||||||
# victory_bloc_cta: "Meet your mentor – learn about Bloc"
|
victory_bloc_cta: "Conoce a tu mentor – aprende acerca de Bloc"
|
||||||
guide_title: "Guía"
|
guide_title: "Guía"
|
||||||
tome_minion_spells: "Hechizos de tus Secuaces" # Only in old-style levels.
|
tome_minion_spells: "Hechizos de tus Secuaces" # Only in old-style levels.
|
||||||
tome_read_only_spells: "Hechizos de Sólo Lectura" # Only in old-style levels.
|
tome_read_only_spells: "Hechizos de Sólo Lectura" # Only in old-style levels.
|
||||||
|
@ -438,19 +438,19 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
payment_methods_blurb1: "Actualmente aceptamos tarjetas de credito y Alipay."
|
payment_methods_blurb1: "Actualmente aceptamos tarjetas de credito y Alipay."
|
||||||
payment_methods_blurb2: "Si necesitas una forma alternativa de pago, por favor contactarse"
|
payment_methods_blurb2: "Si necesitas una forma alternativa de pago, por favor contactarse"
|
||||||
# sale_already_subscribed: "You're already subscribed!"
|
# sale_already_subscribed: "You're already subscribed!"
|
||||||
# sale_blurb1: "Save 35%"
|
sale_blurb1: "Ahorra 35%"
|
||||||
# sale_blurb2: "off regular subscription price of $120 for a whole year!" # {changed}
|
# sale_blurb2: "off regular subscription price of $120 for a whole year!" # {changed}
|
||||||
# sale_button: "Sale!"
|
# sale_button: "Sale!"
|
||||||
# sale_button_title: "Save 35% when you purchase a 1 year subscription"
|
# sale_button_title: "Save 35% when you purchase a 1 year subscription"
|
||||||
# sale_click_here: "Click Here"
|
sale_click_here: "Haz Click Aquí"
|
||||||
# sale_ends: "Ends"
|
sale_ends: "Termina"
|
||||||
# sale_extended: "*Existing subscriptions will be extended by 1 year."
|
# sale_extended: "*Existing subscriptions will be extended by 1 year."
|
||||||
# sale_feature_here: "Here's what you'll get:"
|
# sale_feature_here: "Here's what you'll get:"
|
||||||
# sale_feature2: "Access to 9 powerful <strong>new heroes</strong> with unique skills!"
|
# sale_feature2: "Access to 9 powerful <strong>new heroes</strong> with unique skills!"
|
||||||
# sale_feature4: "<strong>42,000 bonus gems</strong> awarded immediately!"
|
# sale_feature4: "<strong>42,000 bonus gems</strong> awarded immediately!"
|
||||||
# sale_continue: "Ready to continue adventuring?"
|
# sale_continue: "Ready to continue adventuring?"
|
||||||
# sale_limited_time: "Limited time offer!"
|
sale_limited_time: "¡Oferta por tiempo limitado!"
|
||||||
# sale_new_heroes: "New heroes!"
|
sale_new_heroes: "¡Nuevos héroes!"
|
||||||
# sale_title: "Back to School Sale"
|
# sale_title: "Back to School Sale"
|
||||||
# sale_view_button: "Buy 1 year subscription for"
|
# sale_view_button: "Buy 1 year subscription for"
|
||||||
stripe_description: "Suscripción Mensual"
|
stripe_description: "Suscripción Mensual"
|
||||||
|
@ -547,7 +547,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
|
|
||||||
options:
|
options:
|
||||||
general_options: "Opciones Generales" # Check out the Options tab in the Game Menu while playing a level
|
general_options: "Opciones Generales" # Check out the Options tab in the Game Menu while playing a level
|
||||||
volume_label: "Volumen"
|
volume_label: "Volúmen"
|
||||||
music_label: "Música"
|
music_label: "Música"
|
||||||
music_description: "Música encendida/apagada."
|
music_description: "Música encendida/apagada."
|
||||||
editor_config: "Config. de Editor"
|
editor_config: "Config. de Editor"
|
||||||
|
@ -582,7 +582,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
press_paragraph_1_link: "paquete de prensa"
|
press_paragraph_1_link: "paquete de prensa"
|
||||||
press_paragraph_1_suffix: ". Todos los logos e imágenes pueden ser usados sin contactarnos directamente."
|
press_paragraph_1_suffix: ". Todos los logos e imágenes pueden ser usados sin contactarnos directamente."
|
||||||
team: "Equipo"
|
team: "Equipo"
|
||||||
george_title: "CEO" # {change}
|
george_title: "Director Ejecutivo"
|
||||||
george_blurb: "Negociante"
|
george_blurb: "Negociante"
|
||||||
scott_title: "Programador" # {change}
|
scott_title: "Programador" # {change}
|
||||||
scott_blurb: "Razonable"
|
scott_blurb: "Razonable"
|
||||||
|
@ -665,10 +665,10 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
denied_2: "denegada."
|
denied_2: "denegada."
|
||||||
contact_1: "Por favor contáctenos"
|
contact_1: "Por favor contáctenos"
|
||||||
contact_2: "si tiene más preguntas."
|
contact_2: "si tiene más preguntas."
|
||||||
# description_1: "We offer free subscriptions to teachers for evaluation purposes. You can find more information on our"
|
# description_1: "Ofrecemos free subscriptions to teachers for evaluation purposes. You can find more information on our"
|
||||||
description_2: "página"
|
description_2: "página"
|
||||||
description_3: "de maestros."
|
description_3: "de maestros."
|
||||||
# description_4: "Please fill out this quick survey and we’ll email you setup instructions."
|
# description_4: "Por favor fill out this quick survey and we’ll email you setup instructions."
|
||||||
email: "Dirección de email"
|
email: "Dirección de email"
|
||||||
school: "Nombre del colegio"
|
school: "Nombre del colegio"
|
||||||
location: "Nombre de la ciudad"
|
location: "Nombre de la ciudad"
|
||||||
|
@ -688,7 +688,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
cla_url: "CLA"
|
cla_url: "CLA"
|
||||||
cla_suffix: "."
|
cla_suffix: "."
|
||||||
cla_agree: "ACEPTO"
|
cla_agree: "ACEPTO"
|
||||||
# owner_approve: "An owner will need to approve it before your changes will become visible."
|
owner_approve: "Un dueño necesitará aprobarlo antes de que tus cambios puedan ser visibles."
|
||||||
|
|
||||||
contact:
|
contact:
|
||||||
contact_us: "Contacta a CodeCombat"
|
contact_us: "Contacta a CodeCombat"
|
||||||
|
@ -779,12 +779,12 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
introduction: "Mira las maneras en las que puedes involucrarte adelante y decide qué es más divertido. ¡Queremos trabajar contigo!"
|
introduction: "Mira las maneras en las que puedes involucrarte adelante y decide qué es más divertido. ¡Queremos trabajar contigo!"
|
||||||
level_editor_prefix: "Usar CodeCombat"
|
level_editor_prefix: "Usar CodeCombat"
|
||||||
level_editor_suffix: "para crear y editar niveles. Los han creado niveles para sus clases, amigos, hackatones, estudiantes, familiares. Si crear un nuevo juego luce intimidante puedes ¡comenzar con base en uno nuestro!"
|
level_editor_suffix: "para crear y editar niveles. Los han creado niveles para sus clases, amigos, hackatones, estudiantes, familiares. Si crear un nuevo juego luce intimidante puedes ¡comenzar con base en uno nuestro!"
|
||||||
thang_editor_prefix: "Nosotros llamamos a las unidades del juego 'thangs'. Usa el"
|
thang_editor_prefix: "Nosotros llamamos a las unidades del juego 'Tiliches'. Usa el"
|
||||||
thang_editor_suffix: "para modificar el arte de CodeCombat. Permite a las unidades lanzar proyectiles, altera la dirección de una animación, cambia los puntos de vida de una unidad o sube tu propio sprite de vectores."
|
thang_editor_suffix: "para modificar el arte de CodeCombat. Permite a las unidades lanzar proyectiles, altera la dirección de una animación, cambia los puntos de vida de una unidad o sube tu propio sprite de vectores."
|
||||||
article_editor_prefix: "¿Ves algún error en nuestros documentos? ¿Quieres hacer algunas instrucciones para tus propias creaciones? Revisa el"
|
article_editor_prefix: "¿Ves algún error en nuestros documentos? ¿Quieres hacer algunas instrucciones para tus propias creaciones? Revisa el"
|
||||||
article_editor_suffix: "y ayuda a los jugadores de CodeCombat conseguir lo más posible de su tiempo jugando."
|
article_editor_suffix: "y ayuda a los jugadores de CodeCombat conseguir lo más posible de su tiempo jugando."
|
||||||
find_us: "Encuentranos en etsos sitios"
|
find_us: "Encuentranos en etsos sitios"
|
||||||
# social_github: "Check out all our code on GitHub"
|
social_github: "Checa todo nuestro código en el GitHub"
|
||||||
social_blog: "Lee el blog de CodeCombat en Sett"
|
social_blog: "Lee el blog de CodeCombat en Sett"
|
||||||
social_discource: "Unite a la discusión en nuestro foro"
|
social_discource: "Unite a la discusión en nuestro foro"
|
||||||
social_facebook: "Me Gusta CodeCombat en Facebook"
|
social_facebook: "Me Gusta CodeCombat en Facebook"
|
||||||
|
@ -806,7 +806,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
my_clans: "Mis Clanes"
|
my_clans: "Mis Clanes"
|
||||||
clan_name: "Nombre del clan"
|
clan_name: "Nombre del clan"
|
||||||
name: "Nombre"
|
name: "Nombre"
|
||||||
# chieftain: "Chieftain"
|
chieftain: "Cacique/Líder" #Chieftain/Leader literally
|
||||||
type: "Tipo"
|
type: "Tipo"
|
||||||
edit_clan_name: "Editar el nombre del Clan"
|
edit_clan_name: "Editar el nombre del Clan"
|
||||||
edit_clan_description: "Editar descripción del clan"
|
edit_clan_description: "Editar descripción del clan"
|
||||||
|
@ -836,7 +836,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
latest_achievement: "último logro"
|
latest_achievement: "último logro"
|
||||||
playtime: "Tiempo de juego"
|
playtime: "Tiempo de juego"
|
||||||
last_played: "Último jugado"
|
last_played: "Último jugado"
|
||||||
# leagues_explanation: "Play in a league against other clan members in these multiplayer arena instances."
|
# leagues_explanation: "Juega en una liga contra otros miembros del clan en these multiplayer arena instances."
|
||||||
|
|
||||||
classes:
|
classes:
|
||||||
archmage_title: "Archimago"
|
archmage_title: "Archimago"
|
||||||
|
@ -861,7 +861,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
editor:
|
editor:
|
||||||
main_title: "Editor de CodeCombat"
|
main_title: "Editor de CodeCombat"
|
||||||
article_title: "Editor de Artículo"
|
article_title: "Editor de Artículo"
|
||||||
thang_title: "Editor de Thangs"
|
thang_title: "Editor de Tiliches"
|
||||||
level_title: "Editor de Nivel"
|
level_title: "Editor de Nivel"
|
||||||
achievement_title: "Editor de logros"
|
achievement_title: "Editor de logros"
|
||||||
poll_title: "Editor de Encuesta"
|
poll_title: "Editor de Encuesta"
|
||||||
|
@ -884,23 +884,23 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
wiki: "Wiki"
|
wiki: "Wiki"
|
||||||
live_chat: "Chat en vivo"
|
live_chat: "Chat en vivo"
|
||||||
thang_main: "Principal"
|
thang_main: "Principal"
|
||||||
thang_spritesheets: "Spritesheets"
|
thang_spritesheets: "Hojas de figuras( para animaciones )"
|
||||||
thang_colors: "Colores"
|
thang_colors: "Colores"
|
||||||
level_some_options: "¿Algunas opciones?"
|
level_some_options: "¿Algunas opciones?"
|
||||||
level_tab_thangs: "Thangs"
|
level_tab_thangs: "Tiliches" #Verificar cual es mejor: Cachivache, Tiliche, Artilugio, Bagatela, Cosa
|
||||||
level_tab_scripts: "Scripts"
|
level_tab_scripts: "Scripts"
|
||||||
level_tab_settings: "Opciones"
|
level_tab_settings: "Opciones"
|
||||||
level_tab_components: "Componentes"
|
level_tab_components: "Componentes"
|
||||||
level_tab_systems: "Sistemas"
|
level_tab_systems: "Sistemas"
|
||||||
level_tab_docs: "Documentación"
|
level_tab_docs: "Documentación"
|
||||||
level_tab_thangs_title: "Thangs Actuales"
|
level_tab_thangs_title: "Tiliches Actuales"
|
||||||
level_tab_thangs_all: "Todo"
|
level_tab_thangs_all: "Todo"
|
||||||
level_tab_thangs_conditions: "Condiciones Iniciales"
|
level_tab_thangs_conditions: "Condiciones Iniciales"
|
||||||
level_tab_thangs_add: "Agregar Thangs"
|
level_tab_thangs_add: "Agregar Tiliches"
|
||||||
# level_tab_thangs_search: "Search thangs"
|
level_tab_thangs_search: "Buscar thangs"
|
||||||
add_components: "Agregar Componentes"
|
add_components: "Agregar Componentes"
|
||||||
component_configs: "Configuraciones del Componente"
|
component_configs: "Configuraciones del Componente"
|
||||||
config_thang: "Doble clic para configurar un thang"
|
config_thang: "Doble clic para configurar un Tiliche"
|
||||||
delete: "Borrar"
|
delete: "Borrar"
|
||||||
duplicate: "Duplicar"
|
duplicate: "Duplicar"
|
||||||
stop_duplicate: "Parar de Duplicar"
|
stop_duplicate: "Parar de Duplicar"
|
||||||
|
@ -911,7 +911,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
level_systems_tab_title: "Sistemas Actuales"
|
level_systems_tab_title: "Sistemas Actuales"
|
||||||
level_systems_btn_new: "Crear Nuevo Sistema"
|
level_systems_btn_new: "Crear Nuevo Sistema"
|
||||||
level_systems_btn_add: "Agregar Sistema"
|
level_systems_btn_add: "Agregar Sistema"
|
||||||
level_components_title: "Regresar a todos los Thangs"
|
level_components_title: "Regresar a todos los Tiliches"
|
||||||
level_components_type: "Tipo"
|
level_components_type: "Tipo"
|
||||||
level_component_edit_title: "Editar Componente"
|
level_component_edit_title: "Editar Componente"
|
||||||
level_component_config_schema: "Config Schema"
|
level_component_config_schema: "Config Schema"
|
||||||
|
@ -921,17 +921,17 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
new_component_title: "Crear Nuevo Componente"
|
new_component_title: "Crear Nuevo Componente"
|
||||||
new_component_field_system: "Sistema"
|
new_component_field_system: "Sistema"
|
||||||
new_article_title: "Crear un Nuevo Artículo"
|
new_article_title: "Crear un Nuevo Artículo"
|
||||||
new_thang_title: "Crear un Nuevo tipo de Thang"
|
new_thang_title: "Crear un Nuevo tipo de Tiliche"
|
||||||
new_level_title: "Crear un Nuevo Nivel"
|
new_level_title: "Crear un Nuevo Nivel"
|
||||||
new_article_title_login: "Ingresa para Crear un Nuevo Artículo"
|
new_article_title_login: "Ingresa para Crear un Nuevo Artículo"
|
||||||
new_thang_title_login: "Ingresa para crear un nuevo tipo de Thang"
|
new_thang_title_login: "Ingresa para crear un nuevo tipo de Tiliche"
|
||||||
new_level_title_login: "Ingresa para Crear un Nuevo Nivel"
|
new_level_title_login: "Ingresa para Crear un Nuevo Nivel"
|
||||||
new_achievement_title: "Crear un Nuevo Logro"
|
new_achievement_title: "Crear un Nuevo Logro"
|
||||||
new_achievement_title_login: "Ingresa para Crear un Nuevo Logro"
|
new_achievement_title_login: "Ingresa para Crear un Nuevo Logro"
|
||||||
new_poll_title: "Crear una nueva encuesta"
|
new_poll_title: "Crear una nueva encuesta"
|
||||||
new_poll_title_login: "Ingresa para crear una nueva encuesta"
|
new_poll_title_login: "Ingresa para crear una nueva encuesta"
|
||||||
article_search_title: "Buscar Artículos aquí"
|
article_search_title: "Buscar Artículos aquí"
|
||||||
thang_search_title: "Buscar tipos de Thang aquí"
|
thang_search_title: "Buscar tipos de Tiliche aquí"
|
||||||
level_search_title: "Buscar Niveles aquí"
|
level_search_title: "Buscar Niveles aquí"
|
||||||
achievement_search_title: "Buscar logros"
|
achievement_search_title: "Buscar logros"
|
||||||
poll_search_title: "Buscar Encuesta"
|
poll_search_title: "Buscar Encuesta"
|
||||||
|
@ -943,8 +943,8 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
pop_i18n: "Poblar I18N"
|
pop_i18n: "Poblar I18N"
|
||||||
tasks: "Tareas"
|
tasks: "Tareas"
|
||||||
clear_storage: "Borrar tus cambios locales"
|
clear_storage: "Borrar tus cambios locales"
|
||||||
# add_system_title: "Add Systems to Level"
|
add_system_title: "Agregar Sistemas al Level"
|
||||||
# done_adding: "Done Adding"
|
done_adding: "Se terminó de agregar"
|
||||||
|
|
||||||
article:
|
article:
|
||||||
edit_btn_preview: "Vista previa"
|
edit_btn_preview: "Vista previa"
|
||||||
|
@ -1026,7 +1026,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
my_matches: "Mis Partidas"
|
my_matches: "Mis Partidas"
|
||||||
simulate: "Simular"
|
simulate: "Simular"
|
||||||
simulation_explanation: "¡Simulando tus juegos puedes mejorar tu posición más rápido!"
|
simulation_explanation: "¡Simulando tus juegos puedes mejorar tu posición más rápido!"
|
||||||
# simulation_explanation_leagues: "You will mainly help simulate games for allied players in your clans and courses."
|
# simulation_explanation_leagues: "Principalmente ayudarás a simular juegos for allied players in your clans and courses."
|
||||||
simulate_games: "¡Simular Juegos!"
|
simulate_games: "¡Simular Juegos!"
|
||||||
simulate_all: "REINICIAR Y SIMULAR JUEGOS"
|
simulate_all: "REINICIAR Y SIMULAR JUEGOS"
|
||||||
games_simulated_by: "Juegos simulados por ti:"
|
games_simulated_by: "Juegos simulados por ti:"
|
||||||
|
@ -1047,7 +1047,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
rank_failed: "Fallo al Clasificar"
|
rank_failed: "Fallo al Clasificar"
|
||||||
rank_being_ranked: "Juego Siendo Clasificado"
|
rank_being_ranked: "Juego Siendo Clasificado"
|
||||||
rank_last_submitted: "Presentado"
|
rank_last_submitted: "Presentado"
|
||||||
help_simulate: "Ayudar simulando juego?"
|
help_simulate: "¿Ayudar simulando juego?"
|
||||||
code_being_simulated: "Tu nuevo código está siendo simulado por otros jugadores para clasificación. Esto se refrescará a medida que vengan nuevas partidas."
|
code_being_simulated: "Tu nuevo código está siendo simulado por otros jugadores para clasificación. Esto se refrescará a medida que vengan nuevas partidas."
|
||||||
no_ranked_matches_pre: "Sin partidas clasificadas para el "
|
no_ranked_matches_pre: "Sin partidas clasificadas para el "
|
||||||
no_ranked_matches_post: " equipo! Juega en contra de algunos competidores y luego vuelve aquí para ver tu juego clasificado."
|
no_ranked_matches_post: " equipo! Juega en contra de algunos competidores y luego vuelve aquí para ver tu juego clasificado."
|
||||||
|
@ -1077,7 +1077,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
tournament_blurb_blog: "en nuestro blog"
|
tournament_blurb_blog: "en nuestro blog"
|
||||||
rules: "Reglas"
|
rules: "Reglas"
|
||||||
winners: "Ganadores"
|
winners: "Ganadores"
|
||||||
# league: "League"
|
league: "Liga"
|
||||||
|
|
||||||
user:
|
user:
|
||||||
stats: "Estados"
|
stats: "Estados"
|
||||||
|
@ -1093,7 +1093,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
no_achievements: "Sin Logros todavía."
|
no_achievements: "Sin Logros todavía."
|
||||||
favorite_prefix: "Idioma favorito "
|
favorite_prefix: "Idioma favorito "
|
||||||
favorite_postfix: "."
|
favorite_postfix: "."
|
||||||
not_member_of_clans: "No se es miembro de ningún clan todavía."
|
not_member_of_clans: "No eres miembro de ningún clan todavía."
|
||||||
|
|
||||||
achievements:
|
achievements:
|
||||||
last_earned: "Último Ganado"
|
last_earned: "Último Ganado"
|
||||||
|
@ -1118,7 +1118,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
no_recent_games: "No juegos jugados duramente las últimas dos semanas."
|
no_recent_games: "No juegos jugados duramente las últimas dos semanas."
|
||||||
payments: "Pagos"
|
payments: "Pagos"
|
||||||
purchased: "Comprado"
|
purchased: "Comprado"
|
||||||
# sale: "Sale"
|
sale: "Venta"
|
||||||
subscription: "Suscripción"
|
subscription: "Suscripción"
|
||||||
invoices: "Facturas"
|
invoices: "Facturas"
|
||||||
service_apple: "Apple"
|
service_apple: "Apple"
|
||||||
|
@ -1128,14 +1128,14 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
price: "Precio"
|
price: "Precio"
|
||||||
gems: "Gemas"
|
gems: "Gemas"
|
||||||
active: "Activo"
|
active: "Activo"
|
||||||
subscribed: "Suscripto"
|
subscribed: "Suscrito"
|
||||||
unsubscribed: "Insuscripto"
|
unsubscribed: "Desuscrito"
|
||||||
active_until: "Activo Hasta"
|
active_until: "Activo Hasta"
|
||||||
cost: "Costo"
|
cost: "Costo"
|
||||||
next_payment: "Próximo Pago"
|
next_payment: "Próximo Pago"
|
||||||
card: "Tarjeta"
|
card: "Tarjeta"
|
||||||
status_unsubscribed_active: "No estas suscripto y no se te cobrará, pero tu cuenta está activa por ahora."
|
status_unsubscribed_active: "No estas suscrito y no se te cobrará, pero tu cuenta está activa por ahora."
|
||||||
status_unsubscribed: "Obtén acceso a nuevos niveles, heroés, items y gemas extras con la suscripción a CodeCombat!"
|
status_unsubscribed: "¡Obtén acceso a nuevos niveles, héroes, items y gemas extras con la suscripción a CodeCombat!"
|
||||||
|
|
||||||
account_invoices:
|
account_invoices:
|
||||||
amount: "Cantidad en dólares."
|
amount: "Cantidad en dólares."
|
||||||
|
@ -1181,13 +1181,13 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
systems: "Sistemas"
|
systems: "Sistemas"
|
||||||
component: "Componente"
|
component: "Componente"
|
||||||
components: "Componentes"
|
components: "Componentes"
|
||||||
thang: "Thang"
|
thang: "Tiliche"
|
||||||
thangs: "Thangs"
|
thangs: "Tiliches"
|
||||||
level_session: "Tu Sesión"
|
level_session: "Tu Sesión"
|
||||||
opponent_session: "Sesión del Oponente"
|
opponent_session: "Sesión del Oponente"
|
||||||
article: "Artícule"
|
article: "Artícule"
|
||||||
user_names: "Nombres de usuario"
|
user_names: "Nombres de usuario"
|
||||||
thang_names: "Nombres de thang"
|
thang_names: "Nombres de Tiliche"
|
||||||
files: "Archivos"
|
files: "Archivos"
|
||||||
top_simulators: "Mejores simuladores"
|
top_simulators: "Mejores simuladores"
|
||||||
source_document: "Documento fuente"
|
source_document: "Documento fuente"
|
||||||
|
@ -1211,35 +1211,35 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
poll: "Encuesta"
|
poll: "Encuesta"
|
||||||
user_polls_record: "Historia de Visitas de Encuestas"
|
user_polls_record: "Historia de Visitas de Encuestas"
|
||||||
|
|
||||||
# concepts:
|
concepts:
|
||||||
# advanced_strings: "Advanced Strings"
|
advanced_strings: "Manipulación Avanzada de Cadenas" #used Advanced Strings Handling instead of Advanced Strings
|
||||||
# algorithms: "Algorithms"
|
algorithms: "Algoritmos"
|
||||||
# arguments: "Arguments"
|
arguments: "Argumentos"
|
||||||
# arithmetic: "Arithmetic"
|
arithmetic: "Aritmética"
|
||||||
# arrays: "Arrays"
|
arrays: "Arreglos"
|
||||||
# basic_syntax: "Basic Syntax"
|
basic_syntax: "Sintaxis Básica"
|
||||||
# boolean_logic: "Boolean Logic"
|
boolean_logic: "Lógica Booleana"
|
||||||
# break_statements: "Break Statements"
|
# break_statements: "Break Statements"
|
||||||
# classes: "Classes"
|
classes: "Clases"
|
||||||
# continue_statements: "Continue Statements"
|
# continue_statements: "Continue Statements"
|
||||||
# for_loops: "For Loops"
|
for_loops: "Ciclos For"
|
||||||
# functions: "Functions"
|
functions: "Funciones"
|
||||||
# graphics: "Graphics"
|
graphics: "Gráficos"
|
||||||
# if_statements: "If Statements"
|
# if_statements: "If Statements"
|
||||||
# input_handling: "Input Handling"
|
# input_handling: "Input Handling"
|
||||||
# math_operations: "Math Operations"
|
math_operations: "Operaciones Matemáticas"
|
||||||
# object_literals: "Object Literals"
|
# object_literals: "Object Literals"
|
||||||
# parameters: "Parameters"
|
parameters: "Parámetros"
|
||||||
# strings: "Strings"
|
strings: "Cadenas"
|
||||||
# variables: "Variables"
|
variables: "Variables"
|
||||||
# vectors: "Vectors"
|
vectors: "Vectores"
|
||||||
# while_loops: "Loops"
|
while_loops: "Ciclos While"
|
||||||
# recursion: "Recursion"
|
recursion: "Recursividad"
|
||||||
|
|
||||||
delta:
|
delta:
|
||||||
added: "Agregado"
|
added: "Agregado"
|
||||||
modified: "Modificado"
|
modified: "Modificado"
|
||||||
# not_modified: "Not Modified"
|
not_modified: "No Modificado"
|
||||||
deleted: "Borrado"
|
deleted: "Borrado"
|
||||||
moved_index: "Índice movido"
|
moved_index: "Índice movido"
|
||||||
text_diff: "Diferir Texto"
|
text_diff: "Diferir Texto"
|
||||||
|
|
|
@ -7,6 +7,7 @@ _.extend CourseSchema.properties,
|
||||||
campaignID: c.objectId()
|
campaignID: c.objectId()
|
||||||
concepts: c.array {title: 'Programming Concepts', uniqueItems: true}, c.concept
|
concepts: c.array {title: 'Programming Concepts', uniqueItems: true}, c.concept
|
||||||
description: {type: 'string'}
|
description: {type: 'string'}
|
||||||
|
duration: {trype: 'number', description: 'Approximate hours of content'}
|
||||||
pricePerSeat: {type: 'number', description: 'Price per seat in USD cents.'}
|
pricePerSeat: {type: 'number', description: 'Price per seat in USD cents.'}
|
||||||
screenshot: c.url {title: 'URL', description: 'Link to course screenshot.'}
|
screenshot: c.url {title: 'URL', description: 'Link to course screenshot.'}
|
||||||
|
|
||||||
|
|
68
app/styles/courses/courses.sass
Normal file
68
app/styles/courses/courses.sass
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#courses-view
|
||||||
|
|
||||||
|
.center
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
.code-input
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
.course-image
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
.course-panel
|
||||||
|
margin: 20px
|
||||||
|
|
||||||
|
.faq-blurb
|
||||||
|
font-size: 14px
|
||||||
|
|
||||||
|
.continue-dialog .modal-dialog
|
||||||
|
background-color: white
|
||||||
|
max-width: 400px
|
||||||
|
|
||||||
|
.instruction-label
|
||||||
|
font-size: 14pt
|
||||||
|
.or
|
||||||
|
margin-bottom: 20px
|
||||||
|
font-size: 14pt
|
||||||
|
|
||||||
|
.btn-enroll
|
||||||
|
margin-top: 20px
|
||||||
|
|
||||||
|
.center
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
.concepts-container
|
||||||
|
width: 200px
|
||||||
|
|
||||||
|
.contact-container
|
||||||
|
margin-top: 20px
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
.info-container
|
||||||
|
margin: 0% 10%
|
||||||
|
font-size: 18px
|
||||||
|
|
||||||
|
.monitoring-img-container
|
||||||
|
margin-top: 10px
|
||||||
|
|
||||||
|
.praise-caption
|
||||||
|
font-size: 14px
|
||||||
|
|
||||||
|
.praise-quote
|
||||||
|
font-size: 20px
|
||||||
|
font-style: italic
|
||||||
|
|
||||||
|
.progress-container
|
||||||
|
font-size: 20px
|
||||||
|
|
||||||
|
.img-quote
|
||||||
|
height: 160px
|
||||||
|
|
||||||
|
.popover
|
||||||
|
z-index: 1050
|
||||||
|
min-width: 400px
|
||||||
|
|
||||||
|
h3
|
||||||
|
background: transparent
|
||||||
|
border: 0
|
||||||
|
font-size: 30px
|
|
@ -1,4 +1,4 @@
|
||||||
#course-details-view
|
#course-details-mock-view
|
||||||
|
|
||||||
.section-selector
|
.section-selector
|
||||||
margin-bottom: 0px
|
margin-bottom: 0px
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#course-enroll-view
|
#course-enroll-mock-view
|
||||||
|
|
||||||
.btn-buy
|
.btn-buy
|
||||||
margin: 20px 0px
|
margin: 20px 0px
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#courses-view
|
#courses-mock-view
|
||||||
|
|
||||||
.center
|
.center
|
||||||
text-align: center
|
text-align: center
|
||||||
|
|
|
@ -8,19 +8,136 @@ block content
|
||||||
span *UNDER CONSTRUCTION, please send feedback to
|
span *UNDER CONSTRUCTION, please send feedback to
|
||||||
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
||||||
|
|
||||||
h1(style='text-align: center;') Courses
|
br
|
||||||
|
if studentMode
|
||||||
|
+student-main
|
||||||
|
else
|
||||||
|
+teacher-main
|
||||||
.container-fluid
|
.container-fluid
|
||||||
.row(style='font-size: 20px;')
|
- var i = 0
|
||||||
.col-md-3
|
while i < courses.length
|
||||||
.col-md-3 Name
|
.row
|
||||||
.col-md-3 Description
|
+course-block(courses[i], instances)
|
||||||
.col-md-3 Concepts
|
- i++
|
||||||
each course in courses
|
if i < courses.length
|
||||||
.row(style='border-top: 1px solid gray; padding: 10px;')
|
+course-block(courses[i], instances)
|
||||||
.col-md-3
|
- i++
|
||||||
img(src="#{course.get('screenshot')}", style="width: 100%;")
|
|
||||||
.col-md-3
|
mixin student-main
|
||||||
p= course.get('name')
|
button.btn.btn-warning.btn-teacher Teachers Click Here
|
||||||
a(href="/editor/campaign/#{course.get('campaignID')}") Campaign (levels)
|
h1.center Courses on CodeCombat
|
||||||
.col-md-3= course.get('description')
|
|
||||||
.col-md-3= course.get('concepts').join(' ')
|
mixin teacher-main
|
||||||
|
button.btn.btn-warning.btn-student Students Click Here
|
||||||
|
h1.center Courses on CodeCombat
|
||||||
|
.info-container
|
||||||
|
p Courses are designed to introduce computer science concepts using CodeCombat's fun and engaging environment. CodeCombat levels are organized around key topics to encourage progressive learning, over the course of 5 hours.
|
||||||
|
.container-fluid
|
||||||
|
.row
|
||||||
|
.col-md-6
|
||||||
|
ul
|
||||||
|
li Learn more in less time
|
||||||
|
li No coding experience necesssary
|
||||||
|
li Easily monitor student progress
|
||||||
|
|
||||||
|
p Purchase a course for your entire class. It's easy to sign up your students!
|
||||||
|
p.faq-blurb
|
||||||
|
span.spr See the courses
|
||||||
|
a.spr.courses-faq FAQ
|
||||||
|
span for more information.
|
||||||
|
.col-md-6
|
||||||
|
img.img-quote(src="/images/pages/courses/coco_complab.png")
|
||||||
|
p
|
||||||
|
.well.well-sm
|
||||||
|
div.praise-quote "#{praise.quote}"
|
||||||
|
div.praise-caption - #{praise.source}
|
||||||
|
h2.center Choose Your Course:
|
||||||
|
|
||||||
|
mixin student-dialog(course)
|
||||||
|
.modal.continue-dialog(id="continueModal#{course.id}")
|
||||||
|
.modal-dialog
|
||||||
|
.modal-header
|
||||||
|
button.close(data-dismiss='modal')
|
||||||
|
span ×
|
||||||
|
h3.modal-title= course.get('name')
|
||||||
|
.modal-body
|
||||||
|
.container-fluid
|
||||||
|
.row.button-row
|
||||||
|
.col-md-12
|
||||||
|
.well.well-sm
|
||||||
|
p
|
||||||
|
div.instruction-label Enter an unlock code
|
||||||
|
.container-fluid
|
||||||
|
.row
|
||||||
|
.col-md-8
|
||||||
|
input.code-input(type='text', placeholder="Enter unlock code")
|
||||||
|
.col-md-4
|
||||||
|
button.btn.btn-success.btn-enroll Enroll
|
||||||
|
|
||||||
|
mixin teacher-dialog(course)
|
||||||
|
.modal.continue-dialog(id="continueModal#{course.id}")
|
||||||
|
.modal-dialog
|
||||||
|
.modal-header
|
||||||
|
button.close(data-dismiss='modal')
|
||||||
|
span ×
|
||||||
|
h3.modal-title= course.get('name')
|
||||||
|
.modal-body
|
||||||
|
.container-fluid
|
||||||
|
if enrolledCourses[course.id]
|
||||||
|
.row.button-row.row-pick-class
|
||||||
|
.col-md-12
|
||||||
|
.well.well-sm
|
||||||
|
p
|
||||||
|
div.instruction-label Pick from your current classes
|
||||||
|
.container-fluid
|
||||||
|
.row
|
||||||
|
.col-md-8
|
||||||
|
select.form-control.select-session
|
||||||
|
each inst in instances
|
||||||
|
if inst.get('name')
|
||||||
|
option(value="#{inst.id}")= inst.get('name')
|
||||||
|
else
|
||||||
|
option(value="#{inst.id}") *unnamed*
|
||||||
|
.col-md-4
|
||||||
|
button.btn.btn-success.btn-enter(data-course-id="#{course.id}") Enter
|
||||||
|
.row.button-row.center.row-pick-class
|
||||||
|
.col-md-12
|
||||||
|
div.or Or
|
||||||
|
.row.button-row.center
|
||||||
|
.col-md-12
|
||||||
|
button.btn.btn-success.btn-lg.btn-buy(data-course-id="#{course.id}") Buy this course
|
||||||
|
|
||||||
|
mixin course-block(course)
|
||||||
|
if studentMode
|
||||||
|
+student-dialog(course)
|
||||||
|
else
|
||||||
|
+teacher-dialog(course)
|
||||||
|
.col-md-6
|
||||||
|
.well.panel.course-panel(class=enrolledCourses[course.id] ? 'panel-success' : 'panel-info')
|
||||||
|
.panel-heading
|
||||||
|
.panel-title
|
||||||
|
span.spr #{course.get('name')}
|
||||||
|
strong #{enrolledCourses[course.id] ? '[ enrolled ]' : ''}
|
||||||
|
.panel-body
|
||||||
|
.container-fluid
|
||||||
|
.row
|
||||||
|
.col-md-12
|
||||||
|
p
|
||||||
|
img.course-image(src="#{course.get('screenshot')}")
|
||||||
|
.row.button-row
|
||||||
|
.col-md-6
|
||||||
|
strong Topics
|
||||||
|
ul
|
||||||
|
each concept in course.get('concepts')
|
||||||
|
li(data-i18n="concepts." + concept)
|
||||||
|
strong Hours of content: #{course.get('duration')}
|
||||||
|
.col-md-6.center(style='margin-top: 40px;')
|
||||||
|
if studentMode
|
||||||
|
if enrolledCourses[course.id]
|
||||||
|
a.btn.btn-lg.btn-success.btn-continue(href="/courses/#{course.id}?student=true") Continue
|
||||||
|
else
|
||||||
|
button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal#{course.id}") Enter
|
||||||
|
else if enrolledCourses[course.id]
|
||||||
|
button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal#{course.id}") Continue
|
||||||
|
else
|
||||||
|
button.btn.btn-lg.btn-success.btn-buy(data-course-id="#{course.id}") #{course.get('pricePerSeat') === 0 ? 'Get FREE course' : 'Buy course'}
|
||||||
|
|
|
@ -20,7 +20,7 @@ module.exports = class CourseEnrollView extends RootView
|
||||||
subscriptions:
|
subscriptions:
|
||||||
'stripe:received-token': 'onStripeReceivedToken'
|
'stripe:received-token': 'onStripeReceivedToken'
|
||||||
|
|
||||||
constructor: (options, @courseID=0) ->
|
constructor: (options, @courseID) ->
|
||||||
super options
|
super options
|
||||||
@courseID ?= options.courseID
|
@courseID ?= options.courseID
|
||||||
@seats = 20
|
@seats = 20
|
||||||
|
@ -99,7 +99,7 @@ module.exports = class CourseEnrollView extends RootView
|
||||||
|
|
||||||
createClass: (token) ->
|
createClass: (token) ->
|
||||||
data =
|
data =
|
||||||
name: $('.class-name').val()
|
name: @className
|
||||||
seats: @seats
|
seats: @seats
|
||||||
token: token
|
token: token
|
||||||
data.courseID = @selectedCourse.id if @selectedCourse
|
data.courseID = @selectedCourse.id if @selectedCourse
|
||||||
|
|
|
@ -1,18 +1,95 @@
|
||||||
RootView = require 'views/core/RootView'
|
app = require 'core/application'
|
||||||
template = require 'templates/courses/courses'
|
|
||||||
CocoCollection = require 'collections/CocoCollection'
|
CocoCollection = require 'collections/CocoCollection'
|
||||||
Course = require 'models/Course'
|
Course = require 'models/Course'
|
||||||
|
CourseInstance = require 'models/CourseInstance'
|
||||||
|
RootView = require 'views/core/RootView'
|
||||||
|
template = require 'templates/courses/courses'
|
||||||
|
utils = require 'core/utils'
|
||||||
|
|
||||||
module.exports = class CoursesView extends RootView
|
module.exports = class CoursesView extends RootView
|
||||||
id: 'courses-view'
|
id: 'courses-view'
|
||||||
template: template
|
template: template
|
||||||
|
|
||||||
|
events:
|
||||||
|
'click .btn-buy': 'onClickBuy'
|
||||||
|
'click .btn-enroll': 'onClickEnroll'
|
||||||
|
'click .btn-enter': 'onClickEnter'
|
||||||
|
'click .btn-student': 'onClickStudent'
|
||||||
|
'click .btn-teacher': 'onClickTeacher'
|
||||||
|
|
||||||
constructor: (options) ->
|
constructor: (options) ->
|
||||||
super options
|
super(options)
|
||||||
|
@praise = utils.getCoursePraise()
|
||||||
|
@studentMode = utils.getQueryVariable('student', false) or options.studentMode
|
||||||
@courses = new CocoCollection([], { url: "/db/course", model: Course})
|
@courses = new CocoCollection([], { url: "/db/course", model: Course})
|
||||||
@supermodel.loadCollection(@courses, 'courses')
|
@supermodel.loadCollection(@courses, 'courses')
|
||||||
|
@courseInstances = new CocoCollection([], { url: "/db/user/#{me.id}/course_instances", model: CourseInstance})
|
||||||
|
@listenToOnce @courseInstances, 'sync', @onCourseInstancesLoaded
|
||||||
|
@supermodel.loadCollection(@courseInstances, 'course_instances')
|
||||||
|
|
||||||
getRenderData: ->
|
getRenderData: ->
|
||||||
context = super()
|
context = super()
|
||||||
context.courses = @courses.models ? []
|
context.courses = @courses.models ? []
|
||||||
|
context.enrolledCourses = @enrolledCourses ? {}
|
||||||
|
context.instances = @courseInstances.models ? []
|
||||||
|
context.praise = @praise
|
||||||
|
context.studentMode = @studentMode
|
||||||
context
|
context
|
||||||
|
|
||||||
|
afterRender: ->
|
||||||
|
super()
|
||||||
|
@setupCoursesFAQPopover()
|
||||||
|
|
||||||
|
onCourseInstancesLoaded: ->
|
||||||
|
@enrolledCourses = {}
|
||||||
|
@enrolledCourses[courseInstance.get('courseID')] = true for courseInstance in @courseInstances.models
|
||||||
|
|
||||||
|
setupCoursesFAQPopover: ->
|
||||||
|
popoverTitle = "<h3>Courses FAQ<button type='button' class='close' onclick='$('.courses-faq').popover('hide');'>×</button></h3>"
|
||||||
|
popoverContent = "<p><strong>Q:</strong> What's the difference between these courses and the single player game?</p>"
|
||||||
|
popoverContent += "<p><strong>A:</strong> The single player game is designed for individuals, while the courses are designed for classes.</p>"
|
||||||
|
popoverContent += "<p>The single player game has items, gems, hero selection, leveling up, and in-app purchases. Courses have classroom management features and streamlined student-focused level pacing.</p>"
|
||||||
|
@$el.find('.courses-faq').popover(
|
||||||
|
animation: true
|
||||||
|
html: true
|
||||||
|
placement: 'top'
|
||||||
|
trigger: 'click'
|
||||||
|
title: popoverTitle
|
||||||
|
content: popoverContent
|
||||||
|
container: @$el
|
||||||
|
).on 'shown.bs.popover', =>
|
||||||
|
application.tracker?.trackEvent 'Subscription payment methods hover'
|
||||||
|
|
||||||
|
onClickBuy: (e) ->
|
||||||
|
courseID = $(e.target).data('course-id')
|
||||||
|
route = "/courses/enroll/#{courseID}"
|
||||||
|
viewClass = require 'views/courses/CourseEnrollView'
|
||||||
|
viewArgs = [{}, courseID]
|
||||||
|
navigationEvent = route: route, viewClass: viewClass, viewArgs: viewArgs
|
||||||
|
Backbone.Mediator.publish 'router:navigate', navigationEvent
|
||||||
|
|
||||||
|
onClickEnroll: (e) ->
|
||||||
|
alert('TODO: redeem course prepaid and navigate to correct course instance')
|
||||||
|
|
||||||
|
onClickEnter: (e) ->
|
||||||
|
$('.continue-dialog').modal('hide')
|
||||||
|
courseID = $(e.target).data('course-id')
|
||||||
|
courseInstanceID = $('.select-session').val()
|
||||||
|
viewClass = require 'views/courses/CourseDetailsView'
|
||||||
|
viewArgs = [{courseInstanceID:courseInstanceID}, courseID]
|
||||||
|
navigationEvent = route: "/courses/#{courseID}", viewClass: viewClass, viewArgs: viewArgs
|
||||||
|
Backbone.Mediator.publish 'router:navigate', navigationEvent
|
||||||
|
|
||||||
|
onClickStudent: (e) ->
|
||||||
|
route = "/courses?student=true"
|
||||||
|
viewClass = require 'views/courses/CoursesView'
|
||||||
|
viewArgs = [studentMode: true]
|
||||||
|
navigationEvent = route: route, viewClass: viewClass, viewArgs: viewArgs
|
||||||
|
Backbone.Mediator.publish 'router:navigate', navigationEvent
|
||||||
|
|
||||||
|
onClickTeacher: (e) ->
|
||||||
|
route = "/courses?student=false"
|
||||||
|
viewClass = require 'views/courses/CoursesView'
|
||||||
|
viewArgs = [studentMode: false]
|
||||||
|
navigationEvent = route: route, viewClass: viewClass, viewArgs: viewArgs
|
||||||
|
Backbone.Mediator.publish 'router:navigate', navigationEvent
|
||||||
|
|
|
@ -6,7 +6,7 @@ CocoCollection = require 'collections/CocoCollection'
|
||||||
Campaign = require 'models/Campaign'
|
Campaign = require 'models/Campaign'
|
||||||
|
|
||||||
module.exports = class CourseDetailsView extends RootView
|
module.exports = class CourseDetailsView extends RootView
|
||||||
id: 'course-details-view'
|
id: 'course-details-mock-view'
|
||||||
template: template
|
template: template
|
||||||
|
|
||||||
events:
|
events:
|
||||||
|
|
|
@ -3,7 +3,7 @@ RootView = require 'views/core/RootView'
|
||||||
template = require 'templates/courses/mock1/course-enroll'
|
template = require 'templates/courses/mock1/course-enroll'
|
||||||
|
|
||||||
module.exports = class CourseEnrollView extends RootView
|
module.exports = class CourseEnrollView extends RootView
|
||||||
id: 'course-enroll-view'
|
id: 'course-enroll-mock-view'
|
||||||
template: template
|
template: template
|
||||||
|
|
||||||
events:
|
events:
|
||||||
|
|
|
@ -4,7 +4,7 @@ RootView = require 'views/core/RootView'
|
||||||
template = require 'templates/courses/mock1/courses'
|
template = require 'templates/courses/mock1/courses'
|
||||||
|
|
||||||
module.exports = class CoursesView extends RootView
|
module.exports = class CoursesView extends RootView
|
||||||
id: 'courses-view'
|
id: 'courses-mock-view'
|
||||||
template: template
|
template: template
|
||||||
|
|
||||||
events:
|
events:
|
||||||
|
|
|
@ -4,10 +4,9 @@
|
||||||
// mongo <address>:<port>/<database> <script file> -u <username> -p <password>
|
// mongo <address>:<port>/<database> <script file> -u <username> -p <password>
|
||||||
|
|
||||||
// NOTE: uses name as unique identifier, so changing the name will insert a new course
|
// NOTE: uses name as unique identifier, so changing the name will insert a new course
|
||||||
// NOTE: concepts should match actual campaign levels
|
|
||||||
// NOTE: pricePerSeat in USD cents
|
// NOTE: pricePerSeat in USD cents
|
||||||
|
|
||||||
var documents =
|
var courses =
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
name: "Introduction to Computer Science",
|
name: "Introduction to Computer Science",
|
||||||
|
@ -15,6 +14,7 @@ var documents =
|
||||||
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
|
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
|
||||||
concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables'],
|
concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables'],
|
||||||
description: "Learn basic syntax, while loops, and the CodeCombat environment.",
|
description: "Learn basic syntax, while loops, and the CodeCombat environment.",
|
||||||
|
duration: NumberInt(1),
|
||||||
pricePerSeat: NumberInt(0),
|
pricePerSeat: NumberInt(0),
|
||||||
screenshot: "/images/pages/courses/101_info.png"
|
screenshot: "/images/pages/courses/101_info.png"
|
||||||
},
|
},
|
||||||
|
@ -24,6 +24,7 @@ var documents =
|
||||||
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
|
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
|
||||||
concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables', 'if_statements'],
|
concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables', 'if_statements'],
|
||||||
description: "Introduce Arguments, Variables, If Statements, and Arithmetic.",
|
description: "Introduce Arguments, Variables, If Statements, and Arithmetic.",
|
||||||
|
duration: NumberInt(5),
|
||||||
pricePerSeat: NumberInt(400),
|
pricePerSeat: NumberInt(400),
|
||||||
screenshot: "/images/pages/courses/102_info.png"
|
screenshot: "/images/pages/courses/102_info.png"
|
||||||
},
|
},
|
||||||
|
@ -33,16 +34,30 @@ var documents =
|
||||||
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
|
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
|
||||||
concepts: ['if_statements', 'arithmetic'],
|
concepts: ['if_statements', 'arithmetic'],
|
||||||
description: "Learn how to handle input.",
|
description: "Learn how to handle input.",
|
||||||
|
duration: NumberInt(5),
|
||||||
pricePerSeat: NumberInt(400),
|
pricePerSeat: NumberInt(400),
|
||||||
screenshot: "/images/pages/courses/103_info.png"
|
screenshot: "/images/pages/courses/103_info.png"
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
for (var i = 0; i < documents.length; i++) {
|
print("Finding course concepts..");
|
||||||
var doc = documents[i];
|
for (var i = 0; i < courses.length; i++) {
|
||||||
db.courses.update({name: doc.name}, doc, {upsert: true});
|
var concepts = {};
|
||||||
|
var cursor = db.campaigns.find({_id: courses[i].campaignID}, {'levels': 1});
|
||||||
|
if (cursor.hasNext()) {
|
||||||
|
var doc = cursor.next();
|
||||||
|
for (var levelID in doc.levels) {
|
||||||
|
for (var j = 0; j < doc.levels[levelID].concepts.length; j++) {
|
||||||
|
concepts[doc.levels[levelID].concepts[j]] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
courses[i].concepts = Object.keys(concepts);
|
||||||
}
|
}
|
||||||
|
|
||||||
function log(str) {
|
print("Updating courses..");
|
||||||
print(new Date().toISOString() + " " + str);
|
for (var i = 0; i < courses.length; i++) {
|
||||||
|
db.courses.update({name: courses[i].name}, courses[i], {upsert: true});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print("Done.");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue