native-document 1.0.138 → 1.0.140

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/components.js +1 -1
  2. package/devtools/ComponentRegistry.js +3 -2
  3. package/dist/native-document.components.min.css +1 -0
  4. package/dist/native-document.components.min.js +11506 -8566
  5. package/dist/native-document.dev.js +2645 -2166
  6. package/dist/native-document.dev.js.map +1 -1
  7. package/dist/native-document.min.js +1 -1
  8. package/index.js +1 -0
  9. package/package.json +5 -2
  10. package/rollup.config.js +5 -2
  11. package/src/components/$traits/has-draggable/HasDraggable.js +69 -0
  12. package/src/components/$traits/has-draggable/has-draggable.css +8 -0
  13. package/src/components/$traits/{HasItems.js → has-items/HasItems.js} +2 -11
  14. package/src/components/$traits/has-position/HasFullPosition.js +51 -0
  15. package/src/components/$traits/has-position/HasPosition.js +23 -0
  16. package/src/components/$traits/has-resizable/HasResizable.js +113 -0
  17. package/src/components/$traits/has-resizable/has-resizable.css +121 -0
  18. package/src/components/$traits/has-validation/HasValidation.js +86 -0
  19. package/src/components/BaseComponent.js +109 -4
  20. package/src/components/accordion/Accordion.js +37 -31
  21. package/src/components/accordion/AccordionItem.js +14 -21
  22. package/src/components/alert/Alert.js +48 -40
  23. package/src/components/avatar/Avatar.js +4 -3
  24. package/src/components/avatar/AvatarGroup.js +8 -2
  25. package/src/components/badge/Badge.js +7 -7
  26. package/src/components/base-component.css +0 -0
  27. package/src/components/breadcrumb/BreadCrumb.js +30 -21
  28. package/src/components/button/Button.js +3 -14
  29. package/src/components/context-menu/ContextMenu.js +49 -26
  30. package/src/components/dropdown/Dropdown.js +172 -34
  31. package/src/components/dropdown/DropdownDivider.js +4 -3
  32. package/src/components/dropdown/DropdownGroup.js +19 -19
  33. package/src/components/dropdown/DropdownItem.js +24 -18
  34. package/src/components/dropdown/helpers.js +52 -0
  35. package/src/components/form/FormControl.js +207 -108
  36. package/src/components/form/field/Field.js +106 -174
  37. package/src/components/form/field/FieldCollection.js +110 -203
  38. package/src/components/form/field/types/AutocompleteField.js +26 -5
  39. package/src/components/form/field/types/CheckboxField.js +4 -4
  40. package/src/components/form/field/types/CheckboxGroupField.js +11 -5
  41. package/src/components/form/field/types/ColorField.js +4 -4
  42. package/src/components/form/field/types/DateField.js +110 -18
  43. package/src/components/form/field/types/EmailField.js +2 -2
  44. package/src/components/form/field/types/FileField.js +87 -21
  45. package/src/components/form/field/types/HiddenField.js +4 -4
  46. package/src/components/form/field/types/ImageField.js +4 -4
  47. package/src/components/form/field/types/NumberField.js +5 -5
  48. package/src/components/form/field/types/PasswordField.js +28 -6
  49. package/src/components/form/field/types/RadioField.js +12 -8
  50. package/src/components/form/field/types/RangeField.js +29 -5
  51. package/src/components/form/field/types/SearchField.js +4 -4
  52. package/src/components/form/field/types/SelectField.js +75 -8
  53. package/src/components/form/field/types/StringField.js +4 -4
  54. package/src/components/form/field/types/TelField.js +4 -4
  55. package/src/components/form/field/types/TextAreaField.js +7 -5
  56. package/src/components/form/field/types/TimeField.js +52 -6
  57. package/src/components/form/field/types/UrlField.js +4 -5
  58. package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +104 -0
  59. package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +59 -0
  60. package/src/components/form/field/types/file-field-mode/FileItemPreview.js +74 -0
  61. package/src/components/form/field/types/file-field-mode/FileNativeMode.js +21 -0
  62. package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +59 -0
  63. package/src/components/form/field/types/file-field-mode/FileWallMode.js +53 -0
  64. package/src/components/form/index.js +14 -2
  65. package/src/components/form/validation/Validation.js +9 -0
  66. package/src/components/list/List.js +1 -1
  67. package/src/components/list/ListGroup.js +1 -1
  68. package/src/components/menu/HasMenuItem.js +133 -0
  69. package/src/components/menu/Menu.js +47 -56
  70. package/src/components/menu/MenuGroup.js +36 -8
  71. package/src/components/menu/MenuItem.js +24 -10
  72. package/src/components/menu/MenuLink.js +2 -0
  73. package/src/components/modal/Modal.js +153 -23
  74. package/src/components/pagination/Pagination.js +55 -21
  75. package/src/components/popover/Popover.js +127 -40
  76. package/src/components/progress/Progress.js +14 -24
  77. package/src/components/skeleton/Skeleton.js +36 -13
  78. package/src/components/slider/Slider.js +96 -70
  79. package/src/components/spinner/Spinner.js +4 -2
  80. package/src/components/splitter/Splitter.js +15 -8
  81. package/src/components/splitter/SplitterGutter.js +28 -7
  82. package/src/components/splitter/SplitterPanel.js +9 -15
  83. package/src/components/splitter/index.js +3 -1
  84. package/src/components/stacks/AbsoluteStack.js +33 -0
  85. package/src/components/stacks/FixedStack.js +33 -0
  86. package/src/components/stacks/PositionStack.js +146 -0
  87. package/src/components/stacks/RelativeStack.js +33 -0
  88. package/src/components/{layouts → stacks}/Stack.js +22 -3
  89. package/src/components/{layouts → stacks}/index.js +6 -4
  90. package/src/components/stepper/Stepper.js +159 -67
  91. package/src/components/stepper/StepperStep.js +49 -12
  92. package/src/components/switch/Switch.js +59 -29
  93. package/src/components/switch/index.js +6 -0
  94. package/src/components/table/Column.js +22 -26
  95. package/src/components/table/ColumnGroup.js +4 -13
  96. package/src/components/table/DataTable.js +388 -103
  97. package/src/components/table/SimpleTable.js +28 -143
  98. package/src/components/tabs/Tabs.js +142 -44
  99. package/src/components/toast/Toast.js +40 -35
  100. package/src/components/tooltip/Tooltip.js +152 -35
  101. package/src/core/data/ObservableArray.js +94 -30
  102. package/src/core/data/ObservableChecker.js +20 -75
  103. package/src/core/data/ObservableItem.js +35 -3
  104. package/src/core/data/observable-helpers/computed.js +2 -1
  105. package/src/core/data/observable-helpers/object.js +13 -8
  106. package/src/core/data/observable-helpers/observable.is-to.js +196 -0
  107. package/src/core/elements/anchor/anchor.js +3 -2
  108. package/src/core/elements/control/for-each-array.js +44 -30
  109. package/src/core/elements/control/for-each.js +6 -3
  110. package/src/core/elements/control/show-if.js +11 -6
  111. package/src/core/elements/control/switch.js +2 -1
  112. package/src/core/elements/index.js +1 -1
  113. package/src/core/elements/svg.js +61 -0
  114. package/src/core/utils/HasEventEmitter.js +6 -0
  115. package/src/core/utils/debug-manager.js +2 -5
  116. package/src/core/utils/filters/standard.js +2 -1
  117. package/src/core/utils/property-accumulator.js +35 -6
  118. package/src/core/utils/shortcut-manager.js +242 -0
  119. package/src/core/utils/validator.js +1 -1
  120. package/src/core/wrappers/AttributesWrapper.js +41 -4
  121. package/src/core/wrappers/DocumentObserver.js +0 -1
  122. package/src/core/wrappers/HtmlElementWrapper.js +1 -1
  123. package/src/core/wrappers/NDElement.js +15 -2
  124. package/src/core/wrappers/SvgElementWrapper.js +15 -0
  125. package/src/core/wrappers/prototypes/attributes-extensions.js +4 -1
  126. package/src/core/wrappers/prototypes/nd-element-extensions.js +8 -1
  127. package/src/router/Router.js +0 -1
  128. package/src/ui/components/accordion/AccordionItemRender.js +63 -0
  129. package/src/ui/components/accordion/AccordionRender.js +34 -0
  130. package/src/ui/components/accordion/accordion.css +121 -0
  131. package/src/ui/components/alert/AlertRender.js +80 -0
  132. package/src/ui/components/alert/alert.css +163 -0
  133. package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +49 -0
  134. package/src/ui/components/avatar/avata-group/avatar-group.css +38 -0
  135. package/src/ui/components/avatar/avatar/AvatarRender.js +87 -0
  136. package/src/ui/components/avatar/avatar/avatar.css +189 -0
  137. package/src/ui/components/badge/BadgeRender.js +24 -0
  138. package/src/ui/components/badge/badge.css +168 -0
  139. package/src/ui/components/breadcrumb/BreadcrumbRender.js +43 -0
  140. package/src/ui/components/breadcrumb/breadcrumb.css +55 -0
  141. package/src/ui/components/button/ButtonRender.js +65 -0
  142. package/src/ui/components/button/button.css +288 -354
  143. package/src/ui/components/contextmenu/ContextmenuRender.js +70 -0
  144. package/src/ui/components/contextmenu/contextmenu.css +36 -0
  145. package/src/ui/components/divider/DividerRender.js +70 -0
  146. package/src/ui/components/divider/divider.css +70 -0
  147. package/src/ui/components/dropdown/DropdownRender.js +92 -0
  148. package/src/ui/components/dropdown/divider/DropdownDividerRender.js +9 -0
  149. package/src/ui/components/dropdown/divider/dropdown-divider.css +0 -0
  150. package/src/ui/components/dropdown/dropdown.css +179 -0
  151. package/src/ui/components/dropdown/group/DropdownGroupRender.js +23 -0
  152. package/src/ui/components/dropdown/group/dropdown-group.css +0 -0
  153. package/src/ui/components/dropdown/item/DropdownItemRender.js +29 -0
  154. package/src/ui/components/dropdown/item/dropdown-item.css +0 -0
  155. package/src/ui/components/form/FieldCollectionRender.js +110 -0
  156. package/src/ui/components/form/FormControlRender.js +84 -0
  157. package/src/ui/components/form/field-collection.css +55 -0
  158. package/src/ui/components/form/fields/AutocompleteFieldRender.js +143 -0
  159. package/src/ui/components/form/fields/CheckboxFieldRender.js +59 -0
  160. package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +92 -0
  161. package/src/ui/components/form/fields/ColorFieldRender.js +30 -0
  162. package/src/ui/components/form/fields/DateFieldRender.js +154 -0
  163. package/src/ui/components/form/fields/EmailFieldRender.js +5 -0
  164. package/src/ui/components/form/fields/FieldRender.js +117 -0
  165. package/src/ui/components/form/fields/FileFieldRender.js +41 -0
  166. package/src/ui/components/form/fields/HiddenFieldRender.js +14 -0
  167. package/src/ui/components/form/fields/ImageFieldRender.js +0 -0
  168. package/src/ui/components/form/fields/NumberFieldRender.js +52 -0
  169. package/src/ui/components/form/fields/PasswordFieldRender.js +65 -0
  170. package/src/ui/components/form/fields/RadioFieldRender.js +77 -0
  171. package/src/ui/components/form/fields/RangeFieldRender.js +121 -0
  172. package/src/ui/components/form/fields/SelectFieldRender.js +248 -0
  173. package/src/ui/components/form/fields/SliderFieldRender.js +359 -0
  174. package/src/ui/components/form/fields/StringFieldRender.js +6 -0
  175. package/src/ui/components/form/fields/TelFieldRender.js +6 -0
  176. package/src/ui/components/form/fields/TextAreaFieldRender.js +96 -0
  177. package/src/ui/components/form/fields/TimeFieldRender.js +141 -0
  178. package/src/ui/components/form/fields/UrlFieldRender.js +6 -0
  179. package/src/ui/components/form/fields/date-field.css +32 -0
  180. package/src/ui/components/form/fields/field.css +402 -0
  181. package/src/ui/components/form/fields/file-field.css +79 -0
  182. package/src/ui/components/form/fields/password-field.css +50 -0
  183. package/src/ui/components/form/fields/range-field.css +120 -0
  184. package/src/ui/components/form/fields/slider.css +195 -0
  185. package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +143 -0
  186. package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +108 -0
  187. package/src/ui/components/form/file-upload-mode/FileNativeModeRender.js +22 -0
  188. package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +89 -0
  189. package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +91 -0
  190. package/src/ui/components/form/file-upload-mode/file-avatar-mode.css +139 -0
  191. package/src/ui/components/form/file-upload-mode/file-dropzone-mode.css +88 -0
  192. package/src/ui/components/form/file-upload-mode/file-upload-button-mode.css +44 -0
  193. package/src/ui/components/form/file-upload-mode/file-wall-mode.css +88 -0
  194. package/src/ui/components/form/form-control.css +40 -0
  195. package/src/ui/components/form/helpers.js +112 -0
  196. package/src/ui/components/form/index.js +61 -0
  197. package/src/ui/components/menu/MenuDividerRender.js +12 -0
  198. package/src/ui/components/menu/MenuGroupRender.js +60 -0
  199. package/src/ui/components/menu/MenuItemRender.js +57 -0
  200. package/src/ui/components/menu/MenuLinkRender.js +55 -0
  201. package/src/ui/components/menu/MenuRender.js +21 -0
  202. package/src/ui/components/menu/helpers.js +121 -0
  203. package/src/ui/components/menu/menu.css +308 -0
  204. package/src/ui/components/modal/ModalRender.js +119 -0
  205. package/src/ui/components/modal/modal.css +156 -0
  206. package/src/ui/components/pagination/PaginationRender.js +112 -0
  207. package/src/ui/components/pagination/pagination.css +63 -0
  208. package/src/ui/components/popover/PopoverRender.js +234 -0
  209. package/src/ui/components/popover/popover.css +139 -0
  210. package/src/ui/components/progress/ProgressRender.js +168 -0
  211. package/src/ui/components/progress/progress.css +197 -0
  212. package/src/ui/components/skeleton/SkeletonRender.js +79 -0
  213. package/src/ui/components/skeleton/skeleton.css +154 -0
  214. package/src/ui/components/spinner/SpinnerRender.js +46 -0
  215. package/src/ui/components/spinner/spinner.css +152 -0
  216. package/src/ui/components/splitter/SplitterGutterRender.js +94 -0
  217. package/src/ui/components/splitter/SplitterPanelRender.js +38 -0
  218. package/src/ui/components/splitter/SplitterRender.js +74 -0
  219. package/src/ui/components/splitter/splitter.css +128 -0
  220. package/src/ui/components/stacks/PositionStackRender.js +38 -0
  221. package/src/ui/components/stacks/StackRender.js +42 -0
  222. package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +5 -0
  223. package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +5 -0
  224. package/src/ui/components/stacks/h-stack/HStackRender.js +7 -0
  225. package/src/ui/components/stacks/h-stack/h-stack.css +4 -0
  226. package/src/ui/components/stacks/index.js +15 -0
  227. package/src/ui/components/stacks/position-stack.css +62 -0
  228. package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +7 -0
  229. package/src/ui/components/stacks/relative-stack/relative-stack.css +3 -0
  230. package/src/ui/components/stacks/stack.css +78 -0
  231. package/src/ui/components/stacks/v-stack/VStackRender.js +5 -0
  232. package/src/ui/components/stacks/v-stack/v-stack.css +4 -0
  233. package/src/ui/components/stepper/StepperRender.js +70 -0
  234. package/src/ui/components/stepper/StepperStepRender.js +67 -0
  235. package/src/ui/components/stepper/stepper.css +359 -0
  236. package/src/ui/components/switch/SwitchRender.js +82 -0
  237. package/src/ui/components/switch/switch.css +143 -0
  238. package/src/ui/components/table/data-table/DataTableRender.js +49 -0
  239. package/src/ui/components/table/data-table/bulk-actions.js +35 -0
  240. package/src/ui/components/table/data-table/data-table.css +246 -0
  241. package/src/ui/components/table/data-table/pagination.js +56 -0
  242. package/src/ui/components/table/data-table/tables.js +363 -0
  243. package/src/ui/components/table/data-table/toolbar.js +67 -0
  244. package/src/ui/components/table/simple-table/SimpleTableRender.js +188 -0
  245. package/src/ui/components/table/simple-table/simple-table.css +50 -0
  246. package/src/ui/components/tabs/TabsRender.js +226 -0
  247. package/src/ui/components/tabs/tabs.css +253 -0
  248. package/src/ui/components/toast/ToastRender.js +98 -0
  249. package/src/ui/components/toast/toast.css +201 -0
  250. package/src/ui/components/tooltip/TooltipRender.js +8 -0
  251. package/src/ui/components/tooltip/tooltip.css +113 -0
  252. package/src/ui/index.js +82 -0
  253. package/src/ui/tokens/colors-dark.scss +2 -1
  254. package/src/ui/tokens/reset.scss +3 -0
  255. package/types/control-flow.d.ts +2 -2
  256. package/src/components/layouts/ZStack.js +0 -41
  257. package/src/ui/components/button/button.render.js +0 -63
  258. /package/src/components/{layouts → stacks}/HStack.js +0 -0
  259. /package/src/components/{layouts → stacks}/VStack.js +0 -0
@@ -1,56 +1,144 @@
1
1
  import Field from "../Field";
2
2
  import {Validation} from "../../validation/Validation";
3
+ import BaseComponent from "../../../BaseComponent";
3
4
 
4
- export default function DateField(name, defaultConfig) {
5
+ export default function DateField(name, props = {}) {
5
6
  if(!(this instanceof DateField)) {
6
- return new DateField(name, defaultConfig);
7
+ return new DateField(name, props);
7
8
  }
8
9
 
9
- Field.call(this, name, 'date', defaultConfig);
10
+ Field.call(this, name, 'date', props);
10
11
 
11
12
  Object.assign(this.$description, {
12
- format: 'YYYY-MM-DD',
13
- minDate: null,
14
- maxDate: null,
15
- disabledDates: [],
16
- picker: true
13
+ format: 'YYYY-MM-DD',
14
+ minDate: null,
15
+ maxDate: null,
16
+ disabledDates: null,
17
+ clearable: false,
18
+ withTime: false,
19
+ range: false,
20
+ firstDayOfWeek: 'monday',
21
+ locale: null,
22
+ timeStep: null,
23
+ timezone: null,
24
+ valueStart: null,
25
+ valueEnd: null,
26
+ rangeSeparator: null,
27
+ props
17
28
  });
18
29
  }
19
30
 
20
31
  DateField.defaultTemplate = null;
21
32
 
22
33
  DateField.use = function(template) {
23
- DateField.defaultTemplate = template.dateField;
34
+ DateField.defaultTemplate = template;
24
35
  };
25
36
 
26
37
  DateField.prototype = Object.create(Field.prototype);
27
38
  DateField.prototype.constructor = DateField;
28
39
 
40
+ DateField.prototype.rangeSeparator = function(rangeSeparator) {
41
+ this.$description.rangeSeparator = rangeSeparator;
42
+ return this;
43
+ };
44
+
29
45
  DateField.prototype.format = function(formatString) {
30
46
  this.$description.format = formatString;
31
47
  return this;
32
48
  };
33
49
 
34
50
  DateField.prototype.minDate = function(date) {
35
- this.$description.minDate = date;
51
+ this.$description.minDate = BaseComponent.obs(date);
36
52
  return this;
37
53
  };
38
54
 
39
55
  DateField.prototype.maxDate = function(date) {
40
- this.$description.maxDate = date;
56
+ this.$description.maxDate = BaseComponent.obs(date);
41
57
  return this;
42
58
  };
43
59
 
44
60
  DateField.prototype.disabledDates = function(dates) {
45
- this.$description.disabledDates = dates;
61
+ this.$description.disabledDates = BaseComponent.obs(dates);
62
+ return this;
63
+ };
64
+
65
+ DateField.prototype.withTime = function(enabled = true) {
66
+ this.$description.withTime = BaseComponent.obs(enabled);
67
+ return this;
68
+ };
69
+
70
+ DateField.prototype.range = function(enabled = true) {
71
+ this.$description.range = BaseComponent.obs(enabled);
72
+ return this;
73
+ };
74
+
75
+ DateField.prototype.mondayAsFirstDay = function() {
76
+ this.$description.firstDayOfWeek = 'monday';
77
+ return this;
78
+ };
79
+
80
+ DateField.prototype.sundayAsFirstDay = function() {
81
+ this.$description.firstDayOfWeek = 'sunday';
82
+ return this;
83
+ };
84
+
85
+ DateField.prototype.locale = function(locale) {
86
+ this.$description.locale = locale;
87
+ return this;
88
+ };
89
+
90
+ DateField.prototype.timeStep = function(secondes) {
91
+ this.$description.timeStep = secondes;
92
+ return this;
93
+ };
94
+
95
+ DateField.prototype.fromToday = function() {
96
+ this.$description.minDate = BaseComponent.obs(new Date().toISOString().split('T')[0]);
97
+ return this;
98
+ };
99
+
100
+ DateField.prototype.untilToday = function() {
101
+ this.$description.maxDate = BaseComponent.obs(new Date().toISOString().split('T')[0]);
46
102
  return this;
47
103
  };
48
104
 
49
- DateField.prototype.picker = function(enabled = true) {
50
- this.$description.picker = enabled;
105
+ DateField.prototype.timezone = function(tz) {
106
+ this.$description.timezone = tz;
51
107
  return this;
52
108
  };
53
109
 
110
+ DateField.prototype.useLocalTimezone = function() {
111
+ this.$description.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
112
+ return this;
113
+ };
114
+
115
+ DateField.prototype.modelStart = function(observable) {
116
+ if(!this.$description.range) {
117
+ console.warn('DateField: modelStart is only available in range mode');
118
+ }
119
+ this.$description.valueStart = observable;
120
+ return this;
121
+ };
122
+
123
+ DateField.prototype.modelEnd = function(observable) {
124
+ if(!this.$description.range) {
125
+ console.warn('DateField: modelEnd is only available in range mode');
126
+ }
127
+ this.$description.valueEnd = observable;
128
+ return this;
129
+ };
130
+
131
+ DateField.prototype.onChange = function(handler) {
132
+ this.on('change', handler);
133
+ return this;
134
+ };
135
+
136
+ DateField.prototype.onClear = function(handler) {
137
+ this.on('clear', handler);
138
+ return this;
139
+ };
140
+
141
+ // Validation
54
142
  DateField.prototype.min = function(date, message) {
55
143
  return this.addRule(Validation.afterDate, [date], message);
56
144
  };
@@ -63,10 +151,14 @@ DateField.prototype.between = function(startDate, endDate, message) {
63
151
  return this.addRule(Validation.betweenDates, [startDate, endDate], message);
64
152
  };
65
153
 
66
- DateField.prototype.after = function(date, message) {
67
- return this.addRule(Validation.afterDate, [date], message);
68
- };
69
-
70
154
  DateField.prototype.before = function(date, message) {
71
155
  return this.addRule(Validation.beforeDate, [date], message);
156
+ };
157
+
158
+ DateField.prototype.weekday = function(message) {
159
+ return this.addRule(Validation.weekday, [], message);
160
+ };
161
+
162
+ DateField.prototype.after = function(date, message) {
163
+ return this.addRule(Validation.afterDate, [date], message);
72
164
  };
@@ -15,14 +15,14 @@ export default function EmailField(name, defaultConfig) {
15
15
  EmailField.defaultTemplate = null;
16
16
 
17
17
  EmailField.use = function(template) {
18
- EmailField.defaultTemplate = template.emailField;
18
+ EmailField.defaultTemplate = template;
19
19
  };
20
20
 
21
21
  EmailField.prototype = Object.create(Field.prototype);
22
22
  EmailField.prototype.constructor = EmailField;
23
23
 
24
24
  EmailField.prototype.email = function(message) {
25
- const existingRule = this.rules.find(r => r.fn === Validation.email);
25
+ const existingRule = this.$description.rules.find(r => r.fn === Validation.email);
26
26
  if (existingRule && message) {
27
27
  existingRule.message = message;
28
28
  }
@@ -1,26 +1,29 @@
1
1
  import Field from "../Field";
2
2
  import {Validation} from "../../validation/Validation";
3
+ import { $ } from '../../../../../index';
4
+ import FileItemPreview from "./file-field-mode/FileItemPreview";
3
5
 
4
- export default function FileField(name, type = 'file', defaultConfig = {}) {
6
+ export default function FileField(name, props = {}) {
5
7
  if(!(this instanceof FileField)) {
6
- return new FileField(name, defaultConfig);
8
+ return new FileField(name, props);
7
9
  }
8
10
 
9
- Field.call(this, name, type, defaultConfig);
11
+ Field.call(this, name, 'file', props);
10
12
 
11
13
  Object.assign(this.$description, {
12
- accept: null,
14
+ accept: null,
13
15
  multiple: false,
14
- preview: false,
15
- dragDrop: false,
16
- compress: false
16
+ mode: null,
17
+ files: $.array([]),
18
+ fileIcons: [],
19
+ props
17
20
  });
18
21
  }
19
22
 
20
23
  FileField.defaultTemplate = null;
21
24
 
22
25
  FileField.use = function(template) {
23
- FileField.defaultTemplate = template.fileField;
26
+ FileField.defaultTemplate = template;
24
27
  };
25
28
 
26
29
  FileField.prototype = Object.create(Field.prototype);
@@ -36,18 +39,8 @@ FileField.prototype.multiple = function(enabled = true) {
36
39
  return this;
37
40
  };
38
41
 
39
- FileField.prototype.preview = function(enabled = true) {
40
- this.$description.preview = enabled;
41
- return this;
42
- };
43
-
44
- FileField.prototype.dragDrop = function(enabled = true) {
45
- this.$description.dragDrop = enabled;
46
- return this;
47
- };
48
-
49
- FileField.prototype.compress = function(enabled = true) {
50
- this.$description.compress = enabled;
42
+ FileField.prototype.mode = function(mode) {
43
+ this.$description.mode = mode;
51
44
  return this;
52
45
  };
53
46
 
@@ -73,4 +66,77 @@ FileField.prototype.maxFiles = function(max, message) {
73
66
 
74
67
  FileField.prototype.minFiles = function(min, message) {
75
68
  return this.addRule(Validation.minFiles, [min], message);
76
- };
69
+ };
70
+
71
+ FileField.prototype.onFileAdd = function(handler) {
72
+ this.on('fileAdd', handler);
73
+ return this;
74
+ };
75
+
76
+ FileField.prototype.onReset = function(handler) {
77
+ this.on('reset', handler);
78
+ return this;
79
+ };
80
+
81
+ FileField.prototype.onFileRemove = function(handler) {
82
+ this.on('fileRemove', handler);
83
+ return this;
84
+ };
85
+
86
+ FileField.prototype.addFile = function(file, update = true) {
87
+ const item = new FileItemPreview(file);
88
+ this.$description.files.push(item);
89
+ this.emit('fileAdd', item);
90
+ update && this.$update();
91
+ return this;
92
+ };
93
+
94
+ FileField.prototype.setFiles = function(files) {
95
+ this.$description.files.clear();
96
+ this.addFiles(files);
97
+ return this;
98
+ }
99
+ FileField.prototype.addFiles = function(files) {
100
+ if (!Array.isArray(files)) {
101
+ throw new Error('addFiles expects an array of files');
102
+ }
103
+ for(let i = 0, len = files.length; i < len; i++) {
104
+ this.addFile(files[i], false);
105
+ }
106
+ this.$update();
107
+ return this;
108
+ };
109
+
110
+ FileField.prototype.$update = function() {
111
+ const files = this.$description.files.val();
112
+ this.$description.value.set(this.$description.multiple ? files.map(i => i.file()) : files[0]?.file() || null);
113
+ this.validate();
114
+ };
115
+
116
+ FileField.prototype.removeFile = function(file) {
117
+ this.$description.files.remove(file);
118
+ this.emit('fileRemove', file);
119
+ this.$update();
120
+ return this;
121
+ };
122
+
123
+ FileField.prototype.getFiles = function() {
124
+ return this.$description.files.val();
125
+ };
126
+
127
+ FileField.prototype.reset = function() {
128
+ this.$description.files.clear();
129
+ this.emit('reset');
130
+ this.$update();
131
+ return this;
132
+ };
133
+
134
+ FileField.prototype.fileIcon = function(desc) {
135
+ this.$description.fileIcons.push(desc);
136
+ return this;
137
+ };
138
+
139
+ FileField.prototype.fileIcons = function(icons) {
140
+ this.$description.fileIcons = icons;
141
+ return this;
142
+ }
@@ -1,17 +1,17 @@
1
1
  import Field from "../Field";
2
2
 
3
- export default function HiddenField(name, defaultConfig) {
3
+ export default function HiddenField(name, props) {
4
4
  if(!(this instanceof HiddenField)) {
5
- return new HiddenField(name, defaultConfig);
5
+ return new HiddenField(name, props);
6
6
  }
7
7
 
8
- Field.call(this, name, 'hidden', defaultConfig);
8
+ Field.call(this, name, 'hidden', props);
9
9
  }
10
10
 
11
11
  HiddenField.defaultTemplate = null;
12
12
 
13
13
  HiddenField.use = function(template) {
14
- HiddenField.defaultTemplate = template.hiddenField;
14
+ HiddenField.defaultTemplate = template;
15
15
  };
16
16
 
17
17
  HiddenField.prototype = Object.create(Field.prototype);
@@ -1,12 +1,12 @@
1
1
  import FileField from "./FileField";
2
2
  import {Validation} from "../../validation/Validation";
3
3
 
4
- export default function ImageField(name, defaultConfig) {
4
+ export default function ImageField(name, props) {
5
5
  if(!(this instanceof ImageField)) {
6
- return new ImageField(name, defaultConfig);
6
+ return new ImageField(name, props);
7
7
  }
8
8
 
9
- FileField.call(this, name, 'image', defaultConfig);
9
+ FileField.call(this, name, 'image', props);
10
10
 
11
11
  Object.assign(this.$description, {
12
12
  maxWidth: null,
@@ -21,7 +21,7 @@ export default function ImageField(name, defaultConfig) {
21
21
  ImageField.defaultTemplate = null;
22
22
 
23
23
  ImageField.use = function(template) {
24
- ImageField.defaultTemplate = template.imageField;
24
+ ImageField.defaultTemplate = template;
25
25
  };
26
26
 
27
27
  ImageField.prototype = Object.create(FileField.prototype);
@@ -1,12 +1,12 @@
1
1
  import {Validation} from "../../validation/Validation";
2
2
  import Field from "../Field";
3
3
 
4
- export default function NumberField(name, type = 'number', defaultConfig = {}) {
4
+ export default function NumberField(name, type = 'number', props = {}) {
5
5
  if(!(this instanceof NumberField)) {
6
- return new NumberField(name, defaultConfig);
6
+ return new NumberField(name, type, props);
7
7
  }
8
8
 
9
- Field.call(this, name, type, defaultConfig);
9
+ Field.call(this, name, type, props);
10
10
 
11
11
  Object.assign(this.$description, {
12
12
  ...this.$description,
@@ -20,7 +20,7 @@ export default function NumberField(name, type = 'number', defaultConfig = {}) {
20
20
  NumberField.defaultTemplate = null;
21
21
 
22
22
  NumberField.use = function(template) {
23
- NumberField.defaultTemplate = template.numberField;
23
+ NumberField.defaultTemplate = template;
24
24
  };
25
25
 
26
26
  NumberField.prototype = Object.create(Field.prototype);
@@ -68,7 +68,7 @@ NumberField.prototype.step = function(value) {
68
68
  return this;
69
69
  };
70
70
 
71
- NumberField.prototype.decimals = function(value) {
71
+ NumberField.prototype.decimals = function(value = 2) {
72
72
  this.$description.decimals = value;
73
73
  return this;
74
74
  };
@@ -1,22 +1,24 @@
1
1
  import {Validation} from "../../validation/Validation";
2
2
  import StringField from "./StringField";
3
3
 
4
- export default function PasswordField(name, defaultConfig) {
4
+ export default function PasswordField(name, props = {}) {
5
5
  if(!(this instanceof PasswordField)) {
6
- return new PasswordField(name, defaultConfig);
6
+ return new PasswordField(name, props);
7
7
  }
8
8
 
9
- StringField.call(this, name, 'password', defaultConfig);
9
+ StringField.call(this, name, 'password', props);
10
10
  Object.assign(this.$description, {
11
11
  visibilityToggle: false,
12
- showStrengthMeter: false
12
+ showStrengthMeter: false,
13
+ visibilityIcons: {},
14
+ strengthLabels: null,
13
15
  });
14
16
  }
15
17
 
16
18
  PasswordField.defaultTemplate = null;
17
19
 
18
20
  PasswordField.use = function(template) {
19
- PasswordField.defaultTemplate = template.passwordField;
21
+ PasswordField.defaultTemplate = template;
20
22
  };
21
23
 
22
24
  PasswordField.prototype = Object.create(StringField.prototype);
@@ -63,8 +65,16 @@ PasswordField.prototype.containsSpecialChar = function(message) {
63
65
  );
64
66
  };
65
67
 
66
- PasswordField.prototype.visibilityToggle = function(enabled = true) {
68
+ PasswordField.prototype.visibilityToggle = function(enabled = true, icons = {}) {
67
69
  this.$description.visibilityToggle = enabled;
70
+ this.$description.visibilityIcons = {
71
+ show: icons.show || '👁',
72
+ hide: icons.hide || '🙈',
73
+ };
74
+ return this;
75
+ };
76
+ PasswordField.prototype.visibilityIcons = function(show, hide) {
77
+ this.$description.visibilityIcons = {show, hide};
68
78
  return this;
69
79
  };
70
80
 
@@ -73,6 +83,18 @@ PasswordField.prototype.showStrengthMeter = function(enabled = true) {
73
83
  return this;
74
84
  };
75
85
 
86
+ PasswordField.prototype.strengthLabels = function(labels = {}) {
87
+ this.$description.strengthLabels = {
88
+ 0: labels[0] || '',
89
+ 1: labels[1] || 'Very weak',
90
+ 2: labels[2] || 'Weak',
91
+ 3: labels[3] || 'Fair',
92
+ 4: labels[4] || 'Strong',
93
+ 5: labels[5] || 'Very strong',
94
+ };
95
+ return this;
96
+ };
97
+
76
98
  PasswordField.prototype.same = function(fieldName, message) {
77
99
  return this.addRule(Validation.same, [fieldName], message || 'Passwords must match');
78
100
  };
@@ -1,17 +1,16 @@
1
1
  import Field from "../Field";
2
2
  import {Validator} from "../../../../../index";
3
- import CheckboxField from "./CheckboxField";
4
3
 
5
- export default function RadioField(name, options, defaultConfig = {}) {
4
+ export default function RadioField(name, props = {}) {
6
5
  if(!(this instanceof RadioField)) {
7
- return new RadioField(name, defaultConfig);
6
+ return new RadioField(name, props);
8
7
  }
9
8
 
10
- Field.call(this, name, 'radio', defaultConfig);
9
+ Field.call(this, name, 'radio', props);
11
10
 
12
11
  Object.assign(this.$description, {
13
- options: options || [],
14
- layout: 'vertical' || defaultConfig?.layout,
12
+ options: [],
13
+ layout: 'vertical',
15
14
  checked: false
16
15
  });
17
16
  }
@@ -19,7 +18,7 @@ export default function RadioField(name, options, defaultConfig = {}) {
19
18
  RadioField.defaultTemplate = null;
20
19
 
21
20
  RadioField.use = function(template) {
22
- RadioField.defaultTemplate = template.radioField;
21
+ RadioField.defaultTemplate = template;
23
22
  };
24
23
 
25
24
  RadioField.prototype = Object.create(Field.prototype);
@@ -30,12 +29,17 @@ RadioField.prototype.options = function(opts) {
30
29
  return this;
31
30
  };
32
31
 
32
+ RadioField.prototype.option = function(value, label, props = {}) {
33
+ this.$description.options.push({ value, label, props });
34
+ return this;
35
+ };
36
+
33
37
  RadioField.prototype.model = function(observable) {
34
38
  this.$description.checked = observable;
35
39
  return this;
36
40
  };
37
41
 
38
- CheckboxField.prototype.checked = function() {
42
+ RadioField.prototype.checked = function() {
39
43
  const checked = this.$description.checked;
40
44
  if(Validator.isObservable(checked)) {
41
45
  return checked.val();
@@ -1,21 +1,25 @@
1
1
  import NumberField from "./NumberField";
2
2
 
3
- export default function RangeField(name, defaultConfig) {
3
+ export default function RangeField(name, props) {
4
4
  if(!(this instanceof RangeField)) {
5
- return new RangeField(name, defaultConfig);
5
+ return new RangeField(name, props);
6
6
  }
7
7
 
8
- NumberField.call(this, name, 'range', defaultConfig);
8
+ NumberField.call(this, name, 'range', props);
9
9
 
10
10
  Object.assign(this.$description, {
11
- showValue: true
11
+ showValue: true,
12
+ marks: null,
13
+ showMarks: false,
14
+ vertical: false,
15
+ showTooltip: false,
12
16
  });
13
17
  }
14
18
 
15
19
  RangeField.defaultTemplate = null;
16
20
 
17
21
  RangeField.use = function(template) {
18
- RangeField.defaultTemplate = template.rangeField;
22
+ RangeField.defaultTemplate = template;
19
23
  };
20
24
 
21
25
  RangeField.prototype = Object.create(NumberField.prototype);
@@ -24,4 +28,24 @@ RangeField.prototype.constructor = RangeField;
24
28
  RangeField.prototype.showValue = function(enabled = true) {
25
29
  this.$description.showValue = enabled;
26
30
  return this;
31
+ };
32
+
33
+ RangeField.prototype.marks = function(marks) {
34
+ this.$description.marks = marks;
35
+ return this;
36
+ };
37
+
38
+ RangeField.prototype.showMarks = function(enabled = true) {
39
+ this.$description.showMarks = enabled;
40
+ return this;
41
+ };
42
+
43
+ RangeField.prototype.vertical = function(enabled = true) {
44
+ this.$description.vertical = enabled;
45
+ return this;
46
+ };
47
+
48
+ RangeField.prototype.showTooltip = function(enabled = true) {
49
+ this.$description.showTooltip = enabled;
50
+ return this;
27
51
  };
@@ -1,11 +1,11 @@
1
1
  import StringField from "./StringField";
2
2
 
3
- export default function SearchField(name, defaultConfig) {
3
+ export default function SearchField(name, props) {
4
4
  if(!(this instanceof SearchField)) {
5
- return new SearchField(name, defaultConfig);
5
+ return new SearchField(name, props);
6
6
  }
7
7
 
8
- StringField.call(this, name, 'search', defaultConfig);
8
+ StringField.call(this, name, 'search', props);
9
9
 
10
10
  Object.assign(this.$description, {
11
11
  debounce: 300
@@ -15,7 +15,7 @@ export default function SearchField(name, defaultConfig) {
15
15
  SearchField.defaultTemplate = null;
16
16
 
17
17
  SearchField.use = function(template) {
18
- SearchField.defaultTemplate = template.searchField;
18
+ SearchField.defaultTemplate = template;
19
19
  };
20
20
 
21
21
  SearchField.prototype = Object.create(StringField.prototype);