Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
4c8e45c7
Commit
4c8e45c7
authored
Jul 23, 2015
by
Amir Qayyum Khan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed accessibility related issues on schedule tab inside CCX coach dashboard
parent
f785ae46
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
239 additions
and
86 deletions
+239
-86
lms/static/js/ccx/schedule.js
+84
-28
lms/static/js/spec/ccx/schedule_spec.js
+1
-1
lms/static/sass/course/ccx_coach/_dashboard.scss
+19
-0
lms/templates/ccx/coach_dashboard.html
+2
-1
lms/templates/ccx/schedule.html
+63
-34
lms/templates/ccx/schedule.underscore
+70
-22
No files found.
lms/static/js/ccx/schedule.js
View file @
4c8e45c7
...
...
@@ -86,9 +86,9 @@ var edx = edx || {};
}
else
{
self
.
vertical_select
.
html
(
''
).
prop
(
'disabled'
,
true
);
}
}
});
this
.
vertical_select
.
on
(
'change'
,
function
()
{
var
vertical_location
=
self
.
vertical_select
.
val
();
if
(
vertical_location
!==
'all'
)
{
...
...
@@ -115,9 +115,9 @@ var edx = edx || {};
due
=
self
.
get_datetime
(
'due'
);
units
.
map
(
self
.
show
);
var
unit
=
units
[
units
.
length
-
1
];
self
.
schedule_apply
([
unit
],
self
.
show
);
if
(
unit
!==
undefined
&&
start
)
{
unit
.
start
=
start
;
}
if
(
unit
!==
undefined
&&
due
)
{
unit
.
due
=
due
;
}
self
.
schedule_apply
([
unit
],
self
.
show
);
self
.
schedule_collection
.
set
(
self
.
schedule
);
self
.
dirty
=
true
;
self
.
render
();
...
...
@@ -139,22 +139,27 @@ var edx = edx || {};
return
!
node
.
hidden
;});
this
.
$el
.
html
(
schedule_template
({
chapters
:
this
.
showing
}));
$
(
'table.ccx-schedule .sequential,.vertical'
).
hide
();
$
(
'table.ccx-schedule .toggle-collapse'
).
on
(
'click'
,
this
.
toggle_collapse
);
$
(
'table.ccx-schedule .
unit .
toggle-collapse'
).
on
(
'click'
,
this
.
toggle_collapse
);
//
// Hidden hover fields for empty date fields
$
(
'table.ccx-schedule .date a'
).
each
(
function
()
{
if
(
!
$
(
this
).
text
())
{
$
(
this
).
text
(
'Set date'
).
addClass
(
'empty'
);
$
(
'table.ccx-schedule .date button'
).
each
(
function
()
{
if
(
$
(
this
).
text
().
trim
()
===
gettext
(
"Click to change"
))
{
$
(
this
).
html
(
'Set date <span class="sr"> '
+
gettext
(
"Click to change"
)
+
'</span>'
);
}
});
// Handle date edit clicks
$
(
'table.ccx-schedule .date
a
'
).
attr
(
'href'
,
'#enter-date-modal'
)
$
(
'table.ccx-schedule .date
button
'
).
attr
(
'href'
,
'#enter-date-modal'
)
.
leanModal
({
closeButton
:
'.close-modal'
});
$
(
'table.ccx-schedule .due-date a'
).
on
(
'click'
,
this
.
enterNewDate
(
'due'
));
$
(
'table.ccx-schedule .start-date a'
).
on
(
'click'
,
this
.
enterNewDate
(
'start'
));
$
(
'table.ccx-schedule .due-date button'
).
on
(
'click'
,
this
.
enterNewDate
(
'due'
));
$
(
'table.ccx-schedule .start-date button'
).
on
(
'click'
,
this
.
enterNewDate
(
'start'
));
// click handler for expand all
$
(
'#ccx_expand_all_btn'
).
on
(
'click'
,
self
.
expandAll
);
// click handler for collapse all
$
(
'#ccx_collapse_all_btn'
).
on
(
'click'
,
self
.
collapseAll
);
// Click handler for remove all
$
(
'table.ccx-schedule
a
#remove-all'
).
on
(
'click'
,
function
(
event
)
{
$
(
'table.ccx-schedule
button
#remove-all'
).
on
(
'click'
,
function
(
event
)
{
event
.
preventDefault
();
self
.
schedule_apply
(
self
.
schedule
,
self
.
hide
);
self
.
dirty
=
true
;
...
...
@@ -162,14 +167,14 @@ var edx = edx || {};
self
.
render
();
});
// Remove unit handler
$
(
'table.ccx-schedule
a
.remove-unit'
).
on
(
'click'
,
function
()
{
$
(
'table.ccx-schedule
button
.remove-unit'
).
on
(
'click'
,
function
()
{
var
row
=
$
(
this
).
closest
(
'tr'
),
path
=
row
.
data
(
'location'
).
split
(
' '
),
unit
=
self
.
find_unit
(
self
.
schedule
,
path
[
0
],
path
[
1
],
path
[
2
]);
self
.
schedule_apply
([
unit
],
self
.
hide
);
self
.
schedule_collection
.
set
(
self
.
schedule
);
self
.
dirty
=
true
;
self
.
render
();
self
.
render
();
});
...
...
@@ -191,7 +196,13 @@ var edx = edx || {};
}
// Show or hide save button
if
(
this
.
dirty
)
{
$
(
'#dirty-schedule'
).
show
();}
if
(
this
.
dirty
)
{
$
(
'#dirty-schedule'
).
show
();
$
(
'html, body'
).
animate
(
{
scrollTop
:
$
(
'#dirty-schedule'
).
offset
().
top
},
'slow'
,
function
()
{
$
(
'#dirty-schedule'
).
focus
();}
);
}
else
{
$
(
'#dirty-schedule'
).
hide
();}
$
(
'#ajax-error'
).
hide
();
...
...
@@ -202,8 +213,8 @@ var edx = edx || {};
save
:
function
()
{
self
.
schedule_collection
.
set
(
self
.
schedule
);
var
button
=
$
(
'#dirty-schedule #save-changes'
);
button
.
prop
(
'disabled'
,
true
).
text
(
gettext
(
"Saving"
)
+
'...'
);
button
.
prop
(
'disabled'
,
true
).
text
(
gettext
(
"Saving"
));
$
.
ajax
({
url
:
save_url
,
type
:
'POST'
,
...
...
@@ -213,14 +224,14 @@ var edx = edx || {};
self
.
dirty
=
false
;
self
.
render
();
button
.
prop
(
'disabled'
,
false
).
text
(
gettext
(
"Save changes"
));
// Update textarea with grading policy JSON, since grading policy
// may have changed.
// may have changed.
$
(
'#grading-policy'
).
text
(
data
.
grading_policy
);
},
error
:
function
(
jqXHR
)
{
console
.
log
(
jqXHR
.
responseText
);
$
(
'#ajax-error'
).
show
();
$
(
'#ajax-error'
).
show
()
.
focus
()
;
$
(
'#dirty-schedule'
).
hide
();
$
(
'form#add-unit select,input,button'
).
prop
(
'disabled'
,
true
);
button
.
prop
(
'disabled'
,
false
).
text
(
gettext
(
"Save changes"
));
...
...
@@ -290,21 +301,49 @@ var edx = edx || {};
var
children
=
self
.
get_children
(
row
);
if
(
row
.
is
(
'.expanded'
))
{
$
(
this
).
removeClass
(
'fa-caret-down'
).
addClass
(
'fa-caret-right'
);
$
(
this
).
attr
(
'aria-expanded'
,
'false'
);
$
(
this
).
find
(
".fa-caret-down"
).
removeClass
(
'fa-caret-down'
).
addClass
(
'fa-caret-right'
);
row
.
removeClass
(
'expanded'
).
addClass
(
'collapsed'
);
children
.
hide
();
children
.
hide
();
}
else
{
$
(
this
).
removeClass
(
'fa-caret-right'
).
addClass
(
'fa-caret-down'
);
$
(
this
).
attr
(
'aria-expanded'
,
'true'
);
$
(
this
).
find
(
".fa-caret-right"
).
removeClass
(
'fa-caret-right'
).
addClass
(
'fa-caret-down'
);
row
.
removeClass
(
'collapsed'
).
addClass
(
'expanded'
);
children
.
filter
(
'.collapsed'
).
each
(
function
()
{
children
=
children
.
not
(
self
.
get_children
(
this
));
});
children
.
show
();
children
.
show
();
}
},
expandAll
:
function
()
{
$
(
'table.ccx-schedule > tbody > tr'
).
each
(
function
()
{
var
row
=
$
(
this
);
if
(
!
row
.
is
(
'.expanded'
))
{
var
children
=
self
.
get_children
(
row
);
row
.
find
(
".ccx_sr_alert"
).
attr
(
"aria-expanded"
,
"true"
);
row
.
find
(
".fa-caret-right"
).
removeClass
(
'fa-caret-right'
).
addClass
(
'fa-caret-down'
);
row
.
removeClass
(
'collapsed'
).
addClass
(
'expanded'
);
children
.
filter
(
'.collapsed'
).
each
(
function
()
{
children
=
children
.
not
(
self
.
get_children
(
this
));
});
children
.
show
();
}
});
},
collapseAll
:
function
()
{
$
(
'table.ccx-schedule > tbody > tr'
).
each
(
function
()
{
var
row
=
$
(
this
);
if
(
row
.
is
(
'.expanded'
))
{
$
(
row
).
find
(
'.ccx_sr_alert'
).
attr
(
'aria-expanded'
,
'false'
);
$
(
row
).
find
(
'.fa-caret-down'
).
removeClass
(
'fa-caret-down'
).
addClass
(
'fa-caret-right'
);
row
.
removeClass
(
'expanded'
).
addClass
(
'collapsed'
);
$
(
'table.ccx-schedule .sequential,.vertical'
).
hide
();
}
});
},
enterNewDate
:
function
(
what
)
{
return
function
()
{
var
row
=
$
(
this
).
closest
(
'tr'
);
...
...
@@ -312,10 +351,27 @@ var edx = edx || {};
.
data
(
'what'
,
what
)
.
data
(
'location'
,
row
.
data
(
'location'
));
modal
.
find
(
'h2'
).
text
(
what
===
'due'
?
gettext
(
"Enter Due Date"
)
:
gettext
(
"Enter Start Date"
));
modal
.
find
(
'label'
).
text
(
row
.
find
(
'td:first'
).
text
());
what
===
'due'
?
gettext
(
"Enter Due Date and Time"
)
:
gettext
(
"Enter Start Date and Time"
));
modal
.
focus
();
$
(
document
).
on
(
'focusin'
,
function
(
event
)
{
try
{
if
(
!
_
.
isUndefined
(
event
.
target
.
closest
(
'.modal'
).
id
)
&&
event
.
target
.
closest
(
'.modal'
).
id
!==
'enter-date-modal'
&&
event
.
target
.
id
!==
'enter-date-modal'
)
{
event
.
preventDefault
();
modal
.
find
(
'.close-modal'
).
focus
();
}
}
catch
(
err
)
{
event
.
preventDefault
();
modal
.
find
(
'.close-modal'
).
focus
();
}
});
modal
.
find
(
'.close-modal'
).
click
(
function
()
{
$
(
document
).
off
(
'focusin'
);
});
var
path
=
row
.
data
(
'location'
).
split
(
' '
),
unit
=
self
.
find_unit
(
self
.
schedule
,
path
[
0
],
path
[
1
],
path
[
2
]),
parts
=
unit
[
what
]
?
unit
[
what
].
split
(
' '
)
:
[
''
,
''
],
...
...
lms/static/js/spec/ccx/schedule_spec.js
View file @
4c8e45c7
...
...
@@ -164,7 +164,7 @@ define(['common/js/spec_helpers/ajax_helpers', 'js/ccx/schedule'],
view
.
save
();
expect
(
requests
.
length
).
toEqual
(
1
)
AjaxHelpers
.
expectJsonRequest
(
requests
,
'POST'
,
'save_ccx'
,
view
.
schedule
);
expect
(
$
(
'#dirty-schedule #save-changes'
).
text
()).
toEqual
(
"Saving
...
"
);
expect
(
$
(
'#dirty-schedule #save-changes'
).
text
()).
toEqual
(
"Saving"
);
AjaxHelpers
.
respondWithJson
(
requests
,
{
data
:
view
.
schedule
});
...
...
lms/static/sass/course/ccx_coach/_dashboard.scss
View file @
4c8e45c7
...
...
@@ -55,3 +55,22 @@ form.ccx-form {
margin
:
5px
0
5px
0
;
}
}
button
.ccx-button-link
{
background
:
none
;
border
:
none
;
padding
:
0
;
color
:
#069
;
cursor
:
pointer
;
&
:after
{
content
:
"\00a0 "
;
}
&
:active
{
background
:
none
;
border
:
none
;
padding
:
0
;
}
&
:hover
{
color
:
brown
;
}
}
lms/templates/ccx/coach_dashboard.html
View file @
4c8e45c7
...
...
@@ -38,7 +38,8 @@ from django.core.urlresolvers import reverse
<section>
<form
action=
"${create_ccx_url}"
method=
"POST"
>
<input
type=
"hidden"
name=
"csrfmiddlewaretoken"
value=
"${csrf_token}"
/>
<input
name=
"name"
placeholder=
"Name your CCX"
/><br/>
<label
class=
"sr"
for=
"ccx_name"
>
${_('Name your CCX')}
</label>
<input
name=
"name"
id=
"ccx_name"
placeholder=
"${_('Name your CCX')}"
/><br/>
<button
id=
"create-ccx"
>
Coach a new Custom Course for EdX
</button>
</form>
</section>
...
...
lms/templates/ccx/schedule.html
View file @
4c8e45c7
...
...
@@ -29,22 +29,24 @@
<div
id=
"new-ccx-schedule"
></div>
</div>
<section
id=
"enter-date-modal"
class=
"modal"
aria-hidden=
"true"
>
<div
class=
"inner-wrapper"
role=
"dialog"
>
<section
id=
"enter-date-modal"
class=
"modal"
tabindex=
"-1"
role=
"dialog"
aria-labelledby=
"ccx_schedule_set_date_heading"
>
<div
class=
"inner-wrapper"
>
<button
class=
"close-modal"
>
<i
class=
"icon fa fa-remove"
></i>
<span
class=
"sr"
>
${_("Close")}
</span>
<i
class=
"icon fa fa-remove"
aria-hidden=
"true"
></i>
<span
class=
"sr"
>
${_("Close")}
</span>
</button>
<header>
<h2></h2>
<h2
id=
"ccx_schedule_set_date_heading"
></h2>
</header>
<form
role=
"form"
>
<form>
<div
class=
"field datepair"
>
<label></label>
<input
placeholder=
"Date"
class=
"date"
type=
"text"
name=
"date"
/
size=
"11"
>
<input
placeholder=
"Time"
class=
"time"
type=
"text"
name=
"time"
/
size=
"6"
>
## Translators: This explains to people using a screen reader how to interpret the format of YYYY-MM-DD
<label
class=
"sr"
for=
"ccx_dialog_date"
>
${_('Date format four digit year dash two digit month dash two digit day')}
</label>
<input
placeholder=
"Date"
class=
"date"
type=
"text"
name=
"date"
id=
"ccx_dialog_date"
size=
"11"
/>
## Translators: This explains to people using a screen reader how to interpret the format of HH:MM
<label
class=
"sr"
for=
"ccx_dialog_time"
>
${_('Time format two digit hours colon two digit minutes')}
</label>
<input
placeholder=
"Time"
class=
"time"
type=
"text"
name=
"time"
id=
"ccx_dialog_time"
size=
"6"
/>
</div>
<div
class=
"field"
>
<button
type=
"submit"
class=
"btn btn-primary"
>
${_('Set date')}
</button>
...
...
@@ -54,44 +56,62 @@
</section>
<div
class=
"ccx-schedule-sidebar"
>
<div
class=
"ccx-sidebar-panel"
id=
"dirty-schedule"
>
<h2>
${_('Save changes')}
</h2>
<form
role=
"form"
>
<p>
${_("You have unsaved changes.")}
</p>
<div
class=
"ccx-sidebar-panel"
id=
"dirty-schedule"
tabindex=
"-1"
role=
"region"
aria-labelledby=
"ccx_schedule_save_changes_heading"
>
<h2
id=
"ccx_schedule_save_changes_heading"
>
${_('Save changes')}
</h2>
<form>
<p
id=
"message_save"
>
${_("You have unsaved changes.")}
</p>
<div
class=
"field"
>
<br/>
<button
id=
"save-changes"
>
${_("Save changes")}
</button>
<button
id=
"save-changes"
aria-describedby=
"message_save"
>
${_("Save changes")}
</button>
</div>
</form>
</div>
<div
class=
"ccx-sidebar-panel"
id=
"ajax-error"
>
<div
class=
"ccx-sidebar-panel"
id=
"ajax-error"
tabindex=
"-1"
role=
"region"
aria-labelledby=
"ccx_schedule_error_message"
>
<h2>
${_('Error')}
</h2>
<p>
${_("There was an error saving changes.")}
</p>
<p
id=
"ccx_schedule_error_message"
>
${_("There was an error saving changes.")}
</p>
</div>
<div
class=
"ccx-sidebar-panel"
>
<h2>
${_('Schedule a Unit')}
</h2>
<div
class=
"ccx-sidebar-panel"
aria-labelledby=
"ccx_schedule_unit"
id=
"ccx_schedule_unit_panel"
role=
"region"
>
<h2
id=
"ccx_schedule_unit"
>
${_('Schedule a Unit')}
</h2>
<form
role=
"form"
id=
"add-unit"
name=
"add-unit"
class=
"ccx-form"
>
<div
class=
"field"
>
<
b>
${_('Section')}
</b><br/
>
<select
name=
"chapter"
></select>
<
label
for=
"ccx_chapter"
><b>
${_('Section')}
</b></label
>
<select
name=
"chapter"
id=
"ccx_chapter"
></select>
</div>
<div
class=
"field"
>
<
b>
${_('Subsection')}
</b><br/
>
<select
name=
"sequential"
></select>
<
label
for=
"ccx_sequential"
><b>
${_('Subsection')}
</b></label
>
<select
name=
"sequential"
id=
"ccx_sequential"
></select>
</div>
<div
class=
"field"
>
<
b>
${_('Unit')}
</b><br/
>
<select
name=
"vertical"
></select>
<
label
for=
"ccx_vertical"
><b>
${_('Unit')}
</b></label
>
<select
name=
"vertical"
id=
"ccx_vertical"
></select>
</div>
<div
class=
"field datepair"
>
<b>
${_('Start Date')}
</b><br/>
<input
placeholder=
"Date"
type=
"date"
class=
"date"
name=
"start_date"
/>
<input
placeholder=
"time"
type=
"time"
class=
"time"
name=
"start_time"
/>
<label
for=
"ccx_start_date"
>
<b>
${_('Start Date')}
</b>
<span
class=
"sr"
>
## Translators: This explains to people using a screen reader how to interpret the format of YYYY-MM-DD
${_('format four digit year dash two digit month dash two digit day')}
</span>
</label>
<input
placeholder=
"yyyy-mm-dd"
type=
"text"
class=
"date"
name=
"start_date"
id=
"ccx_start_date"
/>
## Translators: This explains to people using a screen reader how to interpret the format of HH:MM
<label
for=
"ccx_start_time"
class=
"sr"
>
${_('Start time format two digit hours colon two digit minutes')}
</label>
<input
placeholder=
"time"
type=
"text"
class=
"time"
name=
"start_time"
id=
"ccx_start_time"
/>
</div>
<div
class=
"field datepair"
>
<b>
${_('Due Date')}
</b>
${_('(Optional)')}
<br/>
<input
placeholder=
"Date"
type=
"date"
class=
"date"
name=
"due_date"
/>
<input
placeholder=
"time"
type=
"time"
class=
"time"
name=
"due_time"
/>
<label
for=
"ccx_due_date"
>
<b>
${_('Due Date')}
</b>
${_('(Optional)')}
<span
class=
"sr"
>
## Translators: This explains to people using a screen reader how to interpret the format of YYYY-MM-DD
${_('format four digit year dash two digit month dash two digit day')}
</span>
</label>
<input
placeholder=
"yyyy-mm-dd"
type=
"text"
class=
"date"
name=
"due_date"
id=
"ccx_due_date"
/>
## Translators: This explains to people using a screen reader how to interpret the format of HH:MM
<label
for=
"ccx_due_time"
class=
"sr"
>
${_('Due Time format two digit hours colon two digit minutes')}
</label>
<input
placeholder=
"time"
type=
"text"
class=
"time"
name=
"due_time"
id=
"ccx_due_time"
/>
</div>
<div
class=
"field"
>
<br/>
...
...
@@ -102,7 +122,7 @@
<button
id=
"add-all"
>
${_('Add All Units')}
</button>
</div>
</form>
<div
id=
"all-units-added"
>
<div
id=
"all-units-added"
tabindex=
"-1"
role=
"region"
>
${_("All units have been added.")}
</div>
</div>
...
...
@@ -118,11 +138,20 @@ $(function() {
//ccx_schedule.render();
$
(
'.datepair .time'
).
timepicker
({
'showDuration'
:
true
,
'timeFormat'
:
'G:i'
'timeFormat'
:
'G:i'
,
'autoclose'
:
true
});
$
(
'.datepair .date'
).
datepicker
({
'dateFormat'
:
'yy-mm-dd'
,
'autoclose'
:
true
});
$
(
'.datepair .date'
).
change
(
function
()
{
var
date
=
$
(
this
).
datepicker
(
"getDate"
);
if
(
date
)
{
$
(
this
).
val
(
date
.
getFullYear
()
+
"-"
+
(
'0'
+
(
date
.
getMonth
()
+
1
)).
slice
(
-
2
)
+
"-"
+
(
'0'
+
date
.
getDate
()).
slice
(
-
2
));
}
});
});
</script>
lms/templates/ccx/schedule.underscore
View file @
4c8e45c7
<div align="right">
<button id="ccx_expand_all_btn" class="ccx-button-link">
<i class="fa fa-expand" aria-hidden="true"></i> <%- gettext('Expand All') %>
</button>
<button id="ccx_collapse_all_btn" class="ccx-button-link">
<i class="fa fa-compress" aria-hidden="true"></i> <%- gettext('Collapse All') %>
</button>
</div>
<br/>
<table class="ccx-schedule">
<thead>
<tr>
<th><%- gettext('Unit') %></th>
<th><%- gettext('Start Date') %></th>
<th><%- gettext('Due Date') %></th>
<t
h><a href="#" id="remove-all
">
<t
d><button id="remove-all" class="ccx-button-link
">
<i class="fa fa-remove"></i> <%- gettext('remove all') %>
</
a></th
>
</
button></td
>
</tr>
</thead>
<tbody>
<% _.each(chapters, function(chapter) { %>
<tr class="chapter collapsed" data-location="<%= chapter.location %>" data-depth="1">
<td class="unit">
<a href="#"><i class="fa fa-caret-right toggle-collapse"></i></a>
<%= chapter.display_name %>
<button class="toggle-collapse ccx-button-link" aria-expanded="false">
<i class="fa fa-caret-right"></i>
<span class="sr"><%- gettext('toggle chapter') %> <%= chapter.display_name %></span>
</button>
<span class="sr"><%- gettext('Section') %> </span><%= chapter.display_name %>
</td>
<td class="date start-date"><a><%= chapter.start %></a></td>
<td class="date due-date"><a><%= chapter.due %></a></td>
<td><a href="#" class="remove-unit">
<i class="fa fa-remove"></i> <%- gettext('remove') %>
</a></td>
<td class="date start-date">
<button class="ccx-button-link">
<%= chapter.start %>
<span class="sr"><%- gettext('Click to change') %></span>
</button>
</td>
<td class="date due-date">
<button class="ccx-button-link">
<%= chapter.due %>
<span class="sr"><%- gettext('Click to change') %></span>
</button>
</td>
<td><button class="remove-unit ccx-button-link" aria-label="Remove chapter <%= chapter.display_name %>">
<i class="fa fa-remove" aria-hidden="true"></i> <%- gettext('remove') %>
</button></td>
</tr>
<% _.each(chapter.children, function(child) { %>
<tr class="sequential collapsed" data-depth="2"
data-location="<%= chapter.location %> <%= child.location %>">
<td class="unit">
<a href="#"><i class="fa fa-caret-right toggle-collapse"></i></a>
<%= child.display_name %>
<button class="toggle-collapse ccx-button-link" aria-expanded="false">
<i class="fa fa-caret-right"></i>
<span class="sr"><%- gettext('toggle subsection') %> <%= child.display_name %></span>
</button>
<span class="sr"><%- gettext('Subsection') %> </span><%= child.display_name %>
</td>
<td class="date start-date">
<button class="ccx-button-link">
<%= child.start %>
<span class="sr"><%- gettext('Click to change') %></span>
</button>
</td>
<td class="date due-date">
<button class="ccx-button-link">
<%= child.due %>
<span class="sr"><%- gettext('Click to change') %></span>
</button>
</td>
<td class="date start-date"><a><%= child.start %></a></td>
<td class="date due-date"><a><%= child.due %></a></td>
<td><a href="#" class="remove-unit">
<i class="fa fa-remove"></i> <%- gettext('remove') %>
</a></td>
<td><button class="remove-unit ccx-button-link" aria-label="Remove subsection <%= child.display_name %>">
<i class="fa fa-remove" aria-hidden="true"></i> <%- gettext('remove') %>
</button></td>
</tr>
<% _.each(child.children, function(subchild) { %>
<tr class="vertical" data-dapth="3"
data-location="<%= chapter.location %> <%= child.location %> <%= subchild.location %>">
<td class="unit"> <%= subchild.display_name %></td>
<td class="date start-date"><a><%= subchild.start %></a></td>
<td class="date due-date"><a><%= subchild.due %></a></td>
<td><a href="#" class="remove-unit">
<i class="fa fa-remove"></i> <%- gettext('remove') %>
</a></td>
<td class="unit">
<span class="sr"><%- gettext('Unit') %> </span>
<%= subchild.display_name %>
</td>
<td class="date start-date">
<button class="ccx-button-link">
<%= subchild.start %>
<span class="sr"><%- gettext('Click to change') %></span>
</button>
</td>
<td class="date due-date">
<button class="ccx-button-link">
<%= subchild.due %>
<span class="sr"><%- gettext('Click to change') %></span>
</button>
</td>
<td><button class="remove-unit ccx-button-link" aria-label="Remove unit <%= subchild.display_name %>">
<i class="fa fa-remove" aria-hidden="true"></i> <%- gettext('remove') %>
</button></td>
<% }); %>
<% }); %>
<% }); %>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment