예제 #1
0
        private object GetDefaultValue(Quantumart.QP8.BLL.Field qpField)
        {
            switch (qpField.ExactType)
            {
            case FieldExactTypes.String:
            case FieldExactTypes.Textbox:
            case FieldExactTypes.VisualEdit:
            case FieldExactTypes.StringEnum:
            case FieldExactTypes.File:
            case FieldExactTypes.Image:
                return(qpField.DefaultValue);

            case FieldExactTypes.Boolean:
                return(qpField.DefaultValue == "1" ? true : (object)null);

            case FieldExactTypes.Numeric:
                return(Double.TryParse(qpField.DefaultValue, out double number)
                        ? qpField.IsInteger ? (int)number : number : (object)null);

            case FieldExactTypes.Date:
            case FieldExactTypes.Time:
            case FieldExactTypes.DateTime:
                return(DateTime.TryParse(qpField.DefaultValue, out DateTime dateTime)
                        ? dateTime : (object)null);

            case FieldExactTypes.Classifier:
                return(Int32.TryParse(qpField.DefaultValue, out int contentId)
                        ? _contentService.Read(contentId).NetName : null);

            default:
                return(null);
            }
        }
예제 #2
0
        private void AddEnumElement(XmlSchemaGroupBase schema, string name, Quantumart.QP8.BLL.Field field, bool required)
        {
            var values = field.StringEnumItems.Select(itm => itm.Value).ToArray();

            var element     = new XmlSchemaElement();
            var type        = new XmlSchemaSimpleType();
            var restriction = new XmlSchemaSimpleTypeRestriction();

            element.Name             = name;
            element.SchemaType       = type;
            restriction.BaseTypeName = new XmlQualifiedName(StringType, XmlSchema.Namespace);
            type.Content             = restriction;
            schema.Items.Add(element);

            if (!required)
            {
                element.MinOccurs = 0;
                element.MaxOccurs = 1;
            }

            foreach (var item in field.StringEnumItems)
            {
                var option = new XmlSchemaEnumerationFacet();
                AddAnnotation(option, item.Alias);
                option.Value = item.Value;
                restriction.Facets.Add(option);
            }
        }
예제 #3
0
        /// <exception cref="NotSupportedException" />
        /// <exception cref="InvalidOperationException" />
        private FieldSchema GetFieldSchema(
            Field field, Quantumart.QP8.BLL.Field qpField, SchemaContext context, string path)
        {
            path += $"/{field?.FieldName ?? qpField.Name ?? ""}";

            FieldSchema fieldSchema;

            if (field == null || field is PlainField)
            {
                fieldSchema = GetPlainFieldSchema(qpField);
            }
            else if (field is EntityField entityField)
            {
                fieldSchema = GetRelationFieldSchema(entityField, qpField, context, path);
            }
            else if (field is ExtensionField extensionField)
            {
                fieldSchema = GetExtensionFieldSchema(extensionField, qpField, context, path);
            }
            else
            {
                throw new NotSupportedException($"Field type {field.GetType()} is not supported");
            }

            fieldSchema.FieldId          = field?.FieldId ?? qpField.Id;
            fieldSchema.FieldName        = field?.FieldName ?? qpField.Name ?? "";
            fieldSchema.FieldOrder       = qpField.Order;
            fieldSchema.FieldType        = qpField.ExactType;
            fieldSchema.FieldDescription = IsHtmlWhiteSpace(qpField.Description) ? "" : qpField.Description;

            if (!IsHtmlWhiteSpace(field?.FieldTitle))
            {
                fieldSchema.FieldTitle = field.FieldTitle;
            }
            else if (!IsHtmlWhiteSpace(qpField.FriendlyName))
            {
                fieldSchema.FieldTitle = qpField.FriendlyName;
            }
            else
            {
                fieldSchema.FieldTitle = "";
            }

            fieldSchema.IsRequired   = qpField.Required && !(field is BackwardRelationField);
            fieldSchema.IsReadOnly   = qpField.ReadOnly;
            fieldSchema.ViewInList   = qpField.ViewInList;
            fieldSchema.DefaultValue = GetDefaultValue(qpField);

            return(fieldSchema);
        }
예제 #4
0
        private PlainFieldSchema GetPlainFieldSchema(Quantumart.QP8.BLL.Field qpField)
        {
            switch (qpField.ExactType)
            {
            case FieldExactTypes.String:
                return(new StringFieldSchema {
                    RegexPattern = qpField.InputMask
                });

            case FieldExactTypes.Numeric:
                return(new NumericFieldSchema {
                    IsInteger = qpField.IsInteger
                });

            case FieldExactTypes.Classifier:
                return(new ClassifierFieldSchema {
                    Changeable = qpField.Changeable
                });

            case FieldExactTypes.File:
            case FieldExactTypes.Image:
                return(new FileFieldSchema
                {
                    UseSiteLibrary = qpField.UseSiteLibrary,
                    SubFolder = qpField.SubFolder,
                    LibraryEntityId = qpField.LibraryEntityId,
                    LibraryParentEntityId = qpField.LibraryParentEntityId
                                            // FolderUrl = _dbConnector.GetUrlForFileAttribute(qpField.Id, true, true)
                });

            case FieldExactTypes.StringEnum:
                return(new EnumFieldSchema
                {
                    ShowAsRadioButtons = qpField.ShowAsRadioButtons,
                    Items = qpField.StringEnumItems.ToArray()
                });

            // TODO: other plain field types

            default:
                return(new PlainFieldSchema());
            }
        }
예제 #5
0
        private XmlQualifiedName GetElementType(Quantumart.QP8.BLL.Field field)
        {
            string typeName = field.Type.Name;

            if (field.IsClassifier)
            {
                return(new XmlQualifiedName(StringType, XmlSchema.Namespace));
            }
            if (typeName == "File")
            {
                return(new XmlQualifiedName("File"));
            }
            if (typeName == "Boolean")
            {
                return(new XmlQualifiedName(BooleanType, XmlSchema.Namespace));
            }
            if (typeName == "Numeric")
            {
                if (field.Size == 0)
                {
                    return(new XmlQualifiedName(IntegerType, XmlSchema.Namespace));
                }
                else
                {
                    return(new XmlQualifiedName(DecimalType, XmlSchema.Namespace));
                }
            }
            if (typeName == "DateTime")
            {
                return(new XmlQualifiedName(DateTimeType, XmlSchema.Namespace));
            }
            if (typeName == "Date")
            {
                return(new XmlQualifiedName(DateType, XmlSchema.Namespace));
            }
            else
            {
                return(new XmlQualifiedName(StringType, XmlSchema.Namespace));
            }
        }
예제 #6
0
        /// <exception cref="NotSupportedException" />
        /// <exception cref="InvalidOperationException" />
        private FieldSchema GetExtensionFieldSchema(
            ExtensionField extensionField, Quantumart.QP8.BLL.Field qpField, SchemaContext context, string path)
        {
            var contentSchemas = new Dictionary <string, IContentSchema>();

            foreach (Content content in extensionField.ContentMapping.Values)
            {
                var qpContent = _contentService.Read(content.ContentId);

                if (!String.IsNullOrEmpty(qpContent.NetName) &&
                    !contentSchemas.ContainsKey(qpContent.NetName))
                {
                    var contentSchema = GetContentSchema(content, context, $"{path}/{qpContent.NetName}");
                    contentSchema.ForExtension        = true;
                    contentSchemas[qpContent.NetName] = contentSchema;
                }
            }

            return(new ExtensionFieldSchema
            {
                Changeable = qpField.Changeable,
                ExtensionContents = contentSchemas
            });
        }
예제 #7
0
        /// <exception cref="NotSupportedException" />
        /// <exception cref="InvalidOperationException" />
        private RelationFieldSchema GetRelationFieldSchema(
            EntityField entityField, Quantumart.QP8.BLL.Field qpField, SchemaContext context, string path)
        {
            ContentSchema contentSchema = GetContentSchema(entityField.Content, context, path);

            string relationCondition = _editorPreloadingService.GetRelationCondition(entityField, qpField);

            ArticleObject[] preloadedArticles = new ArticleObject[0];
            if (entityField.PreloadingMode == PreloadingMode.Eager)
            {
                preloadedArticles = _editorPreloadingService.PreloadRelationArticles(
                    entityField,
                    relationCondition,
                    context.VisitedPreloadedArticles,
                    context.Dictionaries);
            }

            string[] displayFieldNames = contentSchema.Fields.Values
                                         .OfType <PlainFieldSchema>()
                                         .Where(f => f.FieldType != FieldExactTypes.Textbox && f.FieldType != FieldExactTypes.VisualEdit)
                                         .OrderByDescending(f => f.ViewInList)
                                         .ThenBy(f => f.FieldOrder)
                                         .Take(Math.Max(qpField.ListFieldTitleCount, 1))
                                         .Select(f => f.FieldName)
                                         .ToArray();

            if (qpField.ExactType == FieldExactTypes.O2MRelation && !(entityField is BackwardRelationField) ||
                qpField.ExactType == FieldExactTypes.M2ORelation && entityField is BackwardRelationField)
            {
                return(new SingleRelationFieldSchema
                {
                    RelatedContent = contentSchema,
                    UpdatingMode = entityField.UpdatingMode,
                    IsDpcBackwardField = entityField is BackwardRelationField,
                    RelationCondition = relationCondition,
                    DisplayFieldNames = displayFieldNames,
                    PreloadingMode = entityField.PreloadingMode,
                    PreloadedArticles = preloadedArticles,
                });
            }
            if (qpField.ExactType == FieldExactTypes.M2MRelation ||
                qpField.ExactType == FieldExactTypes.O2MRelation && entityField is BackwardRelationField ||
                qpField.ExactType == FieldExactTypes.M2ORelation && !(entityField is BackwardRelationField))
            {
                int? orderFieldId = qpField.TreeOrderFieldId ?? qpField.ListOrderFieldId ?? qpField.OrderFieldId;
                bool orderByTitle = qpField.TreeOrderByTitle || qpField.ListOrderByTitle || qpField.OrderByTitle;

                string orderByFieldName = contentSchema.Fields.Values
                                          .OfType <PlainFieldSchema>()
                                          .Where(f => f.FieldId == orderFieldId)
                                          .Select(f => f.FieldName)
                                          .FirstOrDefault();

                if (orderByFieldName == null && orderByTitle)
                {
                    orderByFieldName = displayFieldNames.FirstOrDefault();
                }

                int?maxDataListItemCount = null;

                if (qpField.ExactType == FieldExactTypes.M2ORelation && qpField.BackRelationId != null)
                {
                    // MaxDataListItemCount лежит в соотв. поле O2MRelation
                    var reverseField = _fieldService.Read(qpField.BackRelationId.Value);
                    if (reverseField.MaxDataListItemCount > 0)
                    {
                        maxDataListItemCount = reverseField.MaxDataListItemCount;
                    }
                }
                else if (qpField.MaxDataListItemCount > 0)
                {
                    maxDataListItemCount = qpField.MaxDataListItemCount;
                }

                return(new MultiRelationFieldSchema
                {
                    RelatedContent = contentSchema,
                    UpdatingMode = entityField.UpdatingMode,
                    IsDpcBackwardField = entityField is BackwardRelationField,
                    RelationCondition = relationCondition,
                    DisplayFieldNames = displayFieldNames,
                    OrderByFieldName = orderByFieldName,
                    MaxDataListItemCount = maxDataListItemCount,
                    PreloadingMode = entityField.PreloadingMode,
                    PreloadedArticles = preloadedArticles,
                });
            }
            throw new NotSupportedException($"Relation type {qpField.ExactType} is not supported");
        }