From 4ae40e7bdd803606c4fcc052e2ac4b6cea3ffa28 Mon Sep 17 00:00:00 2001 From: Chris Rodriguez Date: Wed, 6 Jan 2016 10:23:12 -0500 Subject: [PATCH] Updating icons on problem type editor --- .../contentstore/features/component.py | 34 +++---- .../contentstore/features/problem-editor.py | 6 +- cms/static/images/cms-editor_checkbox.png | Bin 0 -> 905 bytes cms/static/images/cms-editor_checkbox.svg | 15 ++++ cms/static/images/cms-editor_dropdown.png | Bin 0 -> 909 bytes cms/static/images/cms-editor_dropdown.svg | 13 +++ cms/static/images/cms-editor_explanation.png | Bin 0 -> 864 bytes cms/static/images/cms-editor_explanation.svg | 26 ++++++ cms/static/images/cms-editor_heading.png | Bin 0 -> 887 bytes cms/static/images/cms-editor_heading.svg | 16 ++++ cms/static/images/cms-editor_number.png | Bin 0 -> 1404 bytes cms/static/images/cms-editor_number.svg | 17 ++++ cms/static/images/cms-editor_radio.png | Bin 0 -> 778 bytes cms/static/images/cms-editor_radio.svg | 16 ++++ cms/static/images/cms-editor_text.png | Bin 0 -> 1420 bytes cms/static/images/cms-editor_text.svg | 22 +++++ cms/static/images/problem-editor-icons.png | Bin 2278 -> 0 bytes cms/templates/widgets/problem-edit.html | 85 ++++++++++++------ .../lib/xmodule/xmodule/css/editor/edit.scss | 17 ++-- .../lib/xmodule/xmodule/css/problem/edit.scss | 47 ++-------- .../js/fixtures/crowdsource_hinter.html | 2 +- .../xmodule/js/spec/problem/edit_spec.coffee | 74 +++++++-------- .../xmodule/js/src/problem/edit.coffee | 6 +- .../xmodule/js/src/video/01_initialize.js | 10 +-- .../xmodule/js/src/video/02_html5_video.js | 4 +- .../test/acceptance/pages/lms/video/video.py | 7 +- .../test/acceptance/tests/lms/test_library.py | 6 +- common/test/acceptance/tests/lms/test_lms.py | 2 +- .../tests/lms/test_lms_courseware.py | 6 +- .../tests/lms/test_lms_matlab_problem.py | 2 +- .../courseware/features/lti.feature | 4 +- .../courseware/features/navigation.py | 8 +- lms/templates/video.html | 2 +- 33 files changed, 292 insertions(+), 155 deletions(-) create mode 100644 cms/static/images/cms-editor_checkbox.png create mode 100644 cms/static/images/cms-editor_checkbox.svg create mode 100644 cms/static/images/cms-editor_dropdown.png create mode 100644 cms/static/images/cms-editor_dropdown.svg create mode 100644 cms/static/images/cms-editor_explanation.png create mode 100644 cms/static/images/cms-editor_explanation.svg create mode 100644 cms/static/images/cms-editor_heading.png create mode 100644 cms/static/images/cms-editor_heading.svg create mode 100644 cms/static/images/cms-editor_number.png create mode 100644 cms/static/images/cms-editor_number.svg create mode 100644 cms/static/images/cms-editor_radio.png create mode 100644 cms/static/images/cms-editor_radio.svg create mode 100644 cms/static/images/cms-editor_text.png create mode 100644 cms/static/images/cms-editor_text.svg delete mode 100644 cms/static/images/problem-editor-icons.png diff --git a/cms/djangoapps/contentstore/features/component.py b/cms/djangoapps/contentstore/features/component.py index b5aa8195d1..8adbb0fdae 100644 --- a/cms/djangoapps/contentstore/features/component.py +++ b/cms/djangoapps/contentstore/features/component.py @@ -28,7 +28,7 @@ def see_a_single_step_component(step): for step_hash in step.hashes: component = step_hash['Component'] assert_in(component, ['Discussion', 'Video']) - component_css = 'div.xmodule_{}Module'.format(component) + component_css = '.xmodule_{}Module'.format(component) assert_true(world.is_css_present(component_css), "{} couldn't be found".format(component)) @@ -56,7 +56,7 @@ def see_a_multi_step_component(step, category): html_matcher = { 'Text': '\n \n', 'Announcement': '

Announcement Date

', - 'Zooming Image Tool': '

Zooming Image Tool

', + 'Zooming Image Tool': '

Zooming Image Tool

', 'E-text Written in LaTeX': '

Example: E-text page

', 'Raw HTML': '

This template is similar to the Text template. The only difference is', } @@ -64,19 +64,19 @@ def see_a_multi_step_component(step, category): assert_in(html_matcher[step_hash['Component']].strip(), actual_html.strip()) else: actual_text = world.css_text(selector, index=idx) - assert_in(step_hash['Component'].upper(), actual_text) + assert_in(step_hash['Component'], actual_text) @step(u'I see a "([^"]*)" Problem component$') def see_a_problem_component(step, category): - component_css = 'div.xmodule_CapaModule' + component_css = '.xmodule_CapaModule' assert_true(world.is_css_present(component_css), 'No problem was added to the unit.') - problem_css = 'li.studio-xblock-wrapper div.xblock-student_view' + problem_css = '.studio-xblock-wrapper .xblock-student_view' # This view presents the given problem component in uppercase. Assert that the text matches - # the component selected (in uppercase) - assert_true(world.css_contains_text(problem_css, category.upper())) + # the component selected + assert_true(world.css_contains_text(problem_css, category)) @step(u'I add a "([^"]*)" "([^"]*)" component$') @@ -88,17 +88,17 @@ def add_component_category(step, component, category): @step(u'I delete all components$') def delete_all_components(step): - count = len(world.css_find('ol.reorderable-container li.studio-xblock-wrapper')) + count = len(world.css_find('.reorderable-container .studio-xblock-wrapper')) step.given('I delete "' + str(count) + '" component') @step(u'I delete "([^"]*)" component$') def delete_components(step, number): world.wait_for_xmodule() - delete_btn_css = 'a.delete-button' - prompt_css = 'div#prompt-warning' - btn_css = '{} button.action-primary'.format(prompt_css) - saving_mini_css = 'div#page-notification .wrapper-notification-mini' + delete_btn_css = '.delete-button' + prompt_css = '#prompt-warning' + btn_css = '{} .action-primary'.format(prompt_css) + saving_mini_css = '#page-notification .wrapper-notification-mini' for _ in range(int(number)): world.css_click(delete_btn_css) assert_true( @@ -124,7 +124,7 @@ def see_no_components(steps): @step(u'I delete a component') def delete_one_component(step): - world.css_click('a.delete-button') + world.css_click('.delete-button') @step(u'I edit and save a component') @@ -141,16 +141,16 @@ def duplicated_component(step, ordinal): "third": 2, } index = ord_map[ordinal] - duplicate_btn_css = 'a.duplicate-button' + duplicate_btn_css = '.duplicate-button' world.css_click(duplicate_btn_css, int(index)) @step(u'I see a Problem component with display name "([^"]*)" in position "([^"]*)"$') def see_component_in_position(step, display_name, index): - component_css = 'div.xmodule_CapaModule' + component_css = '.xmodule_CapaModule' def find_problem(_driver): - return world.css_text(component_css, int(index)).startswith(display_name.upper()) + return world.css_text(component_css, int(index)).startswith(display_name) world.wait_for(find_problem, timeout_msg='Did not find the duplicated problem') @@ -158,7 +158,7 @@ def see_component_in_position(step, display_name, index): @step(u'I see the display name is "([^"]*)"') def check_component_display_name(step, display_name): # The display name for the unit uses the same structure, must differentiate by level-element. - label = world.css_html("section.level-element>header>div>div>span.xblock-display-name") + label = world.css_html(".level-element>header>div>div>span.xblock-display-name") assert_equal(display_name, label) diff --git a/cms/djangoapps/contentstore/features/problem-editor.py b/cms/djangoapps/contentstore/features/problem-editor.py index 92f9fda6f9..c8fc76ed87 100644 --- a/cms/djangoapps/contentstore/features/problem-editor.py +++ b/cms/djangoapps/contentstore/features/problem-editor.py @@ -125,7 +125,7 @@ def my_display_name_change_is_persisted_on_save(step): @step('the problem display name is "(.*)"$') def verify_problem_display_name(step, name): - assert_equal(name.upper(), world.browser.find_by_css('.problem-header').text) + assert_equal(name, world.browser.find_by_css('.problem-header').text) @step('I can specify special characters in the display name') @@ -332,8 +332,8 @@ def i_edit_blank_problem_for_annotation_response(_step): @step(u'I can see cheatsheet$') def verify_cheat_sheet_displaying(_step): - world.css_click("a.cheatsheet-toggle") - css_selector = 'article.simple-editor-cheatsheet' + world.css_click(".cheatsheet-toggle") + css_selector = '.simple-editor-cheatsheet' world.wait_for_visible(css_selector) diff --git a/cms/static/images/cms-editor_checkbox.png b/cms/static/images/cms-editor_checkbox.png new file mode 100644 index 0000000000000000000000000000000000000000..30e0591cbd2ca538f0bba4bb54e2b3b3c7fbdf7a GIT binary patch literal 905 zcmV;419tq0P)F)tHA~qXlBE-f9VsxDg?K^Z$~xo@+$B_&=g^HI5o}*x*Q*~ zaTj6Ab2)$9$UZe%Bj|E`N7!~b^(sMEh3zAdJKOH378P`LDh5}d3iVU_H3-TSTsr+7 zin%YkVjt@2Py{W_q|&My<+dR&vN6uR#_pMB4kC>g*U9sCaV^apX5*~M53p`JO>%;s zJ2-UHK6U2k_BM`zh%%#YEeTH|EGVM7WWOI?hth(U8AU2dh*~)PjT`UM9IjbIp)6@^ zI*xByCPET*+W#e1AW%^%<5Vle8wB-}s{PcYk^I8};GQ}OvV5X2j#`>6?n`jP!glOSlb)YVT-5VS#`)_6X(Pk5V3 ze>tD3kV)lLRbs2Lix7SxQRx9mIG?I8`|a(A9l`7U$j18uuX|wJ>%Y-8NWR947*;Dj zJh^!)IsMKGzGqNk`lX=n0MoC&ohqVg!}e1VRT+OC9{oa8W!QcyqAKI()1xy)RmSCf zFGN&r#fMv;P7zg`sMF)HYC(UtvT3&WAr-mD#vYam{@GZ8+%8q1pGraByYzQR@j+ku z`^ex_0Ph)fP1V+0V5%SG|AG>N*{{I!ewlu~OMhe5RE?1R>a(hmyq(3ajYaMZ9GK#F zNi5-jR6%S%wbPO>92ou21r~XB6#Z0%&`(te{Zxg}Pt{m_pr5Kx)afx!)yD5 + + + + + + + + + + + + + diff --git a/cms/static/images/cms-editor_dropdown.png b/cms/static/images/cms-editor_dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..fc204e7779151869add0f0f537e3a74312a0a131 GIT binary patch literal 909 zcmV;819JR{P)!Sh^wc51KHsIfx$s>_{mS6Q~Ok0}|QjMwhA^=B_eTW980YcfOB4 zk7QX@+*AENeeaTceU~JGsCakx&6p@e##WN1L?Jdtb7BDC|CoC3Ib&*kFr>zpsXI@| z)Y$m+<@=kcw0YliAq;L5MC()8++Lap|@=-6m{< zb6OO|apS8;^ZF@$A#+!p4iV~RxsA)XCK! zM7l5N^}Irvsnk=MQ39j_QUR%eRHOn@!7FBG2S{zkQ6Oz5`(K})Ahn)pQ51XPyzsou z3;vE~#l{z^bETnM=`r`4Rocl7%-fo1bJ;rx*HmhzXe&1*v`3ptsmk@KNYz)RI*K*f zrY2KUGPP~+J4!I!raDtK_0;PsHEY>!?x;_(sl{ zP`Y0WU9oGSNOdgMhESwB6l+T;QXPr4DO9;WmAPLtvqLJO2L6tvI!n`(OdT*|t!8M6 ztfwM%AhAOTz2N*AW9krM2NRl5PaR~8H8h5{s;82v7BhCp486?MoyTLOS`zC*sAT;5 z<>isM|IT zoS@urQn^00++TK8`CvT>H3H&(j&y+tkdLYtWIa{4i|9jfdQVb#$FcY)y`#I}hUT>& zWp>i_`qk~qZDCJT7ijnUtz@j+wQ@pCow5+e3*83JrLm;V9{Mt4w~4K@F1OKp0=_>r zLRg;~A*@f06r>^*kP1izqykcr3ZcUHr^cA2&A&bsLSZx~1_0ipT%QUd!;l(ZrczIh j59+BALOnH7{s}MuBA#lfWy7W&00000NkvXXu0mjf{h^`Y literal 0 HcmV?d00001 diff --git a/cms/static/images/cms-editor_dropdown.svg b/cms/static/images/cms-editor_dropdown.svg new file mode 100644 index 0000000000..1c454266af --- /dev/null +++ b/cms/static/images/cms-editor_dropdown.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/cms/static/images/cms-editor_explanation.png b/cms/static/images/cms-editor_explanation.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5d270c5035ee01d56415b1c5b651ad9bf7eb47 GIT binary patch literal 864 zcmV-m1E2hfP)1;a<(0`XpzZewivS)W$Rj4=QJ00000 z002V#&djga?=gL}+oRndt$MTs?Z@UR(6&Om_C{EaO*RnvZ1ov#{3q^_3P=T{0#X5~ zNDaj0U>gJ}U!m!Zg2wYEfn=VV_pW(EuA9OkpxUX_+;QD^6uweA0_8(&Gq_$RAoMgl zRZF>!1Z%6N zZT_En=vvdJAH|G?Q-M%DvBk(Lw{%GSuGJH1PKr=jv9>26ail|bp-h)tSI?~xs!P%a z`tGUO_6y<~0dm5vBed}-G{iy-21p4-Y#`o*g?5d~ixQcV(5|Eg3fvT>vQZy+mr1Hw z!Y)f4Kq`wS;S}Z`sBx-6h-*Np48b1KkjA`j1(pG&KHFvE9B;LTajkl4?qSG#4=gqF zkXotrc#U(vmzBfqa8BJ@zPx5#5RKH&6|ec&`E>H36o=jCm~+cx^?~NpE%(IgH?UL? zAPp##gW7`FKvGLWFGm$fDkV7KG(uY_c&uZ(Qb#EMs# zvEP_hM!wXRv?D`7&-E*`83eqaVw3_x)82dECf*x72pt<5QvspIxJ!n+7rW=@{Z5_0 zcg=S`dhD>=m(P?B8--2^5aHuRSG}v%xc0uWNe1n)GJr^{t_hK8vfzAx(PI-X*p~;kekk z9m=-MQA^5mYkOGtXo4D{IxJZ%MJXi4Cv$(D{aYQQ)V~Z?000nx9}(VDZkGMh?oUkf zaIF77b!iDMqi^pYi`4j7df@v)$c{0ma$q|`=01>;q4z+{d30<}n2ss7G_PlOpVbvk qDgXcg000000IVU_dg|% + + + + + + + + + + + + + + + + diff --git a/cms/static/images/cms-editor_heading.png b/cms/static/images/cms-editor_heading.png new file mode 100644 index 0000000000000000000000000000000000000000..11e7442ef8ecbffe600dbd70c576ed41f4181042 GIT binary patch literal 887 zcmV--1Bm>IP)(?O?Y8u>!XP?Z6VGgS`%<1MPr=+c?9x?n2F#XQUwv9eFnIj9SHvF{==W|nn z+3;MptYtXe2<96HGk$sBddl_8>^oCkG}~w(J#(!WFnp02l2k3Zt!iAKWQHhJL++(X zu1_*UmRgs)6G}i+=>fb*uZT=Us$_MM*0bNf1GtZLU*nj9R0+AMmQxmh~D)LOdKc9LQ?D$b={W4Uk3*l9|)K#5&%ZSq+vo|!UE8$x8 zwv4!J8xqdK7vFankWh|YNQ794@%+!)+zEy7?0s#S5R6%>bcpS|O!!mhrR84C4_pQ& zRU^b|B%!KuPk~5XD1_L?Wxz++)~T7mu5x-s*B+BA@@&M0X6{osEIR^QqUnyELDO%&qD3o3lPUI-mMe z2ntbdJ!!P7F#{r$Wx{IlAsKowwa%w@S;z=wh7Mk1 literal 0 HcmV?d00001 diff --git a/cms/static/images/cms-editor_heading.svg b/cms/static/images/cms-editor_heading.svg new file mode 100644 index 0000000000..1db34636ac --- /dev/null +++ b/cms/static/images/cms-editor_heading.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/cms/static/images/cms-editor_number.png b/cms/static/images/cms-editor_number.png new file mode 100644 index 0000000000000000000000000000000000000000..05cd08076d2f1759e67c9632eb17e3cddbee0da9 GIT binary patch literal 1404 zcmV-?1%vvDP);N}ws&V|z3bI{ z(ulu=9na_4nVs2<0T_N^0#i1Ef25As2<)j0=kX(>mEjqVnNq|2&n~sosGrN(=^rVQERjiIRueFUM356D7`mIs0X>r!p*n`>9@L zzmq+-f)Ok-84JmAvg0)`nLLQ^Z!>umqK7j&Qiqwu;;Rg1tAnVYI?rUA$%lf38sp{UMTjxWl4i2fFn(E=P*ayWNm_2y zy6IQDpSnaU93rQ*gxGLfaSfQ6DKtRjF8u;UPu1$DMjFbhl4{z3vEs~>c0g!Z5hZwZ8mh?Q$2bz_N8m1#J%pj$$<{#+YSE|eHIwMeY&Qpd*4*S4gY4O(JaEWUP) zyxQ_p+?hiQ;|G$(k>4%eQxrWOD!)HBX4hwUZMrCvF(XtkuI&HZh%gZf(J4^G8lh<; z3L9;)8N0?GwD&DhD^s9t?`rVQJt~-hgs>O%6CdFS! z8r^h4f(;R>4z!gZb-KSJRd*4;L?@#_UiAK6`CU_dzBjDj3-W!3imz|K-Y@V@k#%km zSsAGx?%7q$+z;senr{7fvgvN-9Qac*Xr^;kz z>ynW_9Q1?&D`Rz5b<6?Zs*|n#POw#^Dk-j#Iz$*S)fg`lNmf;Kixl$qlIW)2+%{A}TqHFHvn4{)q~aR*lKs?qC4TmSR4k#9=C}!=cjA_p zgy&OTB6X$V8AFStCc-oIbRgWJ?+U3)4WkAG<0k}DZX#JbHVzj^)gd$@(t$crT7#V~ znG>Yy5E>KeVQQO;%93X01F1TMZisI#lY5usZoUzW2GDOTH9RdZ@}Cmxlkcp*EB$;} znm!i<*P1umFB@MqfP+4JYM|+%Hg;5u1vyxcZqLwroc&^sdhDuM+XQxZ$*P6aUanJh z2#vulgvgt+9)#ypyCT&mLW?+ynSz_L-$|bmr8(et7v?)BuD}m8U;pR+tW$M7bm=fb z*krFB(|%09SVFgksxkSLnG)SB2|1~RpZ9BuRM!Zt#=)(K)d6A(#dea?7Ee8LIi~8w z&>>N^Xis9CWyx#rg*=sB^HRBn6U{J=`bZR7YKcw$ofgU3uRWM0Um_5;Py&i3OS$1r13`$6a_$ess!hF2!l z{iNtCs2uPbzyXtrTPI$CnUBINa3j3)7pR}8d!tfrnP^>*K(YB>LIwF>gDvy{ZtP + + + + + + + + diff --git a/cms/static/images/cms-editor_radio.png b/cms/static/images/cms-editor_radio.png new file mode 100644 index 0000000000000000000000000000000000000000..1657b72c617eb933c5ab58d2801e458ebac7cdd8 GIT binary patch literal 778 zcmV+l1NHogP)U&(M8j;4uU+@o^6}cRnxF(5vbov zx=goK5ZECIZPt9xb1-6ax=!ys)DLuj;l5b}!EPh2vx}Swrr1^zfqW4784K_Ai*47< z*HdcSz6S4Qw2I0^LjB^szPk|UQPs2~7EPl5iiBEtuYa|C&+lORh9HSh{rl$=U7ALy z^_fw7$;aS648@_|wj9}u;2sNQp+0)A%N7ftwKru~!7l|A*#$*~<(Uz>4fbX8j@MwH zdcl=Ys72H1;iAcn#6Pxu3Z`7=#0>M#LjiwsE8n&S0=6`R$wUL)o4D%9 zk^pqyQ#Tz)pF1T{MNI3dPu-PKQc)^Q_gd#J;yToRTatK6^G%>Y0YTEoS^8{ypeWS7 zq3~xI3PVMLq4r&^aYjjDsP)Ld6c`}XpFIPmCaiR%K6HHV9TDh7nK0pCDd;DvG(376 z6%WY){jxzvY936rHHC)ha;w^Nhq||h0)DdFnl;^}f1z{?G-hRcZ`=2X?>`<4PuY`E zbl|<~sf5KlT!WJj9k(rA?~_c!0~q@_OKv#MqB7K6V5CD?sC`4>IE%tikzlBmz%m}n zLghG1f}#HC87L!Fm{di{?KiueWcVC0(y1toAoe&*$(Yj5jiNRmx$aItEa)06v!Rx_V + + + + + + + + + + + + + diff --git a/cms/static/images/cms-editor_text.png b/cms/static/images/cms-editor_text.png new file mode 100644 index 0000000000000000000000000000000000000000..7c16befbfe7b6ecf43eceed1a332f0b8a1722356 GIT binary patch literal 1420 zcmV;71#|j|P)7qqyixIhr)V^)zbw;|l57_XY+nc@CpgZrzDxtx41lvX%p zly6;((Z09(Iu_qegxnemH4L28>f|McvZhjzZONE&XkEe}$h0M-zIm3!AWYbnFXCAJ za%jd-vm9&W1SjMoB2rco%^>AEnW6~1$OI_e4mSgBa z*K3kWsIDHHj@cS6K3+Wx74NciB+HzuqBKxE?$JR3!B?@MN$FEZvOIBJNHq;mb<-mU zmb$M(181KnBl3{AC;(E(|s?Lg4MZhKD0oRU6HBHUN4D+L#F2xmP ztaZIQO>$M&yQr^W=KS2cf+ z6qROS={YBR7N%38ylV(26s62W02m4VHjrw*O6{?_tSC(tl-^Z&^e8C()VVOr3Acj3 zFX)2QXGJeVm1S(x0##yaL|7zchVEt{!of!7koOj@o%tp;B~FA&ob{EjQWsKdSshD7 zi_l}Xo|U0yQWj*ckV<05T_TlYJ()u8+9qqQ;#TN4AA%y4QkTue@oklDjH`92Q5-s{ zO?fJH+sgProZSiaeY9`o$Xr2*D2aYq<2|jAk{Vd-HG@m{maCd>1Jxa>Zq8&2WhC^r z#5{+b(loW+Vvnxo!ofXua&oCwS67Y7LVCVlpbHk41^$_!x4)tTN zIO5xes1!rjq(%WG+!qe-#o-lJ#N!99Nev-abSXpX!P>8Ex#3;_R^r7)RWQ<65bh3; zN`3uts_7*nsT9MuS*q>09?RA5M1#;n@srvQE-iIQP^v^K!dCuNwsf6sj>m1`^&7hSI88LPxp$~I7)7@~8Y@6@UqOK%ic!S_A| z?HNwsO7p&y^Qeku3pa!U!<`7@lVARUx`@!7>{##=_+7cVE6r!L{f=s5JdK!Frkt^R z?TOT-VSylFSZy1{RBCQ&x<_|GoE%pL{xWvXQAKryl0Z! zOQF|ZEU)n-$;?$O)%9v^Cjxo>zyrDExEAjl5z+?Z$tnDt2*4+D(eSP*N1h6F03a2l z0w5Le0(^gJ$AIro1poj500000002S)zCX320I47q0I2{-1wbkQQa=vRPwg1cPwgoF a3NQfA4UK$Iz^zgM0000 + + + + + + + + + + + + diff --git a/cms/static/images/problem-editor-icons.png b/cms/static/images/problem-editor-icons.png deleted file mode 100644 index 2d958fb96ab3b9c45b09f6d82ecaea2a0ee6f001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2278 zcmX|B2{_bSA0D@^Zc4>1*A3;HZnjG3x|O6b*{_RilQ9NkHp^It#x9K+``F4dcB5oz ztYe)p8fj4OMF?3UgkmK7ce;Jgcb@-qp7*@J_dUPg`JMCpX=bMSq9P|nAP|VCp#jVS z0uh1%eB!5lU_MC4ibEhjY?_%^-m-DPFiXmuUA?mMim)EO2s9xmoC0^mrDbGKOitlF zNjMK*=Ht@PNLpr2esyhqQd-9R!UDpX&_DPlgOLZw&MyAm-kuZQ(;Df5!g)+hzwhGr z=vh1bJ@|%_kZO*?SJXAsHMZ2$HvzkzHL~$pd%!)Kr4u0~s{k1Jul~-;E%YUa0$g6r zj*d?Wi;T8Hy9GwYJb&4pl#%_k#9*4>v9lVEM{0t9$Ze}2y^qF>!{V>fyNev^$Upvg0>D`WJ1avC%lfu9S{P85}%CnAXz%%*i9U;1X&t5 zZGn_nLtDq@)^g=1*!K09zF9X;lp=C>$KT{rL-^2P7B(xVU+{dIw3J}E;{XmymTH68M-q`^pj_615 z^ao2jX9AERF>V0=FN?bmz-gH|V77O00}TN@krbGimI)Z(ZQ`_o)ZfGo7;txh`ELBa z1HfRA!|sC_FyHL}{67i+!OI^+!Nb00Vr2+-f?3+#vO-$fyXaWhf%j%$-CJ?a$(fx0eL1SX1XFmrV7uh36W zW>$u;A7b^w0Quf|SW=<-@eu9;&o_IuxtnR6+?Ew_uCsx3b2)RGQRuMh&(kOqA;d|j zw~P%aYetpS{T4NFXHeIu25EWU5OznM;TL&!dW*^PZtMSg`i}#1LLqvgRt+02+wwB1 zn%AG6NxLmA*?zKWSfWFY-$3J=<5Wz!M&-%ftn+S{JL{RhzB=;j&Z^kIbVJrq@i|cU+l!!dJ$%_P{UIX4yyttGmR3_P!O?;h^#DGA()vl%7! zU&oRsr?VDEEw{Ivx83_S{V**IafP(aD~A-2+&QbAE6#pf&0oc&qAA8#eN;`6_Ir%p zof-dyApWjOq(cbhlbx(n#R&xKNcP6o*=P!WJ@VbOdc=XuFlXn{ZBqb&zS7Py}p)W zbb-fKf|lZ&p^uFNISCXhn-JU^c_>ZD(OlDDSWjVt=_V$6z4u^&L6?)1LTrYTN5*YM zuC{JdiK_T}TTFl_=HBBNw#(U~RP$kKe3hn3m2{j;rf=@6`JJ~-jBEbHtOdT>TNZmJ z3!&0}azI*%Rv<~W)u_(zk2)XogaS|P+=>O#RNGV=c~8!>?vh~# z$y#5abvaY{cCGQ!MWuY7|??F6qyo(HL4Pl6p>@Fz@AmZO!quRBI|GCX(zWe0@)0%P(QVxOR~l_Xu8WS}q{bTi zN)b3eukYmi)bF3KGTULJwDg80U(uVJH_~R1U%}CtnLlvIb=F;-m!bw6y~?wE z864#Ci&W?tY<0L^gNrB(W%Tybt#LWb{I6!zcdawpd57FH3w4JNf5`t@FI-ASy~-6? z3l|)F$9Bio{3Gz)cWR^hQs^htlz=zDeEFI&LOD7bx@E8W?DKdJZ-_Tl;>96M?MAk# z^|9to>2FNA45~dUC9~m-YdQPl_efej7RG6nU(Q*r7%LoR9brir6--U#sK`nuF9r?l YrC(L5mC;Vn~GxehAgzjPX+KmY&$ diff --git a/cms/templates/widgets/problem-edit.html b/cms/templates/widgets/problem-edit.html index 80596193f9..da0be1724e 100644 --- a/cms/templates/widgets/problem-edit.html +++ b/cms/templates/widgets/problem-edit.html @@ -13,24 +13,59 @@ %if enable_markdown:

    -
  • -
  • -
  • -
  • -
  • -
  • -
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
@@ -43,12 +78,12 @@
-
${_("Heading 1")}
+
${_("Heading")}
- + ${_(
-
H1
+
H3
 =====
 
@@ -56,7 +91,7 @@
${_("Multiple Choice")}
- + ${_(
( ) red
@@ -67,7 +102,7 @@
             
${_("Checkboxes")}
- + ${_(
[x] earth
@@ -78,7 +113,7 @@
             
${_("Text Input")}
- + ${_(
= dog
@@ -89,7 +124,7 @@ or= mouse
${_("Numerical Input")}
- + ${_(
= 3.14 +- 2%
@@ -99,7 +134,7 @@ or= mouse
${_("Dropdown")}
- + ${_(
[[wrong, (right)]]
@@ -114,7 +149,7 @@ or= mouse
${_("Explanation")}
- + ${_(
[explanation] A short explanation of the answer. [explanation]
diff --git a/common/lib/xmodule/xmodule/css/editor/edit.scss b/common/lib/xmodule/xmodule/css/editor/edit.scss index c31c9656f7..d8cb28f966 100644 --- a/common/lib/xmodule/xmodule/css/editor/edit.scss +++ b/common/lib/xmodule/xmodule/css/editor/edit.scss @@ -13,14 +13,21 @@ padding: ($baseline/4); border-bottom-color: #a5aaaf; - a { - display: block; + button { + display: inline-block; @include float(left); - padding: 3px ($baseline/2) 7px; + padding: 3px ($baseline/2) 5px; margin-left: 7px; + border: 0; border-radius: 2px; + background: transparent; - &:hover, &:focus { + .icon { + height: 21px; + } + + &:hover, + &:focus { background: rgba(255, 255, 255, .5); } } @@ -60,4 +67,4 @@ } } } -} \ No newline at end of file +} diff --git a/common/lib/xmodule/xmodule/css/problem/edit.scss b/common/lib/xmodule/xmodule/css/problem/edit.scss index ac6f3f90ff..a3c6576e9a 100644 --- a/common/lib/xmodule/xmodule/css/problem/edit.scss +++ b/common/lib/xmodule/xmodule/css/problem/edit.scss @@ -7,6 +7,7 @@ margin-top: -4px; padding: 3px 9px; font-size: 12px; + color: $link-color; &.current { border: 1px solid $lightGrey !important; @@ -16,7 +17,8 @@ pointer-events: none; cursor: none; - &:hover, &:focus { + &:hover, + &:focus { box-shadow: 0 0 0 0 !important; background-color: $white; } @@ -79,11 +81,15 @@ } .col { - float: left; + display: block; &.sample { width: 60px; margin-right: 30px; + + .icon { + height: ($baseline * 1.5); + } } } @@ -110,40 +116,5 @@ width: 26px; height: 21px; vertical-align: middle; - background: url('#{$static-path}/images/problem-editor-icons.png') no-repeat; + color: $base-font-color; } - -.problem-editor-icon.heading1 { - width: 18px; - background-position: -265px 0; -} - -.problem-editor-icon.multiple-choice { - background-position: 0 0; -} - -.problem-editor-icon.checks { - background-position: -56px 0; -} - -.problem-editor-icon.string { - width: 28px; - background-position: -111px 0; -} - -.problem-editor-icon.number { - width: 24px; - background-position: -168px 0; -} - -.problem-editor-icon.dropdown { - width: 17px; - background-position: -220px 0; -} - -.problem-editor-icon.explanation { - width: 17px; - background-position: -307px 0; -} - - diff --git a/common/lib/xmodule/xmodule/js/fixtures/crowdsource_hinter.html b/common/lib/xmodule/xmodule/js/fixtures/crowdsource_hinter.html index 10511ecffc..d7d6d952d2 100644 --- a/common/lib/xmodule/xmodule/js/fixtures/crowdsource_hinter.html +++ b/common/lib/xmodule/xmodule/js/fixtures/crowdsource_hinter.html @@ -10,7 +10,7 @@

Numerical Input -

+
(1/1 point)
diff --git a/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee b/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee index 575b4c4246..a10ad3d4e4 100644 --- a/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee +++ b/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee @@ -258,9 +258,9 @@ describe 'MarkdownEditingDescriptor', -> """) it 'converts multiple choice shuffle to xml', -> data = MarkdownEditingDescriptor.markdownToXml("""A multiple choice problem presents radio buttons for student input. Students can only select a single option presented. Multiple Choice questions have been the subject of many areas of research due to the early invention and adoption of bubble sheets. - + One of the main elements that goes into a good multiple choice question is the existence of good distractors. That is, each of the alternate responses presented to the student should be the result of a plausible mistake that a student might make. - + What Apple device competed with the portable CD player? (!x@) The iPad (@) Napster @@ -268,16 +268,16 @@ describe 'MarkdownEditingDescriptor', -> ( ) The vegetable peeler ( ) Android (@) The Beatles - + [Explanation] The release of the iPod allowed consumers to carry their entire music library with them in a format that did not rely on fragile and energy-intensive spinning disks. [Explanation] """) expect(data).toEqual("""

A multiple choice problem presents radio buttons for student input. Students can only select a single option presented. Multiple Choice questions have been the subject of many areas of research due to the early invention and adoption of bubble sheets.

- +

One of the main elements that goes into a good multiple choice question is the existence of good distractors. That is, each of the alternate responses presented to the student should be the result of a plausible mistake that a student might make.

- +

What Apple device competed with the portable CD player?

@@ -289,11 +289,11 @@ describe 'MarkdownEditingDescriptor', -> The Beatles - +

Explanation

- +

The release of the iPod allowed consumers to carry their entire music library with them in a format that did not rely on fragile and energy-intensive spinning disks.

@@ -326,7 +326,7 @@ describe 'MarkdownEditingDescriptor', -> c - +

yatta

@@ -335,7 +335,7 @@ describe 'MarkdownEditingDescriptor', -> z - +

testa

@@ -344,13 +344,13 @@ describe 'MarkdownEditingDescriptor', -> iii - +

Explanation

- +

When the student is ready, the explanation appears.

- +
""") @@ -513,25 +513,25 @@ describe 'MarkdownEditingDescriptor', -> - +

Explanation

- +

Test Explanation.

- +
""") it 'handles multiple questions with labels', -> data = MarkdownEditingDescriptor.markdownToXml(""" France is a country in Europe. - + >>What is the capital of France?<< = Paris - + Germany is a country in Europe, too. - + >>What is the capital of Germany?<< ( ) Bonn ( ) Hamburg @@ -540,14 +540,14 @@ describe 'MarkdownEditingDescriptor', -> """) expect(data).toEqual("""

France is a country in Europe.

- +

What is the capital of France?

- +

Germany is a country in Europe, too.

- +

What is the capital of Germany?

@@ -557,8 +557,8 @@ describe 'MarkdownEditingDescriptor', -> Donut - - + +
""") it 'tests multiple questions with only one label', -> data = MarkdownEditingDescriptor.markdownToXml(""" @@ -577,14 +577,14 @@ describe 'MarkdownEditingDescriptor', -> """) expect(data).toEqual("""

France is a country in Europe.

- +

What is the capital of France?

- +

Germany is a country in Europe, too.

- +

What is the capital of Germany?

@@ -594,8 +594,8 @@ describe 'MarkdownEditingDescriptor', -> Donut - - + +
""") it 'tests malformed labels', -> data = MarkdownEditingDescriptor.markdownToXml(""" @@ -612,12 +612,12 @@ describe 'MarkdownEditingDescriptor', -> """) expect(data).toEqual("""

France is a country in Europe.

- +

>>What is the capital of France?<

- +

blahWhat is the capital of Germany?

@@ -627,8 +627,8 @@ describe 'MarkdownEditingDescriptor', -> Donut - - + +
""") it 'adds labels to formulae', -> data = MarkdownEditingDescriptor.markdownToXml(""" @@ -641,8 +641,8 @@ describe 'MarkdownEditingDescriptor', -> - - + + """) it 'escapes entities in labels', -> data = MarkdownEditingDescriptor.markdownToXml(""" @@ -654,8 +654,8 @@ describe 'MarkdownEditingDescriptor', -> - - + + """) # test oddities it 'converts headers and oddities to xml', -> @@ -710,7 +710,7 @@ describe 'MarkdownEditingDescriptor', -> """) expect(data).toEqual("""

Not a header

-

A header

+

A header

Multiple choice w/ parentheticals

diff --git a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee index e14a4d3d45..2e791633a4 100644 --- a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee +++ b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee @@ -23,7 +23,7 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor @setCurrentEditor(@markdown_editor) # Add listeners for toolbar buttons (only present for markdown editor) @element.on('click', '.xml-tab', @onShowXMLButton) - @element.on('click', '.format-buttons a', @onToolbarButton) + @element.on('click', '.format-buttons button', @onToolbarButton) @element.on('click', '.cheatsheet-toggle', @toggleCheatsheet) # Hide the XML text area $(@element.find('.xml-box')).hide() @@ -131,7 +131,7 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor ### save: -> @element.off('click', '.xml-tab', @changeEditor) - @element.off('click', '.format-buttons a', @onToolbarButton) + @element.off('click', '.format-buttons button', @onToolbarButton) @element.off('click', '.cheatsheet-toggle', @toggleCheatsheet) if @current_editor == @markdown_editor { @@ -202,7 +202,7 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor xml = xml.replace(/\r\n/g, '\n'); // replace headers - xml = xml.replace(/(^.*?$)(?=\n\=\=+$)/gm, '

$1

'); + xml = xml.replace(/(^.*?$)(?=\n\=\=+$)/gm, '

$1

'); xml = xml.replace(/\n^\=\=+$/gm, ''); // Pull out demand hints, || a hint || diff --git a/common/lib/xmodule/xmodule/js/src/video/01_initialize.js b/common/lib/xmodule/xmodule/js/src/video/01_initialize.js index 3808ec7c4c..bc9342c232 100644 --- a/common/lib/xmodule/xmodule/js/src/video/01_initialize.js +++ b/common/lib/xmodule/xmodule/js/src/video/01_initialize.js @@ -293,9 +293,9 @@ function (VideoPlayer, i18n, moment) { _hideWaitPlaceholder(state); state.el .find('.video-player div') - .addClass('hidden') - .end() - .find('.video-player h3') + .addClass('hidden'); + state.el + .find('.video-player .video-error') .removeClass('hidden'); return false; @@ -497,7 +497,7 @@ function (VideoPlayer, i18n, moment) { this.el.find('.video-player div') .removeClass('hidden'); - this.el.find('.video-player h3') + this.el.find('.video-player .video-error') .addClass('hidden'); // If in reality the timeout was to short, try to @@ -510,7 +510,7 @@ function (VideoPlayer, i18n, moment) { // In-browser HTML5 player does not support quality // control. - this.el.find('a.quality_control').hide(); + this.el.find('.quality_control').hide(); _renderElements(this); } } diff --git a/common/lib/xmodule/xmodule/js/src/video/02_html5_video.js b/common/lib/xmodule/xmodule/js/src/video/02_html5_video.js index dca85c9d85..6862daf26a 100644 --- a/common/lib/xmodule/xmodule/js/src/video/02_html5_video.js +++ b/common/lib/xmodule/xmodule/js/src/video/02_html5_video.js @@ -99,7 +99,7 @@ function () { .find('.video-player div') .addClass('hidden') .end() - .find('.video-player h3') + .find('.video-player .video-error') .removeClass('hidden') .end() .addClass('is-initialized') @@ -125,7 +125,7 @@ function () { this.el .find('.video-player div').removeClass('hidden') .end() - .find('.video-player h3').addClass('hidden') + .find('.video-player .video-error').addClass('hidden') .end().removeClass('is-initialized') .find('.spinner').attr({'aria-hidden': 'false'}); this.videoEl.remove(); diff --git a/common/test/acceptance/pages/lms/video/video.py b/common/test/acceptance/pages/lms/video/video.py index cfd84899a2..6e421b018c 100644 --- a/common/test/acceptance/pages/lms/video/video.py +++ b/common/test/acceptance/pages/lms/video/video.py @@ -14,7 +14,7 @@ import logging log = logging.getLogger('VideoPage') VIDEO_BUTTONS = { - 'transcript': '.lang', + 'transcript': '.language-menu', 'transcript_button': '.toggle-transcript', 'cc_button': '.toggle-captions', 'volume': '.volume', @@ -35,14 +35,14 @@ CSS_CLASS_NAMES = { 'captions_text': '.subtitles li', 'captions_text_getter': '.subtitles li[role="link"][data-index="1"]', 'closed_captions': '.closed-captions', - 'error_message': '.video .video-player h3', + 'error_message': '.video .video-player .video-error', 'video_container': '.video', 'video_sources': '.video-player video source', 'video_spinner': '.video-wrapper .spinner', 'video_xmodule': '.xmodule_VideoModule', 'video_init': '.is-initialized', 'video_time': '.vidtime', - 'video_display_name': '.vert h2', + 'video_display_name': '.vert h3', 'captions_lang_list': '.langs-list li', 'video_speed': '.speeds .value', 'poster': '.poster', @@ -631,7 +631,6 @@ class VideoPage(PageObject): language_selector = VIDEO_MENUS["language"] + ' li[data-lang-code="{code}"]'.format(code=code) language_selector = self.get_element_selector(language_selector) - self.wait_for_element_visibility(language_selector, 'language menu is visible') self.q(css=language_selector).first.click() diff --git a/common/test/acceptance/tests/lms/test_library.py b/common/test/acceptance/tests/lms/test_library.py index 7c371cda63..7609cbcd3e 100644 --- a/common/test/acceptance/tests/lms/test_library.py +++ b/common/test/acceptance/tests/lms/test_library.py @@ -265,7 +265,7 @@ class StudioLibraryContainerCapaFilterTest(LibraryContentTestBase, TestWithSearc @property def _problem_headers(self): """ Expected XBLock headers according to populate_library_fixture """ - return frozenset(child.display_name.upper() for child in self.library_fixture.children) + return frozenset(child.display_name for child in self.library_fixture.children) def _set_library_content_settings(self, count=1, capa_type="Any Type"): """ @@ -304,7 +304,7 @@ class StudioLibraryContainerCapaFilterTest(LibraryContentTestBase, TestWithSearc self.assertEqual(len(children_headers), 1) self.assertLessEqual( children_headers, - set([header.upper() for header in ["Problem Choice Group 1", "Problem Choice Group 2"]]) + set(["Problem Choice Group 1", "Problem Choice Group 2"]) ) # Choice group test @@ -312,7 +312,7 @@ class StudioLibraryContainerCapaFilterTest(LibraryContentTestBase, TestWithSearc self.assertEqual(len(children_headers), 2) self.assertEqual( children_headers, - set([header.upper() for header in ["Problem Select 1", "Problem Select 2"]]) + set(["Problem Select 1", "Problem Select 2"]) ) # Missing problem type test diff --git a/common/test/acceptance/tests/lms/test_lms.py b/common/test/acceptance/tests/lms/test_lms.py index 1c93f57865..05c4b99776 100644 --- a/common/test/acceptance/tests/lms/test_lms.py +++ b/common/test/acceptance/tests/lms/test_lms.py @@ -1013,7 +1013,7 @@ class ProblemExecutionTest(UniqueCourseTest): self.course_nav.go_to_section('Test Section', 'Test Subsection') problem_page = ProblemPage(self.browser) - self.assertEqual(problem_page.problem_name, 'PYTHON PROBLEM') + self.assertEqual(problem_page.problem_name.upper(), 'PYTHON PROBLEM') # Does the page have computation results? self.assertIn("What is the sum of 17 and 3?", problem_page.problem_text) diff --git a/common/test/acceptance/tests/lms/test_lms_courseware.py b/common/test/acceptance/tests/lms/test_lms_courseware.py index 4c9d0d8a02..c748b17b99 100644 --- a/common/test/acceptance/tests/lms/test_lms_courseware.py +++ b/common/test/acceptance/tests/lms/test_lms_courseware.py @@ -66,7 +66,7 @@ class CoursewareTest(UniqueCourseTest): """ self.courseware_page.visit() self.problem_page = ProblemPage(self.browser) - self.assertEqual(self.problem_page.problem_name, 'TEST PROBLEM 1') + self.assertEqual(self.problem_page.problem_name, 'Test Problem 1') def _create_breadcrumb(self, index): """ Create breadcrumb """ @@ -103,8 +103,8 @@ class CoursewareTest(UniqueCourseTest): # Visit courseware as a student. self.courseware_page.visit() - # Problem name should be "TEST PROBLEM 2". - self.assertEqual(self.problem_page.problem_name, 'TEST PROBLEM 2') + # Problem name should be "Test Problem 2". + self.assertEqual(self.problem_page.problem_name, 'Test Problem 2') def test_course_tree_breadcrumb(self): """ diff --git a/common/test/acceptance/tests/lms/test_lms_matlab_problem.py b/common/test/acceptance/tests/lms/test_lms_matlab_problem.py index 43847c7f7e..cd698bb178 100644 --- a/common/test/acceptance/tests/lms/test_lms_matlab_problem.py +++ b/common/test/acceptance/tests/lms/test_lms_matlab_problem.py @@ -56,7 +56,7 @@ class MatlabProblemTest(ProblemsTest): """ self.courseware_page.visit() matlab_problem_page = MatlabProblemPage(self.browser) - self.assertEqual(matlab_problem_page.problem_name, 'TEST MATLAB PROBLEM') + self.assertEqual(matlab_problem_page.problem_name, 'Test Matlab Problem') return matlab_problem_page def test_run_code(self): diff --git a/lms/djangoapps/courseware/features/lti.feature b/lms/djangoapps/courseware/features/lti.feature index 3ac9564f7a..a10b706ce2 100644 --- a/lms/djangoapps/courseware/features/lti.feature +++ b/lms/djangoapps/courseware/features/lti.feature @@ -128,7 +128,7 @@ Feature: LMS.LTI component | open_in_a_new_page | hide_launch | | False | True | Then in the LTI component I do not see a launch button - Then I see LTI component module title with text "LTI (EXTERNAL RESOURCE)" + Then I see LTI component module title with text "LTI (External resource)" #12 Scenario: LTI component that set to hide_launch and not open_in_a_new_page shows no iframe @@ -137,7 +137,7 @@ Feature: LMS.LTI component | open_in_a_new_page | hide_launch | | True | True | Then in the LTI component I do not see an provider iframe - Then I see LTI component module title with text "LTI (EXTERNAL RESOURCE)" + Then I see LTI component module title with text "LTI (External resource)" #13 Scenario: LTI component button text is correctly displayed diff --git a/lms/djangoapps/courseware/features/navigation.py b/lms/djangoapps/courseware/features/navigation.py index 51b8cc17e5..4520b410b0 100644 --- a/lms/djangoapps/courseware/features/navigation.py +++ b/lms/djangoapps/courseware/features/navigation.py @@ -114,17 +114,17 @@ def when_i_navigate_to_an_item_in_a_sequence(step): @step(u'I see the content of the section') def then_i_see_the_content_of_the_section(step): - wait_for_problem('PROBLEM 2') + wait_for_problem('Problem 2') @step(u'I see the content of the subsection') def then_i_see_the_content_of_the_subsection(step): - wait_for_problem('PROBLEM 4') + wait_for_problem('Problem 4') @step(u'I see the content of the sequence item') def then_i_see_the_content_of_the_sequence_item(step): - wait_for_problem('PROBLEM 6') + wait_for_problem('Problem 6') @step(u'I return to the courseware') @@ -183,6 +183,6 @@ def wait_for_problem(display_name): world.wait_for_ajax_complete() wait_func = lambda _: world.css_has_text( - 'h3.problem-header', display_name, strip=True + '.problem-header', display_name, strip=True ) world.wait_for(wait_func) diff --git a/lms/templates/video.html b/lms/templates/video.html index 0034a0561d..c5fb463102 100644 --- a/lms/templates/video.html +++ b/lms/templates/video.html @@ -23,7 +23,7 @@
- +