inviton-powerduck 0.0.153 → 0.0.155

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 (61) hide show
  1. package/app/powerduck-initializer.ts +3 -3
  2. package/common/api-http.ts +20 -14
  3. package/common/css/ladda-themeless-zoomin.min.css +89 -89
  4. package/common/enum-translation/day-translator.ts +3 -2
  5. package/common/excel/excel-reader.ts +2 -9
  6. package/common/extensions/array-extensions.ts +116 -0
  7. package/common/extensions/string-extensions.ts +92 -0
  8. package/common/extensions/temporal-extensions.ts +115 -0
  9. package/common/scroll-utils.ts +2 -1
  10. package/common/temporal-helpers.ts +551 -0
  11. package/common/throttled-api-caller.ts +149 -0
  12. package/common/timezone-helper.ts +39 -29
  13. package/common/utils/cookie.ts +11 -8
  14. package/common/utils/date-localization-utils.ts +25 -19
  15. package/common/utils/date-utils.ts +37 -47
  16. package/common/utils/form-utils.ts +3 -1
  17. package/common/utils/language-utils.ts +21 -27
  18. package/common/utils/temporal-utils.ts +43 -0
  19. package/common/utils/upload-image-helper.ts +1 -1
  20. package/common/utils/utils.ts +14 -14
  21. package/common/validation.ts +17 -5
  22. package/components/chart-js/line-chart-flot.tsx +9 -9
  23. package/components/chart-js/thirdparty/flot/jquery.flot.categories.min.js +93 -93
  24. package/components/chart-js/thirdparty/flot/jquery.flot.crosshair.min.js +83 -83
  25. package/components/chart-js/thirdparty/flot/jquery.flot.navigate.min.js +270 -270
  26. package/components/chart-js/thirdparty/flot/jquery.flot.pie.min.js +507 -507
  27. package/components/chart-js/thirdparty/flot/jquery.flot.resize.js +7 -9
  28. package/components/chart-js/thirdparty/flot/jquery.flot.resize.min.js +9 -11
  29. package/components/chart-js/thirdparty/flot/jquery.flot.stack.min.js +104 -104
  30. package/components/chart-js/ts/line-chart-contracts.ts +2 -2
  31. package/components/container-with-breakpoints/ts/breakpoint-handler.ts +2 -2
  32. package/components/counter/testall.tsx +89 -75
  33. package/components/datatable/datatable.tsx +2379 -2375
  34. package/components/datatable/export-excel-modal.tsx +12 -14
  35. package/components/datatable/ts/reorder.ts +4 -2
  36. package/components/dropdown/index.tsx +48 -22
  37. package/components/dropdown/mobile/legacy_fdd.ts +10 -11
  38. package/components/dropzone/gallery-dropzone.tsx +394 -382
  39. package/components/fullcalendar/fullcalendar-draggable-event.tsx +8 -7
  40. package/components/fullcalendar/timegrid-calendar.tsx +60 -67
  41. package/components/image-crop/image-cropping-modal.tsx +9 -8
  42. package/components/image-crop/upload-and-crop.tsx +162 -162
  43. package/components/image-crop/vendor/jquery.Jcrop.min.css +344 -344
  44. package/components/import/import-mapper.tsx +2 -2
  45. package/components/input/daterange-picker.tsx +502 -521
  46. package/components/input/datetime-picker.tsx +45 -50
  47. package/components/input/plugins/daterangepicker/daterangepicker.min.css +400 -400
  48. package/components/input/plugins/daterangepicker/jquery.daterangepicker.min.js +346 -339
  49. package/components/input/plugins/daterangepicker/jquery.daterangepicker.ts +580 -402
  50. package/components/input/radio-button-group.tsx +2 -2
  51. package/components/input/ts/dateInputHelper.ts +1 -0
  52. package/components/input/wysiwig.tsx +12 -7
  53. package/components/svg/skilift-svg.tsx +6 -6
  54. package/package.json +2 -1
  55. package/common/date-wrapper.ts +0 -422
  56. package/common/utils/array-extend.ts +0 -215
  57. package/common/utils/array-remove.ts +0 -10
  58. package/common/utils/array-sort.ts +0 -56
  59. package/common/utils/capitalize-string.ts +0 -11
  60. package/common/utils/format-string.ts +0 -14
  61. package/common/utils/latinize-string.ts +0 -7
@@ -5,184 +5,184 @@ import { Prop, toNative } from 'vue-facing-decorator';
5
5
  import PowerduckState from '../../app/powerduck-state';
6
6
  import TsxComponent, { Component } from '../../app/vuetsx';
7
7
  import { BrowserImageCompression } from '../../common/utils/broswer-image-compression';
8
- import { formatString } from '../../common/utils/format-string';
9
8
  import { PortalUtils } from '../../common/utils/utils';
10
9
  import UploadButton from '../button/upload-button';
11
10
  import LoadingIndicator from '../loading-indicator';
12
11
  import NotificationProvider from '../ui/notification';
13
12
  import ImageCropModal from './image-cropping-modal';
13
+ import { format } from '../../common/extensions/string-extensions';
14
14
 
15
15
  export interface UploadImageAndCropFileCompleteArgs {
16
- imageSrc: string;
17
- fileName: string;
16
+ imageSrc: string;
17
+ fileName: string;
18
18
  }
19
19
 
20
20
  export interface UploadImageAndCropUploadEventArgs extends ImageCroppedUploadArgs { }
21
21
 
22
22
  interface UploadImageAndCropButtonArgs extends _ButtonArgsBase {
23
- title?: string;
24
- aspectRatio?: number;
25
- useCropper?: boolean;
26
- uploadUrl?: string;
27
- targetBlobContainer: string;
28
- imageCropperTitleMessage?: string;
29
- uploadArgs: (e: UploadImageAndCropUploadEventArgs) => any;
30
- uploadComplete: (args: any) => void;
31
- autoCommit?: boolean;
32
- disableCompression?: boolean;
33
- allowedTypes?: string[];
34
- compressionMaxSizeMb?: number;
35
- isLoading?: boolean;
23
+ title?: string;
24
+ aspectRatio?: number;
25
+ useCropper?: boolean;
26
+ uploadUrl?: string;
27
+ targetBlobContainer: string;
28
+ imageCropperTitleMessage?: string;
29
+ uploadArgs: (e: UploadImageAndCropUploadEventArgs) => any;
30
+ uploadComplete: (args: any) => void;
31
+ autoCommit?: boolean;
32
+ disableCompression?: boolean;
33
+ allowedTypes?: string[];
34
+ compressionMaxSizeMb?: number;
35
+ isLoading?: boolean;
36
36
  }
37
37
 
38
38
  @Component
39
39
  class UploadImageAndCropButtonComponent extends TsxComponent<UploadImageAndCropButtonArgs> implements UploadImageAndCropButtonArgs {
40
- @Prop() cssClass!: string;
41
- @Prop() layout!: ButtonLayout;
42
- @Prop() text!: string;
43
- @Prop() size!: ButtonSize;
44
- @Prop() round!: boolean;
45
- @Prop() outlined!: boolean;
46
- @Prop() dismissModal!: boolean;
47
- @Prop() icon!: string;
48
- @Prop() disabled!: boolean;
49
- @Prop() useCropper!: boolean;
50
- @Prop() fullWidth!: boolean;
51
- @Prop() title!: string;
52
- @Prop() aspectRatio!: number;
53
- @Prop() uploadUrl: string;
54
- @Prop() isLoading?: boolean;
55
- @Prop() targetBlobContainer: string;
56
- @Prop() imageCropperTitleMessage!: string;
57
- @Prop() uploadArgs: (e: UploadImageAndCropUploadEventArgs) => any;
58
- @Prop() uploadComplete: (args: any) => void;
59
- @Prop() autoCommit: boolean;
60
- @Prop() disableCompression: boolean;
61
- @Prop() allowedTypes: string[];
62
- @Prop() compressionMaxSizeMb?: number;
63
- isInternalLoading: boolean = false;
64
-
65
- handleFileObtained(e: UploadButtonFileObtainedArgs): void {
66
- const urlCreator = window.URL || window.webkitURL;
67
- const imgUrl = urlCreator.createObjectURL(e.file);
68
-
69
- if (this.allowedTypes?.length > 0 && !this.allowedTypes.includes(e.file.type)) {
70
- NotificationProvider.showErrorMessage(formatString(PowerduckState.getResourceValue('uploadImageInvalidFileType'), PortalUtils.htmlEscape(this.allowedTypes.join(', '))));
71
- return;
72
- }
73
-
74
- if (this.useCropper != false) {
75
- (this.$refs.imgCrop as typeof ImageCropModal.prototype).show({
76
- fileName: e.file.name,
77
- imageSrc: imgUrl,
78
- aspectRatio: (this.aspectRatio || (5 / 3)),
79
- title: null,
80
- titleMessageHtml: this.imageCropperTitleMessage,
81
- handleCropUpload: (e) => {
82
- return this.getUploadPromise(e);
83
- },
84
- });
85
- } else {
86
- this.isInternalLoading = true;
87
- this.getUploadPromise({
88
- file: e.file,
89
- fileName: e.file.name,
90
- dataUrl: null,
91
- }).then(() => {
92
- this.isInternalLoading = false;
93
- }).catch((_err) => {
94
- this.isInternalLoading = false;
95
- });
96
- }
97
- }
98
-
99
- getUploadButton() {
100
- return this.$refs.uploadButton as typeof UploadButton.prototype;
101
- }
102
-
103
- async getUploadPromise(args: ImageCroppedUploadArgs): Promise<any> {
104
- if (!(this.disableCompression || args.file.type == 'image/svg+xml')) {
105
- args.file = await BrowserImageCompression.compress(args.file, {
106
- maxSizeMB: this.compressionMaxSizeMb,
107
- });
108
- }
109
-
110
- return new Promise((resolve, reject) => {
111
- const formData = new FormData();
112
- if (this.uploadArgs != null) {
113
- const argsVal = this.uploadArgs(args);
114
- if (argsVal != null) {
115
- for (const key in argsVal) {
116
- formData.append(key, argsVal[key]);
117
- }
118
- }
119
- }
120
-
121
- if (this.autoCommit === true) {
122
- const request = new XMLHttpRequest();
123
- request.open('POST', this.uploadUrl);
124
- request.onreadystatechange = () => {
125
- if (request.readyState == 4) {
126
- let response;
127
- try {
128
- response = JSON.parse(request.responseText);
129
- } catch (e) {
130
- response = request.responseText;
131
- }
132
-
133
- if (request.status == 200) {
134
- if (this.uploadComplete) {
135
- this.uploadComplete(response);
136
- }
137
-
138
- resolve(response);
139
- } else {
140
- try {
141
- if (response.responseText) {
142
- NotificationProvider.showErrorMessage(response.responseText);
143
- } else {
144
- NotificationProvider.showErrorMessage(response);
145
- }
146
- } catch (e) { }
147
-
148
- reject(response);
149
- }
150
- }
151
- };
152
-
153
- request.send(formData);
154
- } else {
155
- const argsVal = this.uploadArgs(args);
156
- this.uploadComplete(argsVal);
157
- resolve(formData);
158
- }
159
- });
160
- }
161
-
162
- render(h) {
163
- return (
164
- <span style="position:relative;">
165
- <LoadingIndicator visible={(this.isLoading || this.isInternalLoading)} />
166
- <UploadButton
167
- ref="uploadButton"
168
- fileObtained={async (e) => {
169
- await this.handleFileObtained(e);
170
- }}
171
- onlyImages={true}
172
- cssClass={this.cssClass}
173
- layout={this.layout}
174
- text={this.text}
175
- size={this.size}
176
- round={this.round}
177
- outlined={this.outlined}
178
- icon={this.icon}
179
- disabled={this.disabled}
180
- />
181
-
182
- <ImageCropModal ref="imgCrop" />
183
- </span>
184
- );
185
- }
40
+ @Prop() cssClass!: string;
41
+ @Prop() layout!: ButtonLayout;
42
+ @Prop() text!: string;
43
+ @Prop() size!: ButtonSize;
44
+ @Prop() round!: boolean;
45
+ @Prop() outlined!: boolean;
46
+ @Prop() dismissModal!: boolean;
47
+ @Prop() icon!: string;
48
+ @Prop() disabled!: boolean;
49
+ @Prop() useCropper!: boolean;
50
+ @Prop() fullWidth!: boolean;
51
+ @Prop() title!: string;
52
+ @Prop() aspectRatio!: number;
53
+ @Prop() uploadUrl: string;
54
+ @Prop() isLoading?: boolean;
55
+ @Prop() targetBlobContainer: string;
56
+ @Prop() imageCropperTitleMessage!: string;
57
+ @Prop() uploadArgs: (e: UploadImageAndCropUploadEventArgs) => any;
58
+ @Prop() uploadComplete: (args: any) => void;
59
+ @Prop() autoCommit: boolean;
60
+ @Prop() disableCompression: boolean;
61
+ @Prop() allowedTypes: string[];
62
+ @Prop() compressionMaxSizeMb?: number;
63
+ isInternalLoading: boolean = false;
64
+
65
+ handleFileObtained(e: UploadButtonFileObtainedArgs): void {
66
+ const urlCreator = window.URL || window.webkitURL;
67
+ const imgUrl = urlCreator.createObjectURL(e.file);
68
+
69
+ if (this.allowedTypes?.length > 0 && !this.allowedTypes.includes(e.file.type)) {
70
+ NotificationProvider.showErrorMessage(PowerduckState.getResourceValue('uploadImageInvalidFileType')[format](PortalUtils.htmlEscape(this.allowedTypes.join(', '))));
71
+ return;
72
+ }
73
+
74
+ if (this.useCropper != false) {
75
+ (this.$refs.imgCrop as typeof ImageCropModal.prototype).show({
76
+ fileName: e.file.name,
77
+ imageSrc: imgUrl,
78
+ aspectRatio: (this.aspectRatio || (5 / 3)),
79
+ title: null,
80
+ titleMessageHtml: this.imageCropperTitleMessage,
81
+ handleCropUpload: (e) => {
82
+ return this.getUploadPromise(e);
83
+ },
84
+ });
85
+ } else {
86
+ this.isInternalLoading = true;
87
+ this.getUploadPromise({
88
+ file: e.file,
89
+ fileName: e.file.name,
90
+ dataUrl: null,
91
+ }).then(() => {
92
+ this.isInternalLoading = false;
93
+ }).catch((_err) => {
94
+ this.isInternalLoading = false;
95
+ });
96
+ }
97
+ }
98
+
99
+ getUploadButton() {
100
+ return this.$refs.uploadButton as typeof UploadButton.prototype;
101
+ }
102
+
103
+ async getUploadPromise(args: ImageCroppedUploadArgs): Promise<any> {
104
+ if (!(this.disableCompression || args.file.type == 'image/svg+xml')) {
105
+ args.file = await BrowserImageCompression.compress(args.file, {
106
+ maxSizeMB: this.compressionMaxSizeMb,
107
+ });
108
+ }
109
+
110
+ return new Promise((resolve, reject) => {
111
+ const formData = new FormData();
112
+ if (this.uploadArgs != null) {
113
+ const argsVal = this.uploadArgs(args);
114
+ if (argsVal != null) {
115
+ for (const key in argsVal) {
116
+ formData.append(key, argsVal[key]);
117
+ }
118
+ }
119
+ }
120
+
121
+ if (this.autoCommit === true) {
122
+ const request = new XMLHttpRequest();
123
+ request.open('POST', this.uploadUrl);
124
+ request.onreadystatechange = () => {
125
+ if (request.readyState == 4) {
126
+ let response;
127
+ try {
128
+ response = JSON.parse(request.responseText);
129
+ } catch (e) {
130
+ response = request.responseText;
131
+ }
132
+
133
+ if (request.status == 200) {
134
+ if (this.uploadComplete) {
135
+ this.uploadComplete(response);
136
+ }
137
+
138
+ resolve(response);
139
+ } else {
140
+ try {
141
+ if (response.responseText) {
142
+ NotificationProvider.showErrorMessage(response.responseText);
143
+ } else {
144
+ NotificationProvider.showErrorMessage(response);
145
+ }
146
+ } catch (e) { }
147
+
148
+ reject(response);
149
+ }
150
+ }
151
+ };
152
+
153
+ request.send(formData);
154
+ } else {
155
+ const argsVal = this.uploadArgs(args);
156
+ this.uploadComplete(argsVal);
157
+ resolve(formData);
158
+ }
159
+ });
160
+ }
161
+
162
+ render(h) {
163
+ return (
164
+ <span style="position:relative;">
165
+ <LoadingIndicator visible={(this.isLoading || this.isInternalLoading)} />
166
+ <UploadButton
167
+ ref="uploadButton"
168
+ fileObtained={async (e) => {
169
+ await this.handleFileObtained(e);
170
+ }}
171
+ onlyImages={true}
172
+ cssClass={this.cssClass}
173
+ layout={this.layout}
174
+ text={this.text}
175
+ size={this.size}
176
+ round={this.round}
177
+ outlined={this.outlined}
178
+ icon={this.icon}
179
+ disabled={this.disabled}
180
+ />
181
+
182
+ <ImageCropModal ref="imgCrop" />
183
+ </span>
184
+ );
185
+ }
186
186
  }
187
187
 
188
188
  const UploadImageAndCropButton = toNative(UploadImageAndCropButtonComponent);