@cccteam/ccc-lib 0.0.17 → 0.0.18
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.
- package/fesm2022/cccteam-ccc-lib-src-ccc-resource.mjs +26 -27
- package/fesm2022/cccteam-ccc-lib-src-ccc-resource.mjs.map +1 -1
- package/fesm2022/cccteam-ccc-lib-src-types.mjs +13 -2
- package/fesm2022/cccteam-ccc-lib-src-types.mjs.map +1 -1
- package/fesm2022/cccteam-ccc-lib.mjs +37 -28
- package/fesm2022/cccteam-ccc-lib.mjs.map +1 -1
- package/package.json +1 -1
- package/types/cccteam-ccc-lib-src-types.d.ts +14 -7
- package/types/cccteam-ccc-lib.d.ts +13 -7
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, Directive, InjectionToken } from '@angular/core';
|
|
2
3
|
|
|
3
4
|
// Shared types and constants used across the ccc-resource module
|
|
4
5
|
// This file exists to break circular dependencies between types and ccc-resource
|
|
@@ -224,6 +225,16 @@ function rootConfig(config) {
|
|
|
224
225
|
...config,
|
|
225
226
|
};
|
|
226
227
|
}
|
|
228
|
+
class CustomConfigComponent {
|
|
229
|
+
uuid = input(undefined, { ...(ngDevMode ? { debugName: "uuid" } : {}) });
|
|
230
|
+
parentData = input(undefined, { ...(ngDevMode ? { debugName: "parentData" } : {}) });
|
|
231
|
+
config = input(undefined, { ...(ngDevMode ? { debugName: "config" } : {}) });
|
|
232
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.2", ngImport: i0, type: CustomConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
233
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.2", type: CustomConfigComponent, isStandalone: true, inputs: { uuid: { classPropertyName: "uuid", publicName: "uuid", isSignal: true, isRequired: false, transformFunction: null }, parentData: { classPropertyName: "parentData", publicName: "parentData", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
234
|
+
}
|
|
235
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.2", ngImport: i0, type: CustomConfigComponent, decorators: [{
|
|
236
|
+
type: Directive
|
|
237
|
+
}], propDecorators: { uuid: [{ type: i0.Input, args: [{ isSignal: true, alias: "uuid", required: false }] }], parentData: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentData", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }] } });
|
|
227
238
|
function componentConfig(config) {
|
|
228
239
|
return {
|
|
229
240
|
...componentConfigDefaults,
|
|
@@ -427,5 +438,5 @@ function createResourceValidator(validator) {
|
|
|
427
438
|
* Generated bundle index. Do not edit.
|
|
428
439
|
*/
|
|
429
440
|
|
|
430
|
-
export { API_URL, AVAILABLE_DOMAINS, AVAILABLE_PERMISSIONS, AlertLevel, BASE_URL, FRONTEND_LOGIN_PATH, IDLE_KEEPALIVE_DURATION, IDLE_SESSION_DURATION, IDLE_WARNING_DURATION, METHOD_META, PERMISSION_REQUIRED, RESOURCE_META, ReadPermission, SESSION_PATH, UpdatePermission, actionButtonConfig, actionButtonConfigDefaults, additionalResourceConfig, additionalResourceConfigDefaults, arrayConfig, arrayConfigDefaults, componentConfig, componentConfigDefaults, computedDisplayField, computedDisplayFieldElementDefaults, createResourceValidator, defaultEmptyFieldValue, enumeratedConfig, enumeratedConfigDefaults, field, fieldElementDefaults, fieldSort, fieldSortDefaults, foreignKeyDefault, foreignKeyDefaultDefaults, listViewConfig, listViewConfigDefaults, multiColumnConfig, multiColumnConfigDefaults, nullBooleanConfig, nullBooleanConfigDefaults, padding, paddingElementDefaults, requiredIf, rootConfig, rootConfigDefaults, rpcConfig, rpcConfigDefaults, section, sectionElementDefaults, singleColumnConfig, singleColumnConfigDefaults, staticDefault, staticDefaultDefaults, switchParams, switchParamsDefaults, validatorsPresent, viewConfig, viewConfigDefaults };
|
|
441
|
+
export { API_URL, AVAILABLE_DOMAINS, AVAILABLE_PERMISSIONS, AlertLevel, BASE_URL, CustomConfigComponent, FRONTEND_LOGIN_PATH, IDLE_KEEPALIVE_DURATION, IDLE_SESSION_DURATION, IDLE_WARNING_DURATION, METHOD_META, PERMISSION_REQUIRED, RESOURCE_META, ReadPermission, SESSION_PATH, UpdatePermission, actionButtonConfig, actionButtonConfigDefaults, additionalResourceConfig, additionalResourceConfigDefaults, arrayConfig, arrayConfigDefaults, componentConfig, componentConfigDefaults, computedDisplayField, computedDisplayFieldElementDefaults, createResourceValidator, defaultEmptyFieldValue, enumeratedConfig, enumeratedConfigDefaults, field, fieldElementDefaults, fieldSort, fieldSortDefaults, foreignKeyDefault, foreignKeyDefaultDefaults, listViewConfig, listViewConfigDefaults, multiColumnConfig, multiColumnConfigDefaults, nullBooleanConfig, nullBooleanConfigDefaults, padding, paddingElementDefaults, requiredIf, rootConfig, rootConfigDefaults, rpcConfig, rpcConfigDefaults, section, sectionElementDefaults, singleColumnConfig, singleColumnConfigDefaults, staticDefault, staticDefaultDefaults, switchParams, switchParamsDefaults, validatorsPresent, viewConfig, viewConfigDefaults };
|
|
431
442
|
//# sourceMappingURL=cccteam-ccc-lib-src-types.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cccteam-ccc-lib-src-types.mjs","sources":["../../../projects/ccc-lib/src/types/resource-types.ts","../../../projects/ccc-lib/src/types/configs.ts","../../../projects/ccc-lib/src/types/notification-message.ts","../../../projects/ccc-lib/src/types/permissions.ts","../../../projects/ccc-lib/src/types/resource-meta.ts","../../../projects/ccc-lib/src/types/tokens.ts","../../../projects/ccc-lib/src/types/validators.ts","../../../projects/ccc-lib/src/types/cccteam-ccc-lib-src-types.ts"],"sourcesContent":["// Shared types and constants used across the ccc-resource module\n// This file exists to break circular dependencies between types and ccc-resource\n\nexport const defaultEmptyFieldValue = '-';\n\nexport type NullBoolean = null | true | false;\n\nexport type ConcatFn = 'space-concat' | 'hyphen-concat' | 'space-hyphen-concat' | 'hyphen-space-concat';\n","import { TooltipPosition } from '@angular/material/tooltip';\nimport { FieldName, Method, Resource } from './permissions';\nimport { ConcatFn, defaultEmptyFieldValue, NullBoolean } from './resource-types';\nimport { ResourceValidatorFn } from './validators';\n\nexport interface FieldPointer {\n field: FieldName;\n}\n\nexport interface MenuItem {\n label: string;\n route?: string[];\n children?: MenuItem[];\n}\n\nexport interface RouteResourceData {\n config: RootConfig;\n}\n\nexport type DataType = string | number | number[] | string[] | boolean | undefined | Date;\nexport type RecordData = Record<string, DataType | null>;\n\nexport type RPCDataType = string | number | string[] | number[] | boolean | Date;\nexport type RPCRecordData = Record<string, RPCDataType>;\nexport type RpcMethod = Record<string, DataType>;\n\nexport type ParentResourceConfig = ListViewConfig | ViewConfig | ArrayConfig;\nexport type ChildResourceConfig = ListViewConfig | ViewConfig | ComponentConfig | ArrayConfig;\n\nexport type ActionType = 'function' | 'link';\n\nexport type ListConcatFn =\n | 'space-concat'\n | 'hyphen-concat'\n | 'space-hyphen-concat'\n | 'hyphen-space-concat'\n | 'no-space-concat';\nexport type ConfigType = ChildResourceConfig;\nexport type FormatType = 'simpleSlashDateFormat';\nexport type RPCPlacement = 'inline' | 'end';\n\nexport type ColumnConfig = SingleColumnConfig | MultiColumnConfig;\n\nexport interface ActionButtonConfig {\n label: string;\n icon: string;\n action?: (resource: { id: string }) => void;\n viewRoute?: string;\n actionType?: ActionType;\n color?: string;\n disabledLabel?: string;\n}\nexport interface ActionButtonConfigOptions {\n label: string;\n icon: string;\n action?: (resource: { id: string }) => void;\n viewRoute?: string;\n actionType?: ActionType;\n color?: string;\n disabledLabel?: string;\n}\n\nexport function actionButtonConfig(config: ActionButtonConfigOptions): ActionButtonConfig {\n return {\n ...actionButtonConfigDefaults,\n ...config,\n } satisfies ActionButtonConfig;\n}\n\nexport const actionButtonConfigDefaults = {\n label: '',\n icon: '',\n actionType: 'function' as ActionType,\n color: '',\n disabledLabel: '',\n} satisfies ActionButtonConfig;\n\nexport interface SingleColumnConfig {\n id: FieldName;\n header?: string;\n width?: number;\n resizable?: boolean;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n valueGetter?: (data: any) => string;\n valueFormatter?: (data: any) => string;\n tooltipPosition?: TooltipPosition;\n viewRoute?: Resource;\n buttonConfig?: ActionButtonConfig;\n actionType?: ActionType;\n formatType?: FormatType | string;\n hidden?: boolean;\n emptyDataValue?: DataType;\n filterable?: boolean;\n hideHeader?: boolean;\n}\nexport interface SingleColumnConfigOptions {\n id: FieldName;\n header?: string;\n width?: number;\n resizable?: boolean;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n valueGetter?: (data: any) => string;\n valueFormatter?: (data: any) => string;\n tooltipPosition?: TooltipPosition;\n viewRoute?: Resource;\n buttonConfig?: ActionButtonConfig;\n actionType?: ActionType;\n formatType?: FormatType | string;\n hidden?: boolean;\n emptyDataValue?: DataType;\n filterable?: boolean;\n hideHeader?: boolean;\n}\n\nexport function singleColumnConfig(config: SingleColumnConfigOptions): SingleColumnConfig {\n return {\n ...singleColumnConfigDefaults,\n ...config,\n } satisfies SingleColumnConfig;\n}\n\nexport const singleColumnConfigDefaults = {\n id: '' as FieldName,\n header: '',\n resizable: true,\n actionType: 'function' as ActionType,\n hidden: false,\n filterable: true,\n hideHeader: false,\n} satisfies SingleColumnConfig;\n\nexport interface MultiColumnConfig extends SingleColumnConfig {\n // todo: additionalIds name is not clear. the id provided is fetched from a different resource, such as a typeId\n additionalIds: AdditionalResourceConfig[];\n concatFn: ListConcatFn;\n}\nexport interface MultiColumnConfigOptions extends SingleColumnConfigOptions {\n additionalIds: AdditionalResourceConfig[];\n concatFn: ListConcatFn;\n}\n\nexport function multiColumnConfig(config: MultiColumnConfigOptions): MultiColumnConfig {\n return {\n ...multiColumnConfigDefaults,\n ...config,\n } satisfies MultiColumnConfig;\n}\n\nexport const multiColumnConfigDefaults = {\n ...singleColumnConfigDefaults,\n additionalIds: [] as AdditionalResourceConfig[],\n concatFn: 'hyphen-concat' as ListConcatFn,\n} satisfies MultiColumnConfig;\n\nexport interface AdditionalResourceConfig {\n resource?: Resource;\n id: FieldName;\n field?: FieldName;\n hidden?: boolean;\n}\nexport interface AdditionalResourceConfigOptions {\n id: FieldName;\n resource?: Resource;\n field?: FieldName;\n hidden?: boolean;\n}\n\nexport function additionalResourceConfig(config: AdditionalResourceConfigOptions): AdditionalResourceConfig {\n return {\n ...additionalResourceConfigDefaults,\n ...config,\n } satisfies AdditionalResourceConfig;\n}\n\nexport const additionalResourceConfigDefaults = {\n id: '' as FieldName,\n resource: '' as Resource,\n field: '' as FieldName,\n hidden: false,\n} satisfies AdditionalResourceConfig;\n\nexport interface FieldSort {\n field: FieldName;\n direction: 'asc' | 'desc';\n}\nexport interface FieldSortOptions {\n field: FieldName;\n direction?: 'asc' | 'desc';\n}\n\nexport function fieldSort(config: FieldSortOptions): FieldSort {\n return {\n ...fieldSortDefaults,\n ...config,\n } satisfies FieldSort;\n}\n\nexport const fieldSortDefaults = {\n field: '' as FieldName,\n direction: 'asc' as 'asc' | 'desc',\n} satisfies FieldSort;\n\nexport interface EnumeratedConfigOptions {\n // primaryResource comes from the metadata\n overrideResource?: Resource;\n /* A function to filter the list of enumerated options.\n * The `parentResource` argument contains the data of the resource that this enumerated field is part of.\n * It will be an object with the current form values, which can be empty during resource creation.\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n filter?: (resource: any) => string;\n /**\n * Set disableCacheForFilterPii to `true` to promote the GET to a POST when PII is used in the filter\n * POST requests cannot be cached\n */\n disableCacheForFilterPii?: boolean;\n /**\n * Specifies which resource data to pass to the filter function:\n * - 'rootResource': Pass in the root resource data\n * - 'parentResource': Pass in the parent resource data\n * @default 'parentResource'\n */\n filterType?: FilterType;\n sorts?: FieldSort[];\n listDisplay?: FieldName[];\n viewDisplay: FieldName[];\n viewConcatFn?: ConcatFn;\n listConcatFn?: ConcatFn;\n viewDetails?: boolean;\n searchable?: boolean;\n}\n\ntype FilterType = 'parentResource' | 'rootResource';\nexport interface EnumeratedConfig {\n overrideResource: Resource;\n filter: (resource: any) => string;\n disableCacheForFilterPii: boolean;\n filterType: FilterType;\n sorts: FieldSort[];\n listDisplay: FieldName[];\n viewDisplay: FieldName[];\n viewConcatFn: ConcatFn;\n listConcatFn: ConcatFn;\n viewDetails: boolean;\n searchable: boolean;\n}\nexport function enumeratedConfig(config: EnumeratedConfigOptions): EnumeratedConfig {\n return {\n ...enumeratedConfigDefaults,\n ...config,\n } satisfies EnumeratedConfig;\n}\nexport const enumeratedConfigDefaults = {\n overrideResource: '' as Resource,\n filter: (): string => '',\n disableCacheForFilterPii: false,\n filterType: 'parentResource' as FilterType,\n sorts: [] as FieldSort[],\n listDisplay: [] as FieldName[],\n viewDisplay: [] as FieldName[],\n viewConcatFn: 'hyphen-concat' as ConcatFn,\n listConcatFn: 'hyphen-concat' as ConcatFn,\n viewDetails: false,\n searchable: false,\n};\n\nexport type FieldDefault = ForeignKeyDefault | StaticDefault | null;\n\nexport interface NullBooleanConfigOptions {\n displayValues?: Record<'null' | 'true' | 'false', { label: string; value: NullBoolean }>;\n}\nexport interface NullBooleanConfig {\n /** This property maps the three possible values for this\n * nullboolean field with the display values users will see\n * on the screen for each\n */\n displayValues: Record<'null' | 'true' | 'false', { label: string; value: NullBoolean }>;\n\n /** TODO: In FUTURE PHASES once field change history is implemented\n * When this field is first displayed on screen, set the\n * value to null based on the value present in it.\n * Useful if the database doesn't have support nulling but you want\n * users to make a conscious selection, but the database\n * will either contain a true or false. Will need to check the\n * 'last edited' on the field to ensure that we don't repeatedly spam\n * users with this though\n */\n // nullOnEdit: {\n // nullIfTrue: boolean;\n // nullIfFalse: boolean;\n // };\n}\nexport function nullBooleanConfig(config: NullBooleanConfigOptions): NullBooleanConfig {\n return {\n ...nullBooleanConfigDefaults,\n ...config,\n } satisfies NullBooleanConfig;\n}\nconst defaultBooleanDisplay = Object.freeze({\n null: {\n label: defaultEmptyFieldValue,\n value: null,\n },\n true: {\n label: 'Yes',\n value: true,\n },\n false: {\n label: 'No',\n value: false,\n },\n});\n\nexport const nullBooleanConfigDefaults = {\n displayValues: defaultBooleanDisplay,\n};\n\nexport interface ForeignKeyDefaultOptions {\n parentId: FieldName;\n}\nexport interface ForeignKeyDefault {\n type: 'foreignKey';\n parentId: FieldName;\n}\nexport function foreignKeyDefault(config: ForeignKeyDefaultOptions): ForeignKeyDefault {\n return {\n ...foreignKeyDefaultDefaults,\n ...config,\n } satisfies ForeignKeyDefault;\n}\nexport const foreignKeyDefaultDefaults = {\n type: 'foreignKey',\n parentId: '' as FieldName,\n} satisfies ForeignKeyDefault;\n\nexport interface StaticDefault {\n type: 'static';\n value: string | boolean;\n}\nexport interface staticDefaultOptions {\n value: string | boolean;\n}\nexport function staticDefault(config: staticDefaultOptions): StaticDefault {\n return {\n ...staticDefaultDefaults,\n ...config,\n } satisfies StaticDefault;\n}\nexport const staticDefaultDefaults = {\n type: 'static',\n value: '',\n} satisfies StaticDefault;\n\nexport type Affix = string | remoteData | parentData;\n\ninterface remoteData {\n resource: Resource;\n id: FieldName;\n field: FieldName;\n}\n\ninterface parentData {\n field: FieldName;\n}\n\nexport type ConfigElement = FieldElement | SectionElement | ComputedDisplayFieldElement | PaddingElement;\n\nexport type ColSize = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\nexport interface ComputedDisplayFieldElementOptions {\n label?: string;\n class?: string;\n cols?: ColSize;\n calculatedValue?: (data: any) => string;\n shouldRender?: ((data: any) => boolean) | boolean;\n}\nexport interface ComputedDisplayFieldElement {\n type: 'computedDisplayField';\n label: string;\n class: string;\n cols: ColSize;\n calculatedValue: (data: any) => string;\n shouldRender: ((data: any) => boolean) | boolean;\n}\nexport function computedDisplayField(config: ComputedDisplayFieldElementOptions): ComputedDisplayFieldElement {\n return {\n ...computedDisplayFieldElementDefaults,\n ...config,\n } satisfies ComputedDisplayFieldElement;\n}\nexport const computedDisplayFieldElementDefaults = {\n type: 'computedDisplayField',\n label: '',\n class: '',\n cols: 6,\n calculatedValue: (): string => '',\n shouldRender: true,\n} satisfies ComputedDisplayFieldElement;\n\nexport interface PaddingElementOptions {\n cols?: ColSize;\n shouldRender?: ((data: any) => boolean) | boolean;\n}\nexport interface PaddingElement {\n type: 'padding';\n cols: ColSize;\n /** Determines whether the padding is shown\n */\n shouldRender: ((data: any) => boolean) | boolean;\n}\nexport function padding(config?: PaddingElementOptions): PaddingElement {\n return {\n ...paddingElementDefaults,\n ...config,\n } satisfies PaddingElement;\n}\nexport const paddingElementDefaults = {\n type: 'padding',\n cols: 12,\n shouldRender: true,\n} satisfies PaddingElement;\n\nexport interface SectionElementOptions {\n label?: string;\n class?: string;\n cols?: ColSize;\n shouldRender?: ((data: any) => boolean) | boolean;\n nullAllChildrenIfConditionallyHidden?: boolean;\n children?: ConfigElement[];\n}\nexport interface SectionElement {\n type: 'section';\n label: string;\n class: string;\n cols: ColSize;\n /**\n * shouldRender is used to determine if the section should be\n * displayed to users.\n * When assigning shouldRender a function, the first argument\n * is the current state of the resource being displayed\n * Hides the layout AND all of its children\n */\n shouldRender: ((data: any) => boolean) | boolean;\n /** If shouldRender is NOT a function, this property does nothing\n * If shouldRender is a function, this property\n * sets children's values to null if shouldRender hides it (returns false)\n * within the resource-layout.component\n */\n nullAllChildrenIfConditionallyHidden: boolean;\n children: ConfigElement[];\n}\nexport function section(config: SectionElementOptions): SectionElement {\n return {\n ...sectionElementDefaults,\n ...config,\n } satisfies SectionElement;\n}\nexport const sectionElementDefaults = {\n type: 'section',\n label: '',\n class: '',\n cols: 12,\n shouldRender: true,\n nullAllChildrenIfConditionallyHidden: false,\n children: [],\n} satisfies SectionElement;\n\nexport interface FieldElementOptions {\n name: FieldName;\n label?: string;\n cols?: ColSize;\n class?: string;\n enumeratedConfig?: EnumeratedConfig;\n default?: FieldDefault;\n nullBooleanConfig?: NullBooleanConfig;\n validators?: ((data: any) => ResourceValidatorFn[]) | ResourceValidatorFn[];\n readOnly?: boolean;\n prefixes?: Affix[];\n suffixes?: Affix[];\n shouldRender?: ((data: any) => boolean) | boolean;\n nullIfConditionallyHidden?: boolean;\n}\nexport interface FieldElement {\n type: 'field';\n name: string;\n label: string;\n cols: ColSize;\n class: string;\n enumeratedConfig: EnumeratedConfig;\n default: FieldDefault;\n nullBooleanConfig: NullBooleanConfig;\n /**\n * A list of validators that must pass to allow a field to be submitted.\n * Utilize existing validators in the resourceValidators object, and\n * add any new or custom validators to it\n */\n validators: ((data: any) => ResourceValidatorFn[]) | ResourceValidatorFn[];\n readOnly: boolean;\n prefixes: Affix[];\n suffixes: Affix[];\n /**\n * shouldRender is used to determine if the element should be\n * displayed to users.\n * When assigning shouldRender a function, the first argument\n * is the current state of the resource being displayed\n */\n shouldRender: ((data: any) => boolean) | boolean;\n /** If shouldRender is NOT a function, this property does nothing\n * If shouldRender is a function, this property\n * determines whether the form control associated\n * with this config element should have its value\n * set to null if shouldRender hides it (returns false)\n */\n nullIfConditionallyHidden: boolean;\n}\n\nexport function field(config: FieldElementOptions): FieldElement {\n return {\n ...fieldElementDefaults,\n ...config,\n } satisfies FieldElement;\n}\nexport const fieldElementDefaults = {\n type: 'field',\n name: '',\n label: '',\n cols: 6,\n class: '',\n enumeratedConfig: { ...enumeratedConfigDefaults },\n default: null,\n validators: [],\n nullBooleanConfig: { ...nullBooleanConfigDefaults },\n readOnly: false,\n prefixes: [],\n suffixes: [],\n shouldRender: true,\n nullIfConditionallyHidden: false,\n} satisfies FieldElement;\n\n/**\n * RouteData is used to define the route for a config\n * route: the route for the config\n * hasViewRoute: when true, a route will be created for route/:uuid\n */\nexport interface RootRouteData {\n route?: string;\n hasViewRoute?: boolean;\n}\n\nexport interface RPCConfigOptions {\n label: string;\n afterMethodRedirect?: string;\n conditions: {\n field: FieldName;\n matchValues: string[];\n }[];\n methodBodyTemplate?: any;\n successMessage?: string;\n elements?: ConfigElement[];\n placement?: RPCPlacement;\n method: Method;\n customComponent?: ComponentConfig;\n refreshResources?: Resource[];\n defaultModalWidth?: string;\n shouldRender?: () => boolean;\n}\nexport interface RPCConfig {\n label: string;\n afterMethodRedirect: string | string[];\n conditions: {\n field: FieldName;\n matchValues: string[];\n }[];\n methodBodyTemplate: any;\n method: Method;\n successMessage: string;\n elements: ConfigElement[];\n placement: RPCPlacement;\n customComponent: ComponentConfig;\n refreshResources: Resource[];\n defaultModalWidth: string;\n shouldRender: () => boolean;\n}\nexport function rpcConfig(config: RPCConfigOptions): RPCConfig {\n return {\n ...rpcConfigDefaults,\n ...config,\n } satisfies RPCConfig;\n}\nexport const rpcConfigDefaults = {\n label: '',\n afterMethodRedirect: '',\n conditions: [] as {\n field: FieldName;\n matchValues: string[];\n }[],\n methodBodyTemplate: {} as any,\n successMessage: '',\n elements: [] as ConfigElement[],\n placement: 'end' as RPCPlacement,\n method: '' as Method,\n customComponent: {} as ComponentConfig,\n refreshResources: [] as Resource[],\n defaultModalWidth: '',\n shouldRender: (): boolean => true,\n} satisfies RPCConfig;\n\nexport interface RPCBaseFormData {\n elements: FieldElement[];\n label: string;\n method: Method;\n}\n\n// Config is the base type that all configurations should start with\nexport interface RootConfigOptions {\n routeData?: RootRouteData;\n nav?: {\n navItem: MenuItem;\n group?: string;\n };\n parentConfig: ParentResourceConfig;\n relatedConfigs?: ChildResourceConfig[];\n rpcConfigs?: RPCConfig[];\n}\nexport interface RootConfig {\n routeData: RootRouteData;\n nav: {\n navItem: MenuItem;\n group?: string;\n };\n parentConfig: ParentResourceConfig;\n relatedConfigs: ChildResourceConfig[];\n rpcConfigs?: RPCConfig[];\n}\nexport const rootConfigDefaults = {\n routeData: {} as RootRouteData,\n nav: {\n navItem: {} as MenuItem,\n },\n parentConfig: {} as ParentResourceConfig,\n relatedConfigs: [] as ChildResourceConfig[],\n rpcConfigs: [] as RPCConfig[],\n} satisfies RootConfig;\n\nexport function rootConfig(config: RootConfigOptions): RootConfig {\n return {\n ...rootConfigDefaults,\n ...config,\n } satisfies RootConfig;\n}\n\n// Base type config is the base type for all resource configurations\nexport interface BaseConfigOptions {\n title?: string;\n createTitle?: string;\n createButtonLabel?: string;\n primaryResource: Resource;\n parentClass?: string;\n fieldClass?: string;\n elements: ConfigElement[];\n createConfig?: ConfigType;\n parentRelation?: {\n parentKey: FieldName;\n childKey: FieldName;\n };\n showBackButton?: boolean;\n createNavigation?: string[];\n}\nexport interface BaseConfig {\n title: string;\n createTitle: string;\n createButtonLabel: string;\n primaryResource: Resource;\n parentClass: string;\n fieldClass: string;\n elements: ConfigElement[];\n createConfig: ConfigType;\n parentRelation: {\n parentKey: FieldName;\n childKey: FieldName;\n };\n showBackButton: boolean;\n createNavigation: string[];\n}\n\n// Available components for a component config\nexport type AvailableComponents = 'SwitchResolver';\n\n// Available param types for a component config\nexport type ConfigParam = SwitchConfigParam;\n\n// Custom component config renders a custom component and supplies params to it\nexport interface ComponentConfigOptions {\n // todo: it's weird that we have a primary resource here. Would be nice to remove but this adds a null check to all other configs\n primaryResource: Resource;\n component: AvailableComponents;\n params?: ConfigParam;\n relatedConfig?: ParentResourceConfig[];\n shouldRenderActions?: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\nexport interface ComponentConfig {\n type: 'Component';\n primaryResource: Resource;\n component: AvailableComponents;\n params: ConfigParam;\n relatedConfig: ParentResourceConfig[];\n shouldRenderActions: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\nexport function componentConfig(config: ComponentConfigOptions): ComponentConfig {\n return {\n ...componentConfigDefaults,\n ...config,\n } satisfies ComponentConfig;\n}\nexport const componentConfigDefaults = {\n type: 'Component',\n primaryResource: '' as Resource,\n component: 'SwitchResolver' as AvailableComponents,\n params: {\n cases: [],\n } satisfies ConfigParam,\n relatedConfig: [] as ParentResourceConfig[],\n shouldRenderActions: {\n create: (): boolean => true,\n edit: (): boolean => true,\n delete: (): boolean => true,\n },\n} satisfies ComponentConfig;\n\n// A switch is a component type that allows for conditional rendering of child components based on the value of a parent field\n// When parentData[c.parentField] equals c.caseId render the caseConfig with parentData[c.childId] as the uuid\nexport interface switchCase {\n caseId: string;\n parentField: string;\n childId: string;\n config: ChildResourceConfig;\n}\nexport interface SwitchConfigParamOptions {\n cases: switchCase[];\n}\nexport interface SwitchConfigParam {\n cases: switchCase[];\n}\nexport function switchParams(config: SwitchConfigParamOptions): SwitchConfigParam {\n return {\n ...switchParamsDefaults,\n ...config,\n } satisfies SwitchConfigParam;\n}\nexport const switchParamsDefaults = {\n cases: [] as switchCase[],\n} satisfies SwitchConfigParam;\n\nexport interface ListViewConfigOptions extends BaseConfigOptions {\n showViewButton?: boolean;\n loadCreatedResource?: boolean;\n collapsible?: boolean;\n overrideResource?: Resource;\n searchable?: boolean;\n enableRowExpansion?: boolean;\n rowExpansionConfig?: ChildResourceConfig;\n requireSearchToDisplayResults?: boolean;\n listColumns: ColumnConfig[];\n relatedConfigs?: ChildResourceConfig[];\n viewResource?: Resource | string;\n actionType?: ActionType;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n filter?: (parentResource: any) => string;\n disableCacheForFilterPii?: boolean;\n rpcConfigs?: RPCConfig[];\n sorts?: FieldSort[];\n shouldRenderActions?: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\nexport interface ListViewConfig extends BaseConfig {\n type: 'ListView';\n showViewButton: boolean;\n loadCreatedResource: boolean;\n collapsible: boolean;\n overrideResource: Resource;\n searchable: boolean;\n enableRowExpansion: boolean;\n rowExpansionConfig: ChildResourceConfig;\n requireSearchToDisplayResults: boolean;\n listColumns: ColumnConfig[];\n relatedConfigs: ChildResourceConfig[];\n viewResource: Resource | string;\n actionType: ActionType;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n filter: (parentResource: any) => string;\n disableCacheForFilterPii: boolean;\n rpcConfigs?: RPCConfig[];\n sorts: FieldSort[];\n shouldRenderActions: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\n\nexport function listViewConfig(config: ListViewConfigOptions): ListViewConfig {\n return {\n ...listViewConfigDefaults,\n ...config,\n } satisfies ListViewConfig;\n}\nexport const listViewConfigDefaults = {\n title: '',\n primaryResource: '' as Resource,\n type: 'ListView',\n createTitle: '',\n createButtonLabel: 'Create',\n loadCreatedResource: false,\n showViewButton: true,\n collapsible: false,\n listColumns: [],\n elements: [],\n parentClass: '',\n fieldClass: '',\n createConfig: {} as ListViewConfig,\n createNavigation: [],\n relatedConfigs: [],\n parentRelation: {\n parentKey: '' as FieldName,\n childKey: '' as FieldName,\n },\n overrideResource: '' as Resource,\n searchable: false,\n enableRowExpansion: false,\n rowExpansionConfig: {} as ChildResourceConfig,\n requireSearchToDisplayResults: false,\n showBackButton: true,\n filter: (): string => '',\n disableCacheForFilterPii: false,\n sorts: [] as FieldSort[],\n viewResource: '' as Resource,\n actionType: 'function' as ActionType,\n rpcConfigs: [],\n shouldRenderActions: {\n create: (): boolean => true,\n edit: (): boolean => true,\n delete: (): boolean => true,\n },\n} satisfies ListViewConfig;\n\nexport type ViewType = 'OneToOne' | 'OneToMany';\n\nexport interface ViewConfigOptions extends BaseConfigOptions {\n collapsible?: boolean;\n connectorResource?: Resource;\n relatedConfigs?: ChildResourceConfig[];\n rpcConfigs?: RPCConfig[];\n shouldRenderActions?: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\nexport interface ViewConfig extends BaseConfig {\n type: 'View';\n collapsible: boolean;\n // todo: remove this comment once full documentation has been added. Populate this value when a database view resource is used to connect the ViewConfig's parent resource to its primary resource\n connectorResource: Resource;\n rpcConfigs?: RPCConfig[];\n relatedConfigs: ChildResourceConfig[];\n /** A set of functions that allows for\n * conditional display of non-RPC\n * actions based on the pristine state of the resource\n * (if such a state is applicable. Creation for example won't\n * have such data)\n * This is separate from ABAC control which takes\n * precedence and is based on a user's attributes\n */\n shouldRenderActions: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\n\nexport function viewConfig(config: ViewConfigOptions): ViewConfig {\n return {\n ...viewConfigDefaults,\n ...config,\n } satisfies ViewConfig;\n}\nexport const viewConfigDefaults = {\n title: '',\n primaryResource: '' as Resource,\n type: 'View',\n createTitle: '',\n createButtonLabel: 'Create',\n parentClass: '',\n fieldClass: '',\n elements: [],\n collapsible: true,\n connectorResource: '' as Resource,\n relatedConfigs: [],\n createConfig: {} as ViewConfig,\n shouldRenderActions: {\n create: (): boolean => true,\n edit: (): boolean => true,\n delete: (): boolean => true,\n },\n createNavigation: [],\n parentRelation: {\n parentKey: '' as FieldName,\n childKey: '' as FieldName,\n },\n showBackButton: true,\n rpcConfigs: [],\n} satisfies ViewConfig;\n\nexport interface arrayConfigOptions {\n iteratedConfig: ChildResourceConfig;\n viewType?: ViewType;\n collapsible?: boolean;\n createConfig?: ConfigType;\n connectorResource?: Resource;\n connectorField?: FieldName;\n primaryResource: Resource;\n listFilter: (parentResource: any) => string;\n disableCacheForFilterPii?: boolean;\n sorts?: FieldSort[];\n title?: string;\n createButtonLabel?: string;\n limit?: number;\n shouldRenderActions?: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\nexport interface ArrayConfig {\n type: 'Array';\n iteratedConfig: ChildResourceConfig;\n viewType: ViewType;\n collapsible: boolean;\n createConfig: ConfigType;\n connectorResource: Resource;\n connectorField: FieldName;\n primaryResource: Resource;\n listFilter: (parentResource: any) => string;\n disableCacheForFilterPii: boolean;\n sorts: FieldSort[];\n title: string;\n createButtonLabel: string;\n shouldRenderActions: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n limit: number;\n}\nexport function arrayConfig(config: arrayConfigOptions): ArrayConfig {\n return {\n ...arrayConfigDefaults,\n ...config,\n } satisfies ArrayConfig;\n}\nexport const arrayConfigDefaults = {\n type: 'Array',\n iteratedConfig: {} as ChildResourceConfig,\n viewType: 'OneToMany' as ViewType,\n collapsible: true,\n createConfig: {} as ViewConfig,\n connectorResource: '' as Resource,\n connectorField: '' as FieldName,\n primaryResource: '' as Resource,\n listFilter: (): string => '',\n disableCacheForFilterPii: false,\n sorts: [] as FieldSort[],\n title: '',\n createButtonLabel: 'Create',\n limit: Infinity,\n shouldRenderActions: {\n create: (): boolean => true,\n edit: (): boolean => true,\n delete: (): boolean => true,\n },\n} satisfies ArrayConfig;\n","export enum AlertLevel {\n ERROR = 'warn',\n INFO = 'accent',\n SUCCESS = 'success',\n}\n\nexport interface CreateNotificationMessage {\n duration?: number;\n message: string;\n link: string;\n level: AlertLevel;\n}\n\nexport interface NotificationMessage {\n id: number;\n duration?: number;\n message: string;\n link: string;\n level: AlertLevel;\n}\n","type Brand<K, T> = K & { __brand: T };\n\nexport type Permission = Brand<string, 'Permission'>;\nexport type Resource = Brand<string, 'Resource'>;\nexport type Domain = Brand<string, 'Domain'>;\nexport type FieldName = Brand<string, 'FieldName'>;\nexport type Method = Brand<string, 'Method'>;\nexport type DomainPermissions = Record<Domain, Record<Resource, Record<Permission, Permissions>>>;\n\nexport interface PermissionScope {\n resource: Resource;\n permission: Permission;\n domain: Domain;\n}\n\nexport const ReadPermission = 'Read' as Permission;\nexport const UpdatePermission = 'Update' as Permission;\n","// Meta interfaces for resources and methods\n// This file exists to break circular dependencies between types and ccc-resource\n\nimport { Resource } from './permissions';\n\nexport type ValidDisplayTypes =\n | 'boolean'\n | 'nullboolean'\n | 'number'\n | 'string'\n | 'date'\n | 'enumerated'\n | 'link'\n | 'uuid'\n | 'civildate'\n | 'string[]'\n | 'customtypes.document';\n\nexport type ValidRPCTypes = ValidDisplayTypes | `${Exclude<ValidDisplayTypes, 'string[]'>}[]`;\n\nexport interface RPCFieldMeta {\n fieldName: string;\n displayType: ValidRPCTypes;\n enumeratedResource?: Resource;\n}\n\nexport interface MethodMeta {\n route: string;\n fields: RPCFieldMeta[];\n}\n\nexport interface FieldMeta {\n fieldName: string;\n /** Indicates whether the field is required and only applies during resource creation.\n * Use the validators config parameter in all other contexts\n */\n required: boolean;\n primaryKey?: { ordinalPosition: number };\n displayType: ValidDisplayTypes;\n enumeratedResource?: Resource;\n isIndex: boolean;\n}\n\nexport interface ResourceMeta {\n route: string;\n consolidatedRoute?: string;\n listDisabled?: boolean;\n readDisabled?: boolean;\n createDisabled?: boolean;\n updateDisabled?: boolean;\n deleteDisabled?: boolean;\n substringSearchParameter?: string;\n fields: FieldMeta[];\n}\n\nexport type Meta = MethodMeta | ResourceMeta;\n\nexport namespace CustomTypes {\n export interface Document {\n // todo/fixme: implement the actual rich text document interface here\n placeholder: string;\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { Domain, Permission, Resource } from './permissions';\nimport { MethodMeta, ResourceMeta } from './resource-meta';\n\n/**\n * The base URL for API requests (e.g., 'https://api.example.com/').\n */\nexport const BASE_URL = new InjectionToken<string>('BASE_URL');\n\n/**\n * The path to the frontend login page (e.g., '/login').\n */\nexport const FRONTEND_LOGIN_PATH = new InjectionToken<string>('FRONTEND_LOGIN_PATH');\n\n/**\n * The path to the session endpoint (e.g., 'user/session').\n */\nexport const SESSION_PATH = new InjectionToken<string>('SESSION_PATH');\n\n/**\n * The base URL for API requests (e.g., '/api').\n */\nexport const API_URL = new InjectionToken<string>('API_URL');\n\nexport const PERMISSION_REQUIRED = new InjectionToken<(resource: Resource, permission: Permission) => boolean>(\n 'PERMISSION_REQUIRED',\n);\n\nexport const AVAILABLE_PERMISSIONS = new InjectionToken<{\n Create: Permission;\n Delete: Permission;\n List: Permission;\n Read: Permission;\n Update: Permission;\n}>('AVAILABLE_PERMISSIONS');\nexport const AVAILABLE_DOMAINS = new InjectionToken<Record<string, Domain>[]>('AVAILABLE_DOMAINS');\n\nexport const RESOURCE_META = new InjectionToken<(resource: Resource) => ResourceMeta>('RESOURCE_META');\nexport const METHOD_META = new InjectionToken<(method: string) => MethodMeta>('METHOD_META');\n\nexport const IDLE_SESSION_DURATION = new InjectionToken<number>('IDLE_SESSION_DURATION');\nexport const IDLE_WARNING_DURATION = new InjectionToken<number>('IDLE_WARNING_DURATION');\nexport const IDLE_KEEPALIVE_DURATION = new InjectionToken<number>('IDLE_KEEPALIVE_DURATION');\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport const validatorsPresent = (\n control: AbstractControl<unknown, unknown>,\n validators: ValidatorFn[],\n previousValidatorCount: number,\n): boolean => {\n if (validators.length === previousValidatorCount) {\n return true;\n }\n\n let hasAllValidators = true;\n for (const validator of validators) {\n if (!control.hasValidator(validator)) {\n hasAllValidators = false;\n break;\n }\n }\n return hasAllValidators;\n};\n\nexport const requiredIf = (predicate: () => boolean, validator: ValidatorFn) => {\n return (formControl: AbstractControl): ValidationErrors | null => {\n if (!formControl.parent) {\n return null;\n }\n if (predicate()) {\n return validator(formControl);\n }\n return null;\n };\n};\n\ndeclare const __singletonValidatorBrand: unique symbol;\nexport type ResourceValidatorFn = ValidatorFn & {\n readonly [__singletonValidatorBrand]: true;\n};\nexport function createResourceValidator(validator: ValidatorFn): ResourceValidatorFn {\n return validator as ResourceValidatorFn;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cccteam-ccc-lib-src-types.mjs","sources":["../../../projects/ccc-lib/src/types/resource-types.ts","../../../projects/ccc-lib/src/types/configs.ts","../../../projects/ccc-lib/src/types/notification-message.ts","../../../projects/ccc-lib/src/types/permissions.ts","../../../projects/ccc-lib/src/types/resource-meta.ts","../../../projects/ccc-lib/src/types/tokens.ts","../../../projects/ccc-lib/src/types/validators.ts","../../../projects/ccc-lib/src/types/cccteam-ccc-lib-src-types.ts"],"sourcesContent":["// Shared types and constants used across the ccc-resource module\n// This file exists to break circular dependencies between types and ccc-resource\n\nexport const defaultEmptyFieldValue = '-';\n\nexport type NullBoolean = null | true | false;\n\nexport type ConcatFn = 'space-concat' | 'hyphen-concat' | 'space-hyphen-concat' | 'hyphen-space-concat';\n","import { Directive, input, Type } from '@angular/core';\nimport { TooltipPosition } from '@angular/material/tooltip';\nimport { FieldName, Method, Resource } from './permissions';\nimport { ConcatFn, defaultEmptyFieldValue, NullBoolean } from './resource-types';\nimport { ResourceValidatorFn } from './validators';\n\nexport interface FieldPointer {\n field: FieldName;\n}\n\nexport interface MenuItem {\n label: string;\n route?: string[];\n children?: MenuItem[];\n}\n\nexport interface RouteResourceData {\n config: RootConfig;\n}\n\nexport type DataType = string | number | number[] | string[] | boolean | undefined | Date;\nexport type RecordData = Record<string, DataType | null>;\n\nexport type RPCDataType = string | number | string[] | number[] | boolean | Date;\nexport type RPCRecordData = Record<string, RPCDataType>;\nexport type RpcMethod = Record<string, DataType>;\n\nexport type ParentResourceConfig = ListViewConfig | ViewConfig | ArrayConfig;\nexport type ChildResourceConfig = ListViewConfig | ViewConfig | ComponentConfig | ArrayConfig;\n\nexport type ActionType = 'function' | 'link';\n\nexport type ListConcatFn =\n | 'space-concat'\n | 'hyphen-concat'\n | 'space-hyphen-concat'\n | 'hyphen-space-concat'\n | 'no-space-concat';\nexport type ConfigType = ChildResourceConfig;\nexport type FormatType = 'simpleSlashDateFormat';\nexport type RPCPlacement = 'inline' | 'end';\n\nexport type ColumnConfig = SingleColumnConfig | MultiColumnConfig;\n\nexport interface ActionButtonConfig {\n label: string;\n icon: string;\n action?: (resource: { id: string }) => void;\n viewRoute?: string;\n actionType?: ActionType;\n color?: string;\n disabledLabel?: string;\n}\nexport interface ActionButtonConfigOptions {\n label: string;\n icon: string;\n action?: (resource: { id: string }) => void;\n viewRoute?: string;\n actionType?: ActionType;\n color?: string;\n disabledLabel?: string;\n}\n\nexport function actionButtonConfig(config: ActionButtonConfigOptions): ActionButtonConfig {\n return {\n ...actionButtonConfigDefaults,\n ...config,\n } satisfies ActionButtonConfig;\n}\n\nexport const actionButtonConfigDefaults = {\n label: '',\n icon: '',\n actionType: 'function' as ActionType,\n color: '',\n disabledLabel: '',\n} satisfies ActionButtonConfig;\n\nexport interface SingleColumnConfig {\n id: FieldName;\n header?: string;\n width?: number;\n resizable?: boolean;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n valueGetter?: (data: any) => string;\n valueFormatter?: (data: any) => string;\n tooltipPosition?: TooltipPosition;\n viewRoute?: Resource;\n buttonConfig?: ActionButtonConfig;\n actionType?: ActionType;\n formatType?: FormatType | string;\n hidden?: boolean;\n emptyDataValue?: DataType;\n filterable?: boolean;\n hideHeader?: boolean;\n}\nexport interface SingleColumnConfigOptions {\n id: FieldName;\n header?: string;\n width?: number;\n resizable?: boolean;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n valueGetter?: (data: any) => string;\n valueFormatter?: (data: any) => string;\n tooltipPosition?: TooltipPosition;\n viewRoute?: Resource;\n buttonConfig?: ActionButtonConfig;\n actionType?: ActionType;\n formatType?: FormatType | string;\n hidden?: boolean;\n emptyDataValue?: DataType;\n filterable?: boolean;\n hideHeader?: boolean;\n}\n\nexport function singleColumnConfig(config: SingleColumnConfigOptions): SingleColumnConfig {\n return {\n ...singleColumnConfigDefaults,\n ...config,\n } satisfies SingleColumnConfig;\n}\n\nexport const singleColumnConfigDefaults = {\n id: '' as FieldName,\n header: '',\n resizable: true,\n actionType: 'function' as ActionType,\n hidden: false,\n filterable: true,\n hideHeader: false,\n} satisfies SingleColumnConfig;\n\nexport interface MultiColumnConfig extends SingleColumnConfig {\n // todo: additionalIds name is not clear. the id provided is fetched from a different resource, such as a typeId\n additionalIds: AdditionalResourceConfig[];\n concatFn: ListConcatFn;\n}\nexport interface MultiColumnConfigOptions extends SingleColumnConfigOptions {\n additionalIds: AdditionalResourceConfig[];\n concatFn: ListConcatFn;\n}\n\nexport function multiColumnConfig(config: MultiColumnConfigOptions): MultiColumnConfig {\n return {\n ...multiColumnConfigDefaults,\n ...config,\n } satisfies MultiColumnConfig;\n}\n\nexport const multiColumnConfigDefaults = {\n ...singleColumnConfigDefaults,\n additionalIds: [] as AdditionalResourceConfig[],\n concatFn: 'hyphen-concat' as ListConcatFn,\n} satisfies MultiColumnConfig;\n\nexport interface AdditionalResourceConfig {\n resource?: Resource;\n id: FieldName;\n field?: FieldName;\n hidden?: boolean;\n}\nexport interface AdditionalResourceConfigOptions {\n id: FieldName;\n resource?: Resource;\n field?: FieldName;\n hidden?: boolean;\n}\n\nexport function additionalResourceConfig(config: AdditionalResourceConfigOptions): AdditionalResourceConfig {\n return {\n ...additionalResourceConfigDefaults,\n ...config,\n } satisfies AdditionalResourceConfig;\n}\n\nexport const additionalResourceConfigDefaults = {\n id: '' as FieldName,\n resource: '' as Resource,\n field: '' as FieldName,\n hidden: false,\n} satisfies AdditionalResourceConfig;\n\nexport interface FieldSort {\n field: FieldName;\n direction: 'asc' | 'desc';\n}\nexport interface FieldSortOptions {\n field: FieldName;\n direction?: 'asc' | 'desc';\n}\n\nexport function fieldSort(config: FieldSortOptions): FieldSort {\n return {\n ...fieldSortDefaults,\n ...config,\n } satisfies FieldSort;\n}\n\nexport const fieldSortDefaults = {\n field: '' as FieldName,\n direction: 'asc' as 'asc' | 'desc',\n} satisfies FieldSort;\n\nexport interface EnumeratedConfigOptions {\n // primaryResource comes from the metadata\n overrideResource?: Resource;\n /* A function to filter the list of enumerated options.\n * The `parentResource` argument contains the data of the resource that this enumerated field is part of.\n * It will be an object with the current form values, which can be empty during resource creation.\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n filter?: (resource: any) => string;\n /**\n * Set disableCacheForFilterPii to `true` to promote the GET to a POST when PII is used in the filter\n * POST requests cannot be cached\n */\n disableCacheForFilterPii?: boolean;\n /**\n * Specifies which resource data to pass to the filter function:\n * - 'rootResource': Pass in the root resource data\n * - 'parentResource': Pass in the parent resource data\n * @default 'parentResource'\n */\n filterType?: FilterType;\n sorts?: FieldSort[];\n listDisplay?: FieldName[];\n viewDisplay: FieldName[];\n viewConcatFn?: ConcatFn;\n listConcatFn?: ConcatFn;\n viewDetails?: boolean;\n searchable?: boolean;\n}\n\ntype FilterType = 'parentResource' | 'rootResource';\nexport interface EnumeratedConfig {\n overrideResource: Resource;\n filter: (resource: any) => string;\n disableCacheForFilterPii: boolean;\n filterType: FilterType;\n sorts: FieldSort[];\n listDisplay: FieldName[];\n viewDisplay: FieldName[];\n viewConcatFn: ConcatFn;\n listConcatFn: ConcatFn;\n viewDetails: boolean;\n searchable: boolean;\n}\nexport function enumeratedConfig(config: EnumeratedConfigOptions): EnumeratedConfig {\n return {\n ...enumeratedConfigDefaults,\n ...config,\n } satisfies EnumeratedConfig;\n}\nexport const enumeratedConfigDefaults = {\n overrideResource: '' as Resource,\n filter: (): string => '',\n disableCacheForFilterPii: false,\n filterType: 'parentResource' as FilterType,\n sorts: [] as FieldSort[],\n listDisplay: [] as FieldName[],\n viewDisplay: [] as FieldName[],\n viewConcatFn: 'hyphen-concat' as ConcatFn,\n listConcatFn: 'hyphen-concat' as ConcatFn,\n viewDetails: false,\n searchable: false,\n};\n\nexport type FieldDefault = ForeignKeyDefault | StaticDefault | null;\n\nexport interface NullBooleanConfigOptions {\n displayValues?: Record<'null' | 'true' | 'false', { label: string; value: NullBoolean }>;\n}\nexport interface NullBooleanConfig {\n /** This property maps the three possible values for this\n * nullboolean field with the display values users will see\n * on the screen for each\n */\n displayValues: Record<'null' | 'true' | 'false', { label: string; value: NullBoolean }>;\n\n /** TODO: In FUTURE PHASES once field change history is implemented\n * When this field is first displayed on screen, set the\n * value to null based on the value present in it.\n * Useful if the database doesn't have support nulling but you want\n * users to make a conscious selection, but the database\n * will either contain a true or false. Will need to check the\n * 'last edited' on the field to ensure that we don't repeatedly spam\n * users with this though\n */\n // nullOnEdit: {\n // nullIfTrue: boolean;\n // nullIfFalse: boolean;\n // };\n}\nexport function nullBooleanConfig(config: NullBooleanConfigOptions): NullBooleanConfig {\n return {\n ...nullBooleanConfigDefaults,\n ...config,\n } satisfies NullBooleanConfig;\n}\nconst defaultBooleanDisplay = Object.freeze({\n null: {\n label: defaultEmptyFieldValue,\n value: null,\n },\n true: {\n label: 'Yes',\n value: true,\n },\n false: {\n label: 'No',\n value: false,\n },\n});\n\nexport const nullBooleanConfigDefaults = {\n displayValues: defaultBooleanDisplay,\n};\n\nexport interface ForeignKeyDefaultOptions {\n parentId: FieldName;\n}\nexport interface ForeignKeyDefault {\n type: 'foreignKey';\n parentId: FieldName;\n}\nexport function foreignKeyDefault(config: ForeignKeyDefaultOptions): ForeignKeyDefault {\n return {\n ...foreignKeyDefaultDefaults,\n ...config,\n } satisfies ForeignKeyDefault;\n}\nexport const foreignKeyDefaultDefaults = {\n type: 'foreignKey',\n parentId: '' as FieldName,\n} satisfies ForeignKeyDefault;\n\nexport interface StaticDefault {\n type: 'static';\n value: string | boolean;\n}\nexport interface staticDefaultOptions {\n value: string | boolean;\n}\nexport function staticDefault(config: staticDefaultOptions): StaticDefault {\n return {\n ...staticDefaultDefaults,\n ...config,\n } satisfies StaticDefault;\n}\nexport const staticDefaultDefaults = {\n type: 'static',\n value: '',\n} satisfies StaticDefault;\n\nexport type Affix = string | remoteData | parentData;\n\ninterface remoteData {\n resource: Resource;\n id: FieldName;\n field: FieldName;\n}\n\ninterface parentData {\n field: FieldName;\n}\n\nexport type ConfigElement = FieldElement | SectionElement | ComputedDisplayFieldElement | PaddingElement;\n\nexport type ColSize = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\nexport interface ComputedDisplayFieldElementOptions {\n label?: string;\n class?: string;\n cols?: ColSize;\n calculatedValue?: (data: any) => string;\n shouldRender?: ((data: any) => boolean) | boolean;\n}\nexport interface ComputedDisplayFieldElement {\n type: 'computedDisplayField';\n label: string;\n class: string;\n cols: ColSize;\n calculatedValue: (data: any) => string;\n shouldRender: ((data: any) => boolean) | boolean;\n}\nexport function computedDisplayField(config: ComputedDisplayFieldElementOptions): ComputedDisplayFieldElement {\n return {\n ...computedDisplayFieldElementDefaults,\n ...config,\n } satisfies ComputedDisplayFieldElement;\n}\nexport const computedDisplayFieldElementDefaults = {\n type: 'computedDisplayField',\n label: '',\n class: '',\n cols: 6,\n calculatedValue: (): string => '',\n shouldRender: true,\n} satisfies ComputedDisplayFieldElement;\n\nexport interface PaddingElementOptions {\n cols?: ColSize;\n shouldRender?: ((data: any) => boolean) | boolean;\n}\nexport interface PaddingElement {\n type: 'padding';\n cols: ColSize;\n /** Determines whether the padding is shown\n */\n shouldRender: ((data: any) => boolean) | boolean;\n}\nexport function padding(config?: PaddingElementOptions): PaddingElement {\n return {\n ...paddingElementDefaults,\n ...config,\n } satisfies PaddingElement;\n}\nexport const paddingElementDefaults = {\n type: 'padding',\n cols: 12,\n shouldRender: true,\n} satisfies PaddingElement;\n\nexport interface SectionElementOptions {\n label?: string;\n class?: string;\n cols?: ColSize;\n shouldRender?: ((data: any) => boolean) | boolean;\n nullAllChildrenIfConditionallyHidden?: boolean;\n children?: ConfigElement[];\n}\nexport interface SectionElement {\n type: 'section';\n label: string;\n class: string;\n cols: ColSize;\n /**\n * shouldRender is used to determine if the section should be\n * displayed to users.\n * When assigning shouldRender a function, the first argument\n * is the current state of the resource being displayed\n * Hides the layout AND all of its children\n */\n shouldRender: ((data: any) => boolean) | boolean;\n /** If shouldRender is NOT a function, this property does nothing\n * If shouldRender is a function, this property\n * sets children's values to null if shouldRender hides it (returns false)\n * within the resource-layout.component\n */\n nullAllChildrenIfConditionallyHidden: boolean;\n children: ConfigElement[];\n}\nexport function section(config: SectionElementOptions): SectionElement {\n return {\n ...sectionElementDefaults,\n ...config,\n } satisfies SectionElement;\n}\nexport const sectionElementDefaults = {\n type: 'section',\n label: '',\n class: '',\n cols: 12,\n shouldRender: true,\n nullAllChildrenIfConditionallyHidden: false,\n children: [],\n} satisfies SectionElement;\n\nexport interface FieldElementOptions {\n name: FieldName;\n label?: string;\n cols?: ColSize;\n class?: string;\n enumeratedConfig?: EnumeratedConfig;\n default?: FieldDefault;\n nullBooleanConfig?: NullBooleanConfig;\n validators?: ((data: any) => ResourceValidatorFn[]) | ResourceValidatorFn[];\n readOnly?: boolean;\n prefixes?: Affix[];\n suffixes?: Affix[];\n shouldRender?: ((data: any) => boolean) | boolean;\n nullIfConditionallyHidden?: boolean;\n}\nexport interface FieldElement {\n type: 'field';\n name: string;\n label: string;\n cols: ColSize;\n class: string;\n enumeratedConfig: EnumeratedConfig;\n default: FieldDefault;\n nullBooleanConfig: NullBooleanConfig;\n /**\n * A list of validators that must pass to allow a field to be submitted.\n * Utilize existing validators in the resourceValidators object, and\n * add any new or custom validators to it\n */\n validators: ((data: any) => ResourceValidatorFn[]) | ResourceValidatorFn[];\n readOnly: boolean;\n prefixes: Affix[];\n suffixes: Affix[];\n /**\n * shouldRender is used to determine if the element should be\n * displayed to users.\n * When assigning shouldRender a function, the first argument\n * is the current state of the resource being displayed\n */\n shouldRender: ((data: any) => boolean) | boolean;\n /** If shouldRender is NOT a function, this property does nothing\n * If shouldRender is a function, this property\n * determines whether the form control associated\n * with this config element should have its value\n * set to null if shouldRender hides it (returns false)\n */\n nullIfConditionallyHidden: boolean;\n}\n\nexport function field(config: FieldElementOptions): FieldElement {\n return {\n ...fieldElementDefaults,\n ...config,\n } satisfies FieldElement;\n}\nexport const fieldElementDefaults = {\n type: 'field',\n name: '',\n label: '',\n cols: 6,\n class: '',\n enumeratedConfig: { ...enumeratedConfigDefaults },\n default: null,\n validators: [],\n nullBooleanConfig: { ...nullBooleanConfigDefaults },\n readOnly: false,\n prefixes: [],\n suffixes: [],\n shouldRender: true,\n nullIfConditionallyHidden: false,\n} satisfies FieldElement;\n\n/**\n * RouteData is used to define the route for a config\n * route: the route for the config\n * hasViewRoute: when true, a route will be created for route/:uuid\n */\nexport interface RootRouteData {\n route?: string;\n hasViewRoute?: boolean;\n}\n\nexport interface RPCConfigOptions {\n label: string;\n afterMethodRedirect?: string;\n conditions: {\n field: FieldName;\n matchValues: string[];\n }[];\n methodBodyTemplate?: any;\n successMessage?: string;\n elements?: ConfigElement[];\n placement?: RPCPlacement;\n method: Method;\n customComponent?: ComponentConfig;\n refreshResources?: Resource[];\n defaultModalWidth?: string;\n shouldRender?: () => boolean;\n}\nexport interface RPCConfig {\n label: string;\n afterMethodRedirect: string | string[];\n conditions: {\n field: FieldName;\n matchValues: string[];\n }[];\n methodBodyTemplate: any;\n method: Method;\n successMessage: string;\n elements: ConfigElement[];\n placement: RPCPlacement;\n customComponent: ComponentConfig;\n refreshResources: Resource[];\n defaultModalWidth: string;\n shouldRender: () => boolean;\n}\nexport function rpcConfig(config: RPCConfigOptions): RPCConfig {\n return {\n ...rpcConfigDefaults,\n ...config,\n } satisfies RPCConfig;\n}\nexport const rpcConfigDefaults = {\n label: '',\n afterMethodRedirect: '',\n conditions: [] as {\n field: FieldName;\n matchValues: string[];\n }[],\n methodBodyTemplate: {} as any,\n successMessage: '',\n elements: [] as ConfigElement[],\n placement: 'end' as RPCPlacement,\n method: '' as Method,\n customComponent: {} as ComponentConfig,\n refreshResources: [] as Resource[],\n defaultModalWidth: '',\n shouldRender: (): boolean => true,\n} satisfies RPCConfig;\n\nexport interface RPCBaseFormData {\n elements: FieldElement[];\n label: string;\n method: Method;\n}\n\n// Config is the base type that all configurations should start with\nexport interface RootConfigOptions {\n routeData?: RootRouteData;\n nav?: {\n navItem: MenuItem;\n group?: string;\n };\n parentConfig: ParentResourceConfig;\n relatedConfigs?: ChildResourceConfig[];\n rpcConfigs?: RPCConfig[];\n}\nexport interface RootConfig {\n routeData: RootRouteData;\n nav: {\n navItem: MenuItem;\n group?: string;\n };\n parentConfig: ParentResourceConfig;\n relatedConfigs: ChildResourceConfig[];\n rpcConfigs?: RPCConfig[];\n}\nexport const rootConfigDefaults = {\n routeData: {} as RootRouteData,\n nav: {\n navItem: {} as MenuItem,\n },\n parentConfig: {} as ParentResourceConfig,\n relatedConfigs: [] as ChildResourceConfig[],\n rpcConfigs: [] as RPCConfig[],\n} satisfies RootConfig;\n\nexport function rootConfig(config: RootConfigOptions): RootConfig {\n return {\n ...rootConfigDefaults,\n ...config,\n } satisfies RootConfig;\n}\n\n// Base type config is the base type for all resource configurations\nexport interface BaseConfigOptions {\n title?: string;\n createTitle?: string;\n createButtonLabel?: string;\n primaryResource: Resource;\n parentClass?: string;\n fieldClass?: string;\n elements: ConfigElement[];\n createConfig?: ConfigType;\n parentRelation?: {\n parentKey: FieldName;\n childKey: FieldName;\n };\n showBackButton?: boolean;\n createNavigation?: string[];\n}\nexport interface BaseConfig {\n title: string;\n createTitle: string;\n createButtonLabel: string;\n primaryResource: Resource;\n parentClass: string;\n fieldClass: string;\n elements: ConfigElement[];\n createConfig: ConfigType;\n parentRelation: {\n parentKey: FieldName;\n childKey: FieldName;\n };\n showBackButton: boolean;\n createNavigation: string[];\n}\n\n@Directive()\nexport abstract class CustomConfigComponent {\n uuid = input<string>();\n parentData = input<RecordData>();\n config = input<ComponentConfig>();\n}\n\n// Available param types for a component config\nexport type ConfigParam = SwitchConfigParam;\n\n// Custom component config renders a custom component and supplies params to it\nexport interface ComponentConfigOptions {\n // todo: it's weird that we have a primary resource here. Would be nice to remove but this adds a null check to all other configs\n primaryResource: Resource;\n component: Type<CustomConfigComponent> | 'SwitchResolver';\n params?: ConfigParam;\n relatedConfig?: ParentResourceConfig[];\n shouldRenderActions?: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\nexport interface ComponentConfig {\n type: 'Component';\n primaryResource: Resource;\n component: Type<CustomConfigComponent> | 'SwitchResolver';\n params: ConfigParam;\n relatedConfig: ParentResourceConfig[];\n shouldRenderActions: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\nexport function componentConfig(config: ComponentConfigOptions): ComponentConfig {\n return {\n ...componentConfigDefaults,\n ...config,\n } satisfies ComponentConfig;\n}\nexport const componentConfigDefaults = {\n type: 'Component',\n primaryResource: '' as Resource,\n component: 'SwitchResolver',\n params: {\n cases: [],\n } satisfies ConfigParam,\n relatedConfig: [] as ParentResourceConfig[],\n shouldRenderActions: {\n create: (): boolean => true,\n edit: (): boolean => true,\n delete: (): boolean => true,\n },\n} satisfies ComponentConfig;\n\n// A switch is a component type that allows for conditional rendering of child components based on the value of a parent field\n// When parentData[c.parentField] equals c.caseId render the caseConfig with parentData[c.childId] as the uuid\nexport interface switchCase {\n caseId: string;\n parentField: string;\n childId: string;\n config: ChildResourceConfig;\n}\nexport interface SwitchConfigParamOptions {\n cases: switchCase[];\n}\nexport interface SwitchConfigParam {\n cases: switchCase[];\n}\nexport function switchParams(config: SwitchConfigParamOptions): SwitchConfigParam {\n return {\n ...switchParamsDefaults,\n ...config,\n } satisfies SwitchConfigParam;\n}\nexport const switchParamsDefaults = {\n cases: [] as switchCase[],\n} satisfies SwitchConfigParam;\n\nexport interface ListViewConfigOptions extends BaseConfigOptions {\n showViewButton?: boolean;\n loadCreatedResource?: boolean;\n collapsible?: boolean;\n overrideResource?: Resource;\n searchable?: boolean;\n enableRowExpansion?: boolean;\n rowExpansionConfig?: ChildResourceConfig;\n requireSearchToDisplayResults?: boolean;\n listColumns: ColumnConfig[];\n relatedConfigs?: ChildResourceConfig[];\n viewResource?: Resource | string;\n actionType?: ActionType;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n filter?: (parentResource: any) => string;\n disableCacheForFilterPii?: boolean;\n rpcConfigs?: RPCConfig[];\n sorts?: FieldSort[];\n shouldRenderActions?: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\nexport interface ListViewConfig extends BaseConfig {\n type: 'ListView';\n showViewButton: boolean;\n loadCreatedResource: boolean;\n collapsible: boolean;\n overrideResource: Resource;\n searchable: boolean;\n enableRowExpansion: boolean;\n rowExpansionConfig: ChildResourceConfig;\n requireSearchToDisplayResults: boolean;\n listColumns: ColumnConfig[];\n relatedConfigs: ChildResourceConfig[];\n viewResource: Resource | string;\n actionType: ActionType;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n filter: (parentResource: any) => string;\n disableCacheForFilterPii: boolean;\n rpcConfigs?: RPCConfig[];\n sorts: FieldSort[];\n shouldRenderActions: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\n\nexport function listViewConfig(config: ListViewConfigOptions): ListViewConfig {\n return {\n ...listViewConfigDefaults,\n ...config,\n } satisfies ListViewConfig;\n}\nexport const listViewConfigDefaults = {\n title: '',\n primaryResource: '' as Resource,\n type: 'ListView',\n createTitle: '',\n createButtonLabel: 'Create',\n loadCreatedResource: false,\n showViewButton: true,\n collapsible: false,\n listColumns: [],\n elements: [],\n parentClass: '',\n fieldClass: '',\n createConfig: {} as ListViewConfig,\n createNavigation: [],\n relatedConfigs: [],\n parentRelation: {\n parentKey: '' as FieldName,\n childKey: '' as FieldName,\n },\n overrideResource: '' as Resource,\n searchable: false,\n enableRowExpansion: false,\n rowExpansionConfig: {} as ChildResourceConfig,\n requireSearchToDisplayResults: false,\n showBackButton: true,\n filter: (): string => '',\n disableCacheForFilterPii: false,\n sorts: [] as FieldSort[],\n viewResource: '' as Resource,\n actionType: 'function' as ActionType,\n rpcConfigs: [],\n shouldRenderActions: {\n create: (): boolean => true,\n edit: (): boolean => true,\n delete: (): boolean => true,\n },\n} satisfies ListViewConfig;\n\nexport type ViewType = 'OneToOne' | 'OneToMany';\n\nexport interface ViewConfigOptions extends BaseConfigOptions {\n collapsible?: boolean;\n connectorResource?: Resource;\n relatedConfigs?: ChildResourceConfig[];\n rpcConfigs?: RPCConfig[];\n shouldRenderActions?: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\nexport interface ViewConfig extends BaseConfig {\n type: 'View';\n collapsible: boolean;\n // todo: remove this comment once full documentation has been added. Populate this value when a database view resource is used to connect the ViewConfig's parent resource to its primary resource\n connectorResource: Resource;\n rpcConfigs?: RPCConfig[];\n relatedConfigs: ChildResourceConfig[];\n /** A set of functions that allows for\n * conditional display of non-RPC\n * actions based on the pristine state of the resource\n * (if such a state is applicable. Creation for example won't\n * have such data)\n * This is separate from ABAC control which takes\n * precedence and is based on a user's attributes\n */\n shouldRenderActions: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\n\nexport function viewConfig(config: ViewConfigOptions): ViewConfig {\n return {\n ...viewConfigDefaults,\n ...config,\n } satisfies ViewConfig;\n}\nexport const viewConfigDefaults = {\n title: '',\n primaryResource: '' as Resource,\n type: 'View',\n createTitle: '',\n createButtonLabel: 'Create',\n parentClass: '',\n fieldClass: '',\n elements: [],\n collapsible: true,\n connectorResource: '' as Resource,\n relatedConfigs: [],\n createConfig: {} as ViewConfig,\n shouldRenderActions: {\n create: (): boolean => true,\n edit: (): boolean => true,\n delete: (): boolean => true,\n },\n createNavigation: [],\n parentRelation: {\n parentKey: '' as FieldName,\n childKey: '' as FieldName,\n },\n showBackButton: true,\n rpcConfigs: [],\n} satisfies ViewConfig;\n\nexport interface arrayConfigOptions {\n iteratedConfig: ChildResourceConfig;\n viewType?: ViewType;\n collapsible?: boolean;\n createConfig?: ConfigType;\n connectorResource?: Resource;\n connectorField?: FieldName;\n primaryResource: Resource;\n listFilter: (parentResource: any) => string;\n disableCacheForFilterPii?: boolean;\n sorts?: FieldSort[];\n title?: string;\n createButtonLabel?: string;\n limit?: number;\n shouldRenderActions?: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n}\nexport interface ArrayConfig {\n type: 'Array';\n iteratedConfig: ChildResourceConfig;\n viewType: ViewType;\n collapsible: boolean;\n createConfig: ConfigType;\n connectorResource: Resource;\n connectorField: FieldName;\n primaryResource: Resource;\n listFilter: (parentResource: any) => string;\n disableCacheForFilterPii: boolean;\n sorts: FieldSort[];\n title: string;\n createButtonLabel: string;\n shouldRenderActions: Record<'edit' | 'delete' | 'create', (data: any) => boolean>;\n limit: number;\n}\nexport function arrayConfig(config: arrayConfigOptions): ArrayConfig {\n return {\n ...arrayConfigDefaults,\n ...config,\n } satisfies ArrayConfig;\n}\nexport const arrayConfigDefaults = {\n type: 'Array',\n iteratedConfig: {} as ChildResourceConfig,\n viewType: 'OneToMany' as ViewType,\n collapsible: true,\n createConfig: {} as ViewConfig,\n connectorResource: '' as Resource,\n connectorField: '' as FieldName,\n primaryResource: '' as Resource,\n listFilter: (): string => '',\n disableCacheForFilterPii: false,\n sorts: [] as FieldSort[],\n title: '',\n createButtonLabel: 'Create',\n limit: Infinity,\n shouldRenderActions: {\n create: (): boolean => true,\n edit: (): boolean => true,\n delete: (): boolean => true,\n },\n} satisfies ArrayConfig;\n","export enum AlertLevel {\n ERROR = 'warn',\n INFO = 'accent',\n SUCCESS = 'success',\n}\n\nexport interface CreateNotificationMessage {\n duration?: number;\n message: string;\n link: string;\n level: AlertLevel;\n}\n\nexport interface NotificationMessage {\n id: number;\n duration?: number;\n message: string;\n link: string;\n level: AlertLevel;\n}\n","type Brand<K, T> = K & { __brand: T };\n\nexport type Permission = Brand<string, 'Permission'>;\nexport type Resource = Brand<string, 'Resource'>;\nexport type Domain = Brand<string, 'Domain'>;\nexport type FieldName = Brand<string, 'FieldName'>;\nexport type Method = Brand<string, 'Method'>;\nexport type DomainPermissions = Record<Domain, Record<Resource, Record<Permission, Permissions>>>;\n\nexport interface PermissionScope {\n resource: Resource;\n permission: Permission;\n domain: Domain;\n}\n\nexport const ReadPermission = 'Read' as Permission;\nexport const UpdatePermission = 'Update' as Permission;\n","// Meta interfaces for resources and methods\n// This file exists to break circular dependencies between types and ccc-resource\n\nimport { Resource } from './permissions';\n\nexport type ValidDisplayTypes =\n | 'boolean'\n | 'nullboolean'\n | 'number'\n | 'string'\n | 'date'\n | 'enumerated'\n | 'link'\n | 'uuid'\n | 'civildate'\n | 'string[]'\n | 'customtypes.document';\n\nexport type ValidRPCTypes = ValidDisplayTypes | `${Exclude<ValidDisplayTypes, 'string[]'>}[]`;\n\nexport interface RPCFieldMeta {\n fieldName: string;\n displayType: ValidRPCTypes;\n enumeratedResource?: Resource;\n}\n\nexport interface MethodMeta {\n route: string;\n fields: RPCFieldMeta[];\n}\n\nexport interface FieldMeta {\n fieldName: string;\n /** Indicates whether the field is required and only applies during resource creation.\n * Use the validators config parameter in all other contexts\n */\n required: boolean;\n primaryKey?: { ordinalPosition: number };\n displayType: ValidDisplayTypes;\n enumeratedResource?: Resource;\n isIndex: boolean;\n}\n\nexport interface ResourceMeta {\n route: string;\n consolidatedRoute?: string;\n listDisabled?: boolean;\n readDisabled?: boolean;\n createDisabled?: boolean;\n updateDisabled?: boolean;\n deleteDisabled?: boolean;\n substringSearchParameter?: string;\n fields: FieldMeta[];\n}\n\nexport type Meta = MethodMeta | ResourceMeta;\n\nexport namespace CustomTypes {\n export interface Document {\n // todo/fixme: implement the actual rich text document interface here\n placeholder: string;\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { Domain, Permission, Resource } from './permissions';\nimport { MethodMeta, ResourceMeta } from './resource-meta';\n\n/**\n * The base URL for API requests (e.g., 'https://api.example.com/').\n */\nexport const BASE_URL = new InjectionToken<string>('BASE_URL');\n\n/**\n * The path to the frontend login page (e.g., '/login').\n */\nexport const FRONTEND_LOGIN_PATH = new InjectionToken<string>('FRONTEND_LOGIN_PATH');\n\n/**\n * The path to the session endpoint (e.g., 'user/session').\n */\nexport const SESSION_PATH = new InjectionToken<string>('SESSION_PATH');\n\n/**\n * The base URL for API requests (e.g., '/api').\n */\nexport const API_URL = new InjectionToken<string>('API_URL');\n\nexport const PERMISSION_REQUIRED = new InjectionToken<(resource: Resource, permission: Permission) => boolean>(\n 'PERMISSION_REQUIRED',\n);\n\nexport const AVAILABLE_PERMISSIONS = new InjectionToken<{\n Create: Permission;\n Delete: Permission;\n List: Permission;\n Read: Permission;\n Update: Permission;\n}>('AVAILABLE_PERMISSIONS');\nexport const AVAILABLE_DOMAINS = new InjectionToken<Record<string, Domain>[]>('AVAILABLE_DOMAINS');\n\nexport const RESOURCE_META = new InjectionToken<(resource: Resource) => ResourceMeta>('RESOURCE_META');\nexport const METHOD_META = new InjectionToken<(method: string) => MethodMeta>('METHOD_META');\n\nexport const IDLE_SESSION_DURATION = new InjectionToken<number>('IDLE_SESSION_DURATION');\nexport const IDLE_WARNING_DURATION = new InjectionToken<number>('IDLE_WARNING_DURATION');\nexport const IDLE_KEEPALIVE_DURATION = new InjectionToken<number>('IDLE_KEEPALIVE_DURATION');\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport const validatorsPresent = (\n control: AbstractControl<unknown, unknown>,\n validators: ValidatorFn[],\n previousValidatorCount: number,\n): boolean => {\n if (validators.length === previousValidatorCount) {\n return true;\n }\n\n let hasAllValidators = true;\n for (const validator of validators) {\n if (!control.hasValidator(validator)) {\n hasAllValidators = false;\n break;\n }\n }\n return hasAllValidators;\n};\n\nexport const requiredIf = (predicate: () => boolean, validator: ValidatorFn) => {\n return (formControl: AbstractControl): ValidationErrors | null => {\n if (!formControl.parent) {\n return null;\n }\n if (predicate()) {\n return validator(formControl);\n }\n return null;\n };\n};\n\ndeclare const __singletonValidatorBrand: unique symbol;\nexport type ResourceValidatorFn = ValidatorFn & {\n readonly [__singletonValidatorBrand]: true;\n};\nexport function createResourceValidator(validator: ValidatorFn): ResourceValidatorFn {\n return validator as ResourceValidatorFn;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -528,6 +528,16 @@ function rootConfig(config) {
|
|
|
528
528
|
...config,
|
|
529
529
|
};
|
|
530
530
|
}
|
|
531
|
+
class CustomConfigComponent {
|
|
532
|
+
uuid = input(undefined, { ...(ngDevMode ? { debugName: "uuid" } : {}) });
|
|
533
|
+
parentData = input(undefined, { ...(ngDevMode ? { debugName: "parentData" } : {}) });
|
|
534
|
+
config = input(undefined, { ...(ngDevMode ? { debugName: "config" } : {}) });
|
|
535
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.2", ngImport: i0, type: CustomConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
536
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.2", type: CustomConfigComponent, isStandalone: true, inputs: { uuid: { classPropertyName: "uuid", publicName: "uuid", isSignal: true, isRequired: false, transformFunction: null }, parentData: { classPropertyName: "parentData", publicName: "parentData", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
537
|
+
}
|
|
538
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.2", ngImport: i0, type: CustomConfigComponent, decorators: [{
|
|
539
|
+
type: Directive
|
|
540
|
+
}], propDecorators: { uuid: [{ type: i0.Input, args: [{ isSignal: true, alias: "uuid", required: false }] }], parentData: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentData", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }] } });
|
|
531
541
|
function componentConfig(config) {
|
|
532
542
|
return {
|
|
533
543
|
...componentConfigDefaults,
|
|
@@ -3410,37 +3420,36 @@ class ResourceResolverComponent {
|
|
|
3410
3420
|
untracked(() => {
|
|
3411
3421
|
this.dynamicSlot().clear();
|
|
3412
3422
|
const component = config.component;
|
|
3413
|
-
|
|
3414
|
-
|
|
3415
|
-
|
|
3416
|
-
|
|
3417
|
-
|
|
3418
|
-
if (parentData) {
|
|
3419
|
-
|
|
3420
|
-
|
|
3421
|
-
|
|
3422
|
-
|
|
3423
|
-
|
|
3424
|
-
caseConfig.parentRelation.parentKey = '';
|
|
3425
|
-
}
|
|
3426
|
-
break;
|
|
3423
|
+
if (component === 'SwitchResolver') {
|
|
3424
|
+
let uuid = '';
|
|
3425
|
+
let caseConfig = {};
|
|
3426
|
+
for (const c of params.cases) {
|
|
3427
|
+
if (parentData) {
|
|
3428
|
+
if (parentData[c.parentField] === c.caseId) {
|
|
3429
|
+
uuid = String(parentData[c.childId]);
|
|
3430
|
+
caseConfig = c.config;
|
|
3431
|
+
if ('parentRelation' in caseConfig) {
|
|
3432
|
+
caseConfig.parentRelation.childKey = '';
|
|
3433
|
+
caseConfig.parentRelation.parentKey = '';
|
|
3427
3434
|
}
|
|
3435
|
+
break;
|
|
3428
3436
|
}
|
|
3429
3437
|
}
|
|
3430
|
-
if (uuid == '') {
|
|
3431
|
-
return;
|
|
3432
|
-
}
|
|
3433
|
-
// Use dynamic import to avoid circular dependency
|
|
3434
|
-
const primaryComponentRef = this.dynamicSlot().createComponent(this.compoundResourceComponent());
|
|
3435
|
-
primaryComponentRef.setInput('resourceConfig', caseConfig);
|
|
3436
|
-
primaryComponentRef.setInput('uuid', uuid);
|
|
3437
|
-
primaryComponentRef.setInput('parentData', parentData);
|
|
3438
|
-
break;
|
|
3439
3438
|
}
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3439
|
+
if (uuid == '') {
|
|
3440
|
+
return;
|
|
3441
|
+
}
|
|
3442
|
+
// Use dynamic import to avoid circular dependency
|
|
3443
|
+
const primaryComponentRef = this.dynamicSlot().createComponent(this.compoundResourceComponent());
|
|
3444
|
+
primaryComponentRef.setInput('resourceConfig', caseConfig);
|
|
3445
|
+
primaryComponentRef.setInput('uuid', uuid);
|
|
3446
|
+
primaryComponentRef.setInput('parentData', parentData);
|
|
3447
|
+
}
|
|
3448
|
+
else if (typeof component === 'function') {
|
|
3449
|
+
const primaryComponentRef = this.dynamicSlot().createComponent(component);
|
|
3450
|
+
primaryComponentRef.setInput('uuid', parentData['uuid'] || '');
|
|
3451
|
+
primaryComponentRef.setInput('config', config);
|
|
3452
|
+
primaryComponentRef.setInput('parentData', parentData);
|
|
3444
3453
|
}
|
|
3445
3454
|
});
|
|
3446
3455
|
});
|
|
@@ -4440,5 +4449,5 @@ function cleanStringForm(control) {
|
|
|
4440
4449
|
* Generated bundle index. Do not edit.
|
|
4441
4450
|
*/
|
|
4442
4451
|
|
|
4443
|
-
export { API_URL, AVAILABLE_DOMAINS, AVAILABLE_PERMISSIONS, ActionAccessControlWrapperComponent, AlertComponent, AlertLevel, ApiInterceptor, AppGridComponent, AuthService, AuthenticationGuard, AuthorizationGuard, BASE_URL, BaseInputComponent, BaseRPCModalComponent, CUSTOM_HTTP_REQUEST_OPTIONS, CamelCaseToTitlePipe, CccInputFieldComponent, CompoundResourceComponent, DeleteResourceConfirmationModalComponent, EmptyReadonlyFieldComponent, FRONTEND_LOGIN_PATH, FormStateService, HasPermissionDirective, IDLE_KEEPALIVE_DURATION, IDLE_SESSION_DURATION, IDLE_WARNING_DURATION, IdleService, InputMode, LeavePageConfirmationModalComponent, METHOD_META, NotificationService, PERMISSION_REQUIRED, PaddingElementComponent, RESOURCE_META, ReadPermission, ResourceArrayViewComponent, ResourceCreateComponent, ResourceFieldComponent, ResourceLayoutComponent, ResourceListComponent, ResourceListCreateComponent, ResourceResolverComponent, ResourceStore, ResourceViewComponent, RpcButtonComponent, SESSION_PATH, SidenavComponent, TableButtonComponent, UiCoreService, UpdatePermission, ValueFormatters, actionButtonConfig, actionButtonConfigDefaults, additionalResourceConfig, additionalResourceConfigDefaults, applyFormatting, arrayConfig, arrayConfigDefaults, canDeactivateGuard, civildateCoercion, cleanStringForm, componentConfig, componentConfigDefaults, computedDisplayField, computedDisplayFieldElementDefaults, concatFunctions, createFormGroup, createResourceValidator, defaultEmptyFieldValue, enumeratedConfig, enumeratedConfigDefaults, errorOptions, extractFieldNames, field, fieldElementDefaults, fieldSort, fieldSortDefaults, flattenElements, foreignKeyDefault, foreignKeyDefaultDefaults, formatDateString, generatedNavGroups, generatedNavItems, hyphenConcat, hyphenConcatWithoutResource, hyphenSpaceConcat, hyphenSpaceConcatWithoutResource, isUUID, listViewConfig, listViewConfigDefaults, maxConfigElementRecursionDepth, maxLayoutNestingDepth, metadataTypeCoercion, multiColumnConfig, multiColumnConfigDefaults, noSpaceConcatWithoutResource, nullBooleanConfig, nullBooleanConfigDefaults, padding, paddingElementDefaults, requiredIf, resourceRoutes, resourceValidators, rootConfig, rootConfigDefaults, rpcConfig, rpcConfigDefaults, section, sectionElementDefaults, simpleSlashDateFormatter, singleColumnConfig, singleColumnConfigDefaults, spaceConcat, spaceConcatWithoutResource, spaceHyphenConcat, spaceHyphenConcatWithoutResource, sparseData, sparseFormData, staticDefault, staticDefaultDefaults, switchParams, switchParamsDefaults, validatorsPresent, viewConfig, viewConfigDefaults };
|
|
4452
|
+
export { API_URL, AVAILABLE_DOMAINS, AVAILABLE_PERMISSIONS, ActionAccessControlWrapperComponent, AlertComponent, AlertLevel, ApiInterceptor, AppGridComponent, AuthService, AuthenticationGuard, AuthorizationGuard, BASE_URL, BaseInputComponent, BaseRPCModalComponent, CUSTOM_HTTP_REQUEST_OPTIONS, CamelCaseToTitlePipe, CccInputFieldComponent, CompoundResourceComponent, CustomConfigComponent, DeleteResourceConfirmationModalComponent, EmptyReadonlyFieldComponent, FRONTEND_LOGIN_PATH, FormStateService, HasPermissionDirective, IDLE_KEEPALIVE_DURATION, IDLE_SESSION_DURATION, IDLE_WARNING_DURATION, IdleService, InputMode, LeavePageConfirmationModalComponent, METHOD_META, NotificationService, PERMISSION_REQUIRED, PaddingElementComponent, RESOURCE_META, ReadPermission, ResourceArrayViewComponent, ResourceCreateComponent, ResourceFieldComponent, ResourceLayoutComponent, ResourceListComponent, ResourceListCreateComponent, ResourceResolverComponent, ResourceStore, ResourceViewComponent, RpcButtonComponent, SESSION_PATH, SidenavComponent, TableButtonComponent, UiCoreService, UpdatePermission, ValueFormatters, actionButtonConfig, actionButtonConfigDefaults, additionalResourceConfig, additionalResourceConfigDefaults, applyFormatting, arrayConfig, arrayConfigDefaults, canDeactivateGuard, civildateCoercion, cleanStringForm, componentConfig, componentConfigDefaults, computedDisplayField, computedDisplayFieldElementDefaults, concatFunctions, createFormGroup, createResourceValidator, defaultEmptyFieldValue, enumeratedConfig, enumeratedConfigDefaults, errorOptions, extractFieldNames, field, fieldElementDefaults, fieldSort, fieldSortDefaults, flattenElements, foreignKeyDefault, foreignKeyDefaultDefaults, formatDateString, generatedNavGroups, generatedNavItems, hyphenConcat, hyphenConcatWithoutResource, hyphenSpaceConcat, hyphenSpaceConcatWithoutResource, isUUID, listViewConfig, listViewConfigDefaults, maxConfigElementRecursionDepth, maxLayoutNestingDepth, metadataTypeCoercion, multiColumnConfig, multiColumnConfigDefaults, noSpaceConcatWithoutResource, nullBooleanConfig, nullBooleanConfigDefaults, padding, paddingElementDefaults, requiredIf, resourceRoutes, resourceValidators, rootConfig, rootConfigDefaults, rpcConfig, rpcConfigDefaults, section, sectionElementDefaults, simpleSlashDateFormatter, singleColumnConfig, singleColumnConfigDefaults, spaceConcat, spaceConcatWithoutResource, spaceHyphenConcat, spaceHyphenConcatWithoutResource, sparseData, sparseFormData, staticDefault, staticDefaultDefaults, switchParams, switchParamsDefaults, validatorsPresent, viewConfig, viewConfigDefaults };
|
|
4444
4453
|
//# sourceMappingURL=cccteam-ccc-lib.mjs.map
|