@webiny/app-admin 6.6.0-alpha.3 → 6.6.0-alpha.5

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.
Files changed (49) hide show
  1. package/base/Admin.js +2 -2
  2. package/base/Admin.js.map +1 -1
  3. package/base/resolveApiUrl.js.map +1 -1
  4. package/features/{aiChat/AiChatGateway.d.ts → adminAssistant/AdminAssistantGateway.d.ts} +7 -7
  5. package/features/{aiChat/AiChatGateway.js → adminAssistant/AdminAssistantGateway.js} +8 -8
  6. package/features/adminAssistant/AdminAssistantGateway.js.map +1 -0
  7. package/features/{aiChat/AiChatPresenter.d.ts → adminAssistant/AdminAssistantPresenter.d.ts} +7 -7
  8. package/features/{aiChat/AiChatPresenter.js → adminAssistant/AdminAssistantPresenter.js} +7 -7
  9. package/features/adminAssistant/AdminAssistantPresenter.js.map +1 -0
  10. package/features/{aiChat → adminAssistant}/abstractions.d.ts +30 -30
  11. package/features/adminAssistant/abstractions.js +6 -0
  12. package/features/adminAssistant/abstractions.js.map +1 -0
  13. package/features/adminAssistant/feature.d.ts +3 -0
  14. package/features/adminAssistant/feature.js +19 -0
  15. package/features/adminAssistant/feature.js.map +1 -0
  16. package/features/adminAssistant/index.d.ts +6 -0
  17. package/features/adminAssistant/index.js +3 -0
  18. package/features/formModel/Field.d.ts +6 -0
  19. package/features/formModel/Field.js +11 -0
  20. package/features/formModel/Field.js.map +1 -1
  21. package/features/formModel/Rules.test.js +55 -0
  22. package/features/formModel/Rules.test.js.map +1 -1
  23. package/features/wcp/ReactLicense.d.ts +5 -0
  24. package/features/wcp/ReactLicense.js +15 -0
  25. package/features/wcp/ReactLicense.js.map +1 -1
  26. package/features/wcp/WcpGateway.js +4 -0
  27. package/features/wcp/WcpGateway.js.map +1 -1
  28. package/hooks/useHotkeys.js +2 -2
  29. package/hooks/useHotkeys.js.map +1 -1
  30. package/index.d.ts +2 -2
  31. package/index.js +1 -1
  32. package/package.json +20 -20
  33. package/presentation/commandPalette/CommandPalettePresenter.js +2 -1
  34. package/presentation/commandPalette/CommandPalettePresenter.js.map +1 -1
  35. package/presentation/commandPalette/abstractions.d.ts +2 -0
  36. package/presentation/commandPalette/abstractions.js.map +1 -1
  37. package/presentation/commandPalette/commands/AskAiCommand.js +1 -1
  38. package/presentation/commandPalette/commands/AskAiCommand.js.map +1 -1
  39. package/presentation/installation/components/SystemInstaller/steps/FinishSetup/handleStartUsing.js.map +1 -1
  40. package/presentation/installation/presenters/SystemInstaller/SystemInstallerPresenter.js.map +1 -1
  41. package/features/aiChat/AiChatGateway.js.map +0 -1
  42. package/features/aiChat/AiChatPresenter.js.map +0 -1
  43. package/features/aiChat/abstractions.js +0 -6
  44. package/features/aiChat/abstractions.js.map +0 -1
  45. package/features/aiChat/feature.d.ts +0 -3
  46. package/features/aiChat/feature.js +0 -19
  47. package/features/aiChat/feature.js.map +0 -1
  48. package/features/aiChat/index.d.ts +0 -6
  49. package/features/aiChat/index.js +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"features/formModel/Field.js","sources":["../../../src/features/formModel/Field.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type {\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IValueOption,\n IFormModel,\n IField,\n IRule,\n FieldTypeMap,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback,\n RequiredWhenCallback,\n HiddenWhenCallback,\n DisabledWhenCallback,\n ComputedFieldCallback,\n IFieldCallbackParams,\n IFieldNavigator,\n IFieldScope\n} from \"./abstractions.js\";\n\n/**\n * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.\n */\nclass FieldScope implements IFieldScope {\n constructor(\n private _form: IFormModel,\n private _path: string\n ) {}\n\n field(name: string): IField {\n const path = this._path ? `${this._path}.${name}` : name;\n return this._form.field(path);\n }\n\n parent(): IFieldScope {\n if (!this._path) {\n throw new Error(\"Cannot navigate above root level.\");\n }\n const segments = this._path.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nclass FieldNavigator implements IFieldNavigator {\n constructor(\n private _form: IFormModel,\n private _qualifiedName: string\n ) {}\n\n parent(): IFieldScope {\n const segments = this._qualifiedName.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nexport class Field implements IField {\n private _value: unknown;\n private _validation: IFieldValidation = { isValid: null };\n private _disabled: boolean;\n private _hidden: boolean;\n private _beforeChangeCallbacks: BeforeChangeCallback[] = [];\n private _afterChangeCallbacks: AfterChangeCallback[] = [];\n private _afterSetValueCallbacks: AfterSetValueCallback[] = [];\n private _onBlurCallbacks: OnBlurCallback[] = [];\n private _requiredWhenCallbacks: RequiredWhenCallback[] = [];\n private _hiddenWhenCallbacks: HiddenWhenCallback[] = [];\n private _disabledWhenCallbacks: DisabledWhenCallback[] = [];\n private _computed: ComputedFieldCallback | null = null;\n private _computedUntilDirty: ComputedFieldCallback | null = null;\n /** Set once a computedUntilDirty field receives its first user edit. */\n private _computedOverridden = false;\n private _validating = false;\n private _validationCacheKey: string | undefined = undefined;\n private _validationCache: boolean | undefined = undefined;\n private _isUIChange = false;\n private _focusRequested = false;\n private _qualifiedName: string = \"\";\n private _parentPath: string = \"\";\n private _form: IFormModel | null = null;\n private _ancestorRules: IRule[] = [];\n\n readonly config: IFieldConfig;\n\n constructor(config: IFieldConfig) {\n this.config = config;\n this._qualifiedName = config.name;\n const defaultValue =\n typeof config.defaultValue === \"function\"\n ? (config.defaultValue as () => unknown)()\n : config.defaultValue;\n this._value = defaultValue ?? (config.isList ? [] : null);\n this._disabled = config.disabled;\n this._hidden = config.hidden;\n\n if (config.beforeChangeCallbacks) {\n this._beforeChangeCallbacks = [...config.beforeChangeCallbacks];\n }\n if (config.afterChangeCallbacks) {\n this._afterChangeCallbacks = [...config.afterChangeCallbacks];\n }\n if (config.afterSetValueCallbacks) {\n this._afterSetValueCallbacks = [...config.afterSetValueCallbacks];\n }\n if (config.onBlurCallbacks) {\n this._onBlurCallbacks = [...config.onBlurCallbacks];\n }\n if (config.requiredWhenCallbacks) {\n this._requiredWhenCallbacks = [...config.requiredWhenCallbacks];\n }\n if (config.hiddenWhenCallbacks) {\n this._hiddenWhenCallbacks = [...config.hiddenWhenCallbacks];\n }\n if (config.disabledWhenCallbacks) {\n this._disabledWhenCallbacks = [...config.disabledWhenCallbacks];\n }\n if (config.computed) {\n this._computed = config.computed;\n } else if (config.computedUntilDirty) {\n this._computedUntilDirty = config.computedUntilDirty;\n }\n\n makeAutoObservable(this, {\n config: false,\n vm: computed\n });\n }\n\n get name(): string {\n return this.config.name;\n }\n\n get type(): string {\n return this.config.type;\n }\n\n getValue<T = unknown>(): T {\n if (this._computed && this._form) {\n return this._computed(this._callbackParams()) as T;\n }\n if (this._computedUntilDirty && !this._computedOverridden && this._form) {\n return this._computedUntilDirty(this._callbackParams()) as T;\n }\n return this._value as T;\n }\n\n /**\n * Set value with beforeChange/afterChange pipeline.\n * beforeChange always runs (pure transform).\n * afterChange only fires when value actually changed.\n */\n setValue(raw: unknown): void {\n let transformed = this.config.normalizeValue\n ? this._applyNormalizeValue(raw, this.config.normalizeValue)\n : raw;\n for (const cb of this._beforeChangeCallbacks) {\n transformed = cb(transformed, this._callbackParams());\n }\n\n if (transformed === this._value) {\n return;\n }\n\n const wasComputed = this._computedUntilDirty && !this._computedOverridden && this._form;\n const computedValue = wasComputed\n ? this._computedUntilDirty!(this._callbackParams())\n : undefined;\n\n this._value = transformed;\n if (this._computedUntilDirty && this._isUIChange) {\n if (!wasComputed || transformed !== computedValue) {\n this._computedOverridden = true;\n }\n }\n\n for (const cb of this._afterChangeCallbacks) {\n cb(transformed, this._callbackParams());\n }\n\n if (!this._isUIChange) {\n for (const cb of this._afterSetValueCallbacks) {\n cb(transformed, this._callbackParams());\n }\n }\n }\n\n /**\n * Set value directly without running pipelines. Used by setData() and reset().\n */\n setValueSilent(value: unknown): void {\n const parsed = this.config.normalizeValue\n ? this._applyNormalizeValue(value, this.config.normalizeValue)\n : value;\n this._value = parsed;\n if (this._computedUntilDirty) {\n if (parsed === null || parsed === undefined) {\n this._computedOverridden = false;\n } else if (this._form) {\n const computedValue = this._computedUntilDirty(this._callbackParams());\n this._computedOverridden = parsed !== computedValue;\n } else {\n this._computedOverridden = true;\n }\n }\n }\n\n setDisabled(value: boolean): void {\n this._disabled = value;\n }\n\n private _evaluateRules(): { visible: boolean; disabled: boolean } {\n if (!this._form) {\n return { visible: true, disabled: false };\n }\n const own = this.config.rules ?? [];\n const all = [...this._ancestorRules, ...own];\n if (all.length === 0) {\n return { visible: true, disabled: false };\n }\n if (this._parentPath) {\n const resolved = all.map(rule => {\n if (rule.target.startsWith(\"$.\")) {\n return { ...rule, target: `${this._parentPath}.${rule.target.slice(2)}` };\n }\n return rule;\n });\n return this._form.evaluateRules(resolved);\n }\n return this._form.evaluateRules(all);\n }\n\n get visible(): boolean {\n if (this._hidden) {\n return false;\n }\n if (this._form && this._hiddenWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._hiddenWhenCallbacks) {\n if (cb(scoped)) {\n return false;\n }\n }\n }\n return this._evaluateRules().visible;\n }\n\n get disabled(): boolean {\n if (this._disabled) {\n return true;\n }\n if (this._form && this._disabledWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._disabledWhenCallbacks) {\n if (cb(scoped)) {\n return true;\n }\n }\n }\n return this._evaluateRules().disabled;\n }\n\n setVisible(value: boolean): void {\n this._hidden = !value;\n }\n\n setAncestorRules(rules: IRule[]): void {\n runInAction(() => {\n this._ancestorRules = rules;\n });\n }\n\n setValidation(validation: IFieldValidation): void {\n this._validation = validation;\n }\n\n resetValidation(): void {\n this._validation = { isValid: null };\n this._validationCacheKey = undefined;\n this._validationCache = undefined;\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._beforeChangeCallbacks.push(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._afterChangeCallbacks.push(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._afterSetValueCallbacks.push(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._onBlurCallbacks.push(cb);\n }\n\n addRequiredWhen(fn: (params: IFieldCallbackParams) => boolean, message?: string): void {\n this._requiredWhenCallbacks.push({ fn, message });\n }\n\n setComputed(fn: ComputedFieldCallback): void {\n this._computed = fn;\n this._computedUntilDirty = null;\n this._computedOverridden = false;\n }\n\n setComputedUntilDirty(fn: ComputedFieldCallback): void {\n this._computedUntilDirty = fn;\n this._computed = null;\n this._computedOverridden = false;\n }\n\n /**\n * Effective `required` state — true if the built-in `.required()` flag is\n * set, or if any `requiredWhen()` callback returns `true` for the current\n * form state. The first truthy callback wins; its message is used.\n */\n resolveRequired(): { required: boolean; message?: string } {\n return this._resolveRequired();\n }\n\n private _resolveRequired(): { required: boolean; message?: string } {\n if (this.config.required) {\n return { required: true, message: this.config.requiredMessage };\n }\n if (this._form && this._requiredWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._requiredWhenCallbacks) {\n if (cb.fn(scoped)) {\n return { required: true, message: cb.message };\n }\n }\n }\n return { required: false };\n }\n\n blur(): void {\n for (const cb of this._onBlurCallbacks) {\n cb(this._value, this._callbackParams());\n }\n }\n\n setForm(form: IFormModel, parentPath?: string): void {\n this._form = form;\n this._parentPath = parentPath || \"\";\n this._qualifiedName = parentPath ? `${parentPath}.${this.config.name}` : this.config.name;\n }\n\n private _callbackParams(): IFieldCallbackParams {\n if (!this._form) {\n throw new Error(\"Field not attached to a form.\");\n }\n return {\n field: new FieldNavigator(this._form, this._qualifiedName),\n form: this._form\n };\n }\n\n get qualifiedName(): string {\n return this._qualifiedName;\n }\n\n focus(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n this._form.focusField(this._qualifiedName);\n }\n\n requestFocus(): void {\n this._focusRequested = true;\n }\n\n clearFocusRequest(): void {\n this._focusRequested = false;\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (this.config.type !== type) {\n throw new Error(\n `Field \"${this.config.name}\" is type \"${this.config.type}\", not \"${type}\".`\n );\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n remove(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n (this._form as any).removeField(this.config.name);\n }\n\n get vm(): IFieldVM {\n const options = this._resolveOptions();\n const required = this._resolveRequired().required;\n\n return {\n name: this.config.name,\n type: this.config.type,\n label: this.config.label,\n help: this.config.help,\n description: this.config.description,\n note: this.config.note,\n placeholder: this.config.placeholder,\n autoFocus: this.config.autoFocus,\n value: this.getValue(),\n validation: this.visible ? this._validation : { isValid: null },\n validating: this._validating,\n required,\n visible: this.visible,\n disabled: this.disabled,\n renderer: this.config.renderer,\n rendererSettings: this.config.rendererSettings,\n isList: !!this.config.isList,\n options,\n onChange: (value: unknown) => this._setValueFromUI(value),\n onBlur: () => {\n if (this._form?.submitted) {\n void this.validate();\n }\n this.blur();\n },\n addItem: (value?: unknown) => this._addItem(value),\n removeItem: (index: number) => this._removeItem(index),\n focusRequested: this._focusRequested,\n clearFocusRequest: () => this.clearFocusRequest(),\n context: this._resolveContext()\n };\n }\n\n private _setValueFromUI(value: unknown): void {\n this._isUIChange = true;\n try {\n this.setValue(value);\n } finally {\n this._isUIChange = false;\n }\n }\n\n private _applyNormalizeValue(value: unknown, normalizeValue: (v: unknown) => unknown): unknown {\n if (this.config.isList && Array.isArray(value)) {\n return value.map(item => normalizeValue(item));\n }\n return normalizeValue(value);\n }\n\n private _addItem(value?: unknown): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI([...current, value ?? null]);\n }\n\n private _removeItem(index: number): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI(current.filter((_: unknown, i: number) => i !== index));\n }\n\n private _resolveOptions(): IValueOption[] | undefined {\n if (!this.config.options) {\n return undefined;\n }\n if (typeof this.config.options === \"function\") {\n return this.config.options(this._callbackParams());\n }\n return this.config.options;\n }\n\n private _resolveContext(): Record<string, unknown> {\n if (!this.config.context || !this._form) {\n return {};\n }\n return this.config.context(this._callbackParams());\n }\n\n /**\n * Validate this field. Returns true if valid.\n * Validation order: required check → zod schema.\n * Hidden fields are excluded from validation.\n *\n * Pass `{ force: true }` to bypass the memoization cache (used by\n * `form.validate()` / `form.submit()`). Blur-triggered validation\n * omits the flag so unchanged values return the cached result.\n */\n async validate(options?: { force?: boolean }): Promise<boolean> {\n if (!this.visible) {\n runInAction(() => {\n this._validation = { isValid: null };\n });\n return true;\n }\n\n const effectiveValue = this.getValue();\n\n // Memoization: return cached result when value hasn't changed.\n if (!options?.force && this._validationCache !== undefined) {\n const cacheKey = this._serializeValue(effectiveValue);\n if (this._validationCacheKey === cacheKey) {\n return this._validationCache;\n }\n }\n\n runInAction(() => {\n this._validating = true;\n });\n\n try {\n const requiredState = this._resolveRequired();\n\n // Required check\n if (requiredState.required) {\n const isEmpty =\n effectiveValue === null ||\n effectiveValue === undefined ||\n effectiveValue === \"\" ||\n (this.config.isList &&\n Array.isArray(effectiveValue) &&\n effectiveValue.length === 0);\n\n if (isEmpty) {\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: requiredState.message || \"This field is required.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n // Zod schema check\n if (this.config.schema) {\n const result = await this.config.schema.safeParseAsync(effectiveValue);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = { isValid: true };\n this._validationCacheKey = cacheKey;\n this._validationCache = true;\n });\n return true;\n } finally {\n runInAction(() => {\n this._validating = false;\n });\n }\n }\n\n private _serializeValue(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(Math.random());\n }\n }\n\n /** True if this field has any computed callback configured. */\n get isComputed(): boolean {\n return this._computed !== null || this._computedUntilDirty !== null;\n }\n\n /** True if a computedUntilDirty field has been overridden by user edit. */\n get isComputedOverridden(): boolean {\n return this._computedOverridden;\n }\n}\n"],"names":["FieldScope","_form","_path","name","path","Error","segments","FieldNavigator","_qualifiedName","Field","config","undefined","defaultValue","makeAutoObservable","computed","raw","transformed","cb","wasComputed","computedValue","value","parsed","own","all","resolved","rule","scoped","rules","runInAction","validation","fn","message","form","parentPath","type","options","required","index","normalizeValue","Array","item","current","_","i","effectiveValue","cacheKey","requiredState","isEmpty","result","firstIssue","JSON","String","Math"],"mappings":"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"}
1
+ {"version":3,"file":"features/formModel/Field.js","sources":["../../../src/features/formModel/Field.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type {\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IValueOption,\n IFormModel,\n IField,\n IRule,\n FieldTypeMap,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback,\n RequiredWhenCallback,\n HiddenWhenCallback,\n DisabledWhenCallback,\n ComputedFieldCallback,\n IFieldCallbackParams,\n IFieldNavigator,\n IFieldScope\n} from \"./abstractions.js\";\n\n/**\n * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.\n */\nclass FieldScope implements IFieldScope {\n constructor(\n private _form: IFormModel,\n private _path: string\n ) {}\n\n field(name: string): IField {\n const path = this._path ? `${this._path}.${name}` : name;\n return this._form.field(path);\n }\n\n parent(): IFieldScope {\n if (!this._path) {\n throw new Error(\"Cannot navigate above root level.\");\n }\n const segments = this._path.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nclass FieldNavigator implements IFieldNavigator {\n constructor(\n private _form: IFormModel,\n private _qualifiedName: string\n ) {}\n\n parent(): IFieldScope {\n const segments = this._qualifiedName.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nexport class Field implements IField {\n private _value: unknown;\n private _validation: IFieldValidation = { isValid: null };\n private _disabled: boolean;\n private _hidden: boolean;\n private _beforeChangeCallbacks: BeforeChangeCallback[] = [];\n private _afterChangeCallbacks: AfterChangeCallback[] = [];\n private _afterSetValueCallbacks: AfterSetValueCallback[] = [];\n private _onBlurCallbacks: OnBlurCallback[] = [];\n private _requiredWhenCallbacks: RequiredWhenCallback[] = [];\n private _hiddenWhenCallbacks: HiddenWhenCallback[] = [];\n private _disabledWhenCallbacks: DisabledWhenCallback[] = [];\n private _computed: ComputedFieldCallback | null = null;\n private _computedUntilDirty: ComputedFieldCallback | null = null;\n /** Set once a computedUntilDirty field receives its first user edit. */\n private _computedOverridden = false;\n private _validating = false;\n private _validationCacheKey: string | undefined = undefined;\n private _validationCache: boolean | undefined = undefined;\n private _isUIChange = false;\n private _focusRequested = false;\n private _qualifiedName: string = \"\";\n private _parentPath: string = \"\";\n private _form: IFormModel | null = null;\n private _ancestorRules: IRule[] = [];\n\n readonly config: IFieldConfig;\n\n constructor(config: IFieldConfig) {\n this.config = config;\n this._qualifiedName = config.name;\n const defaultValue =\n typeof config.defaultValue === \"function\"\n ? (config.defaultValue as () => unknown)()\n : config.defaultValue;\n this._value = defaultValue ?? (config.isList ? [] : null);\n this._disabled = config.disabled;\n this._hidden = config.hidden;\n\n if (config.beforeChangeCallbacks) {\n this._beforeChangeCallbacks = [...config.beforeChangeCallbacks];\n }\n if (config.afterChangeCallbacks) {\n this._afterChangeCallbacks = [...config.afterChangeCallbacks];\n }\n if (config.afterSetValueCallbacks) {\n this._afterSetValueCallbacks = [...config.afterSetValueCallbacks];\n }\n if (config.onBlurCallbacks) {\n this._onBlurCallbacks = [...config.onBlurCallbacks];\n }\n if (config.requiredWhenCallbacks) {\n this._requiredWhenCallbacks = [...config.requiredWhenCallbacks];\n }\n if (config.hiddenWhenCallbacks) {\n this._hiddenWhenCallbacks = [...config.hiddenWhenCallbacks];\n }\n if (config.disabledWhenCallbacks) {\n this._disabledWhenCallbacks = [...config.disabledWhenCallbacks];\n }\n if (config.computed) {\n this._computed = config.computed;\n } else if (config.computedUntilDirty) {\n this._computedUntilDirty = config.computedUntilDirty;\n }\n\n makeAutoObservable(this, {\n config: false,\n vm: computed\n });\n }\n\n get name(): string {\n return this.config.name;\n }\n\n get type(): string {\n return this.config.type;\n }\n\n getValue<T = unknown>(): T {\n if (this._computed && this._form) {\n return this._computed(this._callbackParams()) as T;\n }\n if (this._computedUntilDirty && !this._computedOverridden && this._form) {\n return this._computedUntilDirty(this._callbackParams()) as T;\n }\n return this._value as T;\n }\n\n /**\n * Set value with beforeChange/afterChange pipeline.\n * beforeChange always runs (pure transform).\n * afterChange only fires when value actually changed.\n */\n setValue(raw: unknown): void {\n let transformed = this.config.normalizeValue\n ? this._applyNormalizeValue(raw, this.config.normalizeValue)\n : raw;\n for (const cb of this._beforeChangeCallbacks) {\n transformed = cb(transformed, this._callbackParams());\n }\n\n if (transformed === this._value) {\n return;\n }\n\n const wasComputed = this._computedUntilDirty && !this._computedOverridden && this._form;\n const computedValue = wasComputed\n ? this._computedUntilDirty!(this._callbackParams())\n : undefined;\n\n this._value = transformed;\n if (this._computedUntilDirty && this._isUIChange) {\n if (!wasComputed || transformed !== computedValue) {\n this._computedOverridden = true;\n }\n }\n\n for (const cb of this._afterChangeCallbacks) {\n cb(transformed, this._callbackParams());\n }\n\n if (!this._isUIChange) {\n for (const cb of this._afterSetValueCallbacks) {\n cb(transformed, this._callbackParams());\n }\n }\n }\n\n /**\n * Set value directly without running pipelines. Used by setData() and reset().\n */\n setValueSilent(value: unknown): void {\n const parsed = this.config.normalizeValue\n ? this._applyNormalizeValue(value, this.config.normalizeValue)\n : value;\n this._value = parsed;\n if (this._computedUntilDirty) {\n if (parsed === null || parsed === undefined) {\n this._computedOverridden = false;\n } else if (this._form) {\n const computedValue = this._computedUntilDirty(this._callbackParams());\n this._computedOverridden = parsed !== computedValue;\n } else {\n this._computedOverridden = true;\n }\n }\n }\n\n setDisabled(value: boolean): void {\n this._disabled = value;\n }\n\n /**\n * `form.field()` throws for a path it can't resolve, which happens while a form is\n * still being assembled. Ancestor lookups treat that as \"no parent\" rather than\n * failing the render.\n */\n private _safeGetField(name: string): IField | undefined {\n try {\n return this._form?.field(name);\n } catch {\n return undefined;\n }\n }\n\n private _evaluateRules(): { visible: boolean; disabled: boolean } {\n if (!this._form) {\n return { visible: true, disabled: false };\n }\n const own = this.config.rules ?? [];\n const all = [...this._ancestorRules, ...own];\n if (all.length === 0) {\n return { visible: true, disabled: false };\n }\n if (this._parentPath) {\n const resolved = all.map(rule => {\n if (rule.target.startsWith(\"$.\")) {\n return { ...rule, target: `${this._parentPath}.${rule.target.slice(2)}` };\n }\n return rule;\n });\n return this._form.evaluateRules(resolved);\n }\n return this._form.evaluateRules(all);\n }\n\n get visible(): boolean {\n if (this._hidden) {\n return false;\n }\n if (this._form && this._hiddenWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._hiddenWhenCallbacks) {\n if (cb(scoped)) {\n return false;\n }\n }\n }\n return this._evaluateRules().visible;\n }\n\n get disabled(): boolean {\n if (this._disabled) {\n return true;\n }\n /**\n * Disabling a container disables everything inside it, the way a disabled\n * fieldset does in HTML. Without this, marking an object field disabled would\n * grey out the container while leaving every child editable.\n */\n if (this._parentPath && this._form) {\n const parent = this._safeGetField(this._parentPath);\n if (parent?.disabled) {\n return true;\n }\n }\n if (this._form && this._disabledWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._disabledWhenCallbacks) {\n if (cb(scoped)) {\n return true;\n }\n }\n }\n return this._evaluateRules().disabled;\n }\n\n setVisible(value: boolean): void {\n this._hidden = !value;\n }\n\n setAncestorRules(rules: IRule[]): void {\n runInAction(() => {\n this._ancestorRules = rules;\n });\n }\n\n setValidation(validation: IFieldValidation): void {\n this._validation = validation;\n }\n\n resetValidation(): void {\n this._validation = { isValid: null };\n this._validationCacheKey = undefined;\n this._validationCache = undefined;\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._beforeChangeCallbacks.push(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._afterChangeCallbacks.push(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._afterSetValueCallbacks.push(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._onBlurCallbacks.push(cb);\n }\n\n addRequiredWhen(fn: (params: IFieldCallbackParams) => boolean, message?: string): void {\n this._requiredWhenCallbacks.push({ fn, message });\n }\n\n setComputed(fn: ComputedFieldCallback): void {\n this._computed = fn;\n this._computedUntilDirty = null;\n this._computedOverridden = false;\n }\n\n setComputedUntilDirty(fn: ComputedFieldCallback): void {\n this._computedUntilDirty = fn;\n this._computed = null;\n this._computedOverridden = false;\n }\n\n /**\n * Effective `required` state — true if the built-in `.required()` flag is\n * set, or if any `requiredWhen()` callback returns `true` for the current\n * form state. The first truthy callback wins; its message is used.\n */\n resolveRequired(): { required: boolean; message?: string } {\n return this._resolveRequired();\n }\n\n private _resolveRequired(): { required: boolean; message?: string } {\n if (this.config.required) {\n return { required: true, message: this.config.requiredMessage };\n }\n if (this._form && this._requiredWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._requiredWhenCallbacks) {\n if (cb.fn(scoped)) {\n return { required: true, message: cb.message };\n }\n }\n }\n return { required: false };\n }\n\n blur(): void {\n for (const cb of this._onBlurCallbacks) {\n cb(this._value, this._callbackParams());\n }\n }\n\n setForm(form: IFormModel, parentPath?: string): void {\n this._form = form;\n this._parentPath = parentPath || \"\";\n this._qualifiedName = parentPath ? `${parentPath}.${this.config.name}` : this.config.name;\n }\n\n private _callbackParams(): IFieldCallbackParams {\n if (!this._form) {\n throw new Error(\"Field not attached to a form.\");\n }\n return {\n field: new FieldNavigator(this._form, this._qualifiedName),\n form: this._form\n };\n }\n\n get qualifiedName(): string {\n return this._qualifiedName;\n }\n\n focus(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n this._form.focusField(this._qualifiedName);\n }\n\n requestFocus(): void {\n this._focusRequested = true;\n }\n\n clearFocusRequest(): void {\n this._focusRequested = false;\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (this.config.type !== type) {\n throw new Error(\n `Field \"${this.config.name}\" is type \"${this.config.type}\", not \"${type}\".`\n );\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n remove(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n (this._form as any).removeField(this.config.name);\n }\n\n get vm(): IFieldVM {\n const options = this._resolveOptions();\n const required = this._resolveRequired().required;\n\n return {\n name: this.config.name,\n type: this.config.type,\n label: this.config.label,\n help: this.config.help,\n description: this.config.description,\n note: this.config.note,\n placeholder: this.config.placeholder,\n autoFocus: this.config.autoFocus,\n value: this.getValue(),\n validation: this.visible ? this._validation : { isValid: null },\n validating: this._validating,\n required,\n visible: this.visible,\n disabled: this.disabled,\n renderer: this.config.renderer,\n rendererSettings: this.config.rendererSettings,\n isList: !!this.config.isList,\n options,\n onChange: (value: unknown) => this._setValueFromUI(value),\n onBlur: () => {\n if (this._form?.submitted) {\n void this.validate();\n }\n this.blur();\n },\n addItem: (value?: unknown) => this._addItem(value),\n removeItem: (index: number) => this._removeItem(index),\n focusRequested: this._focusRequested,\n clearFocusRequest: () => this.clearFocusRequest(),\n context: this._resolveContext()\n };\n }\n\n private _setValueFromUI(value: unknown): void {\n this._isUIChange = true;\n try {\n this.setValue(value);\n } finally {\n this._isUIChange = false;\n }\n }\n\n private _applyNormalizeValue(value: unknown, normalizeValue: (v: unknown) => unknown): unknown {\n if (this.config.isList && Array.isArray(value)) {\n return value.map(item => normalizeValue(item));\n }\n return normalizeValue(value);\n }\n\n private _addItem(value?: unknown): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI([...current, value ?? null]);\n }\n\n private _removeItem(index: number): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI(current.filter((_: unknown, i: number) => i !== index));\n }\n\n private _resolveOptions(): IValueOption[] | undefined {\n if (!this.config.options) {\n return undefined;\n }\n if (typeof this.config.options === \"function\") {\n return this.config.options(this._callbackParams());\n }\n return this.config.options;\n }\n\n private _resolveContext(): Record<string, unknown> {\n if (!this.config.context || !this._form) {\n return {};\n }\n return this.config.context(this._callbackParams());\n }\n\n /**\n * Validate this field. Returns true if valid.\n * Validation order: required check → zod schema.\n * Hidden fields are excluded from validation.\n *\n * Pass `{ force: true }` to bypass the memoization cache (used by\n * `form.validate()` / `form.submit()`). Blur-triggered validation\n * omits the flag so unchanged values return the cached result.\n */\n async validate(options?: { force?: boolean }): Promise<boolean> {\n if (!this.visible) {\n runInAction(() => {\n this._validation = { isValid: null };\n });\n return true;\n }\n\n const effectiveValue = this.getValue();\n\n // Memoization: return cached result when value hasn't changed.\n if (!options?.force && this._validationCache !== undefined) {\n const cacheKey = this._serializeValue(effectiveValue);\n if (this._validationCacheKey === cacheKey) {\n return this._validationCache;\n }\n }\n\n runInAction(() => {\n this._validating = true;\n });\n\n try {\n const requiredState = this._resolveRequired();\n\n // Required check\n if (requiredState.required) {\n const isEmpty =\n effectiveValue === null ||\n effectiveValue === undefined ||\n effectiveValue === \"\" ||\n (this.config.isList &&\n Array.isArray(effectiveValue) &&\n effectiveValue.length === 0);\n\n if (isEmpty) {\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: requiredState.message || \"This field is required.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n // Zod schema check\n if (this.config.schema) {\n const result = await this.config.schema.safeParseAsync(effectiveValue);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = { isValid: true };\n this._validationCacheKey = cacheKey;\n this._validationCache = true;\n });\n return true;\n } finally {\n runInAction(() => {\n this._validating = false;\n });\n }\n }\n\n private _serializeValue(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(Math.random());\n }\n }\n\n /** True if this field has any computed callback configured. */\n get isComputed(): boolean {\n return this._computed !== null || this._computedUntilDirty !== null;\n }\n\n /** True if a computedUntilDirty field has been overridden by user edit. */\n get isComputedOverridden(): boolean {\n return this._computedOverridden;\n }\n}\n"],"names":["FieldScope","_form","_path","name","path","Error","segments","FieldNavigator","_qualifiedName","Field","config","undefined","defaultValue","makeAutoObservable","computed","raw","transformed","cb","wasComputed","computedValue","value","parsed","own","all","resolved","rule","scoped","parent","rules","runInAction","validation","fn","message","form","parentPath","type","options","required","index","normalizeValue","Array","item","current","_","i","effectiveValue","cacheKey","requiredState","isEmpty","result","firstIssue","JSON","String","Math"],"mappings":"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"}
@@ -320,5 +320,60 @@ describe("Rules system", ()=>{
320
320
  });
321
321
  });
322
322
  });
323
+ describe("disabled cascades into containers", ()=>{
324
+ it("disables the children of a disabled object field", ()=>{
325
+ const form = createForm({
326
+ fields: (fields)=>({
327
+ title: fields.text().label("Title"),
328
+ meta: fields.object().label("Meta").disabled().fields((inner)=>({
329
+ source: inner.text().label("Source"),
330
+ comment: inner.text().label("Comment")
331
+ }))
332
+ })
333
+ });
334
+ expect(form.field("meta").disabled).toBe(true);
335
+ expect(form.field("meta.source").disabled).toBe(true);
336
+ expect(form.field("meta.comment").disabled).toBe(true);
337
+ expect(form.field("title").disabled).toBe(false);
338
+ });
339
+ it("reaches grandchildren of a disabled object field", ()=>{
340
+ const form = createForm({
341
+ fields: (fields)=>({
342
+ outer: fields.object().label("Outer").disabled().fields((inner)=>({
343
+ nested: inner.object().label("Nested").fields((deep)=>({
344
+ value: deep.text().label("Value")
345
+ }))
346
+ }))
347
+ })
348
+ });
349
+ expect(form.field("outer.nested").disabled).toBe(true);
350
+ expect(form.field("outer.nested.value").disabled).toBe(true);
351
+ });
352
+ it("leaves children alone when the container is not disabled", ()=>{
353
+ const form = createForm({
354
+ fields: (fields)=>({
355
+ meta: fields.object().label("Meta").fields((inner)=>({
356
+ source: inner.text().label("Source").disabled(),
357
+ comment: inner.text().label("Comment")
358
+ }))
359
+ })
360
+ });
361
+ expect(form.field("meta").disabled).toBe(false);
362
+ expect(form.field("meta.source").disabled).toBe(true);
363
+ expect(form.field("meta.comment").disabled).toBe(false);
364
+ });
365
+ it("picks up a container disabled after the form was built", ()=>{
366
+ const form = createForm({
367
+ fields: (fields)=>({
368
+ meta: fields.object().label("Meta").fields((inner)=>({
369
+ source: inner.text().label("Source")
370
+ }))
371
+ })
372
+ });
373
+ expect(form.field("meta.source").disabled).toBe(false);
374
+ form.field("meta").setDisabled(true);
375
+ expect(form.field("meta.source").disabled).toBe(true);
376
+ });
377
+ });
323
378
 
324
379
  //# sourceMappingURL=Rules.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"features/formModel/Rules.test.js","sources":["../../../src/features/formModel/Rules.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { FormModelFeature } from \"./feature.js\";\nimport { ConditionRuleEvaluator } from \"./ConditionRuleEvaluator.js\";\nimport {\n FormModelFactory,\n type IRule,\n type IRuleEvaluator,\n type ITabsNodeVM,\n type IFormModel,\n type IFormModelConfig\n} from \"./abstractions.js\";\n\nfunction createForm(config: {\n extraEvaluators?: IRuleEvaluator[];\n fields: IFormModelConfig[\"fields\"];\n layout?: IFormModelConfig[\"layout\"];\n}) {\n const container = new Container();\n FormModelFeature.register(container);\n return container.resolve(FormModelFactory).create({\n fields: config.fields,\n layout: config.layout,\n ruleEvaluators: config.extraEvaluators\n });\n}\n\ndescribe(\"Rules system\", () => {\n describe(\"condition rule on a field\", () => {\n it(\"hides a field when its rule matches\", () => {\n const form = createForm({\n fields: fields => ({\n title: fields.text().label(\"Title\"),\n subtitle: fields\n .text()\n .label(\"Subtitle\")\n .rules([\n {\n type: \"condition\",\n target: \"title\",\n operator: \"isEmpty\",\n value: null,\n action: \"hide\"\n }\n ])\n })\n });\n\n expect(form.field(\"subtitle\").visible).toBe(false);\n expect(form.field(\"subtitle\").vm.visible).toBe(false);\n\n form.field(\"title\").setValue(\"Hello\");\n expect(form.field(\"subtitle\").visible).toBe(true);\n expect(form.field(\"subtitle\").vm.visible).toBe(true);\n });\n\n it(\"disables a field when its rule matches\", () => {\n const form = createForm({\n fields: fields => ({\n country: fields.text().label(\"Country\"),\n city: fields\n .text()\n .label(\"City\")\n .rules([\n {\n type: \"condition\",\n target: \"country\",\n operator: \"isEmpty\",\n value: null,\n action: \"disable\"\n }\n ])\n })\n });\n\n expect(form.field(\"city\").vm.disabled).toBe(true);\n\n form.field(\"country\").setValue(\"US\");\n expect(form.field(\"city\").vm.disabled).toBe(false);\n });\n\n it(\"supports eq operator\", () => {\n const form = createForm({\n fields: fields => ({\n plan: fields.text().label(\"Plan\"),\n enterpriseOnly: fields\n .text()\n .label(\"Enterprise\")\n .rules([\n {\n type: \"condition\",\n target: \"plan\",\n operator: \"eq\",\n value: \"enterprise\",\n action: \"hide\"\n }\n ])\n })\n });\n\n form.field(\"plan\").setValue(\"starter\");\n expect(form.field(\"enterpriseOnly\").visible).toBe(true);\n\n form.field(\"plan\").setValue(\"enterprise\");\n expect(form.field(\"enterpriseOnly\").visible).toBe(false);\n });\n\n it(\"excludes hidden fields from validation\", async () => {\n const form = createForm({\n fields: fields => ({\n toggle: fields.text().label(\"Toggle\"),\n required: fields\n .text()\n .label(\"Required\")\n .required(\"Must fill\")\n .rules([\n {\n type: \"condition\",\n target: \"toggle\",\n operator: \"isEmpty\",\n value: null,\n action: \"hide\"\n }\n ])\n })\n });\n\n // toggle is empty → \"required\" is hidden → should not count as invalid\n const valid = await form.validate();\n expect(valid).toBe(true);\n\n // Fill toggle → \"required\" becomes visible → fails without a value\n form.field(\"toggle\").setValue(\"anything\");\n const valid2 = await form.validate();\n expect(valid2).toBe(false);\n expect(form.errors.some(e => e.path === \"required\")).toBe(true);\n });\n });\n\n describe(\"rules on layout elements\", () => {\n it(\"cascades disable from tabs container to contained fields\", () => {\n const form = createForm({\n fields: fields => ({\n trigger: fields.text().label(\"Trigger\"),\n general: fields.text().label(\"General\"),\n seo: fields.text().label(\"SEO\")\n }),\n layout: layout => [\n layout.row(\"trigger\"),\n layout\n .tabs(\"settings\")\n .rules([\n {\n type: \"condition\",\n target: \"trigger\",\n operator: \"isEmpty\",\n value: null,\n action: \"disable\"\n }\n ])\n .tab(\"general\", tab => {\n tab.label(\"General\").layout(layout => [layout.row(\"general\")]);\n })\n .tab(\"seo\", tab => {\n tab.label(\"SEO\").layout(layout => [layout.row(\"seo\")]);\n })\n ]\n });\n\n expect(form.field(\"general\").vm.disabled).toBe(true);\n expect(form.field(\"seo\").vm.disabled).toBe(true);\n\n const tabs = form.vm.layout[1] as ITabsNodeVM;\n expect(tabs.disabled).toBe(true);\n expect(tabs.tabs[0].disabled).toBe(true);\n\n form.field(\"trigger\").setValue(\"go\");\n expect(form.field(\"general\").vm.disabled).toBe(false);\n expect(form.field(\"seo\").vm.disabled).toBe(false);\n });\n\n it(\"cascades disable from a single tab to its fields only\", () => {\n const form = createForm({\n fields: fields => ({\n title: fields.text().label(\"Title\"),\n general: fields.text().label(\"General\"),\n seo: fields.text().label(\"SEO\")\n }),\n layout: layout => [\n layout\n .tabs(\"settings\")\n .tab(\"general\", tab => {\n tab.label(\"General\").layout(layout => [layout.row(\"general\")]);\n })\n .tab(\"seo\", tab => {\n tab.label(\"SEO\")\n .rules([\n {\n type: \"condition\",\n target: \"title\",\n operator: \"isEmpty\",\n value: null,\n action: \"disable\"\n }\n ])\n .layout(layout => [layout.row(\"seo\")]);\n })\n ]\n });\n\n expect(form.field(\"general\").vm.disabled).toBe(false);\n expect(form.field(\"seo\").vm.disabled).toBe(true);\n\n const tabs = form.vm.layout[0] as ITabsNodeVM;\n expect(tabs.tabs[0].disabled).toBe(false);\n expect(tabs.tabs[1].disabled).toBe(true);\n });\n\n it(\"hides a tab and its fields when the tab has a hide rule\", async () => {\n const form = createForm({\n fields: fields => ({\n trigger: fields.text().label(\"Trigger\"),\n hiddenField: fields.text().label(\"Hidden\").required(\"needed\")\n }),\n layout: layout => [\n layout.row(\"trigger\"),\n layout.tabs(\"settings\").tab(\"secret\", tab => {\n tab.label(\"Secret\")\n .rules([\n {\n type: \"condition\",\n target: \"trigger\",\n operator: \"isEmpty\",\n value: null,\n action: \"hide\"\n }\n ])\n .layout(layout => [layout.row(\"hiddenField\")]);\n })\n ]\n });\n\n // Tab is hidden → field inside is hidden → not validated\n const valid = await form.validate();\n expect(valid).toBe(true);\n\n // Form VM should not expose this tabs node (all tabs hidden = no tabs node)\n const tabsVm = form.vm.layout.find(n => n.type === \"tabs\");\n expect(tabsVm).toBeUndefined();\n });\n\n it(\"hides the entire tabs container when its rule matches\", () => {\n const form = createForm({\n fields: fields => ({\n trigger: fields.text().label(\"Trigger\"),\n inner: fields.text().label(\"Inner\")\n }),\n layout: layout => [\n layout.row(\"trigger\"),\n layout\n .tabs(\"settings\")\n .rules([\n {\n type: \"condition\",\n target: \"trigger\",\n operator: \"isEmpty\",\n value: null,\n action: \"hide\"\n }\n ])\n .tab(\"tab1\", tab => {\n tab.label(\"Tab 1\").layout(layout => [layout.row(\"inner\")]);\n })\n ]\n });\n\n expect(form.vm.layout.find(n => n.type === \"tabs\")).toBeUndefined();\n expect(form.field(\"inner\").visible).toBe(false);\n\n form.field(\"trigger\").setValue(\"yes\");\n expect(form.field(\"inner\").visible).toBe(true);\n expect(form.vm.layout.find(n => n.type === \"tabs\")).toBeDefined();\n });\n });\n\n describe(\"custom rule evaluators\", () => {\n it(\"uses externally registered evaluators for custom rule types\", () => {\n class AccessControlEvaluator implements IRuleEvaluator {\n constructor(private userTeams: string[]) {}\n canEvaluate(rule: IRule) {\n return rule.type === \"accessControl\";\n }\n evaluate(rule: IRule): boolean {\n if (!rule.value) {\n return false;\n }\n const [scope, id] = rule.value.split(\":\");\n return scope === \"team\" && this.userTeams.includes(id);\n }\n }\n\n const form = createForm({\n extraEvaluators: [new AccessControlEvaluator([\"admins\"])],\n fields: fields => ({\n adminField: fields\n .text()\n .label(\"Admin Only\")\n .rules([\n {\n type: \"accessControl\",\n target: \"identity\",\n operator: \"matches\",\n value: \"team:admins\",\n action: \"disable\"\n }\n ])\n })\n });\n\n expect(form.field(\"adminField\").vm.disabled).toBe(true);\n });\n\n it(\"ignores rules with unknown types (no evaluator)\", () => {\n const form = createForm({\n fields: fields => ({\n weird: fields\n .text()\n .label(\"Weird\")\n .rules([\n {\n type: \"bogusType\",\n target: \"x\",\n operator: \"noop\",\n value: null,\n action: \"hide\"\n }\n ])\n })\n });\n\n // Unknown rule types are ignored — field remains visible\n expect(form.field(\"weird\").visible).toBe(true);\n expect(form.field(\"weird\").vm.disabled).toBe(false);\n });\n });\n\n describe(\"ConditionRuleEvaluator\", () => {\n it(\"canEvaluate returns true only for condition rules\", () => {\n const e = new ConditionRuleEvaluator();\n expect(\n e.canEvaluate({\n type: \"condition\",\n target: \"x\",\n operator: \"eq\",\n value: \"y\",\n action: \"hide\"\n })\n ).toBe(true);\n expect(\n e.canEvaluate({\n type: \"accessControl\",\n target: \"identity\",\n operator: \"matches\",\n value: \"team:x\",\n action: \"hide\"\n })\n ).toBe(false);\n });\n\n it(\"isEmpty matches null, undefined, empty string, empty array\", () => {\n const e = new ConditionRuleEvaluator();\n const mkForm = (value: unknown): IFormModel =>\n ({\n field: () => ({ getValue: () => value })\n }) as unknown as IFormModel;\n\n const rule: IRule = {\n type: \"condition\",\n target: \"x\",\n operator: \"isEmpty\",\n value: null,\n action: \"hide\"\n };\n\n expect(e.evaluate(rule, mkForm(null))).toBe(true);\n expect(e.evaluate(rule, mkForm(undefined))).toBe(true);\n expect(e.evaluate(rule, mkForm(\"\"))).toBe(true);\n expect(e.evaluate(rule, mkForm([]))).toBe(true);\n expect(e.evaluate(rule, mkForm(\"hello\"))).toBe(false);\n expect(e.evaluate(rule, mkForm(0))).toBe(false);\n });\n });\n});\n"],"names":["createForm","config","container","Container","FormModelFeature","FormModelFactory","describe","it","form","fields","expect","valid","valid2","e","layout","tab","tabs","tabsVm","n","AccessControlEvaluator","userTeams","rule","scope","id","ConditionRuleEvaluator","mkForm","value","undefined"],"mappings":"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"}
1
+ {"version":3,"file":"features/formModel/Rules.test.js","sources":["../../../src/features/formModel/Rules.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { FormModelFeature } from \"./feature.js\";\nimport { ConditionRuleEvaluator } from \"./ConditionRuleEvaluator.js\";\nimport {\n FormModelFactory,\n type IRule,\n type IRuleEvaluator,\n type ITabsNodeVM,\n type IFormModel,\n type IFormModelConfig\n} from \"./abstractions.js\";\n\nfunction createForm(config: {\n extraEvaluators?: IRuleEvaluator[];\n fields: IFormModelConfig[\"fields\"];\n layout?: IFormModelConfig[\"layout\"];\n}) {\n const container = new Container();\n FormModelFeature.register(container);\n return container.resolve(FormModelFactory).create({\n fields: config.fields,\n layout: config.layout,\n ruleEvaluators: config.extraEvaluators\n });\n}\n\ndescribe(\"Rules system\", () => {\n describe(\"condition rule on a field\", () => {\n it(\"hides a field when its rule matches\", () => {\n const form = createForm({\n fields: fields => ({\n title: fields.text().label(\"Title\"),\n subtitle: fields\n .text()\n .label(\"Subtitle\")\n .rules([\n {\n type: \"condition\",\n target: \"title\",\n operator: \"isEmpty\",\n value: null,\n action: \"hide\"\n }\n ])\n })\n });\n\n expect(form.field(\"subtitle\").visible).toBe(false);\n expect(form.field(\"subtitle\").vm.visible).toBe(false);\n\n form.field(\"title\").setValue(\"Hello\");\n expect(form.field(\"subtitle\").visible).toBe(true);\n expect(form.field(\"subtitle\").vm.visible).toBe(true);\n });\n\n it(\"disables a field when its rule matches\", () => {\n const form = createForm({\n fields: fields => ({\n country: fields.text().label(\"Country\"),\n city: fields\n .text()\n .label(\"City\")\n .rules([\n {\n type: \"condition\",\n target: \"country\",\n operator: \"isEmpty\",\n value: null,\n action: \"disable\"\n }\n ])\n })\n });\n\n expect(form.field(\"city\").vm.disabled).toBe(true);\n\n form.field(\"country\").setValue(\"US\");\n expect(form.field(\"city\").vm.disabled).toBe(false);\n });\n\n it(\"supports eq operator\", () => {\n const form = createForm({\n fields: fields => ({\n plan: fields.text().label(\"Plan\"),\n enterpriseOnly: fields\n .text()\n .label(\"Enterprise\")\n .rules([\n {\n type: \"condition\",\n target: \"plan\",\n operator: \"eq\",\n value: \"enterprise\",\n action: \"hide\"\n }\n ])\n })\n });\n\n form.field(\"plan\").setValue(\"starter\");\n expect(form.field(\"enterpriseOnly\").visible).toBe(true);\n\n form.field(\"plan\").setValue(\"enterprise\");\n expect(form.field(\"enterpriseOnly\").visible).toBe(false);\n });\n\n it(\"excludes hidden fields from validation\", async () => {\n const form = createForm({\n fields: fields => ({\n toggle: fields.text().label(\"Toggle\"),\n required: fields\n .text()\n .label(\"Required\")\n .required(\"Must fill\")\n .rules([\n {\n type: \"condition\",\n target: \"toggle\",\n operator: \"isEmpty\",\n value: null,\n action: \"hide\"\n }\n ])\n })\n });\n\n // toggle is empty → \"required\" is hidden → should not count as invalid\n const valid = await form.validate();\n expect(valid).toBe(true);\n\n // Fill toggle → \"required\" becomes visible → fails without a value\n form.field(\"toggle\").setValue(\"anything\");\n const valid2 = await form.validate();\n expect(valid2).toBe(false);\n expect(form.errors.some(e => e.path === \"required\")).toBe(true);\n });\n });\n\n describe(\"rules on layout elements\", () => {\n it(\"cascades disable from tabs container to contained fields\", () => {\n const form = createForm({\n fields: fields => ({\n trigger: fields.text().label(\"Trigger\"),\n general: fields.text().label(\"General\"),\n seo: fields.text().label(\"SEO\")\n }),\n layout: layout => [\n layout.row(\"trigger\"),\n layout\n .tabs(\"settings\")\n .rules([\n {\n type: \"condition\",\n target: \"trigger\",\n operator: \"isEmpty\",\n value: null,\n action: \"disable\"\n }\n ])\n .tab(\"general\", tab => {\n tab.label(\"General\").layout(layout => [layout.row(\"general\")]);\n })\n .tab(\"seo\", tab => {\n tab.label(\"SEO\").layout(layout => [layout.row(\"seo\")]);\n })\n ]\n });\n\n expect(form.field(\"general\").vm.disabled).toBe(true);\n expect(form.field(\"seo\").vm.disabled).toBe(true);\n\n const tabs = form.vm.layout[1] as ITabsNodeVM;\n expect(tabs.disabled).toBe(true);\n expect(tabs.tabs[0].disabled).toBe(true);\n\n form.field(\"trigger\").setValue(\"go\");\n expect(form.field(\"general\").vm.disabled).toBe(false);\n expect(form.field(\"seo\").vm.disabled).toBe(false);\n });\n\n it(\"cascades disable from a single tab to its fields only\", () => {\n const form = createForm({\n fields: fields => ({\n title: fields.text().label(\"Title\"),\n general: fields.text().label(\"General\"),\n seo: fields.text().label(\"SEO\")\n }),\n layout: layout => [\n layout\n .tabs(\"settings\")\n .tab(\"general\", tab => {\n tab.label(\"General\").layout(layout => [layout.row(\"general\")]);\n })\n .tab(\"seo\", tab => {\n tab.label(\"SEO\")\n .rules([\n {\n type: \"condition\",\n target: \"title\",\n operator: \"isEmpty\",\n value: null,\n action: \"disable\"\n }\n ])\n .layout(layout => [layout.row(\"seo\")]);\n })\n ]\n });\n\n expect(form.field(\"general\").vm.disabled).toBe(false);\n expect(form.field(\"seo\").vm.disabled).toBe(true);\n\n const tabs = form.vm.layout[0] as ITabsNodeVM;\n expect(tabs.tabs[0].disabled).toBe(false);\n expect(tabs.tabs[1].disabled).toBe(true);\n });\n\n it(\"hides a tab and its fields when the tab has a hide rule\", async () => {\n const form = createForm({\n fields: fields => ({\n trigger: fields.text().label(\"Trigger\"),\n hiddenField: fields.text().label(\"Hidden\").required(\"needed\")\n }),\n layout: layout => [\n layout.row(\"trigger\"),\n layout.tabs(\"settings\").tab(\"secret\", tab => {\n tab.label(\"Secret\")\n .rules([\n {\n type: \"condition\",\n target: \"trigger\",\n operator: \"isEmpty\",\n value: null,\n action: \"hide\"\n }\n ])\n .layout(layout => [layout.row(\"hiddenField\")]);\n })\n ]\n });\n\n // Tab is hidden → field inside is hidden → not validated\n const valid = await form.validate();\n expect(valid).toBe(true);\n\n // Form VM should not expose this tabs node (all tabs hidden = no tabs node)\n const tabsVm = form.vm.layout.find(n => n.type === \"tabs\");\n expect(tabsVm).toBeUndefined();\n });\n\n it(\"hides the entire tabs container when its rule matches\", () => {\n const form = createForm({\n fields: fields => ({\n trigger: fields.text().label(\"Trigger\"),\n inner: fields.text().label(\"Inner\")\n }),\n layout: layout => [\n layout.row(\"trigger\"),\n layout\n .tabs(\"settings\")\n .rules([\n {\n type: \"condition\",\n target: \"trigger\",\n operator: \"isEmpty\",\n value: null,\n action: \"hide\"\n }\n ])\n .tab(\"tab1\", tab => {\n tab.label(\"Tab 1\").layout(layout => [layout.row(\"inner\")]);\n })\n ]\n });\n\n expect(form.vm.layout.find(n => n.type === \"tabs\")).toBeUndefined();\n expect(form.field(\"inner\").visible).toBe(false);\n\n form.field(\"trigger\").setValue(\"yes\");\n expect(form.field(\"inner\").visible).toBe(true);\n expect(form.vm.layout.find(n => n.type === \"tabs\")).toBeDefined();\n });\n });\n\n describe(\"custom rule evaluators\", () => {\n it(\"uses externally registered evaluators for custom rule types\", () => {\n class AccessControlEvaluator implements IRuleEvaluator {\n constructor(private userTeams: string[]) {}\n canEvaluate(rule: IRule) {\n return rule.type === \"accessControl\";\n }\n evaluate(rule: IRule): boolean {\n if (!rule.value) {\n return false;\n }\n const [scope, id] = rule.value.split(\":\");\n return scope === \"team\" && this.userTeams.includes(id);\n }\n }\n\n const form = createForm({\n extraEvaluators: [new AccessControlEvaluator([\"admins\"])],\n fields: fields => ({\n adminField: fields\n .text()\n .label(\"Admin Only\")\n .rules([\n {\n type: \"accessControl\",\n target: \"identity\",\n operator: \"matches\",\n value: \"team:admins\",\n action: \"disable\"\n }\n ])\n })\n });\n\n expect(form.field(\"adminField\").vm.disabled).toBe(true);\n });\n\n it(\"ignores rules with unknown types (no evaluator)\", () => {\n const form = createForm({\n fields: fields => ({\n weird: fields\n .text()\n .label(\"Weird\")\n .rules([\n {\n type: \"bogusType\",\n target: \"x\",\n operator: \"noop\",\n value: null,\n action: \"hide\"\n }\n ])\n })\n });\n\n // Unknown rule types are ignored — field remains visible\n expect(form.field(\"weird\").visible).toBe(true);\n expect(form.field(\"weird\").vm.disabled).toBe(false);\n });\n });\n\n describe(\"ConditionRuleEvaluator\", () => {\n it(\"canEvaluate returns true only for condition rules\", () => {\n const e = new ConditionRuleEvaluator();\n expect(\n e.canEvaluate({\n type: \"condition\",\n target: \"x\",\n operator: \"eq\",\n value: \"y\",\n action: \"hide\"\n })\n ).toBe(true);\n expect(\n e.canEvaluate({\n type: \"accessControl\",\n target: \"identity\",\n operator: \"matches\",\n value: \"team:x\",\n action: \"hide\"\n })\n ).toBe(false);\n });\n\n it(\"isEmpty matches null, undefined, empty string, empty array\", () => {\n const e = new ConditionRuleEvaluator();\n const mkForm = (value: unknown): IFormModel =>\n ({\n field: () => ({ getValue: () => value })\n }) as unknown as IFormModel;\n\n const rule: IRule = {\n type: \"condition\",\n target: \"x\",\n operator: \"isEmpty\",\n value: null,\n action: \"hide\"\n };\n\n expect(e.evaluate(rule, mkForm(null))).toBe(true);\n expect(e.evaluate(rule, mkForm(undefined))).toBe(true);\n expect(e.evaluate(rule, mkForm(\"\"))).toBe(true);\n expect(e.evaluate(rule, mkForm([]))).toBe(true);\n expect(e.evaluate(rule, mkForm(\"hello\"))).toBe(false);\n expect(e.evaluate(rule, mkForm(0))).toBe(false);\n });\n });\n});\n\ndescribe(\"disabled cascades into containers\", () => {\n it(\"disables the children of a disabled object field\", () => {\n const form = createForm({\n fields: fields => ({\n title: fields.text().label(\"Title\"),\n meta: fields\n .object()\n .label(\"Meta\")\n .disabled()\n .fields(inner => ({\n source: inner.text().label(\"Source\"),\n comment: inner.text().label(\"Comment\")\n }))\n })\n });\n\n expect(form.field(\"meta\").disabled).toBe(true);\n expect(form.field(\"meta.source\").disabled).toBe(true);\n expect(form.field(\"meta.comment\").disabled).toBe(true);\n expect(form.field(\"title\").disabled).toBe(false);\n });\n\n it(\"reaches grandchildren of a disabled object field\", () => {\n const form = createForm({\n fields: fields => ({\n outer: fields\n .object()\n .label(\"Outer\")\n .disabled()\n .fields(inner => ({\n nested: inner\n .object()\n .label(\"Nested\")\n .fields(deep => ({\n value: deep.text().label(\"Value\")\n }))\n }))\n })\n });\n\n expect(form.field(\"outer.nested\").disabled).toBe(true);\n expect(form.field(\"outer.nested.value\").disabled).toBe(true);\n });\n\n it(\"leaves children alone when the container is not disabled\", () => {\n const form = createForm({\n fields: fields => ({\n meta: fields\n .object()\n .label(\"Meta\")\n .fields(inner => ({\n source: inner.text().label(\"Source\").disabled(),\n comment: inner.text().label(\"Comment\")\n }))\n })\n });\n\n expect(form.field(\"meta\").disabled).toBe(false);\n expect(form.field(\"meta.source\").disabled).toBe(true);\n expect(form.field(\"meta.comment\").disabled).toBe(false);\n });\n\n it(\"picks up a container disabled after the form was built\", () => {\n const form = createForm({\n fields: fields => ({\n meta: fields\n .object()\n .label(\"Meta\")\n .fields(inner => ({\n source: inner.text().label(\"Source\")\n }))\n })\n });\n\n expect(form.field(\"meta.source\").disabled).toBe(false);\n form.field(\"meta\").setDisabled(true);\n expect(form.field(\"meta.source\").disabled).toBe(true);\n });\n});\n"],"names":["createForm","config","container","Container","FormModelFeature","FormModelFactory","describe","it","form","fields","expect","valid","valid2","e","layout","tab","tabs","tabsVm","n","AccessControlEvaluator","userTeams","rule","scope","id","ConditionRuleEvaluator","mkForm","value","undefined","inner","deep"],"mappings":"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"}
@@ -19,10 +19,15 @@ export declare class ReactLicense implements ILicense {
19
19
  canUseAiPageGeneration(): boolean;
20
20
  canUseAiPageTranslation(): boolean;
21
21
  canUseAiLexicalGeneration(): boolean;
22
+ canUseAiAdminAssistant(): boolean;
22
23
  canUseAiEntryGeneration(): boolean;
23
24
  canUseAiEntryComparison(): boolean;
24
25
  canUseAiEntryTranslation(): boolean;
26
+ canUseAiPowerups(): boolean;
25
27
  canUseAbTesting(): boolean;
26
28
  canUseRemoteComponents(): boolean;
29
+ canUseCollaboration(): boolean;
30
+ canUseComments(): boolean;
31
+ canUseActivityLog(): boolean;
27
32
  toDto(): DecryptedWcpProjectLicense | null;
28
33
  }
@@ -50,6 +50,9 @@ class ReactLicense {
50
50
  canUseAiLexicalGeneration() {
51
51
  return this.license.canUseAiLexicalGeneration();
52
52
  }
53
+ canUseAiAdminAssistant() {
54
+ return this.license.canUseAiAdminAssistant();
55
+ }
53
56
  canUseAiEntryGeneration() {
54
57
  return this.license.canUseAiEntryGeneration();
55
58
  }
@@ -59,12 +62,24 @@ class ReactLicense {
59
62
  canUseAiEntryTranslation() {
60
63
  return this.license.canUseAiEntryTranslation();
61
64
  }
65
+ canUseAiPowerups() {
66
+ return this.license.canUseAiPowerups();
67
+ }
62
68
  canUseAbTesting() {
63
69
  return this.license.canUseAbTesting();
64
70
  }
65
71
  canUseRemoteComponents() {
66
72
  return this.license.canUseRemoteComponents();
67
73
  }
74
+ canUseCollaboration() {
75
+ return this.license.canUseCollaboration();
76
+ }
77
+ canUseComments() {
78
+ return this.license.canUseComments();
79
+ }
80
+ canUseActivityLog() {
81
+ return this.license.canUseActivityLog();
82
+ }
68
83
  toDto() {
69
84
  return this.license.toDto();
70
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/wcp/ReactLicense.js","sources":["../../../src/features/wcp/ReactLicense.ts"],"sourcesContent":["import type { DecryptedWcpProjectLicense, ILicense, WcpProject } from \"@webiny/wcp/types.js\";\nimport type { WCP_FEATURE_LABEL } from \"@webiny/wcp\";\n\nexport class ReactLicense implements ILicense {\n private readonly license: ILicense;\n\n constructor(license: ILicense) {\n this.license = license;\n }\n\n getProject(): WcpProject | null {\n return this.license.getProject();\n }\n\n canUseAacl(): boolean {\n return this.license.canUseAacl();\n }\n\n canUseAuditLogs(): boolean {\n return this.license.canUseAuditLogs();\n }\n\n canUseFeature(featureId: keyof typeof WCP_FEATURE_LABEL): boolean {\n return this.license.canUseFeature(featureId);\n }\n\n canUseFileManagerThreatDetection(): boolean {\n return this.license.canUseFileManagerThreatDetection();\n }\n\n canUseFolderLevelPermissions(): boolean {\n return this.license.canUseFolderLevelPermissions();\n }\n\n canUseHcmsFieldPermissions(): boolean {\n return this.license.canUseHcmsFieldPermissions();\n }\n\n canUsePrivateFiles(): boolean {\n return this.license.canUsePrivateFiles();\n }\n\n canUseRecordLocking(): boolean {\n return this.license.canUseRecordLocking();\n }\n\n canUseTeams(): boolean {\n return this.license.canUseTeams();\n }\n\n getRawLicense(): DecryptedWcpProjectLicense | null {\n return this.license.getRawLicense();\n }\n\n public canUseWorkflows(): boolean {\n return this.license.canUseWorkflows();\n }\n\n canUseAiImageEnrichment(): boolean {\n return this.license.canUseAiImageEnrichment();\n }\n\n canUseAiPageGeneration(): boolean {\n return this.license.canUseAiPageGeneration();\n }\n\n canUseAiPageTranslation(): boolean {\n return this.license.canUseAiPageTranslation();\n }\n\n canUseAiLexicalGeneration(): boolean {\n return this.license.canUseAiLexicalGeneration();\n }\n\n canUseAiEntryGeneration(): boolean {\n return this.license.canUseAiEntryGeneration();\n }\n\n canUseAiEntryComparison(): boolean {\n return this.license.canUseAiEntryComparison();\n }\n\n canUseAiEntryTranslation(): boolean {\n return this.license.canUseAiEntryTranslation();\n }\n\n canUseAbTesting(): boolean {\n return this.license.canUseAbTesting();\n }\n\n canUseRemoteComponents(): boolean {\n return this.license.canUseRemoteComponents();\n }\n\n toDto(): DecryptedWcpProjectLicense | null {\n return this.license.toDto();\n }\n}\n"],"names":["ReactLicense","license","featureId"],"mappings":"AAGO,MAAMA;IAGT,YAAYC,OAAiB,CAAE;QAC3B,IAAI,CAAC,OAAO,GAAGA;IACnB;IAEA,aAAgC;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU;IAClC;IAEA,aAAsB;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU;IAClC;IAEA,kBAA2B;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe;IACvC;IAEA,cAAcC,SAAyC,EAAW;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAACA;IACtC;IAEA,mCAA4C;QACxC,OAAO,IAAI,CAAC,OAAO,CAAC,gCAAgC;IACxD;IAEA,+BAAwC;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B;IACpD;IAEA,6BAAsC;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,0BAA0B;IAClD;IAEA,qBAA8B;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB;IAC1C;IAEA,sBAA+B;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB;IAC3C;IAEA,cAAuB;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW;IACnC;IAEA,gBAAmD;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa;IACrC;IAEO,kBAA2B;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe;IACvC;IAEA,0BAAmC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB;IAC/C;IAEA,yBAAkC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB;IAC9C;IAEA,0BAAmC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB;IAC/C;IAEA,4BAAqC;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,yBAAyB;IACjD;IAEA,0BAAmC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB;IAC/C;IAEA,0BAAmC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB;IAC/C;IAEA,2BAAoC;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB;IAChD;IAEA,kBAA2B;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe;IACvC;IAEA,yBAAkC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB;IAC9C;IAEA,QAA2C;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;IAC7B;AACJ"}
1
+ {"version":3,"file":"features/wcp/ReactLicense.js","sources":["../../../src/features/wcp/ReactLicense.ts"],"sourcesContent":["import type { DecryptedWcpProjectLicense, ILicense, WcpProject } from \"@webiny/wcp/types.js\";\nimport type { WCP_FEATURE_LABEL } from \"@webiny/wcp\";\n\nexport class ReactLicense implements ILicense {\n private readonly license: ILicense;\n\n constructor(license: ILicense) {\n this.license = license;\n }\n\n getProject(): WcpProject | null {\n return this.license.getProject();\n }\n\n canUseAacl(): boolean {\n return this.license.canUseAacl();\n }\n\n canUseAuditLogs(): boolean {\n return this.license.canUseAuditLogs();\n }\n\n canUseFeature(featureId: keyof typeof WCP_FEATURE_LABEL): boolean {\n return this.license.canUseFeature(featureId);\n }\n\n canUseFileManagerThreatDetection(): boolean {\n return this.license.canUseFileManagerThreatDetection();\n }\n\n canUseFolderLevelPermissions(): boolean {\n return this.license.canUseFolderLevelPermissions();\n }\n\n canUseHcmsFieldPermissions(): boolean {\n return this.license.canUseHcmsFieldPermissions();\n }\n\n canUsePrivateFiles(): boolean {\n return this.license.canUsePrivateFiles();\n }\n\n canUseRecordLocking(): boolean {\n return this.license.canUseRecordLocking();\n }\n\n canUseTeams(): boolean {\n return this.license.canUseTeams();\n }\n\n getRawLicense(): DecryptedWcpProjectLicense | null {\n return this.license.getRawLicense();\n }\n\n public canUseWorkflows(): boolean {\n return this.license.canUseWorkflows();\n }\n\n canUseAiImageEnrichment(): boolean {\n return this.license.canUseAiImageEnrichment();\n }\n\n canUseAiPageGeneration(): boolean {\n return this.license.canUseAiPageGeneration();\n }\n\n canUseAiPageTranslation(): boolean {\n return this.license.canUseAiPageTranslation();\n }\n\n canUseAiLexicalGeneration(): boolean {\n return this.license.canUseAiLexicalGeneration();\n }\n\n canUseAiAdminAssistant(): boolean {\n return this.license.canUseAiAdminAssistant();\n }\n\n canUseAiEntryGeneration(): boolean {\n return this.license.canUseAiEntryGeneration();\n }\n\n canUseAiEntryComparison(): boolean {\n return this.license.canUseAiEntryComparison();\n }\n\n canUseAiEntryTranslation(): boolean {\n return this.license.canUseAiEntryTranslation();\n }\n\n canUseAiPowerups(): boolean {\n return this.license.canUseAiPowerups();\n }\n\n canUseAbTesting(): boolean {\n return this.license.canUseAbTesting();\n }\n\n canUseRemoteComponents(): boolean {\n return this.license.canUseRemoteComponents();\n }\n\n canUseCollaboration(): boolean {\n return this.license.canUseCollaboration();\n }\n\n canUseComments(): boolean {\n return this.license.canUseComments();\n }\n\n canUseActivityLog(): boolean {\n return this.license.canUseActivityLog();\n }\n\n toDto(): DecryptedWcpProjectLicense | null {\n return this.license.toDto();\n }\n}\n"],"names":["ReactLicense","license","featureId"],"mappings":"AAGO,MAAMA;IAGT,YAAYC,OAAiB,CAAE;QAC3B,IAAI,CAAC,OAAO,GAAGA;IACnB;IAEA,aAAgC;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU;IAClC;IAEA,aAAsB;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU;IAClC;IAEA,kBAA2B;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe;IACvC;IAEA,cAAcC,SAAyC,EAAW;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAACA;IACtC;IAEA,mCAA4C;QACxC,OAAO,IAAI,CAAC,OAAO,CAAC,gCAAgC;IACxD;IAEA,+BAAwC;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B;IACpD;IAEA,6BAAsC;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,0BAA0B;IAClD;IAEA,qBAA8B;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB;IAC1C;IAEA,sBAA+B;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB;IAC3C;IAEA,cAAuB;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW;IACnC;IAEA,gBAAmD;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa;IACrC;IAEO,kBAA2B;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe;IACvC;IAEA,0BAAmC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB;IAC/C;IAEA,yBAAkC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB;IAC9C;IAEA,0BAAmC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB;IAC/C;IAEA,4BAAqC;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,yBAAyB;IACjD;IAEA,yBAAkC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB;IAC9C;IAEA,0BAAmC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB;IAC/C;IAEA,0BAAmC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB;IAC/C;IAEA,2BAAoC;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB;IAChD;IAEA,mBAA4B;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB;IACxC;IAEA,kBAA2B;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe;IACvC;IAEA,yBAAkC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB;IAC9C;IAEA,sBAA+B;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB;IAC3C;IAEA,iBAA0B;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc;IACtC;IAEA,oBAA6B;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB;IACzC;IAEA,QAA2C;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;IAC7B;AACJ"}
@@ -42,6 +42,10 @@ const GET_WCP_PROJECT = `
42
42
  abTesting {
43
43
  enabled
44
44
  }
45
+ collaboration {
46
+ enabled
47
+ options
48
+ }
45
49
  }
46
50
  }
47
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/wcp/WcpGateway.js","sources":["../../../src/features/wcp/WcpGateway.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport { WcpGateway as WcpGatewayAbstraction } from \"./abstractions.js\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient/index.js\";\nimport type { GetWcpProjectResponse, WcpProjectData } from \"./types.js\";\n\nconst GET_WCP_PROJECT = /* GraphQL */ `\n query GetWcpProject {\n wcp {\n getProject {\n data {\n orgId\n projectId\n package {\n features {\n seats {\n enabled\n options\n }\n multiTenancy {\n enabled\n options\n }\n advancedPublishingWorkflow {\n enabled\n }\n advancedAccessControlLayer {\n enabled\n options\n }\n auditLogs {\n enabled\n }\n recordLocking {\n enabled\n }\n fileManager {\n enabled\n options\n }\n aiPowerups {\n enabled\n options\n }\n abTesting {\n enabled\n }\n }\n }\n }\n error {\n message\n code\n data\n }\n }\n }\n }\n`;\n\nclass WcpGraphQLGateway implements WcpGatewayAbstraction.Interface {\n constructor(private client: MainGraphQLClient.Interface) {}\n\n async fetchProject(): Promise<WcpProjectData | null> {\n const response = await this.client.execute<GetWcpProjectResponse>({\n query: GET_WCP_PROJECT,\n headers: {\n \"x-tenant\": \"root\"\n }\n });\n\n if (response.wcp.getProject.error) {\n throw new Error(response.wcp.getProject.error.message);\n }\n\n return response.wcp.getProject.data;\n }\n}\n\nexport const WcpGateway = createImplementation({\n abstraction: WcpGatewayAbstraction,\n implementation: WcpGraphQLGateway,\n dependencies: [MainGraphQLClient]\n});\n"],"names":["GET_WCP_PROJECT","WcpGraphQLGateway","client","response","Error","WcpGateway","createImplementation","WcpGatewayAbstraction","MainGraphQLClient"],"mappings":";;;AAKA,MAAMA,kBAAgC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDvC,CAAC;AAED,MAAMC;IACF,YAAoBC,MAAmC,CAAE;aAArCA,MAAM,GAANA;IAAsC;IAE1D,MAAM,eAA+C;QACjD,MAAMC,WAAW,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAwB;YAC9D,OAAOH;YACP,SAAS;gBACL,YAAY;YAChB;QACJ;QAEA,IAAIG,SAAS,GAAG,CAAC,UAAU,CAAC,KAAK,EAC7B,MAAM,IAAIC,MAAMD,SAAS,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO;QAGzD,OAAOA,SAAS,GAAG,CAAC,UAAU,CAAC,IAAI;IACvC;AACJ;AAEO,MAAME,wBAAaC,qBAAqB;IAC3C,aAAaC;IACb,gBAAgBN;IAChB,cAAc;QAACO;KAAkB;AACrC"}
1
+ {"version":3,"file":"features/wcp/WcpGateway.js","sources":["../../../src/features/wcp/WcpGateway.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport { WcpGateway as WcpGatewayAbstraction } from \"./abstractions.js\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient/index.js\";\nimport type { GetWcpProjectResponse, WcpProjectData } from \"./types.js\";\n\nconst GET_WCP_PROJECT = /* GraphQL */ `\n query GetWcpProject {\n wcp {\n getProject {\n data {\n orgId\n projectId\n package {\n features {\n seats {\n enabled\n options\n }\n multiTenancy {\n enabled\n options\n }\n advancedPublishingWorkflow {\n enabled\n }\n advancedAccessControlLayer {\n enabled\n options\n }\n auditLogs {\n enabled\n }\n recordLocking {\n enabled\n }\n fileManager {\n enabled\n options\n }\n aiPowerups {\n enabled\n options\n }\n abTesting {\n enabled\n }\n collaboration {\n enabled\n options\n }\n }\n }\n }\n error {\n message\n code\n data\n }\n }\n }\n }\n`;\n\nclass WcpGraphQLGateway implements WcpGatewayAbstraction.Interface {\n constructor(private client: MainGraphQLClient.Interface) {}\n\n async fetchProject(): Promise<WcpProjectData | null> {\n const response = await this.client.execute<GetWcpProjectResponse>({\n query: GET_WCP_PROJECT,\n headers: {\n \"x-tenant\": \"root\"\n }\n });\n\n if (response.wcp.getProject.error) {\n throw new Error(response.wcp.getProject.error.message);\n }\n\n return response.wcp.getProject.data;\n }\n}\n\nexport const WcpGateway = createImplementation({\n abstraction: WcpGatewayAbstraction,\n implementation: WcpGraphQLGateway,\n dependencies: [MainGraphQLClient]\n});\n"],"names":["GET_WCP_PROJECT","WcpGraphQLGateway","client","response","Error","WcpGateway","createImplementation","WcpGatewayAbstraction","MainGraphQLClient"],"mappings":";;;AAKA,MAAMA,kBAAgC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDvC,CAAC;AAED,MAAMC;IACF,YAAoBC,MAAmC,CAAE;aAArCA,MAAM,GAANA;IAAsC;IAE1D,MAAM,eAA+C;QACjD,MAAMC,WAAW,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAwB;YAC9D,OAAOH;YACP,SAAS;gBACL,YAAY;YAChB;QACJ;QAEA,IAAIG,SAAS,GAAG,CAAC,UAAU,CAAC,KAAK,EAC7B,MAAM,IAAIC,MAAMD,SAAS,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO;QAGzD,OAAOA,SAAS,GAAG,CAAC,UAAU,CAAC,IAAI;IACvC;AACJ;AAEO,MAAME,wBAAaC,qBAAqB;IAC3C,aAAaC;IACb,gBAAgBN;IAChB,cAAc;QAACO;KAAkB;AACrC"}
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useRef } from "react";
2
- import is_hotkey from "is-hotkey";
2
+ import { isHotkey } from "is-hotkey";
3
3
  const state = {
4
4
  listenerAttached: false,
5
5
  zIndex: null,
@@ -8,7 +8,7 @@ const state = {
8
8
  function triggerHotkeys(e) {
9
9
  if (null === state.zIndex) return;
10
10
  const keys = state.handlers[state.zIndex];
11
- for(const key in keys)if (is_hotkey(key, e)) {
11
+ for(const key in keys)if (isHotkey(key, e)) {
12
12
  keys[key](e);
13
13
  break;
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hooks/useHotkeys.js","sources":["../../src/hooks/useHotkeys.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport isHotkey from \"is-hotkey\";\n\ntype HookProps = {\n disabled?: boolean;\n zIndex: number;\n keys?: { [key: string]: (e: KeyboardEvent) => void };\n};\n\ntype State = {\n listenerAttached: boolean;\n zIndex: null | number;\n handlers: { [zIndex: number]: { [key: string]: (e: KeyboardEvent) => void } };\n};\n\nconst state: State = {\n listenerAttached: false,\n zIndex: null,\n handlers: Object.create(null)\n};\n\nfunction triggerHotkeys(e: KeyboardEvent) {\n if (state.zIndex === null) {\n return;\n }\n\n const keys = state.handlers[state.zIndex];\n for (const key in keys) {\n if (isHotkey(key, e)) {\n keys[key](e);\n break;\n }\n }\n}\n\nfunction registerZIndex({ zIndex, keys }: HookProps) {\n if (state.zIndex === null || state.zIndex < zIndex) {\n state.zIndex = zIndex;\n }\n\n if (!state.handlers[zIndex]) {\n state.handlers[zIndex] = Object.create(null);\n }\n\n if (!keys || Object.keys(keys).length === 0) {\n return;\n }\n\n for (const key in keys) {\n if (key in state.handlers[zIndex]) {\n throw Error(`Shortcut \"${key}\" already registered on zIndex ${zIndex}.`);\n }\n state.handlers[zIndex][key] = keys[key];\n }\n\n if (!state.listenerAttached) {\n document.body.addEventListener(\"keydown\", triggerHotkeys);\n state.listenerAttached = true;\n }\n}\n\nfunction unregisterZIndex({ zIndex, keys }: HookProps) {\n if (state.handlers && state.handlers[zIndex]) {\n for (const key in keys) {\n delete state.handlers[zIndex][key];\n }\n\n if (Object.keys(state.handlers[zIndex]).length === 0) {\n delete state.handlers[zIndex];\n }\n }\n\n if (Object.keys(state.handlers).length > 0) {\n state.zIndex = Math.max(...Object.keys(state.handlers).map(Number));\n } else {\n state.zIndex = null;\n\n if (state.listenerAttached) {\n document.body.removeEventListener(\"keydown\", triggerHotkeys);\n state.listenerAttached = false;\n }\n }\n}\n\nexport function useHotkeys(props: HookProps) {\n const { disabled, zIndex, keys } = props;\n\n const prevPropsRef = useRef<HookProps | undefined>();\n const firstRenderRef = useRef(true);\n\n useEffect(\n function () {\n if (firstRenderRef.current || prevPropsRef.current?.disabled !== disabled) {\n firstRenderRef.current = false;\n if (disabled) {\n unregisterZIndex(props);\n } else {\n registerZIndex(props);\n }\n }\n\n if (!disabled && typeof keys === \"object\") {\n Object.assign(state.handlers[zIndex], keys);\n }\n prevPropsRef.current = { ...props };\n },\n [keys]\n );\n\n useEffect(function () {\n return function () {\n if (!disabled) {\n unregisterZIndex(props);\n }\n };\n }, []);\n}\n"],"names":["state","Object","triggerHotkeys","e","keys","key","isHotkey","registerZIndex","zIndex","Error","document","unregisterZIndex","Math","Number","useHotkeys","props","disabled","prevPropsRef","useRef","firstRenderRef","useEffect"],"mappings":";;AAeA,MAAMA,QAAe;IACjB,kBAAkB;IAClB,QAAQ;IACR,UAAUC,OAAO,MAAM,CAAC;AAC5B;AAEA,SAASC,eAAeC,CAAgB;IACpC,IAAIH,AAAiB,SAAjBA,MAAM,MAAM,EACZ;IAGJ,MAAMI,OAAOJ,MAAM,QAAQ,CAACA,MAAM,MAAM,CAAC;IACzC,IAAK,MAAMK,OAAOD,KACd,IAAIE,UAASD,KAAKF,IAAI;QAClBC,IAAI,CAACC,IAAI,CAACF;QACV;IACJ;AAER;AAEA,SAASI,eAAe,EAAEC,MAAM,EAAEJ,IAAI,EAAa;IAC/C,IAAIJ,AAAiB,SAAjBA,MAAM,MAAM,IAAaA,MAAM,MAAM,GAAGQ,QACxCR,MAAM,MAAM,GAAGQ;IAGnB,IAAI,CAACR,MAAM,QAAQ,CAACQ,OAAO,EACvBR,MAAM,QAAQ,CAACQ,OAAO,GAAGP,OAAO,MAAM,CAAC;IAG3C,IAAI,CAACG,QAAQH,AAA6B,MAA7BA,OAAO,IAAI,CAACG,MAAM,MAAM,EACjC;IAGJ,IAAK,MAAMC,OAAOD,KAAM;QACpB,IAAIC,OAAOL,MAAM,QAAQ,CAACQ,OAAO,EAC7B,MAAMC,MAAM,CAAC,UAAU,EAAEJ,IAAI,+BAA+B,EAAEG,OAAO,CAAC,CAAC;QAE3ER,MAAM,QAAQ,CAACQ,OAAO,CAACH,IAAI,GAAGD,IAAI,CAACC,IAAI;IAC3C;IAEA,IAAI,CAACL,MAAM,gBAAgB,EAAE;QACzBU,SAAS,IAAI,CAAC,gBAAgB,CAAC,WAAWR;QAC1CF,MAAM,gBAAgB,GAAG;IAC7B;AACJ;AAEA,SAASW,iBAAiB,EAAEH,MAAM,EAAEJ,IAAI,EAAa;IACjD,IAAIJ,MAAM,QAAQ,IAAIA,MAAM,QAAQ,CAACQ,OAAO,EAAE;QAC1C,IAAK,MAAMH,OAAOD,KACd,OAAOJ,MAAM,QAAQ,CAACQ,OAAO,CAACH,IAAI;QAGtC,IAAIJ,AAA+C,MAA/CA,OAAO,IAAI,CAACD,MAAM,QAAQ,CAACQ,OAAO,EAAE,MAAM,EAC1C,OAAOR,MAAM,QAAQ,CAACQ,OAAO;IAErC;IAEA,IAAIP,OAAO,IAAI,CAACD,MAAM,QAAQ,EAAE,MAAM,GAAG,GACrCA,MAAM,MAAM,GAAGY,KAAK,GAAG,IAAIX,OAAO,IAAI,CAACD,MAAM,QAAQ,EAAE,GAAG,CAACa;SACxD;QACHb,MAAM,MAAM,GAAG;QAEf,IAAIA,MAAM,gBAAgB,EAAE;YACxBU,SAAS,IAAI,CAAC,mBAAmB,CAAC,WAAWR;YAC7CF,MAAM,gBAAgB,GAAG;QAC7B;IACJ;AACJ;AAEO,SAASc,WAAWC,KAAgB;IACvC,MAAM,EAAEC,QAAQ,EAAER,MAAM,EAAEJ,IAAI,EAAE,GAAGW;IAEnC,MAAME,eAAeC;IACrB,MAAMC,iBAAiBD,OAAO;IAE9BE,UACI;QACI,IAAID,eAAe,OAAO,IAAIF,aAAa,OAAO,EAAE,aAAaD,UAAU;YACvEG,eAAe,OAAO,GAAG;YACzB,IAAIH,UACAL,iBAAiBI;iBAEjBR,eAAeQ;QAEvB;QAEA,IAAI,CAACC,YAAY,AAAgB,YAAhB,OAAOZ,MACpBH,OAAO,MAAM,CAACD,MAAM,QAAQ,CAACQ,OAAO,EAAEJ;QAE1Ca,aAAa,OAAO,GAAG;YAAE,GAAGF,KAAK;QAAC;IACtC,GACA;QAACX;KAAK;IAGVgB,UAAU;QACN,OAAO;YACH,IAAI,CAACJ,UACDL,iBAAiBI;QAEzB;IACJ,GAAG,EAAE;AACT"}
1
+ {"version":3,"file":"hooks/useHotkeys.js","sources":["../../src/hooks/useHotkeys.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { isHotkey } from \"is-hotkey\";\n\ntype HookProps = {\n disabled?: boolean;\n zIndex: number;\n keys?: { [key: string]: (e: KeyboardEvent) => void };\n};\n\ntype State = {\n listenerAttached: boolean;\n zIndex: null | number;\n handlers: { [zIndex: number]: { [key: string]: (e: KeyboardEvent) => void } };\n};\n\nconst state: State = {\n listenerAttached: false,\n zIndex: null,\n handlers: Object.create(null)\n};\n\nfunction triggerHotkeys(e: KeyboardEvent) {\n if (state.zIndex === null) {\n return;\n }\n\n const keys = state.handlers[state.zIndex];\n for (const key in keys) {\n if (isHotkey(key, e)) {\n keys[key](e);\n break;\n }\n }\n}\n\nfunction registerZIndex({ zIndex, keys }: HookProps) {\n if (state.zIndex === null || state.zIndex < zIndex) {\n state.zIndex = zIndex;\n }\n\n if (!state.handlers[zIndex]) {\n state.handlers[zIndex] = Object.create(null);\n }\n\n if (!keys || Object.keys(keys).length === 0) {\n return;\n }\n\n for (const key in keys) {\n if (key in state.handlers[zIndex]) {\n throw Error(`Shortcut \"${key}\" already registered on zIndex ${zIndex}.`);\n }\n state.handlers[zIndex][key] = keys[key];\n }\n\n if (!state.listenerAttached) {\n document.body.addEventListener(\"keydown\", triggerHotkeys);\n state.listenerAttached = true;\n }\n}\n\nfunction unregisterZIndex({ zIndex, keys }: HookProps) {\n if (state.handlers && state.handlers[zIndex]) {\n for (const key in keys) {\n delete state.handlers[zIndex][key];\n }\n\n if (Object.keys(state.handlers[zIndex]).length === 0) {\n delete state.handlers[zIndex];\n }\n }\n\n if (Object.keys(state.handlers).length > 0) {\n state.zIndex = Math.max(...Object.keys(state.handlers).map(Number));\n } else {\n state.zIndex = null;\n\n if (state.listenerAttached) {\n document.body.removeEventListener(\"keydown\", triggerHotkeys);\n state.listenerAttached = false;\n }\n }\n}\n\nexport function useHotkeys(props: HookProps) {\n const { disabled, zIndex, keys } = props;\n\n const prevPropsRef = useRef<HookProps | undefined>();\n const firstRenderRef = useRef(true);\n\n useEffect(\n function () {\n if (firstRenderRef.current || prevPropsRef.current?.disabled !== disabled) {\n firstRenderRef.current = false;\n if (disabled) {\n unregisterZIndex(props);\n } else {\n registerZIndex(props);\n }\n }\n\n if (!disabled && typeof keys === \"object\") {\n Object.assign(state.handlers[zIndex], keys);\n }\n prevPropsRef.current = { ...props };\n },\n [keys]\n );\n\n useEffect(function () {\n return function () {\n if (!disabled) {\n unregisterZIndex(props);\n }\n };\n }, []);\n}\n"],"names":["state","Object","triggerHotkeys","e","keys","key","isHotkey","registerZIndex","zIndex","Error","document","unregisterZIndex","Math","Number","useHotkeys","props","disabled","prevPropsRef","useRef","firstRenderRef","useEffect"],"mappings":";;AAeA,MAAMA,QAAe;IACjB,kBAAkB;IAClB,QAAQ;IACR,UAAUC,OAAO,MAAM,CAAC;AAC5B;AAEA,SAASC,eAAeC,CAAgB;IACpC,IAAIH,AAAiB,SAAjBA,MAAM,MAAM,EACZ;IAGJ,MAAMI,OAAOJ,MAAM,QAAQ,CAACA,MAAM,MAAM,CAAC;IACzC,IAAK,MAAMK,OAAOD,KACd,IAAIE,SAASD,KAAKF,IAAI;QAClBC,IAAI,CAACC,IAAI,CAACF;QACV;IACJ;AAER;AAEA,SAASI,eAAe,EAAEC,MAAM,EAAEJ,IAAI,EAAa;IAC/C,IAAIJ,AAAiB,SAAjBA,MAAM,MAAM,IAAaA,MAAM,MAAM,GAAGQ,QACxCR,MAAM,MAAM,GAAGQ;IAGnB,IAAI,CAACR,MAAM,QAAQ,CAACQ,OAAO,EACvBR,MAAM,QAAQ,CAACQ,OAAO,GAAGP,OAAO,MAAM,CAAC;IAG3C,IAAI,CAACG,QAAQH,AAA6B,MAA7BA,OAAO,IAAI,CAACG,MAAM,MAAM,EACjC;IAGJ,IAAK,MAAMC,OAAOD,KAAM;QACpB,IAAIC,OAAOL,MAAM,QAAQ,CAACQ,OAAO,EAC7B,MAAMC,MAAM,CAAC,UAAU,EAAEJ,IAAI,+BAA+B,EAAEG,OAAO,CAAC,CAAC;QAE3ER,MAAM,QAAQ,CAACQ,OAAO,CAACH,IAAI,GAAGD,IAAI,CAACC,IAAI;IAC3C;IAEA,IAAI,CAACL,MAAM,gBAAgB,EAAE;QACzBU,SAAS,IAAI,CAAC,gBAAgB,CAAC,WAAWR;QAC1CF,MAAM,gBAAgB,GAAG;IAC7B;AACJ;AAEA,SAASW,iBAAiB,EAAEH,MAAM,EAAEJ,IAAI,EAAa;IACjD,IAAIJ,MAAM,QAAQ,IAAIA,MAAM,QAAQ,CAACQ,OAAO,EAAE;QAC1C,IAAK,MAAMH,OAAOD,KACd,OAAOJ,MAAM,QAAQ,CAACQ,OAAO,CAACH,IAAI;QAGtC,IAAIJ,AAA+C,MAA/CA,OAAO,IAAI,CAACD,MAAM,QAAQ,CAACQ,OAAO,EAAE,MAAM,EAC1C,OAAOR,MAAM,QAAQ,CAACQ,OAAO;IAErC;IAEA,IAAIP,OAAO,IAAI,CAACD,MAAM,QAAQ,EAAE,MAAM,GAAG,GACrCA,MAAM,MAAM,GAAGY,KAAK,GAAG,IAAIX,OAAO,IAAI,CAACD,MAAM,QAAQ,EAAE,GAAG,CAACa;SACxD;QACHb,MAAM,MAAM,GAAG;QAEf,IAAIA,MAAM,gBAAgB,EAAE;YACxBU,SAAS,IAAI,CAAC,mBAAmB,CAAC,WAAWR;YAC7CF,MAAM,gBAAgB,GAAG;QAC7B;IACJ;AACJ;AAEO,SAASc,WAAWC,KAAgB;IACvC,MAAM,EAAEC,QAAQ,EAAER,MAAM,EAAEJ,IAAI,EAAE,GAAGW;IAEnC,MAAME,eAAeC;IACrB,MAAMC,iBAAiBD,OAAO;IAE9BE,UACI;QACI,IAAID,eAAe,OAAO,IAAIF,aAAa,OAAO,EAAE,aAAaD,UAAU;YACvEG,eAAe,OAAO,GAAG;YACzB,IAAIH,UACAL,iBAAiBI;iBAEjBR,eAAeQ;QAEvB;QAEA,IAAI,CAACC,YAAY,AAAgB,YAAhB,OAAOZ,MACpBH,OAAO,MAAM,CAACD,MAAM,QAAQ,CAACQ,OAAO,EAAEJ;QAE1Ca,aAAa,OAAO,GAAG;YAAE,GAAGF,KAAK;QAAC;IACtC,GACA;QAACX;KAAK;IAGVgB,UAAU;QACN,OAAO;YACH,IAAI,CAACJ,UACDL,iBAAiBI;QAEzB;IACJ,GAAG,EAAE;AACT"}
package/index.d.ts CHANGED
@@ -52,8 +52,8 @@ export { useAuthentication } from "./presentation/security/hooks/useAuthenticati
52
52
  export { useBuildParams } from "./presentation/buildParams/useBuildParams.js";
53
53
  export { Command, CommandPaletteFeature, CommandPalettePresenter } from "./presentation/commandPalette/index.js";
54
54
  export type { ICommand, CommandDetailProps, CommandItemVm, ActiveCommandVm, CommandPaletteViewModel } from "./presentation/commandPalette/index.js";
55
- export { AiChatGateway, AiChatFeature, AiChatPresenter } from "./features/aiChat/index.js";
56
- export type { IAiChatGateway, AiChatMessage, AiChatToolCall, AiChatPendingApproval, AiChatDecision, AiChatRequest, AiTurnViewModel, IAiChatPresenter, IAiChatViewModel } from "./features/aiChat/index.js";
55
+ export { AdminAssistantGateway, AdminAssistantFeature, AdminAssistantPresenter } from "./features/adminAssistant/index.js";
56
+ export type { IAdminAssistantGateway, AdminAssistantMessage, AdminAssistantToolCall, AdminAssistantPendingApproval, AdminAssistantDecision, AdminAssistantRequest, AiTurnViewModel, IAdminAssistantPresenter, IAdminAssistantViewModel } from "./features/adminAssistant/index.js";
57
57
  export { Breadcrumb } from "./config/AdminConfig/Breadcrumbs.js";
58
58
  export type { BreadcrumbProps, BreadcrumbConfig, BreadcrumbLink } from "./config/AdminConfig/Breadcrumbs.js";
59
59
  export { useSecurity } from "./presentation/security/hooks/useSecurity.js";
package/index.js CHANGED
@@ -78,7 +78,7 @@ export { useIdentity } from "./presentation/security/hooks/useIdentity.js";
78
78
  export { useAuthentication } from "./presentation/security/hooks/useAuthentication.js";
79
79
  export { useBuildParams } from "./presentation/buildParams/useBuildParams.js";
80
80
  export { Command, CommandPaletteFeature, CommandPalettePresenter } from "./presentation/commandPalette/index.js";
81
- export { AiChatFeature, AiChatGateway, AiChatPresenter } from "./features/aiChat/index.js";
81
+ export { AdminAssistantFeature, AdminAssistantGateway, AdminAssistantPresenter } from "./features/adminAssistant/index.js";
82
82
  export { Breadcrumb } from "./config/AdminConfig/Breadcrumbs.js";
83
83
  export { useSecurity } from "./presentation/security/hooks/useSecurity.js";
84
84
  export { FormModelFactory } from "./features/formModel/abstractions.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-admin",
3
- "version": "6.6.0-alpha.3",
3
+ "version": "6.6.0-alpha.5",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -24,25 +24,25 @@
24
24
  "@iconify/json": "2.2.518",
25
25
  "@lexical/utils": "0.49.0",
26
26
  "@types/react": "18.3.31",
27
- "@webiny/admin-ui": "6.6.0-alpha.3",
28
- "@webiny/app": "6.6.0-alpha.3",
27
+ "@webiny/admin-ui": "6.6.0-alpha.5",
28
+ "@webiny/app": "6.6.0-alpha.5",
29
29
  "@webiny/di": "1.1.0",
30
- "@webiny/feature": "6.6.0-alpha.3",
31
- "@webiny/feature-flags": "6.6.0-alpha.3",
32
- "@webiny/form": "6.6.0-alpha.3",
33
- "@webiny/icons": "6.6.0-alpha.3",
34
- "@webiny/lexical-converter": "6.6.0-alpha.3",
35
- "@webiny/lexical-editor": "6.6.0-alpha.3",
36
- "@webiny/lexical-nodes": "6.6.0-alpha.3",
37
- "@webiny/lexical-theme": "6.6.0-alpha.3",
38
- "@webiny/plugins": "6.6.0-alpha.3",
39
- "@webiny/react-composition": "6.6.0-alpha.3",
40
- "@webiny/react-properties": "6.6.0-alpha.3",
41
- "@webiny/sdk": "6.6.0-alpha.3",
42
- "@webiny/telemetry": "6.6.0-alpha.3",
43
- "@webiny/utils": "6.6.0-alpha.3",
44
- "@webiny/validation": "6.6.0-alpha.3",
45
- "@webiny/wcp": "6.6.0-alpha.3",
30
+ "@webiny/feature": "6.6.0-alpha.5",
31
+ "@webiny/feature-flags": "6.6.0-alpha.5",
32
+ "@webiny/form": "6.6.0-alpha.5",
33
+ "@webiny/icons": "6.6.0-alpha.5",
34
+ "@webiny/lexical-converter": "6.6.0-alpha.5",
35
+ "@webiny/lexical-editor": "6.6.0-alpha.5",
36
+ "@webiny/lexical-nodes": "6.6.0-alpha.5",
37
+ "@webiny/lexical-theme": "6.6.0-alpha.5",
38
+ "@webiny/plugins": "6.6.0-alpha.5",
39
+ "@webiny/react-composition": "6.6.0-alpha.5",
40
+ "@webiny/react-properties": "6.6.0-alpha.5",
41
+ "@webiny/sdk": "6.6.0-alpha.5",
42
+ "@webiny/telemetry": "6.6.0-alpha.5",
43
+ "@webiny/utils": "6.6.0-alpha.5",
44
+ "@webiny/validation": "6.6.0-alpha.5",
45
+ "@webiny/wcp": "6.6.0-alpha.5",
46
46
  "bytes": "3.1.2",
47
47
  "classnames": "2.5.1",
48
48
  "graphql": "16.14.2",
@@ -76,7 +76,7 @@
76
76
  "@types/react-transition-group": "4.4.12",
77
77
  "@types/store": "2.0.5",
78
78
  "@types/tinycolor2": "1.4.6",
79
- "@webiny/build-tools": "6.6.0-alpha.3",
79
+ "@webiny/build-tools": "6.6.0-alpha.5",
80
80
  "rimraf": "6.1.3",
81
81
  "typescript": "7.0.2",
82
82
  "vitest": "4.1.11"
@@ -34,7 +34,8 @@ class CommandPalettePresenter {
34
34
  category: cmd.category,
35
35
  keywords: cmd.keywords,
36
36
  shortcut: cmd.shortcut,
37
- hasDetailView: Boolean(cmd.detailView)
37
+ hasDetailView: Boolean(cmd.detailView),
38
+ entersAiMode: Boolean(cmd.entersAiMode)
38
39
  })),
39
40
  activeCommand: activeCmd && activeCmd.detailView ? {
40
41
  command: activeCmd,