@mj-biz-apps/committees-entities 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,19 @@
1
+ import { ValidationResult } from '@memberjunction/core';
2
+ import { mjBizAppsCommitteesMeetingEntity } from '../generated/entity_subclasses.js';
3
+ /**
4
+ * Custom Meeting entity.
5
+ *
6
+ * Validation rules:
7
+ * - EndDateTime, if set, must be after StartDateTime
8
+ * - Virtual/Hybrid meetings should have a VideoProviderID or VideoJoinURL
9
+ *
10
+ * Note: Auto-provisioning of VideoJoinURL via the video provider API is handled
11
+ * server-side by VideoProviderService / ProvisionVideoMeeting GraphQL mutation,
12
+ * not in this client-safe entity class.
13
+ */
14
+ export declare class MeetingEntityCustom extends mjBizAppsCommitteesMeetingEntity {
15
+ Validate(): ValidationResult;
16
+ private validateEndDateAfterStart;
17
+ }
18
+ export declare function LoadCustomMeetingEntity(): void;
19
+ //# sourceMappingURL=MeetingEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeetingEntity.d.ts","sourceRoot":"","sources":["../../src/custom/MeetingEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,gBAAgB,EAA4C,MAAM,sBAAsB,CAAC;AAE9G,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAElF;;;;;;;;;;GAUG;AACH,qBACa,mBAAoB,SAAQ,gCAAgC;IAErD,QAAQ,IAAI,gBAAgB;IAS5C,OAAO,CAAC,yBAAyB;CAUpC;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAAG"}
@@ -0,0 +1,39 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BaseEntity, ValidationErrorInfo, ValidationErrorType } from '@memberjunction/core';
8
+ import { RegisterClass } from '@memberjunction/global';
9
+ import { mjBizAppsCommitteesMeetingEntity } from '../generated/entity_subclasses.js';
10
+ /**
11
+ * Custom Meeting entity.
12
+ *
13
+ * Validation rules:
14
+ * - EndDateTime, if set, must be after StartDateTime
15
+ * - Virtual/Hybrid meetings should have a VideoProviderID or VideoJoinURL
16
+ *
17
+ * Note: Auto-provisioning of VideoJoinURL via the video provider API is handled
18
+ * server-side by VideoProviderService / ProvisionVideoMeeting GraphQL mutation,
19
+ * not in this client-safe entity class.
20
+ */
21
+ let MeetingEntityCustom = class MeetingEntityCustom extends mjBizAppsCommitteesMeetingEntity {
22
+ Validate() {
23
+ const result = super.Validate();
24
+ this.validateEndDateAfterStart(result);
25
+ result.Success = result.Success && result.Errors.length === 0;
26
+ return result;
27
+ }
28
+ validateEndDateAfterStart(result) {
29
+ if (this.EndDateTime && this.StartDateTime && this.EndDateTime <= this.StartDateTime) {
30
+ result.Errors.push(new ValidationErrorInfo('EndDateTime', 'End date/time must be after start date/time.', this.EndDateTime, ValidationErrorType.Failure));
31
+ }
32
+ }
33
+ };
34
+ MeetingEntityCustom = __decorate([
35
+ RegisterClass(BaseEntity, 'Meetings', 1)
36
+ ], MeetingEntityCustom);
37
+ export { MeetingEntityCustom };
38
+ export function LoadCustomMeetingEntity() { }
39
+ //# sourceMappingURL=MeetingEntity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeetingEntity.js","sourceRoot":"","sources":["../../src/custom/MeetingEntity.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAoB,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC9G,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAElF;;;;;;;;;;GAUG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,gCAAgC;IAErD,QAAQ;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAEhC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAEvC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,yBAAyB,CAAC,MAAwB;QACtD,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACnF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CACtC,aAAa,EACb,8CAA8C,EAC9C,IAAI,CAAC,WAAW,EAChB,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;CACJ,CAAA;AArBY,mBAAmB;IAD/B,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;GAC5B,mBAAmB,CAqB/B;;AAED,MAAM,UAAU,uBAAuB,KAAU,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { ValidationResult } from '@memberjunction/core';
2
+ import { mjBizAppsCommitteesMembershipEntity } from '../generated/entity_subclasses.js';
3
+ /**
4
+ * Custom Membership entity with business rule validation:
5
+ * - No duplicate active memberships (same person + same term)
6
+ * - End date must be after start date
7
+ * - Status='Active' requires a Role to be assigned
8
+ * - Auto-sets EndDate when Status changes to 'Ended'
9
+ *
10
+ * Registered with priority 1 to override the generated class.
11
+ */
12
+ export declare class MembershipEntityCustom extends mjBizAppsCommitteesMembershipEntity {
13
+ get Status(): mjBizAppsCommitteesMembershipEntity['Status'];
14
+ set Status(value: mjBizAppsCommitteesMembershipEntity['Status']);
15
+ Validate(): ValidationResult;
16
+ ValidateAsync(): Promise<ValidationResult>;
17
+ /**
18
+ * Validates that EndDate, if provided, is after StartDate.
19
+ */
20
+ private ValidateEndDateAfterStartDate;
21
+ /**
22
+ * Validates that Active memberships always have a Role assigned.
23
+ */
24
+ private ValidateRoleRequiredForActive;
25
+ /**
26
+ * Validates that no other Active membership exists for the same person + term.
27
+ * Skipped on updates where PersonID and TermID have not changed.
28
+ */
29
+ private ValidateNoDuplicateActiveMembership;
30
+ }
31
+ export declare function LoadCustomMembershipEntity(): void;
32
+ //# sourceMappingURL=MembershipEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MembershipEntity.d.ts","sourceRoot":"","sources":["../../src/custom/MembershipEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,gBAAgB,EAAqD,MAAM,sBAAsB,CAAC;AAEzI,OAAO,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC;AAErF;;;;;;;;GAQG;AACH,qBACa,sBAAuB,SAAQ,mCAAmC;IAK3E,IAAa,MAAM,IAAI,mCAAmC,CAAC,QAAQ,CAAC,CAEnE;IACD,IAAa,MAAM,CAAC,KAAK,EAAE,mCAAmC,CAAC,QAAQ,CAAC,EAKvE;IAEe,QAAQ,IAAI,gBAAgB;IAUtB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAShE;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAWrC;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAWrC;;;OAGG;YACW,mCAAmC;CAyBpD;AAED,wBAAgB,0BAA0B,SAAM"}
@@ -0,0 +1,89 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BaseEntity, ValidationErrorInfo, ValidationErrorType, RunView } from '@memberjunction/core';
8
+ import { RegisterClass } from '@memberjunction/global';
9
+ import { mjBizAppsCommitteesMembershipEntity } from '../generated/entity_subclasses.js';
10
+ /**
11
+ * Custom Membership entity with business rule validation:
12
+ * - No duplicate active memberships (same person + same term)
13
+ * - End date must be after start date
14
+ * - Status='Active' requires a Role to be assigned
15
+ * - Auto-sets EndDate when Status changes to 'Ended'
16
+ *
17
+ * Registered with priority 1 to override the generated class.
18
+ */
19
+ let MembershipEntityCustom = class MembershipEntityCustom extends mjBizAppsCommitteesMembershipEntity {
20
+ // Override Status setter to auto-set EndDate when membership is ended.
21
+ // Get/Set here mirror the generated accessor implementation — using the
22
+ // typed property inside its own override would recurse.
23
+ get Status() {
24
+ return this.Get('Status');
25
+ }
26
+ set Status(value) {
27
+ this.Set('Status', value);
28
+ if (value === 'Ended' && !this.EndDate) {
29
+ this.EndDate = new Date();
30
+ }
31
+ }
32
+ Validate() {
33
+ const result = super.Validate();
34
+ this.ValidateEndDateAfterStartDate(result);
35
+ this.ValidateRoleRequiredForActive(result);
36
+ result.Success = result.Success && (result.Errors.length === 0);
37
+ return result;
38
+ }
39
+ async ValidateAsync() {
40
+ const result = await super.ValidateAsync();
41
+ await this.ValidateNoDuplicateActiveMembership(result);
42
+ result.Success = result.Success && (result.Errors.length === 0);
43
+ return result;
44
+ }
45
+ /**
46
+ * Validates that EndDate, if provided, is after StartDate.
47
+ */
48
+ ValidateEndDateAfterStartDate(result) {
49
+ if (this.EndDate && this.StartDate && this.EndDate < this.StartDate) {
50
+ result.Errors.push(new ValidationErrorInfo('EndDate', 'End date must be after start date.', this.EndDate, ValidationErrorType.Failure));
51
+ }
52
+ }
53
+ /**
54
+ * Validates that Active memberships always have a Role assigned.
55
+ */
56
+ ValidateRoleRequiredForActive(result) {
57
+ if (this.Status === 'Active' && !this.RoleID) {
58
+ result.Errors.push(new ValidationErrorInfo('RoleID', 'A role must be assigned before setting membership to Active.', this.RoleID, ValidationErrorType.Failure));
59
+ }
60
+ }
61
+ /**
62
+ * Validates that no other Active membership exists for the same person + term.
63
+ * Skipped on updates where PersonID and TermID have not changed.
64
+ */
65
+ async ValidateNoDuplicateActiveMembership(result) {
66
+ if (this.Status !== 'Active' || !this.PersonID || !this.TermID) {
67
+ return;
68
+ }
69
+ // This entity owns a provider — route the query through it and carry the
70
+ // entity's user context (MJ rule: never reach for the global provider here).
71
+ // The concrete provider implements both interfaces; the cast bridges the
72
+ // disjoint IEntityDataProvider/IRunViewProvider declarations.
73
+ const rv = new RunView(this.ProviderToUse);
74
+ const dupeCheck = await rv.RunView({
75
+ EntityName: 'Committees: Memberships',
76
+ ExtraFilter: `PersonID='${this.PersonID}' AND TermID='${this.TermID}' AND Status='Active' AND ID<>'${this.ID}'`,
77
+ ResultType: 'simple',
78
+ }, this.ContextCurrentUser);
79
+ if (dupeCheck.Success && dupeCheck.Results.length > 0) {
80
+ result.Errors.push(new ValidationErrorInfo('PersonID', 'This person already has an active membership for the selected term.', this.PersonID, ValidationErrorType.Failure));
81
+ }
82
+ }
83
+ };
84
+ MembershipEntityCustom = __decorate([
85
+ RegisterClass(BaseEntity, 'Memberships', 1)
86
+ ], MembershipEntityCustom);
87
+ export { MembershipEntityCustom };
88
+ export function LoadCustomMembershipEntity() { }
89
+ //# sourceMappingURL=MembershipEntity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MembershipEntity.js","sourceRoot":"","sources":["../../src/custom/MembershipEntity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { BaseEntity } from "@memberjunction/core";
2
+ declare class ContactBaseEntityStub extends BaseEntity {
3
+ get FirstName(): string;
4
+ set FirstName(value: string);
5
+ }
6
+ export declare class ContactDemoEntity extends ContactBaseEntityStub {
7
+ get FirstName(): string;
8
+ set FirstName(value: string);
9
+ }
10
+ export {};
11
+ //# sourceMappingURL=demoContactEntitySubclass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoContactEntitySubclass.d.ts","sourceRoot":"","sources":["../../src/demo/demoContactEntitySubclass.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKlD,cAAM,qBAAsB,SAAQ,UAAU;IAC1C,IAAI,SAAS,IAAI,MAAM,CAEtB;IACD,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,EAC1B;CACJ;AAKD,qBACa,iBAAkB,SAAQ,qBAAqB;IACxD,IAAI,SAAS,IAAI,MAAM,CAGtB;IACD,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,EAG1B;CACJ"}
@@ -0,0 +1,35 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ //import { ContactBaseEntity } from "../generated/entity_subclasses.js";
8
+ import { BaseEntity } from "@memberjunction/core";
9
+ import { RegisterClass } from "@memberjunction/global";
10
+ // STUB base class- you would DELETE this and use a real base class from ../generated/entity_subclasses instead
11
+ class ContactBaseEntityStub extends BaseEntity {
12
+ get FirstName() {
13
+ return "";
14
+ }
15
+ set FirstName(value) {
16
+ }
17
+ }
18
+ // Super simple example of a sub-class for an example Contacts entity doesn't do anything but you can see here you can do stuff with sub-class overrides
19
+ // Also, important, if you're going to override the getter/setter for a property, you MUST call super.propertyName in the getter/setter AND you must also
20
+ // override BOTH the getter and setter, otherwise you'll get a runtime error! This is because the getter/setter is actually a single property on the object
21
+ let ContactDemoEntity = class ContactDemoEntity extends ContactBaseEntityStub /*here you would change this to sub-class the real base class from ../generated/entity_subclasses */ {
22
+ get FirstName() {
23
+ console.log("I'm getting the FirstName property from the sub-class!");
24
+ return super.FirstName;
25
+ }
26
+ set FirstName(value) {
27
+ super.FirstName = value;
28
+ console.log("I'm setting the FirstName property from the sub-class!");
29
+ }
30
+ };
31
+ ContactDemoEntity = __decorate([
32
+ RegisterClass(BaseEntity, 'Contacts', 1)
33
+ ], ContactDemoEntity);
34
+ export { ContactDemoEntity };
35
+ //# sourceMappingURL=demoContactEntitySubclass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoContactEntitySubclass.js","sourceRoot":"","sources":["../../src/demo/demoContactEntitySubclass.ts"],"names":[],"mappings":";;;;;;AAAA,qEAAqE;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,gHAAgH;AAChH,MAAM,qBAAsB,SAAQ,UAAU;IAC1C,IAAI,SAAS;QACT,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,SAAS,CAAC,KAAa;IAC3B,CAAC;CACJ;AAED,yJAAyJ;AACzJ,yJAAyJ;AACzJ,2JAA2J;AAEpJ,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,qBAAqB,CAAC,oGAAoG;IAC7J,IAAI,SAAS;QACT,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;QACrE,OAAO,KAAK,CAAC,SAAS,CAAC;IAC3B,CAAC;IACD,IAAI,SAAS,CAAC,KAAa;QACvB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;IACzE,CAAC;CACJ,CAAA;AATY,iBAAiB;IAD7B,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;GAC5B,iBAAiB,CAS7B"}