private DataTable GetCustomFieldsTable()
        {
            if (!ExternalData.ContainsKey("CustomFieldDataSet"))
            {
                throw new ExternalDataRequiredException("Provide a CustomFieldDataSet object as external data for ProjectCustomFieldsDataTableMappingObject")
                      {
                          DataKeyName = "CustomFieldDataSet"
                      };
            }

            var customFieldsDs    = ExternalData["CustomFieldDataSet"] as DataSet;
            var customFieldsTable = customFieldsDs.Tables["CustomFields"];

            return(customFieldsTable);
        }
示例#2
0
        private object Get(string column)
        {
            if (_rowIdx == -1)
            {
                _rowIdx++;
            }

            if (ExternalData.ContainsKey("TASK_UID"))
            {
                if ((bool)((DataRow)Current)["TASK_IS_SUMMARY"])
                {
                    _rowIdx++;
                }
            }

            return(_dataTable.Rows[_rowIdx][column]);
        }
        // TODO: Implement mapping to types different than decimal
        // Implement mapping Duration to TimeSpan
        // Implement mapping Work to TimeSpan
        // It shuld be done in value converter
        public object this[string propName]
        {
            get
            {
                var customFieldsTable = GetCustomFieldsTable();
                var customFieldsMap   = customFieldsTable.Rows
                                        .Cast <DataRow>()
                                        .ToDictionary(r => r["MD_PROP_NAME"], r => r);

                var customField = customFieldsMap[propName];
                var propUid     = customField["MD_PROP_UID"];

                // MD_PROP_TYPE_ENUM stored as byte internaly, we have to unbox it to byte first to convert to enum.
                var type         = (PsDataType)(byte)customField["MD_PROP_TYPE_ENUM"];
                var targetColumn = GetColumnNameByDataType(type);

                var rows = _dataTable.Rows
                           .Cast <DataRow>()
                           .Where(r => r["PROJ_UID"].Equals(ExternalData["PROJ_UID"]));

                if (ExternalData.ContainsKey("TASK_UID"))
                {
                    rows = rows.Where(r => r["TASK_UID"].Equals(ExternalData["TASK_UID"]));
                }

                var row = rows
                          .FirstOrDefault(r => r["MD_PROP_UID"].Equals(propUid));

                if (row == null)
                {
                    return(null);
                }

                return(row[targetColumn]);
            }
            set
            {
                var customFieldsTable = GetCustomFieldsTable();
                var customFieldsMap   = customFieldsTable.Rows
                                        .Cast <DataRow>()
                                        .ToDictionary(r => r["MD_PROP_NAME"], r => r);

                var customField = customFieldsMap[propName];

                var propUid = customField["MD_PROP_UID"];

                // MD_PROP_TYPE_ENUM stored as byte internaly, we have to unbox it to byte first to convert to enum.
                var type         = (PsDataType)(byte)customField["MD_PROP_TYPE_ENUM"];
                var targetColumn = GetColumnNameByDataType(type);

                var row = _dataTable.Rows.Cast <DataRow>().FirstOrDefault(r => r["MD_PROP_UID"].Equals(propUid));

                //If there are now row exists for given custom field value, create a new one.
                if (row == null && value != null)
                {
                    row = _dataTable.NewRow();
                    row["MD_PROP_UID"] = propUid;
                    row["PROJ_UID"]    = ExternalData["PROJ_UID"];

                    if (ExternalData.ContainsKey("TASK_UID"))
                    {
                        row["TASK_UID"] = ExternalData["TASK_UID"];
                    }

                    row["CUSTOM_FIELD_UID"] = Guid.NewGuid();
                    row[targetColumn]       = value;
                    _dataTable.Rows.Add(row);
                    return;
                }

                //If custom field value is null, remove the row with existing values, it will erase the field on server.
                if (row != null && value == null)
                {
                    _dataTable.Rows.Remove(row);
                    return;
                }

                //If row for given custom field value exists, update a value in column
                if (row != null)
                {
                    row[targetColumn] = value;
                }
            }
        }