@atlaskit/editor-plugin-extension 0.4.2 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +26 -0
- package/CHANGELOG.md +16 -0
- package/dist/cjs/actions.js +236 -0
- package/dist/cjs/commands.js +122 -0
- package/dist/cjs/context-panel.js +269 -0
- package/dist/cjs/extension-api.js +266 -0
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/plugin-factory.js +32 -0
- package/dist/cjs/plugin-key.js +8 -0
- package/dist/cjs/plugin.js +147 -0
- package/dist/cjs/pm-plugins/keymap.js +21 -0
- package/dist/cjs/pm-plugins/macro/actions.js +186 -0
- package/dist/cjs/pm-plugins/macro/index.js +72 -0
- package/dist/cjs/pm-plugins/macro/plugin-key.js +8 -0
- package/dist/cjs/pm-plugins/macro/types.js +5 -0
- package/dist/cjs/pm-plugins/main.js +323 -0
- package/dist/cjs/pm-plugins/unique-id.js +80 -0
- package/dist/cjs/pm-plugins/utils.js +75 -0
- package/dist/cjs/reducer.js +18 -0
- package/dist/cjs/toolbar.js +242 -0
- package/dist/cjs/ui/ConfigPanel/ConfigPanel.js +475 -0
- package/dist/cjs/ui/ConfigPanel/ConfigPanelFieldsLoader.js +122 -0
- package/dist/cjs/ui/ConfigPanel/ConfigPanelLoader.js +23 -0
- package/dist/cjs/ui/ConfigPanel/ErrorMessage/ErrorImage.js +76 -0
- package/dist/cjs/ui/ConfigPanel/ErrorMessage/index.js +33 -0
- package/dist/cjs/ui/ConfigPanel/FieldMessages.js +105 -0
- package/dist/cjs/ui/ConfigPanel/Fields/Boolean.js +150 -0
- package/dist/cjs/ui/ConfigPanel/Fields/CheckboxGroup.js +101 -0
- package/dist/cjs/ui/ConfigPanel/Fields/ColorPicker.js +420 -0
- package/dist/cjs/ui/ConfigPanel/Fields/CustomSelect.js +192 -0
- package/dist/cjs/ui/ConfigPanel/Fields/Date.js +55 -0
- package/dist/cjs/ui/ConfigPanel/Fields/DateRange.js +160 -0
- package/dist/cjs/ui/ConfigPanel/Fields/Enum.js +41 -0
- package/dist/cjs/ui/ConfigPanel/Fields/Expand.js +88 -0
- package/dist/cjs/ui/ConfigPanel/Fields/Fieldset.js +270 -0
- package/dist/cjs/ui/ConfigPanel/Fields/Number.js +64 -0
- package/dist/cjs/ui/ConfigPanel/Fields/RadioGroup.js +56 -0
- package/dist/cjs/ui/ConfigPanel/Fields/Select.js +60 -0
- package/dist/cjs/ui/ConfigPanel/Fields/SelectItem.js +53 -0
- package/dist/cjs/ui/ConfigPanel/Fields/String.js +75 -0
- package/dist/cjs/ui/ConfigPanel/Fields/TabGroup.js +73 -0
- package/dist/cjs/ui/ConfigPanel/Fields/UnhandledType.js +19 -0
- package/dist/cjs/ui/ConfigPanel/Fields/UserSelect.js +268 -0
- package/dist/cjs/ui/ConfigPanel/Fields/common/RequiredIndicator.js +12 -0
- package/dist/cjs/ui/ConfigPanel/FormContent.js +231 -0
- package/dist/cjs/ui/ConfigPanel/FormErrorBoundary.js +140 -0
- package/dist/cjs/ui/ConfigPanel/Header.js +148 -0
- package/dist/cjs/ui/ConfigPanel/LoadingState.js +25 -0
- package/dist/cjs/ui/ConfigPanel/NestedForms/RemovableField.js +61 -0
- package/dist/cjs/ui/ConfigPanel/constants.js +13 -0
- package/dist/cjs/ui/ConfigPanel/index.js +9 -0
- package/dist/cjs/ui/ConfigPanel/messages.js +99 -0
- package/dist/cjs/ui/ConfigPanel/transformers.js +631 -0
- package/dist/cjs/ui/ConfigPanel/types.js +15 -0
- package/dist/cjs/ui/ConfigPanel/use-abortable-effect/index.js +56 -0
- package/dist/cjs/ui/ConfigPanel/use-state-from-promise/index.js +41 -0
- package/dist/cjs/ui/ConfigPanel/utils.js +116 -0
- package/dist/cjs/ui/SaveIndicator/SaveIndicator.js +79 -0
- package/dist/cjs/ui/SaveIndicator/messages.js +14 -0
- package/dist/cjs/ui/SaveIndicator/types.js +5 -0
- package/dist/cjs/utils.js +73 -0
- package/dist/es2019/actions.js +203 -0
- package/dist/es2019/commands.js +99 -0
- package/dist/es2019/context-panel.js +181 -0
- package/dist/es2019/extension-api.js +284 -0
- package/dist/es2019/index.js +1 -1
- package/dist/es2019/plugin-factory.js +26 -0
- package/dist/es2019/plugin-key.js +2 -0
- package/dist/es2019/plugin.js +138 -0
- package/dist/es2019/pm-plugins/keymap.js +15 -0
- package/dist/es2019/pm-plugins/macro/actions.js +152 -0
- package/dist/es2019/pm-plugins/macro/index.js +36 -0
- package/dist/es2019/pm-plugins/macro/plugin-key.js +2 -0
- package/dist/es2019/pm-plugins/macro/types.js +1 -0
- package/dist/es2019/pm-plugins/main.js +230 -0
- package/dist/es2019/pm-plugins/unique-id.js +69 -0
- package/dist/es2019/pm-plugins/utils.js +30 -0
- package/dist/es2019/reducer.js +11 -0
- package/dist/es2019/toolbar.js +236 -0
- package/dist/es2019/ui/ConfigPanel/ConfigPanel.js +415 -0
- package/dist/es2019/ui/ConfigPanel/ConfigPanelFieldsLoader.js +100 -0
- package/dist/es2019/ui/ConfigPanel/ConfigPanelLoader.js +7 -0
- package/dist/es2019/ui/ConfigPanel/ErrorMessage/ErrorImage.js +66 -0
- package/dist/es2019/ui/ConfigPanel/ErrorMessage/index.js +25 -0
- package/dist/es2019/ui/ConfigPanel/FieldMessages.js +101 -0
- package/dist/es2019/ui/ConfigPanel/Fields/Boolean.js +138 -0
- package/dist/es2019/ui/ConfigPanel/Fields/CheckboxGroup.js +96 -0
- package/dist/es2019/ui/ConfigPanel/Fields/ColorPicker.js +411 -0
- package/dist/es2019/ui/ConfigPanel/Fields/CustomSelect.js +132 -0
- package/dist/es2019/ui/ConfigPanel/Fields/Date.js +50 -0
- package/dist/es2019/ui/ConfigPanel/Fields/DateRange.js +139 -0
- package/dist/es2019/ui/ConfigPanel/Fields/Enum.js +35 -0
- package/dist/es2019/ui/ConfigPanel/Fields/Expand.js +73 -0
- package/dist/es2019/ui/ConfigPanel/Fields/Fieldset.js +227 -0
- package/dist/es2019/ui/ConfigPanel/Fields/Number.js +61 -0
- package/dist/es2019/ui/ConfigPanel/Fields/RadioGroup.js +40 -0
- package/dist/es2019/ui/ConfigPanel/Fields/Select.js +50 -0
- package/dist/es2019/ui/ConfigPanel/Fields/SelectItem.js +47 -0
- package/dist/es2019/ui/ConfigPanel/Fields/String.js +67 -0
- package/dist/es2019/ui/ConfigPanel/Fields/TabGroup.js +57 -0
- package/dist/es2019/ui/ConfigPanel/Fields/UnhandledType.js +11 -0
- package/dist/es2019/ui/ConfigPanel/Fields/UserSelect.js +194 -0
- package/dist/es2019/ui/ConfigPanel/Fields/common/RequiredIndicator.js +5 -0
- package/dist/es2019/ui/ConfigPanel/FormContent.js +225 -0
- package/dist/es2019/ui/ConfigPanel/FormErrorBoundary.js +100 -0
- package/dist/es2019/ui/ConfigPanel/Header.js +140 -0
- package/dist/es2019/ui/ConfigPanel/LoadingState.js +15 -0
- package/dist/es2019/ui/ConfigPanel/NestedForms/RemovableField.js +52 -0
- package/dist/es2019/ui/ConfigPanel/constants.js +7 -0
- package/dist/es2019/ui/ConfigPanel/index.js +2 -0
- package/dist/es2019/ui/ConfigPanel/messages.js +93 -0
- package/dist/es2019/ui/ConfigPanel/transformers.js +367 -0
- package/dist/es2019/ui/ConfigPanel/types.js +9 -0
- package/dist/es2019/ui/ConfigPanel/use-abortable-effect/index.js +46 -0
- package/dist/es2019/ui/ConfigPanel/use-state-from-promise/index.js +30 -0
- package/dist/es2019/ui/ConfigPanel/utils.js +86 -0
- package/dist/es2019/ui/SaveIndicator/SaveIndicator.js +66 -0
- package/dist/es2019/ui/SaveIndicator/messages.js +8 -0
- package/dist/es2019/ui/SaveIndicator/types.js +1 -0
- package/dist/es2019/utils.js +65 -0
- package/dist/esm/actions.js +223 -0
- package/dist/esm/commands.js +113 -0
- package/dist/esm/context-panel.js +261 -0
- package/dist/esm/extension-api.js +259 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/plugin-factory.js +25 -0
- package/dist/esm/plugin-key.js +2 -0
- package/dist/esm/plugin.js +140 -0
- package/dist/esm/pm-plugins/keymap.js +15 -0
- package/dist/esm/pm-plugins/macro/actions.js +179 -0
- package/dist/esm/pm-plugins/macro/index.js +42 -0
- package/dist/esm/pm-plugins/macro/plugin-key.js +2 -0
- package/dist/esm/pm-plugins/macro/types.js +1 -0
- package/dist/esm/pm-plugins/main.js +298 -0
- package/dist/esm/pm-plugins/unique-id.js +74 -0
- package/dist/esm/pm-plugins/utils.js +68 -0
- package/dist/esm/reducer.js +11 -0
- package/dist/esm/toolbar.js +235 -0
- package/dist/esm/ui/ConfigPanel/ConfigPanel.js +465 -0
- package/dist/esm/ui/ConfigPanel/ConfigPanelFieldsLoader.js +112 -0
- package/dist/esm/ui/ConfigPanel/ConfigPanelLoader.js +11 -0
- package/dist/esm/ui/ConfigPanel/ErrorMessage/ErrorImage.js +68 -0
- package/dist/esm/ui/ConfigPanel/ErrorMessage/index.js +26 -0
- package/dist/esm/ui/ConfigPanel/FieldMessages.js +97 -0
- package/dist/esm/ui/ConfigPanel/Fields/Boolean.js +140 -0
- package/dist/esm/ui/ConfigPanel/Fields/CheckboxGroup.js +95 -0
- package/dist/esm/ui/ConfigPanel/Fields/ColorPicker.js +414 -0
- package/dist/esm/ui/ConfigPanel/Fields/CustomSelect.js +182 -0
- package/dist/esm/ui/ConfigPanel/Fields/Date.js +48 -0
- package/dist/esm/ui/ConfigPanel/Fields/DateRange.js +154 -0
- package/dist/esm/ui/ConfigPanel/Fields/Enum.js +34 -0
- package/dist/esm/ui/ConfigPanel/Fields/Expand.js +77 -0
- package/dist/esm/ui/ConfigPanel/Fields/Fieldset.js +261 -0
- package/dist/esm/ui/ConfigPanel/Fields/Number.js +57 -0
- package/dist/esm/ui/ConfigPanel/Fields/RadioGroup.js +46 -0
- package/dist/esm/ui/ConfigPanel/Fields/Select.js +50 -0
- package/dist/esm/ui/ConfigPanel/Fields/SelectItem.js +45 -0
- package/dist/esm/ui/ConfigPanel/Fields/String.js +65 -0
- package/dist/esm/ui/ConfigPanel/Fields/TabGroup.js +62 -0
- package/dist/esm/ui/ConfigPanel/Fields/UnhandledType.js +10 -0
- package/dist/esm/ui/ConfigPanel/Fields/UserSelect.js +258 -0
- package/dist/esm/ui/ConfigPanel/Fields/common/RequiredIndicator.js +5 -0
- package/dist/esm/ui/ConfigPanel/FormContent.js +223 -0
- package/dist/esm/ui/ConfigPanel/FormErrorBoundary.js +133 -0
- package/dist/esm/ui/ConfigPanel/Header.js +140 -0
- package/dist/esm/ui/ConfigPanel/LoadingState.js +17 -0
- package/dist/esm/ui/ConfigPanel/NestedForms/RemovableField.js +53 -0
- package/dist/esm/ui/ConfigPanel/constants.js +7 -0
- package/dist/esm/ui/ConfigPanel/index.js +2 -0
- package/dist/esm/ui/ConfigPanel/messages.js +93 -0
- package/dist/esm/ui/ConfigPanel/transformers.js +624 -0
- package/dist/esm/ui/ConfigPanel/types.js +9 -0
- package/dist/esm/ui/ConfigPanel/use-abortable-effect/index.js +49 -0
- package/dist/esm/ui/ConfigPanel/use-state-from-promise/index.js +34 -0
- package/dist/esm/ui/ConfigPanel/utils.js +109 -0
- package/dist/esm/ui/SaveIndicator/SaveIndicator.js +72 -0
- package/dist/esm/ui/SaveIndicator/messages.js +8 -0
- package/dist/esm/ui/SaveIndicator/types.js +1 -0
- package/dist/esm/utils.js +67 -0
- package/dist/types/actions.d.ts +20 -0
- package/dist/types/commands.d.ts +15 -0
- package/dist/types/context-panel.d.ts +10 -0
- package/dist/types/extension-api.d.ts +12 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/plugin-factory.d.ts +4 -0
- package/dist/types/plugin-key.d.ts +3 -0
- package/dist/types/plugin.d.ts +2 -0
- package/dist/types/pm-plugins/keymap.d.ts +3 -0
- package/dist/types/pm-plugins/macro/actions.d.ts +9 -0
- package/dist/types/pm-plugins/macro/index.d.ts +8 -0
- package/dist/types/pm-plugins/macro/plugin-key.d.ts +3 -0
- package/dist/types/pm-plugins/macro/types.d.ts +4 -0
- package/dist/types/pm-plugins/main.d.ts +25 -0
- package/dist/types/pm-plugins/unique-id.d.ts +3 -0
- package/dist/types/pm-plugins/utils.d.ts +3 -0
- package/dist/types/reducer.d.ts +2 -0
- package/dist/types/toolbar.d.ts +44 -0
- package/dist/types/types.d.ts +27 -2
- package/dist/types/ui/ConfigPanel/ConfigPanel.d.ts +22 -0
- package/dist/types/ui/ConfigPanel/ConfigPanelFieldsLoader.d.ts +21 -0
- package/dist/types/ui/ConfigPanel/ConfigPanelLoader.d.ts +5 -0
- package/dist/types/ui/ConfigPanel/ErrorMessage/ErrorImage.d.ts +4 -0
- package/dist/types/ui/ConfigPanel/ErrorMessage/index.d.ts +10 -0
- package/dist/types/ui/ConfigPanel/FieldMessages.d.ts +12 -0
- package/dist/types/ui/ConfigPanel/Fields/Boolean.d.ts +8 -0
- package/dist/types/ui/ConfigPanel/Fields/CheckboxGroup.d.ts +8 -0
- package/dist/types/ui/ConfigPanel/Fields/ColorPicker.d.ts +20 -0
- package/dist/types/ui/ConfigPanel/Fields/CustomSelect.d.ts +24 -0
- package/dist/types/ui/ConfigPanel/Fields/Date.d.ts +20 -0
- package/dist/types/ui/ConfigPanel/Fields/DateRange.d.ts +20 -0
- package/dist/types/ui/ConfigPanel/Fields/Enum.d.ts +10 -0
- package/dist/types/ui/ConfigPanel/Fields/Expand.d.ts +16 -0
- package/dist/types/ui/ConfigPanel/Fields/Fieldset.d.ts +19 -0
- package/dist/types/ui/ConfigPanel/Fields/Number.d.ts +10 -0
- package/dist/types/ui/ConfigPanel/Fields/RadioGroup.d.ts +8 -0
- package/dist/types/ui/ConfigPanel/Fields/Select.d.ts +11 -0
- package/dist/types/ui/ConfigPanel/Fields/SelectItem.d.ts +5 -0
- package/dist/types/ui/ConfigPanel/Fields/String.d.ts +10 -0
- package/dist/types/ui/ConfigPanel/Fields/TabGroup.d.ts +14 -0
- package/dist/types/ui/ConfigPanel/Fields/UnhandledType.d.ts +6 -0
- package/dist/types/ui/ConfigPanel/Fields/UserSelect.d.ts +10 -0
- package/dist/types/ui/ConfigPanel/Fields/common/RequiredIndicator.d.ts +1 -0
- package/dist/types/ui/ConfigPanel/FormContent.d.ts +4 -0
- package/dist/types/ui/ConfigPanel/FormErrorBoundary.d.ts +16 -0
- package/dist/types/ui/ConfigPanel/Header.d.ts +23 -0
- package/dist/types/ui/ConfigPanel/LoadingState.d.ts +4 -0
- package/dist/types/ui/ConfigPanel/NestedForms/RemovableField.d.ts +19 -0
- package/dist/types/ui/ConfigPanel/constants.d.ts +2 -0
- package/dist/types/ui/ConfigPanel/index.d.ts +2 -0
- package/dist/types/ui/ConfigPanel/messages.d.ts +92 -0
- package/dist/types/ui/ConfigPanel/transformers.d.ts +9 -0
- package/dist/types/ui/ConfigPanel/types.d.ts +36 -0
- package/dist/types/ui/ConfigPanel/use-abortable-effect/index.d.ts +16 -0
- package/dist/types/ui/ConfigPanel/use-state-from-promise/index.d.ts +15 -0
- package/dist/types/ui/ConfigPanel/utils.d.ts +16 -0
- package/dist/types/ui/SaveIndicator/SaveIndicator.d.ts +4 -0
- package/dist/types/ui/SaveIndicator/messages.d.ts +7 -0
- package/dist/types/ui/SaveIndicator/types.d.ts +11 -0
- package/dist/types/utils.d.ts +15 -0
- package/dist/types-ts4.5/actions.d.ts +20 -0
- package/dist/types-ts4.5/commands.d.ts +15 -0
- package/dist/types-ts4.5/context-panel.d.ts +10 -0
- package/dist/types-ts4.5/extension-api.d.ts +12 -0
- package/dist/types-ts4.5/index.d.ts +2 -1
- package/dist/types-ts4.5/plugin-factory.d.ts +4 -0
- package/dist/types-ts4.5/plugin-key.d.ts +3 -0
- package/dist/types-ts4.5/plugin.d.ts +2 -0
- package/dist/types-ts4.5/pm-plugins/keymap.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/macro/actions.d.ts +9 -0
- package/dist/types-ts4.5/pm-plugins/macro/index.d.ts +8 -0
- package/dist/types-ts4.5/pm-plugins/macro/plugin-key.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/macro/types.d.ts +4 -0
- package/dist/types-ts4.5/pm-plugins/main.d.ts +25 -0
- package/dist/types-ts4.5/pm-plugins/unique-id.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/utils.d.ts +3 -0
- package/dist/types-ts4.5/reducer.d.ts +2 -0
- package/dist/types-ts4.5/toolbar.d.ts +44 -0
- package/dist/types-ts4.5/types.d.ts +27 -2
- package/dist/types-ts4.5/ui/ConfigPanel/ConfigPanel.d.ts +22 -0
- package/dist/types-ts4.5/ui/ConfigPanel/ConfigPanelFieldsLoader.d.ts +21 -0
- package/dist/types-ts4.5/ui/ConfigPanel/ConfigPanelLoader.d.ts +5 -0
- package/dist/types-ts4.5/ui/ConfigPanel/ErrorMessage/ErrorImage.d.ts +4 -0
- package/dist/types-ts4.5/ui/ConfigPanel/ErrorMessage/index.d.ts +10 -0
- package/dist/types-ts4.5/ui/ConfigPanel/FieldMessages.d.ts +12 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/Boolean.d.ts +8 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/CheckboxGroup.d.ts +8 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/ColorPicker.d.ts +20 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/CustomSelect.d.ts +24 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/Date.d.ts +20 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/DateRange.d.ts +20 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/Enum.d.ts +10 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/Expand.d.ts +16 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/Fieldset.d.ts +19 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/Number.d.ts +10 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/RadioGroup.d.ts +8 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/Select.d.ts +11 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/SelectItem.d.ts +5 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/String.d.ts +10 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/TabGroup.d.ts +14 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/UnhandledType.d.ts +6 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/UserSelect.d.ts +10 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Fields/common/RequiredIndicator.d.ts +1 -0
- package/dist/types-ts4.5/ui/ConfigPanel/FormContent.d.ts +4 -0
- package/dist/types-ts4.5/ui/ConfigPanel/FormErrorBoundary.d.ts +16 -0
- package/dist/types-ts4.5/ui/ConfigPanel/Header.d.ts +23 -0
- package/dist/types-ts4.5/ui/ConfigPanel/LoadingState.d.ts +4 -0
- package/dist/types-ts4.5/ui/ConfigPanel/NestedForms/RemovableField.d.ts +19 -0
- package/dist/types-ts4.5/ui/ConfigPanel/constants.d.ts +2 -0
- package/dist/types-ts4.5/ui/ConfigPanel/index.d.ts +2 -0
- package/dist/types-ts4.5/ui/ConfigPanel/messages.d.ts +92 -0
- package/dist/types-ts4.5/ui/ConfigPanel/transformers.d.ts +9 -0
- package/dist/types-ts4.5/ui/ConfigPanel/types.d.ts +39 -0
- package/dist/types-ts4.5/ui/ConfigPanel/use-abortable-effect/index.d.ts +16 -0
- package/dist/types-ts4.5/ui/ConfigPanel/use-state-from-promise/index.d.ts +18 -0
- package/dist/types-ts4.5/ui/ConfigPanel/utils.d.ts +16 -0
- package/dist/types-ts4.5/ui/SaveIndicator/SaveIndicator.d.ts +4 -0
- package/dist/types-ts4.5/ui/SaveIndicator/messages.d.ts +7 -0
- package/dist/types-ts4.5/ui/SaveIndicator/types.d.ts +11 -0
- package/dist/types-ts4.5/utils.d.ts +15 -0
- package/example-utils/config-panel/ConfigPanelWithExtensionPicker.tsx +217 -0
- package/example-utils/config-panel/ConfigPanelWithProviders.tsx +51 -0
- package/example-utils/config-panel/ExtensionNodePicker.tsx +141 -0
- package/example-utils/config-panel/FieldTypePicker.tsx +63 -0
- package/example-utils/config-panel/example-manifest-all-fields.ts +86 -0
- package/example-utils/config-panel/example-manifest-individual-fields.ts +85 -0
- package/example-utils/config-panel/fields.ts +611 -0
- package/package.json +49 -7
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { Fragment } from 'react';
|
|
3
|
+
import { css, jsx } from '@emotion/react';
|
|
4
|
+
import { injectIntl } from 'react-intl-next';
|
|
5
|
+
import Loadable from 'react-loadable';
|
|
6
|
+
import Button from '@atlaskit/button/custom-theme-button';
|
|
7
|
+
import { relativeFontSizeToBase16 } from '@atlaskit/editor-shared-styles';
|
|
8
|
+
import CrossIcon from '@atlaskit/icon/glyph/cross';
|
|
9
|
+
import { N200 } from '@atlaskit/theme/colors';
|
|
10
|
+
import { borderRadius } from '@atlaskit/theme/constants';
|
|
11
|
+
import { messages } from './messages';
|
|
12
|
+
const iconWidth = 40;
|
|
13
|
+
const buttonWidth = 40;
|
|
14
|
+
const margin = 16;
|
|
15
|
+
const gapSizeForEllipsis = iconWidth + buttonWidth + margin * 2;
|
|
16
|
+
const itemStyles = css({
|
|
17
|
+
display: 'flex',
|
|
18
|
+
marginBottom: "var(--ds-space-300, 24px)"
|
|
19
|
+
});
|
|
20
|
+
const itemIconStyles = css({
|
|
21
|
+
width: iconWidth,
|
|
22
|
+
height: iconWidth,
|
|
23
|
+
overflow: 'hidden',
|
|
24
|
+
border: `1px solid ${"var(--ds-border, rgba(223, 225, 229, 0.5))"}`,
|
|
25
|
+
borderRadius: `${borderRadius()}px`,
|
|
26
|
+
boxSizing: 'border-box',
|
|
27
|
+
display: 'flex',
|
|
28
|
+
justifyContent: 'center',
|
|
29
|
+
alignItems: 'center',
|
|
30
|
+
// eslint-disable-next-line @atlaskit/design-system/no-nested-styles
|
|
31
|
+
div: {
|
|
32
|
+
width: iconWidth,
|
|
33
|
+
height: iconWidth
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const itemBodyStyles = css({
|
|
37
|
+
display: 'flex',
|
|
38
|
+
flexDirection: 'row',
|
|
39
|
+
flexWrap: 'nowrap',
|
|
40
|
+
justifyContent: 'space-between',
|
|
41
|
+
lineHeight: 1.4,
|
|
42
|
+
margin: `0 ${"var(--ds-space-200, 16px)"}`,
|
|
43
|
+
flexGrow: 3,
|
|
44
|
+
maxWidth: `calc(100% - ${gapSizeForEllipsis}px)`
|
|
45
|
+
});
|
|
46
|
+
const centeredItemTitleStyles = css({
|
|
47
|
+
display: 'flex',
|
|
48
|
+
flexDirection: 'column',
|
|
49
|
+
justifyContent: 'center'
|
|
50
|
+
});
|
|
51
|
+
const itemTextStyles = css({
|
|
52
|
+
maxWidth: '100%',
|
|
53
|
+
whiteSpace: 'initial',
|
|
54
|
+
// eslint-disable-next-line @atlaskit/design-system/no-nested-styles
|
|
55
|
+
itemSummary: {
|
|
56
|
+
fontSize: relativeFontSizeToBase16(11.67),
|
|
57
|
+
color: `var(--ds-text-subtlest, ${N200})`,
|
|
58
|
+
marginTop: "var(--ds-space-050, 4px)",
|
|
59
|
+
whiteSpace: 'nowrap',
|
|
60
|
+
overflow: 'hidden',
|
|
61
|
+
textOverflow: 'ellipsis'
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
const descriptionStyles = css({
|
|
65
|
+
marginBottom: "var(--ds-space-300, 24px)"
|
|
66
|
+
});
|
|
67
|
+
const helpLinkStyles = css({
|
|
68
|
+
paddingTop: "var(--ds-space-150, 12px)"
|
|
69
|
+
});
|
|
70
|
+
const closeButtonWrapperStyles = css({
|
|
71
|
+
width: buttonWidth,
|
|
72
|
+
textAlign: 'right'
|
|
73
|
+
});
|
|
74
|
+
const Header = ({
|
|
75
|
+
icon,
|
|
76
|
+
title,
|
|
77
|
+
description,
|
|
78
|
+
summary,
|
|
79
|
+
documentationUrl,
|
|
80
|
+
enableHelpCTA,
|
|
81
|
+
onClose,
|
|
82
|
+
intl
|
|
83
|
+
}) => {
|
|
84
|
+
const ResolvedIcon = Loadable({
|
|
85
|
+
loader: icon,
|
|
86
|
+
loading: () => null
|
|
87
|
+
});
|
|
88
|
+
return jsx(Fragment, null, jsx("div", {
|
|
89
|
+
css: itemStyles
|
|
90
|
+
}, jsx("div", {
|
|
91
|
+
css: itemIconStyles
|
|
92
|
+
}, jsx(ResolvedIcon, {
|
|
93
|
+
label: title
|
|
94
|
+
})), jsx("div", {
|
|
95
|
+
css: itemBodyStyles
|
|
96
|
+
}, summary ? jsx("div", {
|
|
97
|
+
css: itemTextStyles
|
|
98
|
+
}, jsx("div", {
|
|
99
|
+
className: "item-title",
|
|
100
|
+
id: "context-panel-title",
|
|
101
|
+
"data-testId": "context-panel-title"
|
|
102
|
+
}, title), jsx("div", {
|
|
103
|
+
className: "item-summary"
|
|
104
|
+
}, summary)) : jsx("div", {
|
|
105
|
+
css: centeredItemTitleStyles,
|
|
106
|
+
id: "context-panel-title",
|
|
107
|
+
"data-testId": "context-panel-title"
|
|
108
|
+
}, title)), jsx("div", {
|
|
109
|
+
css: closeButtonWrapperStyles
|
|
110
|
+
}, jsx(Button, {
|
|
111
|
+
appearance: "subtle",
|
|
112
|
+
iconBefore: jsx(CrossIcon, {
|
|
113
|
+
label: intl.formatMessage(messages.close)
|
|
114
|
+
}),
|
|
115
|
+
onClick: onClose
|
|
116
|
+
}))), (description || documentationUrl) && jsx("p", {
|
|
117
|
+
css: descriptionStyles,
|
|
118
|
+
"data-testid": "config-panel-header-description"
|
|
119
|
+
}, description && jsx(Fragment, null, description.replace(/([^.])$/, '$1.'), " "), documentationUrl && (enableHelpCTA ? jsx("p", {
|
|
120
|
+
css: helpLinkStyles
|
|
121
|
+
}, jsx(HelpLink, {
|
|
122
|
+
documentationUrl: documentationUrl,
|
|
123
|
+
label: intl.formatMessage(messages.help)
|
|
124
|
+
})) : jsx(HelpLink, {
|
|
125
|
+
documentationUrl: documentationUrl,
|
|
126
|
+
label: intl.formatMessage(messages.documentation)
|
|
127
|
+
}))));
|
|
128
|
+
};
|
|
129
|
+
const HelpLink = ({
|
|
130
|
+
documentationUrl,
|
|
131
|
+
label
|
|
132
|
+
}) => {
|
|
133
|
+
return jsx("a", {
|
|
134
|
+
target: "_blank",
|
|
135
|
+
rel: "noopener noreferrer",
|
|
136
|
+
href: documentationUrl,
|
|
137
|
+
"data-testid": "config-panel-header-documentation-link"
|
|
138
|
+
}, label);
|
|
139
|
+
};
|
|
140
|
+
export default injectIntl(Header);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { css, jsx } from '@emotion/react';
|
|
3
|
+
import Spinner from '@atlaskit/spinner';
|
|
4
|
+
const spinnerWrapperStyles = css({
|
|
5
|
+
display: 'flex',
|
|
6
|
+
justifyContent: 'center',
|
|
7
|
+
marginTop: "var(--ds-space-800, 64px)"
|
|
8
|
+
});
|
|
9
|
+
const LoadingState = () => jsx("div", {
|
|
10
|
+
css: spinnerWrapperStyles,
|
|
11
|
+
"data-testid": "ConfigPanelLoading"
|
|
12
|
+
}, jsx(Spinner, {
|
|
13
|
+
size: "small"
|
|
14
|
+
}));
|
|
15
|
+
export default LoadingState;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { css, jsx } from '@emotion/react';
|
|
4
|
+
import { injectIntl } from 'react-intl-next';
|
|
5
|
+
import CrossCircleIcon from '@atlaskit/icon/glyph/cross-circle';
|
|
6
|
+
import { N80, R300 } from '@atlaskit/theme/colors';
|
|
7
|
+
import Tooltip from '@atlaskit/tooltip';
|
|
8
|
+
import { messages } from '../messages';
|
|
9
|
+
const removableFieldWrapperStyles = css({
|
|
10
|
+
position: 'relative',
|
|
11
|
+
marginBottom: 0
|
|
12
|
+
});
|
|
13
|
+
const wrapperWithMarginBottomStyles = css({
|
|
14
|
+
marginBottom: "var(--ds-space-200, 16px)"
|
|
15
|
+
});
|
|
16
|
+
const removeButtonWrapperStyles = css({
|
|
17
|
+
position: 'absolute',
|
|
18
|
+
right: 0,
|
|
19
|
+
top: 0,
|
|
20
|
+
cursor: 'pointer',
|
|
21
|
+
color: `var(--ds-icon-subtle, ${N80})`,
|
|
22
|
+
'&:hover': {
|
|
23
|
+
color: `var(--ds-icon-danger, ${R300})`
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
const RemovableField = ({
|
|
27
|
+
name,
|
|
28
|
+
canRemoveField,
|
|
29
|
+
onClickRemove,
|
|
30
|
+
children,
|
|
31
|
+
intl,
|
|
32
|
+
className
|
|
33
|
+
}) => {
|
|
34
|
+
var _children$props$field;
|
|
35
|
+
const onClickCallback = React.useCallback(() => onClickRemove && onClickRemove(name), [name, onClickRemove]);
|
|
36
|
+
const hasMarginBottom = ((_children$props$field = children.props.field) === null || _children$props$field === void 0 ? void 0 : _children$props$field.type) !== 'expand';
|
|
37
|
+
return jsx("div", {
|
|
38
|
+
css: [removableFieldWrapperStyles, hasMarginBottom && wrapperWithMarginBottomStyles],
|
|
39
|
+
className: className
|
|
40
|
+
}, children, canRemoveField && jsx("div", {
|
|
41
|
+
css: removeButtonWrapperStyles,
|
|
42
|
+
"data-testid": `remove-field-${name}`,
|
|
43
|
+
onClick: onClickCallback
|
|
44
|
+
}, jsx(Tooltip, {
|
|
45
|
+
content: intl.formatMessage(messages.removeField),
|
|
46
|
+
position: "left"
|
|
47
|
+
}, jsx(CrossCircleIcon, {
|
|
48
|
+
size: "small",
|
|
49
|
+
label: intl.formatMessage(messages.removeField)
|
|
50
|
+
}))));
|
|
51
|
+
};
|
|
52
|
+
export default injectIntl(RemovableField);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Allowlist of { macroKey: parameterName[] } for analytics logging
|
|
2
|
+
export const ALLOWED_LOGGED_MACRO_PARAMS = {
|
|
3
|
+
children: ['all', 'first', 'depth', 'style', 'excerptType', 'sort', 'reverse'],
|
|
4
|
+
'recently-updated': ['width', 'types', 'max', 'theme', 'showProfilePic', 'hideHeading'],
|
|
5
|
+
excerpt: ['hidden']
|
|
6
|
+
};
|
|
7
|
+
export const ALLOWED_PARAM_TYPES = ['enum', 'number', 'boolean'];
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export const messages = defineMessages({
|
|
3
|
+
submit: {
|
|
4
|
+
id: 'fabric.editor.configPanel.submit',
|
|
5
|
+
defaultMessage: 'Submit',
|
|
6
|
+
description: 'Submit button label'
|
|
7
|
+
},
|
|
8
|
+
cancel: {
|
|
9
|
+
id: 'fabric.editor.configPanel.cancel',
|
|
10
|
+
defaultMessage: 'Cancel',
|
|
11
|
+
description: 'Cancel button label'
|
|
12
|
+
},
|
|
13
|
+
close: {
|
|
14
|
+
id: 'fabric.editor.configPanel.close',
|
|
15
|
+
defaultMessage: 'Close',
|
|
16
|
+
description: 'Close button label'
|
|
17
|
+
},
|
|
18
|
+
required: {
|
|
19
|
+
id: 'fabric.editor.configPanel.required',
|
|
20
|
+
defaultMessage: 'Required field',
|
|
21
|
+
description: 'Validation message for required field'
|
|
22
|
+
},
|
|
23
|
+
invalid: {
|
|
24
|
+
id: 'fabric.editor.configPanel.invalid',
|
|
25
|
+
defaultMessage: 'Invalid field',
|
|
26
|
+
description: 'Validation message when a field value is not acceptable'
|
|
27
|
+
},
|
|
28
|
+
isMultipleAndRadio: {
|
|
29
|
+
id: 'fabric.editor.configPanel.fieldTypeError.isMultipleAndRadio',
|
|
30
|
+
defaultMessage: 'Can not combine isMultiple with style: radio',
|
|
31
|
+
description: 'Configuration error'
|
|
32
|
+
},
|
|
33
|
+
addField: {
|
|
34
|
+
id: 'fabric.editor.configPanel.formType.addField',
|
|
35
|
+
defaultMessage: 'Add field',
|
|
36
|
+
description: 'Button to add a new field in nested forms'
|
|
37
|
+
},
|
|
38
|
+
removeField: {
|
|
39
|
+
id: 'fabric.editor.configPanel.formType.removeField',
|
|
40
|
+
defaultMessage: 'Remove field',
|
|
41
|
+
description: 'Button to remove a field in nested forms'
|
|
42
|
+
},
|
|
43
|
+
createOption: {
|
|
44
|
+
id: 'fabric.editor.configPanel.customSelect.createOption',
|
|
45
|
+
defaultMessage: 'Create',
|
|
46
|
+
description: 'Create a new option for a select field'
|
|
47
|
+
},
|
|
48
|
+
documentation: {
|
|
49
|
+
id: 'fabric.editor.configPanel.documentation',
|
|
50
|
+
defaultMessage: 'Documentation',
|
|
51
|
+
description: 'Label for the documentation link'
|
|
52
|
+
},
|
|
53
|
+
help: {
|
|
54
|
+
id: 'fabric.editor.configPanel.help',
|
|
55
|
+
defaultMessage: 'Need help?',
|
|
56
|
+
description: 'Label for documentation link v.2 (to replace "Documentation" text)'
|
|
57
|
+
},
|
|
58
|
+
custom: {
|
|
59
|
+
id: 'fabric.editor.configPanel.dateRange.option.custom',
|
|
60
|
+
defaultMessage: 'Custom',
|
|
61
|
+
description: 'Label for the option "Custom" in the date range UI element'
|
|
62
|
+
},
|
|
63
|
+
from: {
|
|
64
|
+
id: 'fabric.editor.configPanel.dateRange.custom.from',
|
|
65
|
+
defaultMessage: 'From',
|
|
66
|
+
description: 'Label for the initial date when the option "Custom" is selected in the date range UI element'
|
|
67
|
+
},
|
|
68
|
+
to: {
|
|
69
|
+
id: 'fabric.editor.configPanel.dateRange.custom.to',
|
|
70
|
+
defaultMessage: 'To',
|
|
71
|
+
description: 'Label for the end date when the option "Custom" is selected in the date range UI element'
|
|
72
|
+
},
|
|
73
|
+
expand: {
|
|
74
|
+
id: 'fabric.editor.configPanel.dateRange.grouping.expand',
|
|
75
|
+
defaultMessage: 'Expand',
|
|
76
|
+
description: 'Label for expanding a group of fields'
|
|
77
|
+
},
|
|
78
|
+
collapse: {
|
|
79
|
+
id: 'fabric.editor.configPanel.dateRange.grouping.collapse',
|
|
80
|
+
defaultMessage: 'Collapse',
|
|
81
|
+
description: 'Label for collapsing a group of fields'
|
|
82
|
+
},
|
|
83
|
+
errorBoundaryTitle: {
|
|
84
|
+
id: 'fabric.editor.configPanel.errorBoundary.title',
|
|
85
|
+
defaultMessage: 'Something went wrong.',
|
|
86
|
+
description: 'Title for uncaught config panel error'
|
|
87
|
+
},
|
|
88
|
+
errorBoundaryNote: {
|
|
89
|
+
id: 'fabric.editor.configPanel.errorBoundary.note',
|
|
90
|
+
defaultMessage: `We've let the team know. You can still edit and publish this page, or check the error console for more information.`,
|
|
91
|
+
description: 'Note for uncaught config panel error'
|
|
92
|
+
}
|
|
93
|
+
});
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { getFieldDeserializer, getFieldSerializer, isDateRange, isExpand, isFieldset, isTabField, isTabGroup } from '@atlaskit/editor-common/extensions';
|
|
2
|
+
import { getNameFromDuplicateField, isDuplicateField } from './utils';
|
|
3
|
+
const isOption = option => {
|
|
4
|
+
return option && typeof option === 'object' && 'label' in option && 'value' in option;
|
|
5
|
+
};
|
|
6
|
+
const isOptions = options => {
|
|
7
|
+
return Array.isArray(options) && options.every(isOption);
|
|
8
|
+
};
|
|
9
|
+
/** maps the typed-values from the Form values object */
|
|
10
|
+
function extract(value, field, options) {
|
|
11
|
+
if (isOptions(value)) {
|
|
12
|
+
return value.map(item => item.value);
|
|
13
|
+
} else if (isOption(value)) {
|
|
14
|
+
return value.value;
|
|
15
|
+
} else if (isDateRange(value)) {
|
|
16
|
+
return value;
|
|
17
|
+
} else if (value !== undefined && field.type === 'number') {
|
|
18
|
+
if (value === '') {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
return Number(value);
|
|
22
|
+
}
|
|
23
|
+
// Workaround for https://product-fabric.atlassian.net/browse/DST-2701
|
|
24
|
+
else if (options !== null && options !== void 0 && options.useDefaultValue && value === undefined && 'defaultValue' in field) {
|
|
25
|
+
return field.defaultValue;
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
export const findDuplicateFields = fields => findDuplicateFieldsInternal(flattenFields(fields));
|
|
30
|
+
const findDuplicateFieldsInternal = fields => {
|
|
31
|
+
const allowDuplicatesMap = {};
|
|
32
|
+
return fields.find(field => {
|
|
33
|
+
if (isExpand(field)) {
|
|
34
|
+
return findDuplicateFieldsInternal(field.fields);
|
|
35
|
+
} else if (isTabGroup(field)) {
|
|
36
|
+
return field.fields.find(tabField => findDuplicateFieldsInternal(tabField.fields));
|
|
37
|
+
} else if (allowDuplicatesMap[field.name] === undefined) {
|
|
38
|
+
allowDuplicatesMap[field.name] = !!field.allowDuplicates;
|
|
39
|
+
return;
|
|
40
|
+
} else if (!field.allowDuplicates || !allowDuplicatesMap[field.name]) {
|
|
41
|
+
return field;
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
export const serialize = async (manifest, data, fields, options = {}) => {
|
|
47
|
+
const result = [];
|
|
48
|
+
const {
|
|
49
|
+
depth = 0,
|
|
50
|
+
parentType
|
|
51
|
+
} = options;
|
|
52
|
+
const flattenedFields = flattenFields(fields);
|
|
53
|
+
const fillResults = flattenedFields.map(async field => {
|
|
54
|
+
if (isTabGroup(field)) {
|
|
55
|
+
const tabGroupData = await serializeTabGroupField(manifest, field, data);
|
|
56
|
+
result.push(...tabGroupData);
|
|
57
|
+
} else if (isTabField(field)) {
|
|
58
|
+
const tabData = await serializeTabField(manifest, field, data);
|
|
59
|
+
result.push(...tabData);
|
|
60
|
+
} else if (isExpand(field)) {
|
|
61
|
+
const expandData = await serializeExpandField(manifest, field, data);
|
|
62
|
+
result.push(...expandData);
|
|
63
|
+
}
|
|
64
|
+
// WARNING: don't recursively serialize, limit to depth < 1
|
|
65
|
+
// serializable?
|
|
66
|
+
else if (isFieldset(field) && depth === 0) {
|
|
67
|
+
const fieldsetData = await serializeFieldset(manifest, field, data, depth);
|
|
68
|
+
if (fieldsetData) {
|
|
69
|
+
result.push(fieldsetData);
|
|
70
|
+
}
|
|
71
|
+
} else {
|
|
72
|
+
const value = extract(data[field.name], field, {
|
|
73
|
+
useDefaultValue: true
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// ignore undefined values
|
|
77
|
+
if (value !== undefined) {
|
|
78
|
+
result.push({
|
|
79
|
+
[field.name]: value
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
await Promise.all(fillResults);
|
|
85
|
+
|
|
86
|
+
// Crunch fields down to parameters
|
|
87
|
+
const parameters = result.reduce((obj, current) => {
|
|
88
|
+
for (const key in current) {
|
|
89
|
+
obj[key] = current[key];
|
|
90
|
+
}
|
|
91
|
+
return obj;
|
|
92
|
+
}, {});
|
|
93
|
+
|
|
94
|
+
// Fix up duplicate values (currently only for fieldsets)
|
|
95
|
+
const hasDuplicateFields = parentType === 'fieldset' && !!flattenedFields.find(field => field.allowDuplicates);
|
|
96
|
+
if (hasDuplicateFields) {
|
|
97
|
+
return serializeMergeDuplicateFieldData(parameters, data, flattenedFields);
|
|
98
|
+
}
|
|
99
|
+
return parameters;
|
|
100
|
+
};
|
|
101
|
+
const serializeFieldset = async (manifest, field, data, depth) => {
|
|
102
|
+
let fieldSerializer;
|
|
103
|
+
try {
|
|
104
|
+
fieldSerializer = await getFieldSerializer(manifest, field.options.transformer);
|
|
105
|
+
} catch (ex) {
|
|
106
|
+
// We only throw if there is data that may be lost
|
|
107
|
+
if (data[field.name] !== undefined) {
|
|
108
|
+
throw ex;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (!fieldSerializer) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const {
|
|
115
|
+
fields: fieldsetFields
|
|
116
|
+
} = field;
|
|
117
|
+
const fieldParams = extract(data[field.name], field, {
|
|
118
|
+
useDefaultValue: true
|
|
119
|
+
}) || {};
|
|
120
|
+
const extracted = await serialize(manifest, fieldParams, fieldsetFields, {
|
|
121
|
+
depth: depth + 1,
|
|
122
|
+
parentType: 'fieldset'
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
[field.name]: fieldSerializer(extracted)
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
const serializeExpandField = async (manifest, field, data) => {
|
|
129
|
+
const expandData = field.hasGroupedValues ? data[field.name] || {} : data;
|
|
130
|
+
const value = await serialize(manifest, expandData, field.fields, {
|
|
131
|
+
parentType: 'expand'
|
|
132
|
+
});
|
|
133
|
+
const results = [];
|
|
134
|
+
if (!field.hasGroupedValues) {
|
|
135
|
+
for (const fieldName in value) {
|
|
136
|
+
results.push({
|
|
137
|
+
[fieldName]: value[fieldName]
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
results.push({
|
|
142
|
+
[field.name]: value
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return results;
|
|
146
|
+
};
|
|
147
|
+
const resolveTabValues = async (manifest, tabField, groupData) => {
|
|
148
|
+
const tabFieldParams = tabField.hasGroupedValues ? groupData[tabField.name] || {} : groupData;
|
|
149
|
+
return await serialize(manifest, tabFieldParams, tabField.fields, {
|
|
150
|
+
parentType: 'tab'
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
const serializeTabGroupField = async (manifest, field, data) => {
|
|
154
|
+
const {
|
|
155
|
+
fields: tabs
|
|
156
|
+
} = field;
|
|
157
|
+
const results = [];
|
|
158
|
+
const value = {};
|
|
159
|
+
for (let i = 0; i < tabs.length; i++) {
|
|
160
|
+
const tabField = tabs[i];
|
|
161
|
+
const tabFieldParameters = await resolveTabValues(manifest, tabField, field.hasGroupedValues ? data[field.name] || {} : data);
|
|
162
|
+
if (tabField.hasGroupedValues) {
|
|
163
|
+
// Keep namespaced by tab
|
|
164
|
+
value[tabField.name] = tabFieldParameters;
|
|
165
|
+
} else {
|
|
166
|
+
// Copy into tabGroup value
|
|
167
|
+
for (const fieldName in tabFieldParameters) {
|
|
168
|
+
value[fieldName] = tabFieldParameters[fieldName];
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Now for tabGroup...
|
|
174
|
+
if (field.hasGroupedValues) {
|
|
175
|
+
results.push({
|
|
176
|
+
[field.name]: value
|
|
177
|
+
});
|
|
178
|
+
} else {
|
|
179
|
+
for (const fieldName in value) {
|
|
180
|
+
results.push({
|
|
181
|
+
[fieldName]: value
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return results;
|
|
186
|
+
};
|
|
187
|
+
const serializeTabField = async (manifest, field, data) => {
|
|
188
|
+
const results = [];
|
|
189
|
+
const tabField = field;
|
|
190
|
+
const tabFieldParameters = await resolveTabValues(manifest, tabField, data);
|
|
191
|
+
if (tabField.hasGroupedValues) {
|
|
192
|
+
// Keep namespaced by tab
|
|
193
|
+
results.push({
|
|
194
|
+
[tabField.name]: tabFieldParameters
|
|
195
|
+
});
|
|
196
|
+
} else {
|
|
197
|
+
// Copy into tabGroup value
|
|
198
|
+
for (const fieldName in tabFieldParameters) {
|
|
199
|
+
results.push({
|
|
200
|
+
[fieldName]: tabFieldParameters[fieldName]
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return results;
|
|
205
|
+
};
|
|
206
|
+
const serializeMergeDuplicateFieldData = (parameters, formData, flattenedFields) => {
|
|
207
|
+
// Weed out all the non-duplicate field names
|
|
208
|
+
const allDuplicateFieldNames = Object.keys(formData).filter(key => isDuplicateField(key));
|
|
209
|
+
return flattenedFields.reduce((newParams, field) => {
|
|
210
|
+
const paramValue = parameters[field.name];
|
|
211
|
+
if (!field.allowDuplicates && paramValue !== undefined) {
|
|
212
|
+
newParams[field.name] = paramValue;
|
|
213
|
+
} else {
|
|
214
|
+
// extract the given duplicate values through the field
|
|
215
|
+
const duplicateValues = allDuplicateFieldNames.filter(name => getNameFromDuplicateField(name) === field.name).map(duplicateFieldName => extract(formData[duplicateFieldName], field, {
|
|
216
|
+
useDefaultValue: true
|
|
217
|
+
}));
|
|
218
|
+
// Merge and ensure that all values are worth serializing
|
|
219
|
+
const mergedValues = [paramValue,
|
|
220
|
+
// first value
|
|
221
|
+
...duplicateValues].filter(value => value !== undefined);
|
|
222
|
+
if (mergedValues.length > 0) {
|
|
223
|
+
// Replace so the duplicate field values are saved under the
|
|
224
|
+
// fieldName as an array
|
|
225
|
+
newParams[field.name] = mergedValues;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return newParams;
|
|
229
|
+
}, {});
|
|
230
|
+
};
|
|
231
|
+
function injectDefaultValues(data, fields) {
|
|
232
|
+
const copy = [...convertToParametersArray(data)];
|
|
233
|
+
for (const field of fields) {
|
|
234
|
+
const {
|
|
235
|
+
name
|
|
236
|
+
} = field;
|
|
237
|
+
const fieldIndex = copy.findIndex(item => Object.entries(item)[0][0] === name);
|
|
238
|
+
if (fieldIndex >= 0 && !isFieldset(field)) {
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (isFieldset(field)) {
|
|
242
|
+
const {
|
|
243
|
+
fields: fieldsetFields
|
|
244
|
+
} = field;
|
|
245
|
+
if (fieldIndex >= 0) {
|
|
246
|
+
const fieldValue = Object.entries(copy[fieldIndex])[0][1];
|
|
247
|
+
copy[fieldIndex] = {
|
|
248
|
+
[name]: injectDefaultValues(fieldValue, fieldsetFields)
|
|
249
|
+
};
|
|
250
|
+
} else {
|
|
251
|
+
copy.push({
|
|
252
|
+
[name]: injectDefaultValues({}, fieldsetFields)
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if ('defaultValue' in field) {
|
|
257
|
+
copy.push({
|
|
258
|
+
[name]: field.defaultValue
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return convertToParametersObject(copy);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Flattens the given FieldDefinition[] so it resembles the expected data
|
|
267
|
+
* structure in result Parameters.
|
|
268
|
+
*/
|
|
269
|
+
const flattenFields = fields => {
|
|
270
|
+
const flattenAccumulator = (accumulator, field) => {
|
|
271
|
+
if (isTabGroup(field)) {
|
|
272
|
+
if (field.hasGroupedValues) {
|
|
273
|
+
accumulator.push(field);
|
|
274
|
+
} else {
|
|
275
|
+
const flattenedTabs = field.fields.reduce((tabAccumulator, tab) => {
|
|
276
|
+
return tabAccumulator.concat(tab.hasGroupedValues ?
|
|
277
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
278
|
+
tab : tab.fields.reduce(flattenAccumulator, []));
|
|
279
|
+
}, []);
|
|
280
|
+
accumulator.push(...flattenedTabs);
|
|
281
|
+
}
|
|
282
|
+
} else if (isExpand(field)) {
|
|
283
|
+
if (field.hasGroupedValues) {
|
|
284
|
+
accumulator.push(field);
|
|
285
|
+
} else {
|
|
286
|
+
const flattenedExpand = field.fields.reduce(flattenAccumulator, []);
|
|
287
|
+
accumulator.push(...flattenedExpand);
|
|
288
|
+
}
|
|
289
|
+
} else {
|
|
290
|
+
accumulator.push(field);
|
|
291
|
+
}
|
|
292
|
+
return accumulator;
|
|
293
|
+
};
|
|
294
|
+
return fields.reduce(flattenAccumulator, []);
|
|
295
|
+
};
|
|
296
|
+
export const deserialize = async (manifest, data, fields, depth = 0) => {
|
|
297
|
+
const dataArray = convertToParametersArray(data);
|
|
298
|
+
let result = [];
|
|
299
|
+
const errors = [];
|
|
300
|
+
const flattenedFields = flattenFields(fields);
|
|
301
|
+
for (const item of dataArray) {
|
|
302
|
+
const [name, originalValue] = Object.entries(item)[0];
|
|
303
|
+
const field = flattenedFields.find(field => field.name === getNameFromDuplicateField(name));
|
|
304
|
+
if (field === undefined) {
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
let value = extract(originalValue, field);
|
|
308
|
+
if (value === undefined) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// WARNING: don't recursively serialize, limit to depth < 1
|
|
313
|
+
// deserializable?
|
|
314
|
+
if (isFieldset(field) && depth === 0) {
|
|
315
|
+
const fieldDeserializer = await getFieldDeserializer(manifest, field.options.transformer);
|
|
316
|
+
if (fieldDeserializer) {
|
|
317
|
+
try {
|
|
318
|
+
value = fieldDeserializer(value);
|
|
319
|
+
} catch (error) {
|
|
320
|
+
errors.push({
|
|
321
|
+
[name]: error instanceof Error ? error.message : String(error)
|
|
322
|
+
});
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
value = await deserialize(manifest, value, field.fields, depth + 1);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
result.push({
|
|
329
|
+
[name]: value
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
result = convertToParametersObject(result);
|
|
333
|
+
if (errors.length > 0) {
|
|
334
|
+
result.errors = convertToParametersObject(errors);
|
|
335
|
+
}
|
|
336
|
+
return injectDefaultValues(result, flattenedFields);
|
|
337
|
+
};
|
|
338
|
+
const convertToParametersObject = (parameters = []) => {
|
|
339
|
+
if (!Array.isArray(parameters)) {
|
|
340
|
+
return parameters;
|
|
341
|
+
}
|
|
342
|
+
return parameters.reduce((obj, current) => {
|
|
343
|
+
for (const key in current) {
|
|
344
|
+
const keys = Object.keys(obj);
|
|
345
|
+
let resultKey = key;
|
|
346
|
+
let idx = 1;
|
|
347
|
+
while (keys.indexOf(resultKey) >= 0) {
|
|
348
|
+
resultKey = `${getNameFromDuplicateField(key)}:${idx}`;
|
|
349
|
+
idx++;
|
|
350
|
+
}
|
|
351
|
+
obj[resultKey] = current[key];
|
|
352
|
+
}
|
|
353
|
+
return obj;
|
|
354
|
+
}, {});
|
|
355
|
+
};
|
|
356
|
+
const convertToParametersArray = (parameters = {}) => {
|
|
357
|
+
if (Array.isArray(parameters)) {
|
|
358
|
+
return parameters;
|
|
359
|
+
}
|
|
360
|
+
const dataArray = [];
|
|
361
|
+
for (const name in parameters) {
|
|
362
|
+
dataArray.push({
|
|
363
|
+
[name]: parameters[name]
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
return dataArray;
|
|
367
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export let ValidationError = /*#__PURE__*/function (ValidationError) {
|
|
2
|
+
ValidationError["Required"] = "required";
|
|
3
|
+
ValidationError["Invalid"] = "invalid";
|
|
4
|
+
return ValidationError;
|
|
5
|
+
}({});
|
|
6
|
+
export let FieldTypeError = /*#__PURE__*/function (FieldTypeError) {
|
|
7
|
+
FieldTypeError["isMultipleAndRadio"] = "isMultipleAndRadio";
|
|
8
|
+
return FieldTypeError;
|
|
9
|
+
}({});
|