native-document 1.0.165 → 1.0.166
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/components.d.ts +2 -0
- package/devtools/widget.js +1 -1
- package/dist/native-document.components.min.js +11074 -2735
- package/dist/native-document.dev.js +2269 -392
- package/dist/native-document.dev.js.map +1 -1
- package/dist/native-document.min.js +1 -1
- package/eslint.config.js +28 -33
- package/i18n.js +1 -1
- package/i18n.ts +2 -0
- package/index.js +3 -0
- package/package.json +3 -2
- package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
- package/src/components/$traits/has-draggable/HasDraggable.js +13 -0
- package/src/components/$traits/has-items/HasItems.d.ts +9 -0
- package/src/components/$traits/has-items/HasItems.js +6 -6
- package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
- package/src/components/$traits/has-position/HasFullPosition.js +44 -0
- package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
- package/src/components/$traits/has-position/HasPosition.js +23 -1
- package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
- package/src/components/$traits/has-resizable/HasResizable.js +9 -0
- package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
- package/src/components/$traits/has-validation/HasValidation.js +54 -7
- package/src/components/BaseComponent.d.ts +32 -0
- package/src/components/BaseComponent.js +65 -9
- package/src/components/accordion/Accordion.js +39 -14
- package/src/components/accordion/AccordionItem.js +45 -14
- package/src/components/accordion/index.js +2 -2
- package/src/components/accordion/types/Accordion.d.ts +47 -0
- package/src/components/accordion/types/AccordionItem.d.ts +48 -0
- package/src/components/alert/Alert.js +70 -38
- package/src/components/alert/index.js +2 -2
- package/src/components/alert/types/Alert.d.ts +62 -0
- package/src/components/avatar/Avatar.js +49 -12
- package/src/components/avatar/AvatarGroup.js +50 -2
- package/src/components/avatar/index.js +2 -2
- package/src/components/avatar/types/Avatar.d.ts +74 -0
- package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
- package/src/components/badge/Badge.js +125 -5
- package/src/components/badge/index.js +2 -2
- package/src/components/badge/types/Badge.d.ts +51 -0
- package/src/components/breadcrumb/BreadCrumb.js +61 -5
- package/src/components/breadcrumb/index.js +2 -2
- package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
- package/src/components/button/Button.js +164 -9
- package/src/components/button/index.js +1 -1
- package/src/components/button/types/Button.d.ts +62 -0
- package/src/components/card/Card.js +128 -10
- package/src/components/card/index.js +3 -3
- package/src/components/card/types/Card.d.ts +42 -0
- package/src/components/context-menu/ContextMenu.js +49 -5
- package/src/components/context-menu/ContextMenuGroup.js +15 -2
- package/src/components/context-menu/ContextMenuItem.js +14 -2
- package/src/components/context-menu/index.js +5 -5
- package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
- package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
- package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
- package/src/components/divider/Divider.js +120 -4
- package/src/components/divider/index.js +3 -3
- package/src/components/divider/types/Divider.d.ts +55 -0
- package/src/components/dropdown/Dropdown.js +239 -16
- package/src/components/dropdown/DropdownDivider.js +22 -2
- package/src/components/dropdown/DropdownGroup.js +44 -5
- package/src/components/dropdown/DropdownItem.js +76 -3
- package/src/components/dropdown/DropdownTrigger.js +49 -20
- package/src/components/dropdown/helpers.js +1 -1
- package/src/components/dropdown/index.js +6 -6
- package/src/components/dropdown/types/Dropdown.d.ts +88 -0
- package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
- package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
- package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
- package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
- package/src/components/form/FormControl.js +156 -13
- package/src/components/form/field/Field.js +172 -9
- package/src/components/form/field/FieldCollection.js +116 -12
- package/src/components/form/field/types/AutocompleteField.js +92 -2
- package/src/components/form/field/types/CheckboxField.js +43 -2
- package/src/components/form/field/types/CheckboxGroupField.js +83 -6
- package/src/components/form/field/types/ColorField.js +56 -3
- package/src/components/form/field/types/DateField.js +155 -4
- package/src/components/form/field/types/EmailField.js +54 -4
- package/src/components/form/field/types/FileField.js +140 -6
- package/src/components/form/field/types/HiddenField.js +27 -1
- package/src/components/form/field/types/ImageField.js +82 -3
- package/src/components/form/field/types/NumberField.js +97 -4
- package/src/components/form/field/types/PasswordField.js +103 -7
- package/src/components/form/field/types/RadioField.js +75 -4
- package/src/components/form/field/types/RangeField.js +67 -1
- package/src/components/form/field/types/SearchField.js +41 -2
- package/src/components/form/field/types/SelectField.js +133 -4
- package/src/components/form/field/types/StringField.js +91 -2
- package/src/components/form/field/types/TelField.js +55 -4
- package/src/components/form/field/types/TextAreaField.js +76 -2
- package/src/components/form/field/types/TimeField.js +120 -5
- package/src/components/form/field/types/UrlField.js +59 -4
- package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +83 -4
- package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +61 -3
- package/src/components/form/field/types/file-field-mode/FileItemPreview.js +79 -3
- package/src/components/form/field/types/file-field-mode/FileNativeMode.js +24 -2
- package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +64 -3
- package/src/components/form/field/types/file-field-mode/FileWallMode.js +56 -3
- package/src/components/form/index.js +28 -28
- package/src/components/form/types/Field.d.ts +73 -0
- package/src/components/form/types/FieldCollection.d.ts +53 -0
- package/src/components/form/types/FormControl.d.ts +64 -0
- package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
- package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
- package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
- package/src/components/form/types/fields/ColorField.d.ts +37 -0
- package/src/components/form/types/fields/DateField.d.ts +70 -0
- package/src/components/form/types/fields/EmailField.d.ts +35 -0
- package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
- package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
- package/src/components/form/types/fields/FileField.d.ts +56 -0
- package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
- package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
- package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
- package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
- package/src/components/form/types/fields/HiddenField.d.ts +26 -0
- package/src/components/form/types/fields/ImageField.d.ts +45 -0
- package/src/components/form/types/fields/NumberField.d.ts +48 -0
- package/src/components/form/types/fields/PasswordField.d.ts +46 -0
- package/src/components/form/types/fields/RadioField.d.ts +48 -0
- package/src/components/form/types/fields/RangeField.d.ts +44 -0
- package/src/components/form/types/fields/SearchField.d.ts +34 -0
- package/src/components/form/types/fields/SelectField.d.ts +71 -0
- package/src/components/form/types/fields/StringField.d.ts +48 -0
- package/src/components/form/types/fields/TelField.d.ts +37 -0
- package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
- package/src/components/form/types/fields/TimeField.d.ts +51 -0
- package/src/components/form/types/fields/UrlField.d.ts +35 -0
- package/src/components/form/validation/Validation.js +54 -54
- package/src/components/index.d.ts +160 -0
- package/src/components/list/List.js +99 -15
- package/src/components/list/ListGroup.js +58 -8
- package/src/components/list/ListItem.js +79 -18
- package/src/components/list/index.js +5 -5
- package/src/components/list/types/List.d.ts +43 -0
- package/src/components/list/types/ListGroup.d.ts +37 -0
- package/src/components/list/types/ListItem.d.ts +42 -0
- package/src/components/menu/HasMenuItem.js +55 -6
- package/src/components/menu/Menu.js +113 -22
- package/src/components/menu/MenuDivider.js +18 -2
- package/src/components/menu/MenuGroup.js +61 -6
- package/src/components/menu/MenuItem.js +95 -11
- package/src/components/menu/MenuLink.js +27 -2
- package/src/components/menu/index.js +6 -6
- package/src/components/menu/types/Menu.d.ts +60 -0
- package/src/components/menu/types/MenuDivider.d.ts +19 -0
- package/src/components/menu/types/MenuGroup.d.ts +44 -0
- package/src/components/menu/types/MenuItem.d.ts +46 -0
- package/src/components/menu/types/MenuLink.d.ts +16 -0
- package/src/components/modal/Modal.js +258 -17
- package/src/components/modal/index.js +3 -3
- package/src/components/modal/types/Modal.d.ts +94 -0
- package/src/components/pagination/Pagination.js +155 -7
- package/src/components/pagination/index.js +3 -3
- package/src/components/pagination/types/Pagination.d.ts +68 -0
- package/src/components/popover/Popover.js +198 -11
- package/src/components/popover/PopoverFooter.js +33 -9
- package/src/components/popover/PopoverHeader.js +33 -8
- package/src/components/popover/index.js +4 -4
- package/src/components/popover/types/Popover.d.ts +83 -0
- package/src/components/popover/types/PopoverFooter.d.ts +24 -0
- package/src/components/popover/types/PopoverHeader.d.ts +26 -0
- package/src/components/progress/Progress.js +182 -13
- package/src/components/progress/index.js +3 -3
- package/src/components/progress/types/Progress.d.ts +77 -0
- package/src/components/skeleton/Skeleton.js +117 -49
- package/src/components/skeleton/index.js +3 -3
- package/src/components/skeleton/types/Skeleton.d.ts +55 -0
- package/src/components/slider/Slider.js +207 -10
- package/src/components/slider/index.js +2 -2
- package/src/components/slider/types/Slider.d.ts +82 -0
- package/src/components/spacer/Spacer.js +11 -2
- package/src/components/spacer/index.js +2 -2
- package/src/components/spacer/types/Spacer.d.ts +19 -0
- package/src/components/spinner/Spinner.js +180 -9
- package/src/components/spinner/index.js +3 -3
- package/src/components/spinner/types/Spinner.d.ts +71 -0
- package/src/components/splitter/Splitter.js +76 -13
- package/src/components/splitter/SplitterGutter.js +67 -5
- package/src/components/splitter/SplitterPanel.js +69 -2
- package/src/components/splitter/index.js +5 -5
- package/src/components/splitter/types/Splitter.d.ts +38 -0
- package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
- package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
- package/src/components/stacks/AbsoluteStack.js +23 -3
- package/src/components/stacks/FixedStack.js +23 -3
- package/src/components/stacks/HStack.js +24 -3
- package/src/components/stacks/PositionStack.js +111 -3
- package/src/components/stacks/RelativeStack.js +23 -3
- package/src/components/stacks/Stack.js +73 -2
- package/src/components/stacks/VStack.js +24 -4
- package/src/components/stacks/index.js +7 -7
- package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
- package/src/components/stacks/types/FixedStack.d.ts +16 -0
- package/src/components/stacks/types/HStack.d.ts +16 -0
- package/src/components/stacks/types/PositionStack.d.ts +54 -0
- package/src/components/stacks/types/RelativeStack.d.ts +17 -0
- package/src/components/stacks/types/Stack.d.ts +39 -0
- package/src/components/stacks/types/VStack.d.ts +16 -0
- package/src/components/stepper/Stepper.js +152 -12
- package/src/components/stepper/StepperStep.js +104 -3
- package/src/components/stepper/index.js +4 -4
- package/src/components/stepper/types/Stepper.d.ts +68 -0
- package/src/components/stepper/types/StepperStep.d.ts +54 -0
- package/src/components/switch/Switch.js +143 -6
- package/src/components/switch/index.js +1 -1
- package/src/components/switch/types/Switch.d.ts +55 -0
- package/src/components/table/Column.js +105 -6
- package/src/components/table/ColumnGroup.js +48 -3
- package/src/components/table/DataTable.js +256 -19
- package/src/components/table/SimpleTable.js +58 -4
- package/src/components/table/index.js +2 -2
- package/src/components/table/types/Column.d.ts +49 -0
- package/src/components/table/types/ColumnGroup.d.ts +28 -0
- package/src/components/table/types/DataTable.d.ts +97 -0
- package/src/components/table/types/SimpleTable.d.ts +40 -0
- package/src/components/tabs/Tabs.js +192 -5
- package/src/components/tabs/index.js +3 -3
- package/src/components/tabs/types/Tabs.d.ts +78 -0
- package/src/components/toast/Toast.js +133 -5
- package/src/components/toast/index.js +3 -3
- package/src/components/toast/types/Toast.d.ts +57 -0
- package/src/components/toast/types/ToastError.d.ts +7 -0
- package/src/components/toast/types/ToastInfo.d.ts +7 -0
- package/src/components/toast/types/ToastSuccess.d.ts +7 -0
- package/src/components/toast/types/ToastWarning.d.ts +7 -0
- package/src/components/tooltip/Tooltip.js +157 -13
- package/src/components/tooltip/index.js +2 -2
- package/src/components/tooltip/prototypes.js +1 -1
- package/src/components/tooltip/types/Tooltip.d.ts +65 -0
- package/src/core/data/MemoryManager.js +2 -2
- package/src/core/data/Observable.js +15 -18
- package/src/core/data/ObservableArray.js +118 -46
- package/src/core/data/ObservableChecker.js +2 -2
- package/src/core/data/ObservableItem.js +135 -21
- package/src/core/data/ObservableObject.js +126 -35
- package/src/core/data/ObservableResource.js +113 -3
- package/src/core/data/Store.js +142 -26
- package/src/core/data/observable-helpers/observable.is-to.js +196 -1
- package/src/core/data/observable-helpers/observable.prototypes.js +33 -8
- package/src/core/elements/anchor/anchor-with-sentinel.js +23 -2
- package/src/core/elements/anchor/anchor.js +16 -7
- package/src/core/elements/anchor/one-child-anchor-overwriting.js +2 -2
- package/src/core/elements/content-formatter.js +1 -1
- package/src/core/elements/control/for-each-array.js +9 -9
- package/src/core/elements/control/for-each.js +14 -14
- package/src/core/elements/control/show-if.js +11 -11
- package/src/core/elements/control/show-when.js +5 -5
- package/src/core/elements/control/switch.js +14 -14
- package/src/core/elements/description-list.js +1 -1
- package/src/core/elements/form.js +2 -2
- package/src/core/elements/fragment.js +1 -1
- package/src/core/elements/html5-semantics.js +1 -1
- package/src/core/elements/img.js +3 -3
- package/src/core/elements/interactive.js +1 -1
- package/src/core/elements/list.js +1 -1
- package/src/core/elements/medias.js +1 -1
- package/src/core/elements/meta-data.js +1 -1
- package/src/core/elements/svg.js +1 -1
- package/src/core/elements/table.js +1 -1
- package/src/core/errors/ArgTypesError.js +1 -1
- package/src/core/utils/HasEventEmitter.js +36 -2
- package/src/core/utils/args-types.js +9 -9
- package/src/core/utils/cache.js +1 -1
- package/src/core/utils/callback-handler.js +29 -0
- package/src/core/utils/debug-manager.js +6 -6
- package/src/core/utils/events.js +139 -139
- package/src/core/utils/filters/date.js +84 -3
- package/src/core/utils/filters/standard.js +136 -11
- package/src/core/utils/filters/strings.js +34 -2
- package/src/core/utils/filters/utils.js +40 -4
- package/src/core/utils/formatters.js +4 -4
- package/src/core/utils/helpers.js +39 -7
- package/src/core/utils/localstorage.js +11 -11
- package/src/core/utils/memoize.js +56 -3
- package/src/core/utils/plugins-manager.js +3 -3
- package/src/core/utils/property-accumulator.js +6 -6
- package/src/core/utils/prototypes.js +26 -1
- package/src/core/utils/shortcut-manager.js +2 -2
- package/src/core/utils/validator.js +8 -8
- package/src/core/wrappers/AttributesWrapper.js +32 -22
- package/src/core/wrappers/DocumentObserver.js +3 -3
- package/src/core/wrappers/ElementCreator.js +5 -5
- package/src/core/wrappers/HtmlElementWrapper.js +38 -12
- package/src/core/wrappers/NDElement.js +328 -22
- package/src/core/wrappers/NdPrototype.js +60 -16
- package/src/core/wrappers/SingletonView.js +50 -2
- package/src/core/wrappers/SvgElementWrapper.js +1 -1
- package/src/core/wrappers/constants.js +35 -2
- package/src/core/wrappers/prototypes/attributes-extensions.js +7 -7
- package/src/core/wrappers/prototypes/nd-element-extensions.js +72 -6
- package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +42 -2
- package/src/core/wrappers/template-cloner/NodeCloner.js +53 -8
- package/src/core/wrappers/template-cloner/TemplateCloner.js +75 -6
- package/src/core/wrappers/template-cloner/attributes-hydrator.js +58 -2
- package/src/core/wrappers/template-cloner/utils.js +42 -6
- package/src/fetch/NativeFetch.js +3 -3
- package/src/i18n/bin/scan.js +6 -6
- package/src/i18n/index.d.ts +2 -0
- package/src/i18n/service/I18nService.d.ts +27 -0
- package/src/i18n/service/I18nService.js +5 -5
- package/src/i18n/service/functions.d.ts +22 -0
- package/src/i18n/service/functions.js +2 -2
- package/src/router/Route.js +3 -3
- package/src/router/RouteGroupHelper.js +2 -2
- package/src/router/Router.js +15 -15
- package/src/router/RouterComponent.js +33 -7
- package/src/router/link.js +4 -4
- package/src/router/modes/HashRouter.js +2 -2
- package/src/router/modes/HistoryRouter.js +2 -2
- package/src/router/modes/MemoryRouter.js +1 -1
- package/src/ui/components/accordion/AccordionItemRender.js +3 -3
- package/src/ui/components/accordion/AccordionRender.js +1 -1
- package/src/ui/components/alert/AlertRender.js +10 -10
- package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +1 -1
- package/src/ui/components/avatar/avatar/AvatarRender.js +1 -1
- package/src/ui/components/breadcrumb/BreadcrumbRender.js +2 -2
- package/src/ui/components/button/ButtonRender.js +1 -1
- package/src/ui/components/contextmenu/ContextmenuRender.js +5 -5
- package/src/ui/components/dropdown/DropdownRender.js +8 -8
- package/src/ui/components/dropdown/group/DropdownGroupRender.js +2 -2
- package/src/ui/components/dropdown/item/DropdownItemRender.js +1 -1
- package/src/ui/components/form/FieldCollectionRender.js +2 -2
- package/src/ui/components/form/FormControlRender.js +5 -5
- package/src/ui/components/form/fields/AutocompleteFieldRender.js +3 -3
- package/src/ui/components/form/fields/CheckboxFieldRender.js +1 -1
- package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +1 -1
- package/src/ui/components/form/fields/DateFieldRender.js +7 -7
- package/src/ui/components/form/fields/EmailFieldRender.js +1 -1
- package/src/ui/components/form/fields/FieldRender.js +4 -4
- package/src/ui/components/form/fields/FileFieldRender.js +1 -1
- package/src/ui/components/form/fields/PasswordFieldRender.js +2 -2
- package/src/ui/components/form/fields/RadioFieldRender.js +1 -1
- package/src/ui/components/form/fields/RangeFieldRender.js +1 -1
- package/src/ui/components/form/fields/SelectFieldRender.js +2 -2
- package/src/ui/components/form/fields/SliderFieldRender.js +6 -6
- package/src/ui/components/form/fields/StringFieldRender.js +1 -1
- package/src/ui/components/form/fields/TelFieldRender.js +1 -1
- package/src/ui/components/form/fields/TextAreaFieldRender.js +1 -1
- package/src/ui/components/form/fields/TimeFieldRender.js +3 -3
- package/src/ui/components/form/fields/UrlFieldRender.js +1 -1
- package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +1 -1
- package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +2 -2
- package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +2 -2
- package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +1 -1
- package/src/ui/components/form/helpers.js +8 -8
- package/src/ui/components/form/index.js +27 -27
- package/src/ui/components/menu/MenuDividerRender.js +1 -1
- package/src/ui/components/menu/MenuGroupRender.js +3 -3
- package/src/ui/components/menu/MenuItemRender.js +2 -2
- package/src/ui/components/menu/MenuLinkRender.js +3 -3
- package/src/ui/components/menu/helpers.js +4 -4
- package/src/ui/components/modal/ModalRender.js +4 -4
- package/src/ui/components/pagination/PaginationRender.js +9 -9
- package/src/ui/components/popover/PopoverRender.js +7 -7
- package/src/ui/components/progress/ProgressRender.js +12 -12
- package/src/ui/components/skeleton/SkeletonRender.js +56 -0
- package/src/ui/components/splitter/SplitterGutterRender.js +1 -1
- package/src/ui/components/splitter/SplitterPanelRender.js +2 -2
- package/src/ui/components/stacks/PositionStackRender.js +1 -1
- package/src/ui/components/stacks/StackRender.js +1 -1
- package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +1 -1
- package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +1 -1
- package/src/ui/components/stacks/h-stack/HStackRender.js +1 -1
- package/src/ui/components/stacks/index.js +5 -5
- package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +1 -1
- package/src/ui/components/stacks/v-stack/VStackRender.js +1 -1
- package/src/ui/components/stepper/StepperRender.js +2 -2
- package/src/ui/components/stepper/StepperStepRender.js +4 -4
- package/src/ui/components/switch/SwitchRender.js +4 -4
- package/src/ui/components/table/data-table/DataTableRender.js +5 -5
- package/src/ui/components/table/data-table/bulk-actions.js +7 -7
- package/src/ui/components/table/data-table/pagination.js +6 -6
- package/src/ui/components/table/data-table/tables.js +25 -25
- package/src/ui/components/table/data-table/toolbar.js +3 -3
- package/src/ui/components/table/simple-table/SimpleTableRender.js +8 -8
- package/src/ui/components/tabs/TabsRender.js +11 -11
- package/src/ui/components/toast/ToastRender.js +3 -3
- package/src/ui/components/tooltip/TooltipRender.js +1 -1
- package/src/ui/index.js +36 -36
- package/types/elements.d.ts +163 -1037
- package/types/forms.d.ts +16 -20
- package/types/globals.d.ts +543 -0
- package/types/images.d.ts +2 -2
- package/types/observable-resource.d.ts +3 -0
- package/types/property-accumulator.d.ts +4 -4
- package/types/store.d.ts +26 -2
- package/types/validator.ts +3 -3
- package/ui.js +1 -0
- package/src/components/form/field/DefaultRender.js +0 -77
- package/src/components/form/field/FieldFactory.js +0 -107
- package/src/components/skeleton/SkeletonCard.js +0 -0
- package/src/components/skeleton/SkeletonList.js +0 -0
- package/src/components/skeleton/SkeletonParagraph.js +0 -0
- package/src/components/skeleton/SkeletonTable.js +0 -0
|
@@ -1,16 +1,24 @@
|
|
|
1
|
-
import DebugManager from
|
|
2
|
-
import MemoryManager from
|
|
3
|
-
import NativeDocumentError from
|
|
4
|
-
import PluginsManager from
|
|
5
|
-
import Validator from
|
|
6
|
-
import {deepClone} from
|
|
7
|
-
import {$getFromStorage, $saveToStorage} from
|
|
1
|
+
import DebugManager from '../../core/utils/debug-manager';
|
|
2
|
+
import MemoryManager from './MemoryManager';
|
|
3
|
+
import NativeDocumentError from '../../core/errors/NativeDocumentError';
|
|
4
|
+
import PluginsManager from '../../core/utils/plugins-manager';
|
|
5
|
+
import Validator from '../../core/utils/validator';
|
|
6
|
+
import {deepClone} from '../utils/helpers';
|
|
7
|
+
import {$getFromStorage, $saveToStorage} from '../utils/localstorage';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
+
* Reactive primitive value container.
|
|
11
|
+
* Notifies subscribers whenever its value changes.
|
|
12
|
+
* The core building block of NativeDocument's reactivity system.
|
|
10
13
|
*
|
|
11
|
-
* @
|
|
12
|
-
* @param {
|
|
13
|
-
* @
|
|
14
|
+
* @constructor
|
|
15
|
+
* @param {*} value - Initial value of the observable
|
|
16
|
+
* @param {{ propagation?: boolean, reset?: boolean, deep?: boolean } | null} [configs=null] - Optional configuration
|
|
17
|
+
* @param {boolean} [configs.reset] - If true, stores the initial value for later reset via .reset()
|
|
18
|
+
* @param {boolean} [configs.propagation] - Controls whether changes propagate to parent observables
|
|
19
|
+
* @example
|
|
20
|
+
* const count = new ObservableItem(0);
|
|
21
|
+
* const name = new ObservableItem('John', { reset: true });
|
|
14
22
|
*/
|
|
15
23
|
export default function ObservableItem(value, configs = null) {
|
|
16
24
|
value = Validator.isObservable(value) ? value.val() : value;
|
|
@@ -71,15 +79,34 @@ ObservableItem.prototype.intercept = function(callback) {
|
|
|
71
79
|
return this;
|
|
72
80
|
};
|
|
73
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Intercepts mutations of the array observable before they are applied.
|
|
84
|
+
* Allows transforming or cancelling array operations.
|
|
85
|
+
*
|
|
86
|
+
* @param {(operation: { action: string, args: any[] }) => void} callback - Called before each mutation with the operation details
|
|
87
|
+
* @returns {ObservableItem} this
|
|
88
|
+
*/
|
|
74
89
|
ObservableItem.prototype.interceptMutations = function(callback) {
|
|
75
90
|
this.$mutationInterceptor = callback;
|
|
76
91
|
return this;
|
|
77
92
|
};
|
|
78
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Calls the first registered subscriber directly (internal optimisation).
|
|
96
|
+
*
|
|
97
|
+
* @internal
|
|
98
|
+
* @param {{ action?: string, args?: any[], result?: any }} [operations] - Mutation metadata
|
|
99
|
+
*/
|
|
79
100
|
ObservableItem.prototype.triggerFirstListener = function(operations) {
|
|
80
101
|
this.$firstListener(this.$currentValue, this.$previousValue, operations);
|
|
81
102
|
};
|
|
82
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Calls all registered subscribers (internal).
|
|
106
|
+
*
|
|
107
|
+
* @internal
|
|
108
|
+
* @param {{ action?: string, args?: any[], result?: any }} [operations] - Mutation metadata
|
|
109
|
+
*/
|
|
83
110
|
ObservableItem.prototype.triggerListeners = function(operations) {
|
|
84
111
|
const $listeners = this.$listeners;
|
|
85
112
|
const $previousValue = this.$previousValue;
|
|
@@ -90,6 +117,12 @@ ObservableItem.prototype.triggerListeners = function(operations) {
|
|
|
90
117
|
}
|
|
91
118
|
};
|
|
92
119
|
|
|
120
|
+
/**
|
|
121
|
+
* Triggers callbacks registered via .on() for the current and previous values (internal).
|
|
122
|
+
*
|
|
123
|
+
* @internal
|
|
124
|
+
* @param {{ action?: string, args?: any[], result?: any }} [operations] - Mutation metadata
|
|
125
|
+
*/
|
|
93
126
|
ObservableItem.prototype.triggerWatchers = function(operations) {
|
|
94
127
|
const $watchers = this.$watchers;
|
|
95
128
|
const $previousValue = this.$previousValue;
|
|
@@ -105,28 +138,47 @@ ObservableItem.prototype.triggerWatchers = function(operations) {
|
|
|
105
138
|
}
|
|
106
139
|
};
|
|
107
140
|
|
|
141
|
+
/**
|
|
142
|
+
* Triggers both watchers and all subscribers (internal).
|
|
143
|
+
*
|
|
144
|
+
* @internal
|
|
145
|
+
* @param {{ action?: string, args?: any[], result?: any }} [operations] - Mutation metadata
|
|
146
|
+
*/
|
|
108
147
|
ObservableItem.prototype.triggerAll = function(operations) {
|
|
109
148
|
this.triggerWatchers(operations);
|
|
110
149
|
this.triggerListeners(operations);
|
|
111
150
|
};
|
|
112
151
|
|
|
152
|
+
/**
|
|
153
|
+
* Triggers both watchers and the first subscriber only (internal optimization).
|
|
154
|
+
*
|
|
155
|
+
* @internal
|
|
156
|
+
* @param {{ action?: string, args?: any[], result?: any }} [operations] - Mutation metadata
|
|
157
|
+
*/
|
|
113
158
|
ObservableItem.prototype.triggerWatchersAndFirstListener = function(operations) {
|
|
114
159
|
this.triggerWatchers(operations);
|
|
115
160
|
this.triggerFirstListener(operations);
|
|
116
161
|
};
|
|
117
162
|
|
|
163
|
+
/**
|
|
164
|
+
* Selects and assigns the optimal trigger strategy based on the current
|
|
165
|
+
* combination of listeners and watchers (internal).
|
|
166
|
+
* Called automatically after every subscribe / unsubscribe / on / off.
|
|
167
|
+
*
|
|
168
|
+
* @internal
|
|
169
|
+
*/
|
|
118
170
|
ObservableItem.prototype.assocTrigger = function() {
|
|
119
171
|
this.$firstListener = null;
|
|
120
172
|
if(this.$watchers?.size && this.$listeners?.length) {
|
|
121
173
|
this.$firstListener = this.$listeners[0];
|
|
122
|
-
this.trigger = this.$firstListener.length === 0 ? this.$firstListener : this.triggerFirstListener
|
|
174
|
+
this.trigger = this.$firstListener.length === 0 ? this.$firstListener : this.triggerFirstListener;
|
|
123
175
|
this.trigger = (this.$listeners.length === 1) ? this.triggerWatchersAndFirstListener : this.triggerAll;
|
|
124
176
|
return;
|
|
125
177
|
}
|
|
126
178
|
if(this.$listeners?.length) {
|
|
127
179
|
if(this.$listeners.length === 1) {
|
|
128
180
|
this.$firstListener = this.$listeners[0];
|
|
129
|
-
this.trigger = this.$firstListener.length === 0 ? this.$firstListener : this.triggerFirstListener
|
|
181
|
+
this.trigger = this.$firstListener.length === 0 ? this.$firstListener : this.triggerFirstListener;
|
|
130
182
|
}
|
|
131
183
|
else {
|
|
132
184
|
this.trigger = this.triggerListeners;
|
|
@@ -179,16 +231,30 @@ ObservableItem.prototype.$setWithInterceptor = function(data) {
|
|
|
179
231
|
* @param {*} data
|
|
180
232
|
*/
|
|
181
233
|
ObservableItem.prototype.$basicSet = function(data) {
|
|
182
|
-
|
|
234
|
+
const newValue = (typeof data === 'function') ? data(this.$currentValue) : data;
|
|
183
235
|
this.$updateWithNewValue(newValue);
|
|
184
236
|
};
|
|
185
237
|
|
|
186
238
|
ObservableItem.prototype.set = ObservableItem.prototype.$basicSet;
|
|
187
239
|
|
|
240
|
+
/**
|
|
241
|
+
* Returns the current value of the observable.
|
|
242
|
+
*
|
|
243
|
+
* @returns {*} The current value
|
|
244
|
+
* @example
|
|
245
|
+
* const count = Observable(42);
|
|
246
|
+
* count.val(); // 42
|
|
247
|
+
*/
|
|
188
248
|
ObservableItem.prototype.val = function() {
|
|
189
249
|
return this.$currentValue;
|
|
190
250
|
};
|
|
191
251
|
|
|
252
|
+
/**
|
|
253
|
+
* Disconnects all listeners and watchers and nullifies internal state.
|
|
254
|
+
* Does not trigger cleanup callbacks. Prefer .cleanup() for full disposal.
|
|
255
|
+
*
|
|
256
|
+
* @returns {void}
|
|
257
|
+
*/
|
|
192
258
|
ObservableItem.prototype.disconnectAll = function() {
|
|
193
259
|
this.$previousValue = null;
|
|
194
260
|
this.$currentValue = null;
|
|
@@ -212,6 +278,16 @@ ObservableItem.prototype.onCleanup = function(callback) {
|
|
|
212
278
|
this.$cleanupListeners.push(callback);
|
|
213
279
|
};
|
|
214
280
|
|
|
281
|
+
/**
|
|
282
|
+
* Disposes the observable: runs cleanup callbacks, unregisters from MemoryManager,
|
|
283
|
+
* disconnects all listeners and removes the $value property.
|
|
284
|
+
*
|
|
285
|
+
* @returns {void}
|
|
286
|
+
* @example
|
|
287
|
+
* const obs = Observable(0);
|
|
288
|
+
* obs.onCleanup(() => console.log('disposed'));
|
|
289
|
+
* obs.cleanup(); // logs 'disposed', frees memory
|
|
290
|
+
*/
|
|
215
291
|
ObservableItem.prototype.cleanup = function() {
|
|
216
292
|
if (this.$cleanupListeners) {
|
|
217
293
|
for (let i = 0; i < this.$cleanupListeners.length; i++) {
|
|
@@ -227,10 +303,16 @@ ObservableItem.prototype.cleanup = function() {
|
|
|
227
303
|
delete this.$value;
|
|
228
304
|
};
|
|
229
305
|
|
|
306
|
+
|
|
230
307
|
/**
|
|
308
|
+
* Subscribes to value changes. The callback is called every time the value changes.
|
|
309
|
+
* Returns nothing — use .unsubscribe(callback) to remove the listener.
|
|
231
310
|
*
|
|
232
|
-
* @param {
|
|
233
|
-
* @
|
|
311
|
+
* @param {(current: *, previous: *, operations?: { action?: string }) => void} callback - Called on each value change
|
|
312
|
+
* @example
|
|
313
|
+
* const count = Observable(0);
|
|
314
|
+
* count.subscribe((val) => console.log('New value:', val));
|
|
315
|
+
* count.$value++; // logs 'New value: 1'
|
|
234
316
|
*/
|
|
235
317
|
ObservableItem.prototype.subscribe = function(callback) {
|
|
236
318
|
if(process.env.NODE_ENV === 'development') {
|
|
@@ -280,7 +362,7 @@ ObservableItem.prototype.on = function(value, callback) {
|
|
|
280
362
|
for(let i = 0, length = watchValueList.length; i < length; i++) {
|
|
281
363
|
watchValueList[i](value);
|
|
282
364
|
}
|
|
283
|
-
}
|
|
365
|
+
};
|
|
284
366
|
callback.list = watchValueList;
|
|
285
367
|
this.$watchers.set(value, callback);
|
|
286
368
|
} else {
|
|
@@ -346,9 +428,16 @@ ObservableItem.prototype.once = function(predicate, callback) {
|
|
|
346
428
|
this.subscribe(handler);
|
|
347
429
|
};
|
|
348
430
|
|
|
431
|
+
|
|
349
432
|
/**
|
|
350
|
-
*
|
|
351
|
-
*
|
|
433
|
+
* Removes a previously registered subscriber.
|
|
434
|
+
*
|
|
435
|
+
* @param {Function} callback - The exact function reference passed to .subscribe()
|
|
436
|
+
* @returns {void}
|
|
437
|
+
* @example
|
|
438
|
+
* const handler = (val) => console.log(val);
|
|
439
|
+
* count.subscribe(handler);
|
|
440
|
+
* count.unsubscribe(handler);
|
|
352
441
|
*/
|
|
353
442
|
ObservableItem.prototype.unsubscribe = function(callback) {
|
|
354
443
|
if(!this.$listeners) return;
|
|
@@ -445,7 +534,7 @@ ObservableItem.prototype.reset = function() {
|
|
|
445
534
|
observable.reset();
|
|
446
535
|
})
|
|
447
536
|
: this.$initialValue;
|
|
448
|
-
this.set(resetValue)
|
|
537
|
+
this.set(resetValue);
|
|
449
538
|
};
|
|
450
539
|
|
|
451
540
|
/**
|
|
@@ -467,8 +556,22 @@ ObservableItem.prototype.valueOf = function() {
|
|
|
467
556
|
return this.$currentValue;
|
|
468
557
|
};
|
|
469
558
|
|
|
470
|
-
|
|
471
|
-
|
|
559
|
+
/**
|
|
560
|
+
* Syncs this observable's value to localStorage and restores it on load.
|
|
561
|
+
* Optionally transforms values on get and set.
|
|
562
|
+
*
|
|
563
|
+
* @param {string} key - localStorage key
|
|
564
|
+
* @param {{ get?: (stored: any) => T, set?: (value: T) => any }} [options={}] - Transform options
|
|
565
|
+
* @param {Function} [options.get] - Transform the stored value before applying it
|
|
566
|
+
* @param {Function} [options.set] - Transform the value before saving it
|
|
567
|
+
* @returns {ObservableItem} this — chainable
|
|
568
|
+
* @example
|
|
569
|
+
* const theme = Observable('light').persist('app-theme');
|
|
570
|
+
* const count = Observable(0).persist('count', {
|
|
571
|
+
* get: (v) => parseInt(v),
|
|
572
|
+
* set: (v) => String(v),
|
|
573
|
+
* });
|
|
574
|
+
*/
|
|
472
575
|
ObservableItem.prototype.persist = function(key, options = {}) {
|
|
473
576
|
let value = $getFromStorage(key, this.$currentValue);
|
|
474
577
|
if(options.get) {
|
|
@@ -482,6 +585,17 @@ ObservableItem.prototype.persist = function(key, options = {}) {
|
|
|
482
585
|
return this;
|
|
483
586
|
};
|
|
484
587
|
|
|
588
|
+
/**
|
|
589
|
+
* Creates a new ObservableItem with a deep clone of the current value.
|
|
590
|
+
* For objects implementing a .clone() method, delegates to that method.
|
|
591
|
+
*
|
|
592
|
+
* @returns {ObservableItem} A new independent observable with the cloned value
|
|
593
|
+
* @example
|
|
594
|
+
* const original = Observable({ x: 1 });
|
|
595
|
+
* const copy = original.clone();
|
|
596
|
+
* copy.set({ x: 99 });
|
|
597
|
+
* original.val(); // { x: 1 } — untouched
|
|
598
|
+
*/
|
|
485
599
|
ObservableItem.prototype.clone = function() {
|
|
486
600
|
let clonedValue = this.$currentValue;
|
|
487
601
|
|
|
@@ -1,24 +1,49 @@
|
|
|
1
|
-
import ObservableItem from
|
|
2
|
-
import Validator from
|
|
3
|
-
import {nextTick} from
|
|
4
|
-
import ObservableArray from
|
|
1
|
+
import ObservableItem from './ObservableItem';
|
|
2
|
+
import Validator from '../utils/validator';
|
|
3
|
+
import {nextTick} from '../utils/helpers';
|
|
4
|
+
import ObservableArray from './ObservableArray';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Reactive object container extending ObservableItem.
|
|
8
|
+
* Each property of the target object becomes an individual ObservableItem (or ObservableArray/ObservableObject for nested structures).
|
|
9
|
+
* Use Observable.object() or Observable.init() rather than instantiating directly.
|
|
10
|
+
*
|
|
11
|
+
* @constructor
|
|
12
|
+
* @param {Record<string, *>} target - Plain object to make reactive
|
|
13
|
+
* @param {{ deep?: boolean, reset?: boolean, propagation?: boolean }|null} [configs] - Configuration
|
|
14
|
+
* @param {boolean} [configs.deep] - If false, nested objects and arrays are not wrapped recursively (default: true)
|
|
15
|
+
* @example
|
|
16
|
+
* const user = Observable.object({ name: 'John', age: 25 });
|
|
17
|
+
* user.name.$value = 'Jane'; // triggers reactivity on name only
|
|
18
|
+
*/
|
|
6
19
|
export const ObservableObject = function(target, configs) {
|
|
7
20
|
ObservableItem.call(this, target);
|
|
8
21
|
this.$observables = {};
|
|
9
22
|
this.configs = configs;
|
|
10
23
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
24
|
+
for(const key in target) {
|
|
25
|
+
if(!Object.hasOwn(this, key)) {
|
|
26
|
+
Object.defineProperty(this, key, {
|
|
27
|
+
get: () => this.$observables[key],
|
|
28
|
+
set: (value) => {
|
|
29
|
+
this.$observables[key].set(value);
|
|
30
|
+
},
|
|
31
|
+
configurable: true,
|
|
32
|
+
enumerable: true,
|
|
18
33
|
});
|
|
19
34
|
}
|
|
20
35
|
}
|
|
21
36
|
|
|
37
|
+
this.$load(target);
|
|
38
|
+
|
|
39
|
+
Object.defineProperty(this, '$currentValue', {
|
|
40
|
+
get: function() {
|
|
41
|
+
return this.val();
|
|
42
|
+
},
|
|
43
|
+
set(value) {
|
|
44
|
+
this.set(value);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
22
47
|
};
|
|
23
48
|
|
|
24
49
|
ObservableObject.prototype = Object.create(ObservableItem.prototype);
|
|
@@ -29,12 +54,19 @@ Object.defineProperty(ObservableObject, '$value', {
|
|
|
29
54
|
},
|
|
30
55
|
set(value) {
|
|
31
56
|
this.set(value);
|
|
32
|
-
}
|
|
33
|
-
})
|
|
57
|
+
},
|
|
58
|
+
});
|
|
34
59
|
|
|
35
60
|
ObservableObject.prototype.__$isObservableObject = true;
|
|
36
61
|
ObservableObject.prototype.__isProxy__ = true;
|
|
37
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Initialises (or reinitialize) the internal observables map from a plain object.
|
|
65
|
+
* Called automatically in the constructor.
|
|
66
|
+
*
|
|
67
|
+
* @internal
|
|
68
|
+
* @param {Record<string, *>} initialValue - Object whose properties are turned into observables
|
|
69
|
+
*/
|
|
38
70
|
ObservableObject.prototype.$load = function(initialValue) {
|
|
39
71
|
const configs = this.configs;
|
|
40
72
|
for(const key in initialValue) {
|
|
@@ -56,34 +88,39 @@ ObservableObject.prototype.$load = function(initialValue) {
|
|
|
56
88
|
this.$observables[key] = new ObservableArray(itemValue, configs);
|
|
57
89
|
continue;
|
|
58
90
|
}
|
|
59
|
-
if(
|
|
91
|
+
if(itemValue?.__$Observable) {
|
|
60
92
|
this.$observables[key] = itemValue;
|
|
61
93
|
continue;
|
|
62
94
|
}
|
|
63
|
-
this.$observables[key] = (
|
|
95
|
+
this.$observables[key] = (Validator.isJson(itemValue)) ? new ObservableObject(itemValue, configs) : new ObservableItem(itemValue, configs);
|
|
64
96
|
}
|
|
65
97
|
};
|
|
66
98
|
|
|
99
|
+
/**
|
|
100
|
+
* Returns a plain snapshot of all observable values.
|
|
101
|
+
* Unwraps nested ObservableItem, ObservableArray, and ObservableObject recursively.
|
|
102
|
+
* Alias: $val()
|
|
103
|
+
*
|
|
104
|
+
* @returns {Record<string, *>} Plain object with current values
|
|
105
|
+
* @example
|
|
106
|
+
* const user = Observable.object({ name: 'John', age: 25 });
|
|
107
|
+
* user.val(); // { name: 'John', age: 25 }
|
|
108
|
+
*/
|
|
67
109
|
ObservableObject.prototype.val = function() {
|
|
68
110
|
const result = {};
|
|
69
111
|
for(const key in this.$observables) {
|
|
70
112
|
const dataItem = this.$observables[key];
|
|
71
|
-
if(
|
|
113
|
+
if(dataItem?.__$Observable) {
|
|
72
114
|
let value = dataItem.val();
|
|
73
115
|
if(Array.isArray(value)) {
|
|
74
116
|
value = value.map(item => {
|
|
75
|
-
if(
|
|
117
|
+
if(item.__$Observable) {
|
|
76
118
|
return item.val();
|
|
77
119
|
}
|
|
78
|
-
if(Validator.isProxy(item)) {
|
|
79
|
-
return item.$value;
|
|
80
|
-
}
|
|
81
120
|
return item;
|
|
82
121
|
});
|
|
83
122
|
}
|
|
84
123
|
result[key] = value;
|
|
85
|
-
} else if(Validator.isProxy(dataItem)) {
|
|
86
|
-
result[key] = dataItem.$value;
|
|
87
124
|
} else {
|
|
88
125
|
result[key] = dataItem;
|
|
89
126
|
}
|
|
@@ -92,20 +129,37 @@ ObservableObject.prototype.val = function() {
|
|
|
92
129
|
};
|
|
93
130
|
ObservableObject.prototype.$val = ObservableObject.prototype.val;
|
|
94
131
|
|
|
132
|
+
/**
|
|
133
|
+
* Returns the current value of a single property, unwrapped from its observable.
|
|
134
|
+
* Alias: $get(property)
|
|
135
|
+
*
|
|
136
|
+
* @param {string} property - Property name
|
|
137
|
+
* @returns {*} The current value of that property
|
|
138
|
+
* @example
|
|
139
|
+
* const user = Observable.object({ name: 'John' });
|
|
140
|
+
* user.get('name'); // 'John'
|
|
141
|
+
*/
|
|
95
142
|
ObservableObject.prototype.get = function(property) {
|
|
96
143
|
const item = this.$observables[property];
|
|
97
|
-
if(
|
|
144
|
+
if(item?.__$Observable) {
|
|
98
145
|
return item.val();
|
|
99
146
|
}
|
|
100
|
-
if(Validator.isProxy(item)) {
|
|
101
|
-
return item.$value;
|
|
102
|
-
}
|
|
103
147
|
return item;
|
|
104
148
|
};
|
|
105
149
|
ObservableObject.prototype.$get = ObservableObject.prototype.get;
|
|
106
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Updates one or more properties with new values.
|
|
153
|
+
* Supports partial updates — only provided keys are changed.
|
|
154
|
+
* Aliases: $set(newData), $updateWith(newData), update(newData)
|
|
155
|
+
*
|
|
156
|
+
* @param {Partial<Record<string, *>>} newData - Object with properties to update
|
|
157
|
+
* @example
|
|
158
|
+
* const user = Observable.object({ name: 'John', age: 25 });
|
|
159
|
+
* user.set({ name: 'Jane' }); // Only name changes, age stays 25
|
|
160
|
+
*/
|
|
107
161
|
ObservableObject.prototype.set = function(newData) {
|
|
108
|
-
const data =
|
|
162
|
+
const data = newData?.__$Observable ? newData.$value : newData;
|
|
109
163
|
const configs = this.configs;
|
|
110
164
|
|
|
111
165
|
for(const key in data) {
|
|
@@ -113,15 +167,19 @@ ObservableObject.prototype.set = function(newData) {
|
|
|
113
167
|
const newValueOrigin = newData[key];
|
|
114
168
|
const newValue = data[key];
|
|
115
169
|
|
|
116
|
-
if(
|
|
170
|
+
if(targetItem?.__$Observable) {
|
|
171
|
+
if(targetItem.__$isObservableObject) {
|
|
172
|
+
targetItem.update(newValue);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
117
175
|
if(!Validator.isArray(newValue)) {
|
|
118
176
|
targetItem.set(newValue);
|
|
119
177
|
continue;
|
|
120
178
|
}
|
|
121
179
|
const firstElementFromOriginalValue = newValueOrigin.at(0);
|
|
122
|
-
if(
|
|
180
|
+
if(firstElementFromOriginalValue?.__$Observable) {
|
|
123
181
|
const newValues = newValue.map(item => {
|
|
124
|
-
if(
|
|
182
|
+
if(firstElementFromOriginalValue.__$isObservableObject) {
|
|
125
183
|
return new ObservableObject(item, configs);
|
|
126
184
|
}
|
|
127
185
|
return ObservableItem(item, configs);
|
|
@@ -132,35 +190,68 @@ ObservableObject.prototype.set = function(newData) {
|
|
|
132
190
|
targetItem.set([...newValue]);
|
|
133
191
|
continue;
|
|
134
192
|
}
|
|
135
|
-
if(Validator.isProxy(targetItem)) {
|
|
136
|
-
targetItem.update(newValue);
|
|
137
|
-
continue;
|
|
138
|
-
}
|
|
139
193
|
this[key] = newValue;
|
|
140
194
|
}
|
|
141
195
|
};
|
|
142
196
|
ObservableObject.prototype.$set = ObservableObject.prototype.set;
|
|
143
197
|
ObservableObject.prototype.$updateWith = ObservableObject.prototype.set;
|
|
144
198
|
|
|
199
|
+
/**
|
|
200
|
+
* Returns an array of all internal observable instances (one per property).
|
|
201
|
+
* Alias: $observables()
|
|
202
|
+
*
|
|
203
|
+
* @returns {ObservableItem[]} Array of observable instances
|
|
204
|
+
*/
|
|
145
205
|
ObservableObject.prototype.observables = function() {
|
|
146
206
|
return Object.values(this.$observables);
|
|
147
207
|
};
|
|
148
208
|
ObservableObject.prototype.$observables = ObservableObject.prototype.observables;
|
|
149
209
|
|
|
210
|
+
/**
|
|
211
|
+
* Returns all property names of the observable object.
|
|
212
|
+
* Alias: $keys()
|
|
213
|
+
*
|
|
214
|
+
* @returns {string[]} Array of property names
|
|
215
|
+
*/
|
|
150
216
|
ObservableObject.prototype.keys = function() {
|
|
151
217
|
return Object.keys(this.$observables);
|
|
152
218
|
};
|
|
153
219
|
ObservableObject.prototype.$keys = ObservableObject.prototype.keys;
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Creates a new ObservableObject with a snapshot of the current values.
|
|
223
|
+
* Changes to the clone do not affect the original.
|
|
224
|
+
* Alias: $clone()
|
|
225
|
+
*
|
|
226
|
+
* @returns {ObservableObject} New independent ObservableObject with the same structure and values
|
|
227
|
+
*/
|
|
154
228
|
ObservableObject.prototype.clone = function() {
|
|
155
229
|
return new ObservableObject(this.val(), this.configs);
|
|
156
230
|
};
|
|
157
231
|
ObservableObject.prototype.$clone = ObservableObject.prototype.clone;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Resets all properties to their initial values by calling .reset() on each child observable.
|
|
235
|
+
* Only works if observables were created with { reset: true }.
|
|
236
|
+
*/
|
|
158
237
|
ObservableObject.prototype.reset = function() {
|
|
159
238
|
for(const key in this.$observables) {
|
|
160
239
|
this.$observables[key].reset();
|
|
161
240
|
}
|
|
162
241
|
};
|
|
163
242
|
ObservableObject.prototype.originalSubscribe = ObservableObject.prototype.subscribe;
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Subscribes to changes across all nested observables.
|
|
246
|
+
* The callback is called whenever any property (or nested value) changes.
|
|
247
|
+
* Internally uses debouncing (nextTick) to batch multiple simultaneous changes.
|
|
248
|
+
*
|
|
249
|
+
* @param {(value: Record<string, *>) => void} callback - Called on any nested change
|
|
250
|
+
* @example
|
|
251
|
+
* const user = Observable.object({ name: 'John', age: 25 });
|
|
252
|
+
* user.subscribe(() => console.log('user changed:', user.val()));
|
|
253
|
+
* user.name.$value = 'Jane'; // logs 'user changed: { name: "Jane", age: 25 }'
|
|
254
|
+
*/
|
|
164
255
|
ObservableObject.prototype.subscribe = function(callback) {
|
|
165
256
|
const observables = this.observables();
|
|
166
257
|
const updatedValue = nextTick(() => this.trigger());
|
|
@@ -171,7 +262,7 @@ ObservableObject.prototype.subscribe = function(callback) {
|
|
|
171
262
|
const observable = observables[i];
|
|
172
263
|
if (observable.__$isObservableArray) {
|
|
173
264
|
observable.deepSubscribe(updatedValue);
|
|
174
|
-
continue
|
|
265
|
+
continue;
|
|
175
266
|
}
|
|
176
267
|
observable.subscribe(updatedValue);
|
|
177
268
|
}
|