Move milestones branch out of the way to prepare for merge with trunk

[[Split portion of a mixed commit.]]
 - Legacy-Id: 5185.1
This commit is contained in:
Ole Laursen 2013-01-15 16:12:31 +00:00
parent 1b56a33d21
commit bbe51020d4
7 changed files with 63 additions and 24 deletions

View file

@ -51,6 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<li class="sect first">Secretariat</li>
<li><a href="/admin/iesg/telechatdate/">Telechat Dates</a></li>
<li><a href="/admin/iesg/telechatagendaitem/">Management Items</a></li>
<li><a href="{% url ietf.iesg.views.milestones_needing_review %}">Milestones</a></li>
{# FIXME: this link should be removed when the old WG Actions are completely dead #}
<li><a href="{% url ietf.iesg.views.working_group_actions %}">Working Groups</a></li>
{% endif %}

View file

@ -15,7 +15,7 @@ div.milestones-for-group { margin: 0.5em 0; }
{% for g in ad.groups_needing_review %}
<div class="milestones-for-group">New milestones for <a href="{% url wg_edit_milestones acronym=g.acronym %}">{{ g.name }} ({{ g.acronym }})</a>:</div>
<div class="milestones-for-group">{{ g.name }} ({{ g.acronym }}) <a href="{% url wg_edit_milestones acronym=g.acronym %}">has new milestones</a>:</div>
{% with g.milestones_needing_review as milestones %}
{% include "wginfo/milestones.html" %}

View file

@ -6,11 +6,12 @@
tr.milestone td { padding: 0.2em 0; cursor: pointer; vertical-align: top; }
tr.milestone:hover { background-color: #e8f0fa; }
td.due { width: 5em; }
.milestone .needs-accept { font-style: italic; display: inline-block; margin-left: 0.5em; color: #2647a0; }
.milestone.changed { font-weight: bold; }
.milestone .note { font-style: italic; display: inline-block; margin-left: 0.5em; color: #2647a0; }
.milestone .doc { display: block; padding-left: 1em; }
.edit-milestone { display: none; }
.edit-milestone.delete, .edit-milestone.delete input { color: #aaa !important; }
.edit-milestone table { margin: 0.3em 0; }
.milestone.delete, .edit-milestone.delete, .edit-milestone.delete input { color: #aaa !important; }
.edit-milestone table { margin: 1em 0; }
.edit-milestone table td { padding: 0.1em; }
.edit-milestone .desc input { width: 50em; }
.edit-milestone .due input { width: 6em; }
@ -63,11 +64,13 @@ this list</a> to the currently in-use milestones for the {{ group.acronym }} {{
<form action="" method="post" id="milestones-form">
<table cellspacing="0" cellpadding="0">
{% for form in forms %}
<tr class="milestone">
<tr class="milestone{% if form.delete.data %} delete{% endif %}">
<td class="due">{% if form.milestone.resolved %}{{ form.milestone.resolved }}{% else %}{{ form.milestone.due|date:"M Y" }}{% endif %}</td>
<td>
<div>{{ form.milestone.desc }}
{% if form.needs_review %}<span class="needs-accept">awaiting accept</span>{% endif %}</div>
{% if form.needs_review %}<span class="note">awaiting accept</span>{% endif %}
{% if form.changed %}<span class="note">changed</span>{% endif %}
</div>
{% for d in form.docs_names %}
<div class="doc">{{ d }}</div>
@ -75,15 +78,15 @@ this list</a> to the currently in-use milestones for the {{ group.acronym }} {{
</td>
</tr>
<tr class="edit-milestone"><td colspan="2">{% include "wginfo/milestone_form.html" %}</td></tr>
<tr class="edit-milestone{% if form.changed %} changed{% endif %}"><td colspan="2">{% include "wginfo/milestone_form.html" %}</td></tr>
{% endfor %}
<tr class="milestone add"><td></td><td>Add {% if milestone_set == "chartering" %}charter{% endif%} milestone {% if needs_review %}for AD review{% endif %}</td></tr>
<tr class="edit-milestone template"><td colspan="2">{% with empty_form as form %}{% include "wginfo/milestone_form.html" %}{% endwith %}</td></tr>
</table>
<div class="actions">
<a href="{% if milestone_set == "charter" %}{% url doc_view name=group.charter.canonical_name %}{% else %}{% url wg_charter acronym=group.acronym %}{% endif %}">Back</a>
<input type="submit" data-labelsave="Save" data-labelreview="Review changes" value="Save"/>
<a class="button" href="{% if milestone_set == "charter" %}{% url doc_view name=group.charter.canonical_name %}{% else %}{% url wg_charter acronym=group.acronym %}{% endif %}">Cancel</a>
<input class="button" type="submit" data-labelsave="Save" data-labelreview="Review changes" value="Save" style="display:none"/>
<input type="hidden" name="action" value="save">
</div>

View file

@ -37,7 +37,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% block morecss %}
{{ block.super }}
h2 a.edit { font-weight: normal; font-size: 13px; display: inline-block; margin-left: 0.5em; }
h2 a.button { margin-left: 0.5em; font-size: 13px; }
{% endblock %}
{% block wg_content %}
@ -167,7 +167,7 @@ is occasionally incorrect.</span>
<h2>Milestones
{% if user|has_role:"Area Director,Secretariat" or is_chair %}
<a class="edit" href="{% url wg_edit_milestones acronym=wg.acronym %}">Add or edit milestones</a>
<a class="button" href="{% url wg_edit_milestones acronym=wg.acronym %}">Add or edit milestones</a>
{% endif %}
</h2>

View file

@ -45,23 +45,26 @@ class MilestoneForm(forms.Form):
m = self.milestone = kwargs.pop("instance", None)
self.needs_review = kwargs.pop("needs_review", False)
can_review = not self.needs_review
if m:
self.needs_review = m.state_id == "review"
if not "initial" in kwargs:
kwargs["initial"] = {}
kwargs["initial"].update(dict(id=m.pk,
desc=m.desc,
due_month=m.due.month,
due_year=m.due.year,
resolved_checkbox=bool(m.resolved),
resolved_checkbox="on" if m.resolved else False,
resolved=m.resolved,
docs=",".join(m.docs.values_list("pk", flat=True)),
delete=False,
accept="noaction" if can_review and self.needs_review else None,
))
kwargs["prefix"] = "m%s" % m.pk
self.needs_review = m.state_id == "review"
super(MilestoneForm, self).__init__(*args, **kwargs)
# set choices for due date
@ -77,7 +80,6 @@ class MilestoneForm(forms.Form):
self.fields["due_year"].choices = zip(years, map(str, years))
# figure out what to prepopulate many-to-many field with
pre = ""
if not self.is_bound:
@ -90,6 +92,9 @@ class MilestoneForm(forms.Form):
self.docs_names = parse_doc_names(pre)
self.docs_prepopulate = json_doc_names(self.docs_names)
# calculate whether we've changed
self.changed = self.is_bound and (not self.milestone or any(str(self[f].data) != str(self.initial[f]) for f in self.fields.iterkeys()))
def clean_docs(self):
s = self.cleaned_data["docs"]
return Document.objects.filter(pk__in=[x.strip() for x in s.split(",") if x.strip()], type="draft")

View file

@ -205,3 +205,7 @@ table.milestones td.due { vertical-align: top; width: 80px; }
table.milestones .doc { display: block; padding-left: 1em; }
.stream-state .milestone { display: inline-block; font-size: smaller; background-color: #d5dde6; padding: 0 0.2em; margin-left: 0.3em; }
.button { display: inline-block; font-weight: normal; background: #eee; border: 1px solid #bbb; border-radius: 3px; color: #333; padding: 2px 8px; text-align: center; text-decoration: none; outline: none; transition-duration: 0.2s; cursor: pointer }
.button:hover { background: #ddd; color: #222; }
.button:active { background: #ccc; color: #000; }

View file

@ -8,6 +8,13 @@ jQuery(function () {
idCounter = v - 1;
});
function setChanged() {
$(this).closest(".edit-milestone").addClass("changed");
}
jQuery('#milestones-form .edit-milestone select,#milestones-form .edit-milestone input,#milestones-form .edit-milestone textarea').live("change", setChanged);
jQuery('#milestones-form .edit-milestone .token-input-list input').live("click", setChanged);
function setSubmitButtonState() {
var action, label;
if (jQuery("#milestones-form input[name$=delete]:visible").length > 0)
@ -15,9 +22,14 @@ jQuery(function () {
else
action = "save";
jQuery("#milestones-form input[name=action]").val(action);
var submit = jQuery("#milestones-form input[type=submit]");
submit.val(submit.data("label" + action));
jQuery("#milestones-form input[name=action]").val(action);
if (jQuery("#milestones-form .edit-milestone.changed").length > 0 || action == "review")
submit.show();
else
submit.hide();
}
jQuery("#milestones-form tr.milestone").click(function () {
@ -53,10 +65,18 @@ jQuery(function () {
editRow.show();
}
editRow.find('input[name$="expanded_for_editing"]').val("True");
editRow.find('input[name$="desc"]').focus();
setSubmitButtonState();
// collapse unchanged rows
jQuery("#milestones-form tr.milestone").not(this).each(function () {
var e = jQuery(this).next('tr.edit-milestone');
if (e.is(":visible") && !e.hasClass("changed")) {
jQuery(this).show();
e.hide();
}
});
});
function setResolvedState() {
@ -83,18 +103,22 @@ jQuery(function () {
.live("change", setResolvedState);
function setDeleteState() {
var top = jQuery(this).closest(".edit-milestone");
var edit = jQuery(this).closest(".edit-milestone"), row = edit.prev("tr.milestone");
if (jQuery(this).is(":checked")) {
if (+top.find('input[name$="id"]').val() < 0) {
top.remove();
if (+edit.find('input[name$="id"]').val() < 0) {
edit.remove();
setSubmitButtonState();
}
else
top.addClass("delete")
else {
row.addClass("delete");
edit.addClass("delete");
}
}
else {
row.removeClass("delete");
edit.removeClass("delete");
}
else
top.removeClass("delete")
}
jQuery("#milestones-form .edit-milestone .delete input[type=checkbox]")
@ -104,4 +128,6 @@ jQuery(function () {
jQuery('#milestones-form .edit-milestone .errorlist').each(function () {
jQuery(this).closest(".edit-milestone").prev().click();
});
setSubmitButtonState();
});