protected virtual void ProcessArguments(ControllerConfiguration config, ActionArgs args) { if (args.Values == null) { return; } FieldValueDictionary values = new FieldValueDictionary(args); _pk = null; // detect negative primary keys XPathNavigator pkNav = config.SelectSingleNode("/c:dataController/c:fields/c:field[@isPrimaryKey=\'true\']"); if (pkNav != null) { FieldValue fv = null; if (values.TryGetValue(pkNav.GetAttribute("name", String.Empty), out fv)) { int value = 0; if ((fv.NewValue != null) && int.TryParse(Convert.ToString(fv.NewValue), out value)) { if (value < 0) { if (args.CommandName == "Insert") { // request a new row from business rules PageRequest newRowRequest = new PageRequest(); newRowRequest.Controller = args.Controller; newRowRequest.View = args.View; newRowRequest.Inserting = true; newRowRequest.RequiresMetaData = true; newRowRequest.MetadataFilter = new string[] { "fields" }; ViewPage page = ControllerFactory.CreateDataController().GetPage(newRowRequest.Controller, newRowRequest.View, newRowRequest); if (page.NewRow != null) { for (int i = 0; (i < page.NewRow.Length); i++) { object newValue = page.NewRow[i]; if (newValue != null) { DataField field = page.Fields[i]; if (field.IsPrimaryKey) { // resolve the value of the primary key ResolvePrimaryKey(args.Controller, fv.Name, value, newValue); value = 0; fv.NewValue = newValue; } else { // inject a missing default value in the arguments FieldValue newFieldValue = null; if (values.TryGetValue(field.Name, out newFieldValue)) { if (!(newFieldValue.Modified)) { newFieldValue.NewValue = newValue; newFieldValue.Modified = true; } } else { List <FieldValue> newValues = new List <FieldValue>(args.Values); newFieldValue = new FieldValue(field.Name, newValue); newValues.Add(newFieldValue); args.Values = newValues.ToArray(); values[field.Name] = newFieldValue; } } } } } } // resolve the primary key after the command execution if (value < 0) { _pk = new FieldValue(fv.Name, value); fv.NewValue = null; fv.Modified = false; } } } } } // resolve negative foreign keys if (_resolvedKeys.Count > 0) { XPathNodeIterator fkIterator = config.Select("/c:dataController/c:fields/c:field[c:items/@dataController]"); while (fkIterator.MoveNext()) { FieldValue fv = null; if (values.TryGetValue(fkIterator.Current.GetAttribute("name", String.Empty), out fv)) { XPathNavigator itemsDataControllerNav = fkIterator.Current.SelectSingleNode("c:items/@dataController", config.Resolver); object resolvedKey = null; if (_resolvedKeys.TryGetValue(String.Format("{0}${1}", itemsDataControllerNav.Value, fv.NewValue), out resolvedKey)) { fv.NewValue = resolvedKey; } } } } }
void IPlugIn.ProcessPageRequest(PageRequest request, ViewPage page) { if (page.Rows.Count == 0) { page.Icons = new string[0]; return; } if (!(_requireProcessing)) { List <string> icons = new List <string>(); for (int i = 0; (i < page.Rows.Count); i++) { string rowDir = AnnotationPlugIn.GenerateDataRecordPath(request.Controller, page, null, i); if (Directory.Exists(rowDir)) { icons.Add("Attachment"); } else { icons.Add(null); } } page.Icons = icons.ToArray(); return; } List <DynamicExpression> expressions = new List <DynamicExpression>(page.Expressions); DynamicExpression de = new DynamicExpression(); de.Target = "Annotations"; de.Scope = DynamicExpressionScope.CategoryVisibility; de.Type = DynamicExpressionType.ClientScript; de.Test = "!this.get_isInserting()"; de.ViewId = page.View; expressions.Add(de); page.Expressions = expressions.ToArray(); if (!(_retrieveAnnotations)) { return; } DataField field = page.FindField("_Annotation_AttachmentNew"); if (field != null) { int fieldIndex = page.Fields.IndexOf(field); string newValue = String.Format("{0},{1}|{2}", request.Controller, field.Name, Regex.Replace(((string)(page.Rows[0][fieldIndex])), "^\\w+\\|(.+)$", "$1")); if (field.Name == "_Annotation_AttachmentNew") { newValue = ("null|" + newValue); } page.Rows[0][fieldIndex] = newValue; } string p = AnnotationPlugIn.GenerateDataRecordPath(request.Controller, page, null, 0); if (Directory.Exists(p)) { string[] files = Directory.GetFiles(p, "*.xml"); List <object> values = new List <object>(page.Rows[0]); int i = (files.Length - 1); while (i >= 0) { string filename = files[i]; XPathDocument doc = new XPathDocument(filename); XPathNavigator nav = doc.CreateNavigator().SelectSingleNode("/*"); DataField f = null; if (nav.Name == "note") { f = new DataField(); f.Name = "_Annotation_Note"; f.Type = "String"; f.HeaderText = String.Format(Localizer.Replace("AnnotationNoteDynamicFieldHeaderText", "{0} written at {1}"), ReadNameAndEmail(nav), Convert.ToDateTime(nav.GetAttribute("timestamp", String.Empty))); f.Columns = 50; f.Rows = 7; f.TextMode = TextInputMode.Note; values.Add(nav.Value); } else if (nav.Name == "attachment") { f = new DataField(); f.Name = "_Annotation_Attachment"; f.Type = "Byte[]"; f.HeaderText = String.Format(Localizer.Replace("AnnotationAttachmentDynamicFieldHeaderText", "{0} attached <b>{1}</b> at {2}"), ReadNameAndEmail(nav), nav.GetAttribute("fileName", String.Empty), Convert.ToDateTime(nav.GetAttribute("timestamp", String.Empty))); f.OnDemand = true; f.OnDemandHandler = "AnnotationPlugIn"; f.OnDemandStyle = OnDemandDisplayStyle.Link; if (nav.GetAttribute("contentType", String.Empty).StartsWith("image/")) { f.OnDemandStyle = OnDemandDisplayStyle.Thumbnail; } f.CategoryIndex = (page.Categories.Count - 1); values.Add(nav.GetAttribute("value", String.Empty)); } if (f != null) { f.Name = (f.Name + Path.GetFileNameWithoutExtension(filename)); f.AllowNulls = true; f.CategoryIndex = (page.Categories.Count - 1); if (!(Controller.UserIsInRole("Administrators"))) { f.ReadOnly = true; } page.Fields.Add(f); } i = (i - 1); } page.Rows[0] = values.ToArray(); if (files.Length > 0) { page.Categories[(page.Categories.Count - 1)].Tab = Localizer.Replace("AnnotationTab", "Notes & Attachments"); expressions.RemoveAt((expressions.Count - 1)); page.Expressions = expressions.ToArray(); } } else { de.Test = "this.get_isEditing() && this.get_view()._displayAnnotations"; ActionGroup g = new ActionGroup(); page.ActionGroups.Add(g); g.Scope = "ActionBar"; g.Flat = true; Action a = new Action(); g.Actions.Add(a); a.WhenLastCommandName = "Edit"; a.WhenView = page.View; a.CommandName = "ClientScript"; a.CommandArgument = "this.get_view()._displayAnnotations=true;this._focusedFieldName = \'_Annotation_No" + "teNew\';this._raiseSelectedDelayed=false;"; a.HeaderText = Localizer.Replace("AnnotationActionHeaderText", "Annotate"); a.CssClass = "AttachIcon"; a.WhenClientScript = "this.get_view()._displayAnnotations!=true;"; } }