private void UpdateChildEditContext(UPChildEditContext childEditContext, Dictionary <string, object> _initialValues)
 {
     foreach (string fieldKey in _initialValues.Keys)
     {
         UPEditFieldContext editFieldContext = childEditContext.EditFieldContext[fieldKey];
         if (editFieldContext != null)
         {
             editFieldContext.SetValue(_initialValues[fieldKey] as string);
             editFieldContext.ChildEditContext = childEditContext;
         }
     }
 }
        /// <summary>
        /// Adds the groups with initial values.
        /// </summary>
        /// <param name="_initialValues">The initial values.</param>
        public override void AddGroupsWithInitialValues(List <Dictionary <string, object> > _initialValues)
        {
            UPMRepeatableEditGroup repeatableEditGroup = (UPMRepeatableEditGroup)this.Group;

            foreach (var initialValuesForGroup in _initialValues)
            {
                UPMStandardGroup group = null;
                string           key   = (initialValuesForGroup[".Key"] as List <string>)?[0];

                if (!string.IsNullOrEmpty(key))
                {
                    group = this.groupForKey[key];
                    UPChildEditContext childEditContext = this.ChildEditContextForGroup(group);
                    if (childEditContext != null && repeatableEditGroup.Groups.Contains(group))
                    {
                        this.UpdateChildEditContext(childEditContext, initialValuesForGroup);
                        return;
                    }
                    else
                    {
                        group = null;
                    }
                }

                if (group == null)
                {
                    group = this.CreateNewGroup(initialValuesForGroup);
                    if (group != null)
                    {
                        repeatableEditGroup.AddChild(group);
                        if (!string.IsNullOrEmpty(key))
                        {
                            if (this.groupForKey != null)
                            {
                                this.groupForKey.SetObjectForKey(group, key);
                            }
                            else
                            {
                                this.groupForKey = new Dictionary <string, UPMStandardGroup> {
                                    { key, group }
                                };
                            }
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Handles removing an item from repeatable edit group
        /// </summary>
        /// <param name="group">Group to remove</param>
        /// <param name="repeatableEditGroup">Repeatable edit group to remove from</param>
        public override void UserWillDeleteGroupInRepeatableEditGroup(UPMGroup group, UPMRepeatableEditGroup repeatableEditGroup)
        {
            UPChildEditContext editContext = this.ChildContextForGroup(group);

            if (editContext != null)
            {
                repeatableEditGroup.RemoveChild(group);
                if (this.MaxChildren > 0)
                {
                    repeatableEditGroup.AddingEnabled = this.AddRecordEnabled;
                }

                editContext.DeleteRecord = true;
                if (this.AddedChildEditContexts.Contains(editContext))
                {
                    this.AddedChildEditContexts.Remove(editContext);
                }
            }
        }
        private void AddChildRecordContext(UPChildEditContext childEditContext)
        {
            if (!childEditContext.IsNew)
            {
                if (this.ChildEditContexts == null)
                {
                    this.ChildEditContexts = new Dictionary <string, UPChildEditContext>();
                }

                this.ChildEditContexts.SetObjectForKey(childEditContext, childEditContext.RecordIdentification);
            }
            else
            {
                if (this.AddedChildEditContexts == null)
                {
                    this.AddedChildEditContexts = new List <UPChildEditContext>();
                }

                this.AddedChildEditContexts.Add(childEditContext);
            }
        }
        private void AddRecordsToGroup(
            UPMRepeatableEditGroup repeatableEditGroup,
            int count,
            UPCRMResult childResult,
            Dictionary <string, UPCRMRecord> changedRecords,
            FieldControlTab childFieldControlTab)
        {
            for (var i = 0; i < count; i++)
            {
                var childRow         = (UPCRMResultRow)childResult.ResultRowAtIndex(i);
                var childEditContext = new UPChildEditContext(childRow, this.NextPostfix);
                var changedRecord    = changedRecords.ValueOrDefault(childRow.RootRecordId);
                var initialRecords   = changedRecord != null ? new List <UPCRMRecord> {
                    changedRecord
                } : null;

                var editFieldContextArray = this.EditContextsForResultRow(childRow, childFieldControlTab, childEditContext.EditFieldContext, null, childEditContext.FieldLabelPostfix, initialRecords);
                var editFieldCount        = editFieldContextArray.Count;
                if (editFieldCount > 0)
                {
                    var standardGroup = new UPMStandardGroup(new RecordIdentifier(childRow.RootRecordIdentification))
                    {
                        Deletable = this.DeleteRecordEnabled
                    };
                    childEditContext.Group = standardGroup;
                    this.AddChildRecordContext(childEditContext);
                    for (var j = 0; j < editFieldCount; j++)
                    {
                        var field = editFieldContextArray[j];
                        AddFieldToGroup(standardGroup, field, childEditContext);
                    }

                    childEditContext.HandleDependentFields();
                    repeatableEditGroup.AddChild(standardGroup);
                }
            }
        }
        /// <summary>
        /// Changeds the records for context new record link user changes only.
        /// </summary>
        /// <param name="childEditContext">The child edit context.</param>
        /// <param name="newRecord">if set to <c>true</c> [new record].</param>
        /// <param name="link">The link.</param>
        /// <param name="userChangesOnly">if set to <c>true</c> [user changes only].</param>
        /// <returns></returns>
        public List <UPCRMRecord> ChangedRecordsForContextNewRecordLinkUserChangesOnly(UPChildEditContext childEditContext, bool newRecord, UPCRMLink link, bool userChangesOnly)
        {
            if (childEditContext.DeleteRecord)
            {
                if (newRecord)
                {
                    return(null);
                }

                UPCRMRecord record = new UPCRMRecord(childEditContext.RecordIdentification);
                record.Deleted = true;
                return(new List <UPCRMRecord> {
                    record
                });
            }

            Dictionary <string, UPEditFieldContext> changedFields = null;

            if (newRecord && !userChangesOnly)
            {
                if (this.combinedInitialValues != null)
                {
                    foreach (string fieldIdentification in this.combinedInitialValues.Keys)
                    {
                        int fieldId = fieldIdentification.FieldIdFromStringWithInfoAreaId(this.ChildInfoAreaId);
                        if (fieldId >= 0)
                        {
                            UPEditFieldContext initialValueEditField = new UPEditFieldContext(fieldId, this.combinedInitialValues[fieldIdentification] as string);
                            if (changedFields == null)
                            {
                                changedFields = new Dictionary <string, UPEditFieldContext> {
                                    { initialValueEditField.Key, initialValueEditField }
                                };
                            }
                            else
                            {
                                changedFields.SetObjectForKey(initialValueEditField, initialValueEditField.Key);
                            }
                        }
                    }
                }
            }

            foreach (UPEditFieldContext editFieldContext in childEditContext.EditFieldContext.Values)
            {
                if (editFieldContext.WasChanged(userChangesOnly))
                {
                    if (changedFields != null)
                    {
                        changedFields.SetObjectForKey(editFieldContext, editFieldContext.Key);
                    }
                    else
                    {
                        changedFields = new Dictionary <string, UPEditFieldContext> {
                            { editFieldContext.Key, editFieldContext }
                        };
                    }
                }
            }

            List <UPCRMRecord>      additionalRecords = null;
            ICollection <UPCRMLink> changedLinks      = (ICollection <UPCRMLink>)childEditContext.ChangedLinkArray ?? new List <UPCRMLink>();

            if (changedFields?.Count > 0 || changedLinks?.Count > 0)
            {
                UPCRMRecord record;
                if (newRecord)
                {
                    record = childEditContext.RecordIdentification.RecordId().Length > 6
                        ? new UPCRMRecord(childEditContext.RecordIdentification)
                        : UPCRMRecord.CreateNew(childEditContext.RecordIdentification.InfoAreaId());

                    record.AddLink(link);
                    UPConfigFilter createFilter = ConfigurationUnitStore.DefaultStore.FilterByName($"{record.InfoAreaId}.ChildCreateTemplate");
                    createFilter      = createFilter.FilterByApplyingDefaultReplacements();
                    additionalRecords = record.ApplyValuesFromTemplateFilter(createFilter, false);
                }
                else
                {
                    record = new UPCRMRecord(childEditContext.RecordIdentification);
                }

                foreach (UPEditFieldContext changedField in changedFields.Values)
                {
                    if (newRecord)
                    {
                        record.NewValueFieldId(changedField.Value, changedField.FieldId);
                    }
                    else
                    {
                        record.NewValueFromValueFieldId(changedField.Value, changedField.OriginalValue, changedField.FieldId);
                    }
                }

                foreach (UPCRMLink changedLink in changedLinks)
                {
                    record.AddLink(changedLink);
                }

                if (additionalRecords?.Count > 0)
                {
                    List <UPCRMRecord> arr = new List <UPCRMRecord> {
                        record
                    };
                    arr.AddRange(additionalRecords);
                    return(arr);
                }

                return(new List <UPCRMRecord> {
                    record
                });
            }

            return(null);
        }
        private static void AddFieldToGroup(UPMStandardGroup standardGroup, object field, UPChildEditContext childEditContext)
        {
            if (field is UPEditFieldContext)
            {
                var editFieldContext = (UPEditFieldContext)field;
                editFieldContext.ChildEditContext = childEditContext;

                foreach (var editField in editFieldContext.EditFields)
                {
                    editField.EditFieldsContext = childEditContext;
                    standardGroup.AddField(editField);
                }
            }
            else
            {
                standardGroup.AddField((UPMField)field);
            }
        }
        private UPMStandardGroup CreateNewGroupRecordAsNew(Dictionary <string, object> parentInitialValues, UPCRMRecord record, bool asNew)
        {
            UPContainerMetaInfo metaInfo = new UPContainerMetaInfo(this.ChildFieldControl);
            UPCRMResult         result   = !string.IsNullOrEmpty(record?.RecordId) ? metaInfo.NewRecordWithRecordId(record.RecordId) : metaInfo.NewRecord();

            UPCRMResultRow     childRow         = (UPCRMResultRow)result.ResultRowAtIndex(0);
            UPChildEditContext childEditContext = new UPChildEditContext(childRow, this.NextPostfix);

            if (asNew)
            {
                childEditContext.SetAsNew();
            }

            if (record != null)
            {
                childEditContext.AddChangedLinksFromRecordParentLink(record, null);
            }

            FieldControlTab childFieldControlTab = this.ChildFieldControl.TabAtIndex(0);

            this.combinedInitialValues = null;
            if (this.initialValues != null)
            {
                if (parentInitialValues != null)
                {
                    Dictionary <string, object> combined = new Dictionary <string, object>(this.initialValues);
                    foreach (var item in parentInitialValues)
                    {
                        combined[item.Key] = item.Value;
                    }

                    this.combinedInitialValues = combined;
                }
                else
                {
                    this.combinedInitialValues = this.initialValues;
                }
            }
            else
            {
                this.combinedInitialValues = parentInitialValues;
            }

            List <UPCRMRecord> initialRecords = record != null ? new List <UPCRMRecord> {
                record
            } : null;

            List <object> editFieldContextArray = this.EditContextsFor(childRow, childFieldControlTab,
                                                                       childEditContext.EditFieldContext, this.combinedInitialValues, initialRecords);
            int editFieldCount = editFieldContextArray.Count;

            if (editFieldCount > 0)
            {
                UPMStandardGroup group = new UPMStandardGroup(new RecordIdentifier(childRow.RootRecordIdentification));
                group.Deletable        = true;
                childEditContext.Group = group;
                this.AddChildRecordContext(childEditContext);
                for (int j = 0; j < editFieldCount; j++)
                {
                    UPEditFieldContext editFieldContext = editFieldContextArray[j] as UPEditFieldContext;
                    if (editFieldContext != null)
                    {
                        editFieldContext.ChildEditContext  = childEditContext;
                        editFieldContext.FieldLabelPostfix = childEditContext.FieldLabelPostfix;
                        List <UPMEditField> editFields = editFieldContext.EditFields;
                        if (editFields.Count > 0)
                        {
                            foreach (UPMEditField editField in editFields)
                            {
                                editField.EditFieldsContext = childEditContext;
                                group.AddField(editField);
                            }
                        }
                        else
                        {
                            UPMField field = editFieldContext.Field;
                            if (field != null)
                            {
                                group.AddField(field);
                            }
                        }
                    }
                    else
                    {
                        group.AddField((UPMField)editFieldContextArray[j]);
                    }
                }

                childEditContext.HandleDependentFields();
                return(group);
            }

            return(null);
        }
        private UPChildEditContext ChildContextForGroup(UPMGroup group)
        {
            UPChildEditContext editContext = this.ChildEditContexts.Values.FirstOrDefault(x => x.Group == group);

            return(editContext ?? this.AddedChildEditContexts.FirstOrDefault(x => x.Group == group));
        }