@humandialog/forms.svelte 1.3.14 → 1.3.15

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.
@@ -3,6 +3,7 @@ import { data_tick_store, contextItemsStore, contextTypesStore } from "../stores
3
3
  import { informModification, pushChanges } from "../updates.js";
4
4
  import { parseWidthDirective, isDeviceSmallerThan } from "../utils.js";
5
5
  import FaChevronDown from "svelte-icons/fa/FaChevronDown.svelte";
6
+ import { getFormattedStringDate, getNiceStringDate } from "./date_utils.js";
6
7
  export let self = null;
7
8
  export let a = "";
8
9
  export let context = "";
@@ -132,141 +133,8 @@ function setup(...args) {
132
133
  });
133
134
  } else
134
135
  can_be_activated = true;
135
- rValue = get_formatted_date(value);
136
- pretty_value = get_pretty_value(value);
137
- }
138
- function get_pretty_value(d) {
139
- if (!d)
140
- return "";
141
- let month = d.getMonth();
142
- let day = d.getDate();
143
- let year = d.getFullYear();
144
- const now = new Date(Date.now());
145
- let current_month = now.getMonth();
146
- let current_day = now.getDate();
147
- let current_year = now.getFullYear();
148
- let is_far_date = true;
149
- const far_date_threshold = 14 * 24 * 60 * 60 * 1e3;
150
- if (Math.abs(now.getTime() - d.getTime()) < far_date_threshold)
151
- is_far_date = false;
152
- if (year != current_year) {
153
- if (is_far_date)
154
- return `${day} ${month_name(month)} ${year}`;
155
- else
156
- return `${day_name(d.getDay())}, ${day} ${month_name(month)}`;
157
- }
158
- if (month != current_month) {
159
- if (is_far_date)
160
- return `${day} ${month_name(month)}`;
161
- else
162
- return `${day_name(d.getDay())}, ${day} ${month_name(month)}`;
163
- } else {
164
- let day_of_week = d.getDay();
165
- let current_day_of_week = now.getDay();
166
- if (day_of_week == 0)
167
- day_of_week = 7;
168
- if (current_day_of_week == 0)
169
- current_day_of_week = 7;
170
- let days_diff = day - current_day;
171
- if (days_diff == 0)
172
- return "Today";
173
- else if (days_diff == 1)
174
- return "Tomorrow";
175
- else if (days_diff == -1)
176
- return "Yesterday";
177
- else if (days_diff > 0 && days_diff <= 7) {
178
- if (day_of_week > current_day_of_week)
179
- return day_name(day_of_week);
180
- else
181
- return `${day_name(day_of_week)}, ${d.getDate()} ${month_name(d.getMonth())}`;
182
- } else if (days_diff > 0) {
183
- if (is_far_date)
184
- return `${d.getDate()} ${month_name(d.getMonth())}`;
185
- else
186
- return `${day_name(day_of_week)}, ${d.getDate()} ${month_name(d.getMonth())}`;
187
- } else if (days_diff < 0 && days_diff > -7) {
188
- if (day_of_week < current_day_of_week)
189
- return day_name(day_of_week);
190
- else
191
- return `${day_name(day_of_week)}, ${d.getDate()} ${month_name(d.getMonth())}`;
192
- } else {
193
- if (is_far_date)
194
- return `${d.getDate()} ${month_name(d.getMonth())}`;
195
- else
196
- return `${day_name(day_of_week)}, ${d.getDate()} ${month_name(d.getMonth())}`;
197
- }
198
- }
199
- }
200
- function day_name(d) {
201
- switch (d) {
202
- case 0:
203
- return "Sun";
204
- case 1:
205
- return "Mon";
206
- case 2:
207
- return "Tue";
208
- case 3:
209
- return "Wed";
210
- case 4:
211
- return "Thu";
212
- case 5:
213
- return "Fri";
214
- case 6:
215
- return "Sat";
216
- case 7:
217
- return "Sun";
218
- }
219
- return "";
220
- }
221
- function month_name(m) {
222
- switch (m) {
223
- case 0:
224
- return "Jan";
225
- case 1:
226
- return "Feb";
227
- case 2:
228
- return "Mar";
229
- case 3:
230
- return "Apr";
231
- case 4:
232
- return "May";
233
- case 5:
234
- return "Jun";
235
- case 6:
236
- return "Jul";
237
- case 7:
238
- return "Aug";
239
- case 8:
240
- return "Sep";
241
- case 9:
242
- return "Oct";
243
- case 10:
244
- return "Nov";
245
- case 11:
246
- return "Dec";
247
- }
248
- return "";
249
- }
250
- function get_formatted_date(d) {
251
- if (!d)
252
- return "";
253
- let month = "" + (d.getMonth() + 1);
254
- let day = "" + d.getDate();
255
- let year = d.getFullYear();
256
- let hour = "" + d.getHours();
257
- let minutes = "" + d.getMinutes();
258
- if (day.length < 2)
259
- day = "0" + day;
260
- if (month.length < 2)
261
- month = "0" + month;
262
- if (hour.length < 2)
263
- hour = "0" + hour;
264
- if (minutes.length < 2)
265
- minutes = "0" + minutes;
266
- if (type == "datetime-local")
267
- return `${year}-${month}-${day} ${hour}:${minutes}`;
268
- else
269
- return `${year}-${month}-${day}`;
136
+ rValue = getFormattedStringDate(value, type);
137
+ pretty_value = getNiceStringDate(value);
270
138
  }
271
139
  async function on_changed() {
272
140
  if (!rValue)
@@ -0,0 +1,4 @@
1
+ export function getFormattedStringDate(d: any, type?: string): string;
2
+ export function getNiceStringDate(d: any): string;
3
+ export function dayName(d: any): "" | "Sun" | "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat";
4
+ export function monthName(m: any): "" | "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun" | "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec";
@@ -0,0 +1,178 @@
1
+
2
+ export function getFormattedStringDate(d, type = "datetime")
3
+ {
4
+ if(!d)
5
+ return '';
6
+
7
+ let month = '' + (d.getMonth() + 1);
8
+ let day = '' + d.getDate();
9
+ let year = d.getFullYear();
10
+ let hour = '' + d.getHours();
11
+ let minutes = '' + d.getMinutes();
12
+
13
+ if(day.length < 2)
14
+ day = '0' + day;
15
+
16
+ if(month.length < 2)
17
+ month = '0' + month;
18
+
19
+ if(hour.length < 2)
20
+ hour = '0' + hour;
21
+
22
+ if(minutes.length < 2)
23
+ minutes = '0' + minutes;
24
+
25
+ if(type == "datetime-local")
26
+ return `${year}-${month}-${day} ${hour}:${minutes}`;
27
+ else
28
+ return `${year}-${month}-${day}`;
29
+ }
30
+
31
+ export function getNiceStringDate(d)
32
+ {
33
+ if(!d)
34
+ return '';
35
+
36
+ let month = d.getMonth();
37
+ let day = d.getDate();
38
+ let year = d.getFullYear();
39
+
40
+ const now = new Date( Date.now())
41
+ let current_month = now.getMonth();
42
+ let current_day = now.getDate();
43
+ let current_year = now.getFullYear();
44
+
45
+ let is_far_date = true;
46
+ const far_date_threshold = 14*24*60*60*1000; // 14 days
47
+ if(Math.abs( now.getTime() - d.getTime()) < far_date_threshold)
48
+ is_far_date = false;
49
+
50
+ if(year != current_year)
51
+ {
52
+ if(is_far_date)
53
+ return `${day} ${monthName(month)} ${year}`
54
+ else
55
+ return `${dayName(d.getDay())}, ${day} ${monthName(month)}`
56
+ }
57
+
58
+ if(month != current_month)
59
+ {
60
+ if(is_far_date)
61
+ return `${day} ${monthName(month)}`
62
+ else
63
+ return `${dayName(d.getDay())}, ${day} ${monthName(month)}`
64
+ }
65
+ else
66
+ {
67
+ let day_of_week = d.getDay() // 0 == Sunday
68
+ let current_day_of_week = now.getDay()
69
+
70
+ if(day_of_week == 0)
71
+ day_of_week = 7
72
+
73
+ if(current_day_of_week == 0)
74
+ current_day_of_week = 7;
75
+
76
+
77
+ let days_diff = day - current_day;
78
+ if(days_diff == 0)
79
+ return 'Today';
80
+ else if(days_diff == 1)
81
+ return 'Tomorrow';
82
+ else if(days_diff == -1)
83
+ return 'Yesterday';
84
+ else if(days_diff > 0 && days_diff <= 7)
85
+ {
86
+ if(day_of_week > current_day_of_week)
87
+ return dayName(day_of_week);
88
+ else
89
+ return `${dayName(day_of_week)}, ${d.getDate()} ${monthName(d.getMonth())}`
90
+ }
91
+ else if(days_diff > 0)
92
+ {
93
+ if(is_far_date)
94
+ return `${d.getDate()} ${monthName(d.getMonth())}`
95
+ else
96
+ return `${dayName(day_of_week)}, ${d.getDate()} ${monthName(d.getMonth())}`
97
+ }
98
+ else if(days_diff < 0 && days_diff > -7)
99
+ {
100
+ if(day_of_week < current_day_of_week)
101
+ return dayName(day_of_week);
102
+ else
103
+ return `${dayName(day_of_week)}, ${d.getDate()} ${monthName(d.getMonth())}`
104
+ }
105
+ else
106
+ {
107
+ if(is_far_date)
108
+ return `${d.getDate()} ${monthName(d.getMonth())}`
109
+ else
110
+ return `${dayName(day_of_week)}, ${d.getDate()} ${monthName(d.getMonth())}`
111
+ }
112
+ }
113
+ }
114
+
115
+ export function dayName(d)
116
+ {
117
+ switch(d)
118
+ {
119
+ case 0:
120
+ return 'Sun';
121
+
122
+ case 1:
123
+ return 'Mon';
124
+
125
+ case 2:
126
+ return 'Tue';
127
+
128
+ case 3:
129
+ return 'Wed';
130
+
131
+ case 4:
132
+ return 'Thu';
133
+
134
+ case 5:
135
+ return 'Fri';
136
+
137
+ case 6:
138
+ return 'Sat';
139
+
140
+ case 7:
141
+ return 'Sun';
142
+ }
143
+
144
+ return '';
145
+ }
146
+
147
+ export function monthName(m)
148
+ {
149
+ switch(m)
150
+ {
151
+ case 0:
152
+ return "Jan";
153
+ case 1:
154
+ return "Feb";
155
+ case 2:
156
+ return "Mar";
157
+ case 3:
158
+ return "Apr";
159
+ case 4:
160
+ return "May";
161
+ case 5:
162
+ return "Jun";
163
+ case 6:
164
+ return "Jul";
165
+ case 7:
166
+ return "Aug";
167
+ case 8:
168
+ return "Sep";
169
+ case 9:
170
+ return "Oct";
171
+ case 10:
172
+ return "Nov";
173
+ case 11:
174
+ return "Dec";
175
+ }
176
+
177
+ return '';
178
+ }
@@ -62,6 +62,7 @@ export let a = "";
62
62
  export let context = "";
63
63
  export let typename = "";
64
64
  export let compact = false;
65
+ export let onChange = void 0;
65
66
  export let onFocusCb = void 0;
66
67
  export let onBlurCb = void 0;
67
68
  export let onAddImage = void 0;
@@ -480,12 +481,16 @@ onMount(() => {
480
481
  content: value,
481
482
  injectCSS: false,
482
483
  onTransaction({ editor: editor2, transaction }) {
483
- hasChangedValue = true;
484
- changedValue = editor2.getHTML();
485
- handleImagesChanges(transaction);
484
+ const wasContentChanged = transaction.steps.length > 0;
485
+ if (wasContentChanged) {
486
+ hasChangedValue = true;
487
+ changedValue = editor2.getHTML();
488
+ handleImagesChanges(transaction);
489
+ }
486
490
  refreshToolbarOperations();
487
491
  },
488
492
  onFocus({ editor: editor2, event }) {
493
+ on_focus();
489
494
  if (onFocusCb)
490
495
  onFocusCb();
491
496
  },
@@ -512,7 +517,24 @@ onDestroy(() => {
512
517
  if (is_command_palette_visible)
513
518
  palette.hide();
514
519
  });
520
+ const isAutoSaveEnabled = false;
521
+ let autoSaveTimerId = 0;
522
+ function on_focus() {
523
+ if (isAutoSaveEnabled) {
524
+ autoSaveTimerId = setInterval(
525
+ () => {
526
+ if (hasChangedValue)
527
+ saveData();
528
+ },
529
+ 1e4
530
+ );
531
+ }
532
+ }
515
533
  function on_blur() {
534
+ if (autoSaveTimerId) {
535
+ clearInterval(autoSaveTimerId);
536
+ autoSaveTimerId = 0;
537
+ }
516
538
  if (onFinishEditing) {
517
539
  onFinishEditing();
518
540
  onFinishEditing = void 0;
@@ -529,9 +551,15 @@ export function save() {
529
551
  }
530
552
  }
531
553
  function saveData() {
532
- if (item && a && hasChangedValue) {
554
+ if (!hasChangedValue)
555
+ return false;
556
+ hasChangedValue = false;
557
+ console.log("editor: saveData");
558
+ if (onChange) {
559
+ onChange(changedValue);
560
+ return true;
561
+ } else if (item && a) {
533
562
  item[a] = changedValue;
534
- hasChangedValue = false;
535
563
  if (typename)
536
564
  informModification(item, a, typename);
537
565
  else
@@ -9,6 +9,7 @@ declare const __propDef: {
9
9
  context?: string | undefined;
10
10
  typename?: string | undefined;
11
11
  compact?: boolean | undefined;
12
+ onChange?: undefined;
12
13
  onFocusCb?: undefined;
13
14
  onBlurCb?: undefined;
14
15
  onAddImage?: undefined;
@@ -31,8 +31,8 @@ async function onSummaryChanged(text) {
31
31
  <li class=" mx-2 pt-2 pb-4 px-1 rounded-md border border-transparent
32
32
  bg-stone-100 dark:bg-stone-700">
33
33
 
34
- <h3 class=" text-lg font-semibold min-h-[1.75rem]
35
- sm:text-sm sm:font-semibold sm:min-h-[1.25rem]
34
+ <h3 class=" text-base font-semibold min-h-[1.75rem]
35
+ sm:min-h-[1.25rem]
36
36
  whitespace-nowrap overflow-clip w-full sm:flex-none "
37
37
  use:editable={{
38
38
  action: (text) => onInsert(text, ''),
@@ -43,10 +43,9 @@ async function onSummaryChanged(text) {
43
43
  </h3>
44
44
 
45
45
  {#if editSummary}
46
- <p class=" sm:text-xs sm:min-h-[1rem]
47
- text-base min-h-[1.5rem]
46
+ <p class=" text-sm min-h-[1.25rem]
48
47
  text-stone-400
49
- max-h-[75px] sm:max-h-[64px]
48
+ max-h-[75px]
50
49
  overflow-hidden"
51
50
  use:editable={{
52
51
  action: (text) => onSummaryChanged(text),
package/index.d.ts CHANGED
@@ -56,6 +56,7 @@ export { default as KanbanTagsProperty } from './components/kanban/kanban.tags.s
56
56
  export { default as KanbanCallbacks } from './components/kanban/kanban.callbacks.svelte';
57
57
  export { KanbanColumnTop, KanbanColumnBottom } from './components/kanban/Kanban';
58
58
  export { selectItem, activateItem, clearActiveItem, isActive, isSelected, getActive, editable, startEditing, saveCurrentEditable, selectable, handleSelect, isDeviceSmallerThan, resizeImage, refreshToolbarOperations, isOnScreenKeyboardVisible, randomString, UI, } from './utils';
59
+ export { getFormattedStringDate, getNiceStringDate, dayName, monthName } from './components/date_utils';
59
60
  export { mainContentPageReloader, reloadMainContentPage, reloadWholeApp, alerts, addAlert, onErrorShowAlert, main_sidebar_visible_store } from './stores.js';
60
61
  export { data_tick_store, // tmp
61
62
  hasSelectedItem, hasDataItem, setNavigatorTitle } from "./stores";
package/index.js CHANGED
@@ -62,6 +62,7 @@ export { default as KanbanTagsProperty } from './components/kanban/kanban.tags.s
62
62
  export { default as KanbanCallbacks } from './components/kanban/kanban.callbacks.svelte';
63
63
  export { KanbanColumnTop, KanbanColumnBottom } from './components/kanban/Kanban';
64
64
  export { selectItem, activateItem, clearActiveItem, isActive, isSelected, getActive, editable, startEditing, saveCurrentEditable, selectable, handleSelect, isDeviceSmallerThan, resizeImage, refreshToolbarOperations, isOnScreenKeyboardVisible, randomString, UI, } from './utils';
65
+ export { getFormattedStringDate, getNiceStringDate, dayName, monthName } from './components/date_utils';
65
66
  export { mainContentPageReloader, reloadMainContentPage, reloadWholeApp, alerts, addAlert, onErrorShowAlert, main_sidebar_visible_store } from './stores.js';
66
67
  export { data_tick_store, // tmp
67
68
  hasSelectedItem, hasDataItem, setNavigatorTitle } from "./stores";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humandialog/forms.svelte",
3
- "version": "1.3.14",
3
+ "version": "1.3.15",
4
4
  "description": "Basic Svelte UI components for Object Reef applications",
5
5
  "devDependencies": {
6
6
  "@playwright/test": "^1.28.1",
@@ -74,6 +74,7 @@
74
74
  "./components/combo/combo": "./components/combo/combo.js",
75
75
  "./components/contextmenu.svelte": "./components/contextmenu.svelte",
76
76
  "./components/date.svelte": "./components/date.svelte",
77
+ "./components/date_utils": "./components/date_utils.js",
77
78
  "./components/delayed.spinner.svelte": "./components/delayed.spinner.svelte",
78
79
  "./components/document/editor.svelte": "./components/document/editor.svelte",
79
80
  "./components/document/internal/Document_command": "./components/document/internal/Document_command.js",