Merge pull request #5851 from mjy78/issue/5125

[Fixes #5125] Ensure the modified taxonomy items are not lost if a model validation…
This commit is contained in:
Sébastien Ros
2015-10-08 12:26:25 -07:00

View File

@@ -58,28 +58,7 @@ namespace Orchard.Taxonomies.Drivers {
}
protected override DriverResult Editor(ContentPart part, TaxonomyField field, dynamic shapeHelper) {
return ContentShape("Fields_TaxonomyField_Edit", GetDifferentiator(field, part), () => {
var settings = field.PartFieldDefinition.Settings.GetModel<TaxonomyFieldSettings>();
var appliedTerms = GetAppliedTerms(part, field, VersionOptions.Latest).ToDictionary(t => t.Id, t => t);
var taxonomy = _taxonomyService.GetTaxonomyByName(settings.Taxonomy);
var terms = taxonomy != null
? _taxonomyService.GetTerms(taxonomy.Id).Where(t => !string.IsNullOrWhiteSpace(t.Name)).Select(t => t.CreateTermEntry()).ToList()
: new List<TermEntry>(0);
terms.ForEach(t => t.IsChecked = appliedTerms.ContainsKey(t.Id));
var viewModel = new TaxonomyFieldViewModel {
DisplayName = field.DisplayName,
Name = field.Name,
Terms = terms,
Settings = settings,
SingleTermId = terms.Where(t => t.IsChecked).Select(t => t.Id).FirstOrDefault(),
TaxonomyId = taxonomy != null ? taxonomy.Id : 0
};
var templateName = settings.Autocomplete ? "Fields/TaxonomyField.Autocomplete" : "Fields/TaxonomyField";
return shapeHelper.EditorTemplate(TemplateName: templateName, Model: viewModel, Prefix: GetPrefix(field, part));
});
return BuildEditorShape(part, field, shapeHelper);
}
protected override DriverResult Editor(ContentPart part, TaxonomyField field, IUpdateModel updater, dynamic shapeHelper) {
@@ -103,7 +82,38 @@ namespace Orchard.Taxonomies.Drivers {
_taxonomyService.UpdateTerms(part.ContentItem, checkedTerms, field.Name);
}
return Editor(part, field, shapeHelper);
return BuildEditorShape(part, field, shapeHelper, viewModel);
}
private ContentShapeResult BuildEditorShape(ContentPart part, TaxonomyField field, dynamic shapeHelper, TaxonomyFieldViewModel appliedViewModel = null) {
return ContentShape("Fields_TaxonomyField_Edit", GetDifferentiator(field, part), () => {
var settings = field.PartFieldDefinition.Settings.GetModel<TaxonomyFieldSettings>();
var taxonomy = _taxonomyService.GetTaxonomyByName(settings.Taxonomy);
var terms = taxonomy != null
? _taxonomyService.GetTerms(taxonomy.Id).Where(t => !string.IsNullOrWhiteSpace(t.Name)).Select(t => t.CreateTermEntry()).ToList()
: new List<TermEntry>(0);
// Ensure the modified taxonomy items are not lost if a model validation error occurs
if (appliedViewModel != null) {
terms.ForEach(t => t.IsChecked = appliedViewModel.Terms.Any(at => at.Id == t.Id && at.IsChecked) || t.Id == appliedViewModel.SingleTermId);
}
else {
var appliedTerms = GetAppliedTerms(part, field, VersionOptions.Latest).ToDictionary(t => t.Id, t => t);
terms.ForEach(t => t.IsChecked = appliedTerms.ContainsKey(t.Id));
}
var viewModel = new TaxonomyFieldViewModel {
DisplayName = field.DisplayName,
Name = field.Name,
Terms = terms,
Settings = settings,
SingleTermId = terms.Where(t => t.IsChecked).Select(t => t.Id).FirstOrDefault(),
TaxonomyId = taxonomy != null ? taxonomy.Id : 0
};
var templateName = settings.Autocomplete ? "Fields/TaxonomyField.Autocomplete" : "Fields/TaxonomyField";
return shapeHelper.EditorTemplate(TemplateName: templateName, Model: viewModel, Prefix: GetPrefix(field, part));
});
}
protected override void Exporting(ContentPart part, TaxonomyField field, ExportContentContext context) {