Skip to content

Commit 6e8aac6

Browse files
committed
many changes to support
1 parent 9465d4a commit 6e8aac6

25 files changed

+261
-185
lines changed

Signum.Entities/EnumMessages.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11

22

33
using Signum.Utilities;
4+
using System;
45
using System.ComponentModel;
56

67
namespace Signum.Entities
78
{
9+
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
10+
public sealed class AllowUnathenticatedAttribute : Attribute
11+
{
12+
13+
}
14+
815
public enum OperationMessage
916
{
1017
[Description("Create...")]
@@ -264,6 +271,7 @@ public enum CalendarMessage
264271
Today,
265272
}
266273

274+
[AllowUnathenticated]
267275
public enum JavascriptMessage
268276
{
269277
[Description("Choose a type")]

Signum.React/Facades/ReflectionServer.cs

Lines changed: 68 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,13 @@ public static object GetCurrentValidCulture()
4242
t.IsEnum && !t.Name.EndsWith("Query") && !t.Name.EndsWith("Message"))
4343
.ToDictionaryEx(GetTypeName, "Types"));
4444

45-
public static void RegisterLike(Type type)
45+
public static Dictionary<string, Func<bool>> OverrideIsNamespaceAllowed = new Dictionary<string, Func<bool>>();
46+
47+
public static void RegisterLike(Type type, Func<bool> allowed)
4648
{
4749
TypesByName.Reset();
4850
EntityAssemblies.GetOrCreate(type.Assembly).Add(type.Namespace!);
51+
OverrideIsNamespaceAllowed[type.Namespace!] = allowed;
4952
}
5053

5154
internal static void Start()
@@ -64,54 +67,68 @@ internal static void Start()
6467
const BindingFlags instanceFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly;
6568
const BindingFlags staticFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly;
6669

67-
public static event Action<TypeInfoTS, Type>? AddTypeExtension;
68-
static TypeInfoTS OnAddTypeExtension(TypeInfoTS ti, Type t)
70+
public static event Func<TypeInfoTS, Type, TypeInfoTS?>? TypeExtension;
71+
static TypeInfoTS? OnTypeExtension(TypeInfoTS ti, Type t)
6972
{
70-
foreach (var a in AddTypeExtension.GetInvocationListTyped())
71-
a(ti, t);
73+
foreach (var a in TypeExtension.GetInvocationListTyped())
74+
{
75+
ti = a(ti, t)!;
76+
if (ti == null)
77+
return null;
78+
}
7279

7380
return ti;
7481
}
7582

76-
public static event Action<MemberInfoTS, PropertyRoute>? AddPropertyRouteExtension;
77-
static MemberInfoTS OnAddPropertyRouteExtension(MemberInfoTS mi, PropertyRoute m)
83+
public static event Func<MemberInfoTS, PropertyRoute, MemberInfoTS?>? PropertyRouteExtension;
84+
static MemberInfoTS? OnPropertyRouteExtension(MemberInfoTS mi, PropertyRoute m)
7885
{
79-
if (AddPropertyRouteExtension == null)
86+
if (PropertyRouteExtension == null)
8087
return mi;
8188

82-
foreach (var a in AddPropertyRouteExtension.GetInvocationListTyped())
83-
a(mi, m);
89+
foreach (var a in PropertyRouteExtension.GetInvocationListTyped())
90+
{
91+
mi = a(mi, m)!;
92+
if (mi == null)
93+
return null;
94+
}
8495

8596
return mi;
8697
}
8798

8899

89-
public static event Action<MemberInfoTS, FieldInfo>? AddFieldInfoExtension;
90-
static MemberInfoTS OnAddFieldInfoExtension(MemberInfoTS mi, FieldInfo m)
100+
public static event Func<MemberInfoTS, FieldInfo, MemberInfoTS?>? FieldInfoExtension;
101+
static MemberInfoTS? OnFieldInfoExtension(MemberInfoTS mi, FieldInfo m)
91102
{
92-
if (AddFieldInfoExtension == null)
103+
if (FieldInfoExtension == null)
93104
return mi;
94105

95-
foreach (var a in AddFieldInfoExtension.GetInvocationListTyped())
96-
a(mi, m);
106+
foreach (var a in FieldInfoExtension.GetInvocationListTyped())
107+
{
108+
mi = a(mi, m)!;
109+
if (mi == null)
110+
return null;
111+
}
97112

98113
return mi;
99114
}
100115

101-
public static event Action<OperationInfoTS, OperationInfo, Type>? AddOperationExtension;
102-
static OperationInfoTS OnAddOperationExtension(OperationInfoTS oi, OperationInfo o, Type type)
116+
public static event Func<OperationInfoTS, OperationInfo, Type, OperationInfoTS?>? OperationExtension;
117+
static OperationInfoTS? OnOperationExtension(OperationInfoTS oi, OperationInfo o, Type type)
103118
{
104-
if (AddOperationExtension == null)
119+
if (OperationExtension == null)
105120
return oi;
106121

107-
foreach (var a in AddOperationExtension.GetInvocationListTyped())
108-
a(oi, o, type);
122+
foreach (var a in OperationExtension.GetInvocationListTyped())
123+
{
124+
oi = a(oi, o, type)!;
125+
if (oi == null)
126+
return null;
127+
}
109128

110129
return oi;
111130
}
112131

113-
114-
115132
public static HashSet<Type> ExcludeTypes = new HashSet<Type>();
116133

117134
internal static Dictionary<string, TypeInfoTS> GetTypeInfoTS()
@@ -167,7 +184,7 @@ where typeof(ModelEntity).IsAssignableFrom(type) && !type.IsAbstract
167184
where !type.IsEnumEntity() && !ReflectionServer.ExcludeTypes.Contains(type)
168185
let descOptions = LocalizedAssembly.GetDescriptionOptions(type)
169186
let allOperations = !type.IsEntity() ? null : OperationLogic.GetAllOperationInfos(type)
170-
select KeyValuePair.Create(GetTypeName(type), OnAddTypeExtension(new TypeInfoTS
187+
select KeyValuePair.Create(GetTypeName(type), OnTypeExtension(new TypeInfoTS
171188
{
172189
Kind = KindOfType.Entity,
173190
FullName = type.FullName!,
@@ -182,7 +199,7 @@ select KeyValuePair.Create(GetTypeName(type), OnAddTypeExtension(new TypeInfoTS
182199
QueryDefined = queries.QueryDefined(type),
183200
Members = PropertyRoute.GenerateRoutes(type)
184201
.Where(pr => InTypeScript(pr))
185-
.ToDictionary(p => p.PropertyString(), p =>
202+
.Select(p =>
186203
{
187204
var validators = Validator.TryGetPropertyValidator(p)?.Validators;
188205

@@ -196,19 +213,24 @@ select KeyValuePair.Create(GetTypeName(type), OnAddTypeExtension(new TypeInfoTS
196213
Unit = UnitAttribute.GetTranslation(p.PropertyInfo?.GetCustomAttribute<UnitAttribute>()?.UnitName),
197214
Type = new TypeReferenceTS(IsId(p) ? PrimaryKey.Type(type).Nullify() : p.PropertyInfo!.PropertyType, p.Type.IsMList() ? p.Add("Item").TryGetImplementations() : p.TryGetImplementations()),
198215
IsMultiline = validators?.OfType<StringLengthValidatorAttribute>().FirstOrDefault()?.MultiLine ?? false,
199-
IsVirtualMList = p.IsVirtualMList(),
216+
IsVirtualMList = p.IsVirtualMList(),
200217
MaxLength = validators?.OfType<StringLengthValidatorAttribute>().FirstOrDefault()?.Max.DefaultToNull(-1),
201218
PreserveOrder = settings.FieldAttributes(p)?.OfType<PreserveOrderAttribute>().Any() ?? false,
202219
};
203220

204-
return OnAddPropertyRouteExtension(mi, p);
205-
}),
221+
return KeyValuePair.Create(p.PropertyString(), OnPropertyRouteExtension(mi, p)!);
222+
})
223+
.Where(kvp => kvp.Value != null)
224+
.ToDictionaryEx("properties"),
206225

207-
Operations = allOperations == null ? null : allOperations.ToDictionary(oi => oi.OperationSymbol.Key, oi => OnAddOperationExtension(new OperationInfoTS(oi), oi, type)),
226+
HasConstructorOperation = allOperations != null && allOperations.Any(oi => oi.OperationType == OperationType.Constructor),
227+
Operations = allOperations == null ? null : allOperations.Select(oi => KeyValuePair.Create(oi.OperationSymbol.Key, OnOperationExtension(new OperationInfoTS(oi), oi, type)!)).Where(kvp => kvp.Value != null).ToDictionaryEx("operations"),
208228

209229
RequiresEntityPack = allOperations != null && allOperations.Any(oi => oi.HasCanExecute != null),
210230

211-
}, type))).ToDictionaryEx("entities");
231+
}, type)))
232+
.Where(kvp => kvp.Value != null)
233+
.ToDictionaryEx("entities");
212234

213235
return result;
214236
}
@@ -248,19 +270,23 @@ where type.IsEnum
248270
where descOptions != DescriptionOptions.None
249271
let kind = type.Name.EndsWith("Query") ? KindOfType.Query :
250272
type.Name.EndsWith("Message") ? KindOfType.Message : KindOfType.Enum
251-
select KeyValuePair.Create(GetTypeName(type), OnAddTypeExtension(new TypeInfoTS
273+
select KeyValuePair.Create(GetTypeName(type), OnTypeExtension(new TypeInfoTS
252274
{
253275
Kind = kind,
254276
FullName = type.FullName!,
255277
NiceName = descOptions.HasFlag(DescriptionOptions.Description) ? type.NiceName() : null,
256278
Members = type.GetFields(staticFlags)
257279
.Where(fi => kind != KindOfType.Query || queries.QueryDefined(fi.GetValue(null)!))
258-
.ToDictionary(fi => fi.Name, fi => OnAddFieldInfoExtension(new MemberInfoTS
280+
.Select(fi => KeyValuePair.Create(fi.Name, OnFieldInfoExtension(new MemberInfoTS
259281
{
260282
NiceName = fi.NiceName(),
261283
IsIgnoredEnum = kind == KindOfType.Enum && fi.HasAttribute<IgnoreAttribute>()
262-
}, fi)),
263-
}, type))).ToDictionaryEx("enums");
284+
}, fi)!))
285+
.Where(a=>a.Value != null)
286+
.ToDictionaryEx("query"),
287+
}, type)))
288+
.Where(a => a.Value != null)
289+
.ToDictionaryEx("enums");
264290

265291
return result;
266292
}
@@ -271,7 +297,7 @@ public static Dictionary<string, TypeInfoTS> GetSymbolContainers(IEnumerable<Typ
271297

272298
var result = (from type in allTypes
273299
where type.IsStaticClass() && type.HasAttribute<AutoInitAttribute>()
274-
select KeyValuePair.Create(GetTypeName(type), OnAddTypeExtension(new TypeInfoTS
300+
select KeyValuePair.Create(GetTypeName(type), OnTypeExtension(new TypeInfoTS
275301
{
276302
Kind = KindOfType.SymbolContainer,
277303
FullName = type.FullName!,
@@ -280,13 +306,15 @@ select KeyValuePair.Create(GetTypeName(type), OnAddTypeExtension(new TypeInfoTS
280306
.Where(s =>
281307
s.FieldInfo != null && /*Duplicated like in Dynamic*/
282308
s.IdOrNull.HasValue /*Not registered*/)
283-
.ToDictionary(s => s.FieldInfo.Name, s => OnAddFieldInfoExtension(new MemberInfoTS
309+
.Select(s => KeyValuePair.Create(s.FieldInfo.Name, OnFieldInfoExtension(new MemberInfoTS
284310
{
285311
NiceName = s.FieldInfo.NiceName(),
286312
Id = s.IdOrNull!.Value.Object
287-
}, s.FieldInfo))
313+
}, s.FieldInfo)!))
314+
.Where(a => a.Value != null)
315+
.ToDictionaryEx("fields"),
288316
}, type)))
289-
.Where(a => a.Value.Members.Any())
317+
.Where(a => a.Value != null && a.Value.Members.Any())
290318
.ToDictionaryEx("symbols");
291319

292320
return result;
@@ -340,9 +368,11 @@ public class TypeInfoTS
340368
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "toStringFunction")]
341369
public string? ToStringFunction { get; set; }
342370
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore, PropertyName = "queryDefined")]
343-
public bool QueryDefined { get; internal set; }
371+
public bool QueryDefined { get; set; }
344372
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "members")]
345373
public Dictionary<string, MemberInfoTS> Members { get; set; } = null!;
374+
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore, PropertyName = "hasConstructorOperation")]
375+
public bool HasConstructorOperation { get; set; }
346376
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "operations")]
347377
public Dictionary<string, OperationInfoTS>? Operations { get; set; }
348378
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore, PropertyName = "requiresEntityPack")]

Signum.React/Facades/SignumServer.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Signum.Engine.Maps;
1212
using Signum.Engine.Operations;
1313
using Signum.Entities;
14+
using Signum.Entities.Basics;
1415
using Signum.React.ApiControllers;
1516
using Signum.React.Filters;
1617
using Signum.React.Json;
@@ -85,6 +86,8 @@ public static void Start(IApplicationBuilder app, IWebHostEnvironment hostingEnv
8586
SignumControllerFactory.RegisterArea(MethodInfo.GetCurrentMethod()!);
8687

8788
ReflectionServer.Start();
89+
ReflectionServer.OverrideIsNamespaceAllowed.Add(typeof(DayOfWeek).Namespace!, () => UserHolder.Current != null);
90+
ReflectionServer.OverrideIsNamespaceAllowed.Add(typeof(CollectionMessage).Namespace!, () => UserHolder.Current != null);
8891
}
8992

9093
public static EntityPackTS GetEntityPack(Entity entity)

Signum.React/Scripts/Constructor.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Dic } from './Globals';
22
import { Entity, ModifiableEntity, SelectorMessage, EntityPack } from './Signum.Entities';
3-
import { Type, getTypeInfo, OperationType, New, OperationInfo, PropertyRoute } from './Reflection';
3+
import { Type, getTypeInfo, OperationType, New, OperationInfo, PropertyRoute, tryGetTypeInfo } from './Reflection';
44
import SelectorModal from './SelectorModal';
55
import * as Operations from './Operations';
66
import * as Navigator from './Navigator';
@@ -20,10 +20,9 @@ export function constructPack(type: string | Type<any>, props?: any, pr?: Proper
2020

2121
const typeName = (type as Type<any>).typeName ?? type as string;
2222

23-
const ti = getTypeInfo(typeName);
23+
const ti = tryGetTypeInfo(typeName);
2424
if (ti)
2525
pr = PropertyRoute.root(ti);
26-
2726

2827
const c = customConstructors[typeName];
2928
if (c)

Signum.React/Scripts/Finder.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import { TypeEntity, QueryEntity } from './Signum.Entities.Basics';
2121

2222
import {
2323
Type, IType, EntityKind, QueryKey, getQueryNiceName, getQueryKey, isQueryDefined, TypeReference,
24-
getTypeInfo, getTypeInfos, getEnumInfo, toMomentFormat, toNumbroFormat, PseudoType, EntityData,
25-
TypeInfo, PropertyRoute, QueryTokenString
24+
getTypeInfo, tryGetTypeInfos, getEnumInfo, toMomentFormat, toNumbroFormat, PseudoType, EntityData,
25+
TypeInfo, PropertyRoute, QueryTokenString, getTypeInfos
2626
} from './Reflection';
2727

2828
import SearchModal from './SearchControl/SearchModal';
@@ -223,7 +223,7 @@ export function findOptionsPathQuery(fo: FindOptions, extra?: any): any {
223223
export function getTypeNiceName(tr: TypeReference) {
224224

225225
const niceName = tr.typeNiceName ??
226-
getTypeInfos(tr)
226+
tryGetTypeInfos(tr)
227227
.map(ti => ti == undefined ? getSimpleTypeNiceName(tr.name) : (ti.niceName ?? ti.name))
228228
.joinComma(External.CollectionMessage.Or.niceToString());
229229

@@ -581,7 +581,7 @@ export function parseFindOptions(findOptions: FindOptions, qd: QueryDescription,
581581
fo.columnOptions = mergeColumns(Dic.getValues(qd.columns), fo.columnOptionsMode ?? "Add", fo.columnOptions ?? []);
582582

583583
var qs: QuerySettings | undefined = querySettings[qd.queryKey];
584-
const tis = getTypeInfos(qd.columns["Entity"].type);
584+
const tis = tryGetTypeInfos(qd.columns["Entity"].type);
585585

586586

587587
if (!fo.groupResults && (!fo.orderOptions || fo.orderOptions.length == 0)) {
@@ -1515,7 +1515,7 @@ export const entityFormatRules: EntityFormatRule[] = [
15151515
{
15161516
name: "View",
15171517
isApplicable: row => true,
1518-
formatter: (row, columns, sc) => !row.entity || !Navigator.isNavigable(row.entity.EntityType, undefined, true) ? undefined :
1518+
formatter: (row, columns, sc) => !row.entity || !Navigator.isNavigable(row.entity.EntityType, { isSearch: true }) ? undefined :
15191519
<EntityLink lite={row.entity}
15201520
inSearch={true}
15211521
onNavigated={sc?.handleOnNavigated}

Signum.React/Scripts/Frames/FrameModal.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { ValidationError } from '../Services'
88
import { ifError } from '../Globals'
99
import { TypeContext, StyleOptions, EntityFrame, IHasChanges } from '../TypeContext'
1010
import { Entity, Lite, ModifiableEntity, JavascriptMessage, NormalWindowMessage, getToString, EntityPack, entityInfo, isEntityPack, isLite, is, isEntity } from '../Signum.Entities'
11-
import { getTypeInfo, PropertyRoute, ReadonlyBinding, GraphExplorer, isTypeModel } from '../Reflection'
11+
import { getTypeInfo, PropertyRoute, ReadonlyBinding, GraphExplorer, isTypeModel, tryGetTypeInfo } from '../Reflection'
1212
import { ValidationErrors, ValidationErrorHandle } from './ValidationErrors'
1313
import { renderWidgets, WidgetContext, renderEmbeddedWidgets } from './Widgets'
1414
import { EntityOperationContext } from '../Operations'
@@ -67,7 +67,7 @@ export const FrameModal = React.forwardRef(function FrameModal(p: FrameModalProp
6767
}));
6868

6969
const typeName = getTypeName(p.entityOrPack);
70-
const typeInfo = getTypeInfo(typeName);
70+
const typeInfo = tryGetTypeInfo(typeName);
7171

7272

7373
React.useEffect(() => {
@@ -214,7 +214,7 @@ export const FrameModal = React.forwardRef(function FrameModal(p: FrameModalProp
214214
};
215215

216216
const styleOptions: StyleOptions = {
217-
readOnly: p.readOnly != undefined ? p.readOnly : Navigator.isReadOnly(pc.pack),
217+
readOnly: p.readOnly != undefined ? p.readOnly : Navigator.isReadOnly(pc.pack, { isEmbedded: p.propertyRoute?.member?.type.isEmbedded }),
218218
frame: frame,
219219
};
220220

@@ -316,9 +316,9 @@ export function FrameModalTitle({ pack, pr, title, getViewPromise }: { pack?: En
316316
if (entity == undefined || entity.isNew)
317317
return undefined;
318318

319-
const ti = getTypeInfo(entity.Type);
319+
const ti = tryGetTypeInfo(entity.Type);
320320

321-
if (ti == undefined || !Navigator.isNavigable(ti, false)) //Embedded
321+
if (ti == undefined || !Navigator.isNavigable(ti)) //Embedded
322322
return undefined;
323323

324324
return (

Signum.React/Scripts/Frames/FramePage.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,10 @@ export default function FramePage(p: FramePageProps) {
3535
const mounted = useMounted();
3636
const forceUpdate = useForceUpdate();
3737

38-
const type = getTypeInfo(p.match.params.type).name;
38+
const ti = getTypeInfo(p.match.params.type);
39+
const type = ti.name;
3940
const id = p.match.params.id;
4041

41-
const ti = getTypeInfo(type);
42-
4342
useTitle(state?.pack.entity.toStr ?? "", [state?.pack.entity]);
4443

4544
React.useEffect(() => {

0 commit comments

Comments
 (0)