public object PersistForm(PersistFormRequest request) { // Variables. var result = default(object); var formsRootId = GuidHelper.GetGuid(FormConstants.Id); var parentId = GuidHelper.GetGuid(request.ParentId); // Catch all errors. try { // Parse or create the form ID. var isNew = string.IsNullOrWhiteSpace(request.FormId); var formId = isNew ? Guid.NewGuid() : GuidHelper.GetGuid(request.FormId); // Get the fields. var fields = request.Fields.MakeSafe() .Select(x => { var fieldType = Type.GetType(x.TypeFullName); var fieldTypeInstance = FormFieldTypeCollection .FirstOrDefault(y => y.GetType() == fieldType); var field = new FormField(fieldTypeInstance) { Id = string.IsNullOrWhiteSpace(x.Id) ? Guid.NewGuid() : GuidHelper.GetGuid(x.Id), Alias = x.Alias, Name = x.Name, Label = x.Label, Category = x.Category, Validations = x.Validations.MakeSafe() .Select(y => GuidHelper.GetGuid(y)).ToArray(), FieldConfiguration = JsonHelper.Serialize(x.Configuration) }; return(field); }) .ToArray(); // Get the handlers. var handlers = request.Handlers.MakeSafe().Select(x => { var handlerType = Type.GetType(x.TypeFullName); var handlerTypeInstance = FormHandlerTypeCollection .FirstOrDefault(y => y.GetType() == handlerType); var handler = new FormHandler(handlerTypeInstance) { Id = string.IsNullOrWhiteSpace(x.Id) ? Guid.NewGuid() : GuidHelper.GetGuid(x.Id), Alias = x.Alias, Name = x.Name, Enabled = x.Enabled, HandlerConfiguration = JsonHelper.Serialize(x.Configuration) }; return(handler); }).ToArray(); // Get the ID path. var parent = parentId == Guid.Empty ? null : Entities.Retrieve(parentId); var path = parent == null ? new[] { formsRootId, formId } : parent.Path.Concat(new[] { formId }).ToArray(); // Create the form. var form = new Form() { Id = formId, Path = path, Alias = request.Alias, Name = request.Name, Fields = fields, Handlers = handlers }; // Persist the form. Persistence.Persist(form); // For new forms, automatically create a layout and a form configuration. var layoutNamePrefix = "Layout for "; var layoutNameSuffix = " (Autogenerated)"; var layoutAliasPrefix = "layout_"; var layoutAliasSuffix = "_autogenerated"; var autoLayoutData = JsonHelper.Serialize(new { rows = new[] { new { cells = new [] { new { columnSpan = 12, fields = form.Fields.Select(x => new { id = GuidHelper.GetString(x.Id) }) } } } }, formId = GuidHelper.GetString(form.Id), autopopulate = true }); if (isNew) { // Create new layout. var layoutId = Guid.NewGuid(); var layout = new Layout() { KindId = GuidHelper.GetGuid(app.Constants.Layouts.LayoutBasic.Id), Id = layoutId, Path = new[] { GuidHelper.GetGuid(LayoutConstants.Id), layoutId }, Name = layoutNamePrefix + request.Name + layoutNameSuffix, Alias = layoutAliasPrefix + request.Alias + layoutAliasSuffix, Data = autoLayoutData }; // Persist layout. LayoutPersistence.Persist(layout); // Create a new form configuration. var plainJsTemplateId = GuidHelper.GetGuid("f3fb1485c1d14806b4190d7abde39530"); var template = Config.Templates.FirstOrDefault(x => x.Id == plainJsTemplateId) ?? Config.Templates.FirstOrDefault(); var configId = Guid.NewGuid(); var configuredForm = new ConfiguredForm() { Id = configId, Path = path.Concat(new[] { configId }).ToArray(), Name = request.Name, TemplateId = template?.Id, LayoutId = layoutId }; // Persist form configuration. ConFormPersistence.Persist(configuredForm); } // Get existing layouts that should autopopulate. var layouts = GetFormLayouts(null) .Select(x => new { Layout = x, Configuration = x.DeserializeConfiguration() as LayoutBasicConfiguration }) .Where(x => x.Configuration != null) .Where(x => x.Configuration.FormId.HasValue && x.Configuration.FormId.Value == formId) .Where(x => x.Configuration.Autopopulate); //: Autopopulate the layouts. foreach (var existingLayout in layouts) { existingLayout.Layout.Data = autoLayoutData; var layoutName = existingLayout.Layout.Name ?? string.Empty; var layoutAlias = existingLayout.Layout.Alias ?? string.Empty; if (layoutName.StartsWith(layoutNamePrefix) && layoutName.EndsWith(layoutNameSuffix)) { existingLayout.Layout.Name = layoutNamePrefix + form.Name + layoutNameSuffix; } if (layoutAlias.StartsWith(layoutAliasPrefix) && layoutAlias.EndsWith(layoutAliasSuffix)) { existingLayout.Layout.Alias = layoutAliasPrefix + form.Name + layoutAliasSuffix; } LayoutPersistence.Persist(existingLayout.Layout); } // Success. result = new { Success = true, FormId = GuidHelper.GetString(formId) }; } catch (Exception ex) { // Error. Logger.Error <FormsController>(ex, PersistFormError); result = new { Success = false, Reason = UnhandledError }; } // Return the result. return(result); }
public object DuplicateForm(DuplicateFormRequest request) { // Variables. var result = default(object); // Catch all errors. try { // Variables. var oldFormId = GuidHelper.GetGuid(request.FormId); var parentId = GuidHelper.GetGuid(request.ParentId); var oldForm = Persistence.Retrieve(oldFormId); var oldConfigs = ConFormPersistence.RetrieveChildren(oldFormId); var newFormId = Guid.NewGuid(); var layoutMap = new Dictionary <Guid, Guid>(); // Get the new form ID path. var newFormPath = oldForm.Path .Take(oldForm.Path.Length - 1) .Concat(new[] { newFormId }) .ToArray(); // Create the duplicate form. var newForm = new Form() { Id = newFormId, Path = newFormPath, Alias = oldForm.Alias, Name = $"{oldForm.Name} (Copy)", Fields = oldForm.Fields, Handlers = oldForm.Handlers }; // Persist the duplicate form. Persistence.Persist(newForm); // Duplicate the existing layouts (ensuring each gets a new layout ID). var oldLayoutIds = oldConfigs .Select(x => x.LayoutId) .Where(x => x.HasValue) .Select(x => x.Value); foreach (var layoutId in oldLayoutIds) { // Duplicate layout. var oldLayout = LayoutPersistence.Retrieve(layoutId); var newLayout = oldLayout.Duplicate(newFormId); // Persist duplicated layout. LayoutPersistence.Persist(newLayout); // Map old layout ID to new layout ID. layoutMap[layoutId] = newLayout.Id; } // Duplicate form configurations. foreach (var oldConfig in oldConfigs) { // Duplicate the form configuration. var newConfigId = Guid.NewGuid(); var newConfig = new ConfiguredForm() { Id = newConfigId, Path = newFormPath.Concat(new[] { newConfigId }).ToArray(), Name = oldConfig.Name, TemplateId = oldConfig.TemplateId, LayoutId = oldConfig.LayoutId.HasValue ? layoutMap[oldConfig.LayoutId.Value] : default(Guid?) }; // Persist form configuration. ConFormPersistence.Persist(newConfig); } // Success. result = new { Success = true, FormId = GuidHelper.GetString(newFormId), Path = newFormPath }; } catch (Exception ex) { // Error. Logger.Error <FormsController>(ex, DuplicateFormError); result = new { Success = false, Reason = UnhandledError }; } // Return the result. return(result); }