x4js 1.6.5 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -14
- package/lib/README.txt +3 -14
- package/lib/src/assets/house-light.svg +1 -0
- package/lib/src/assets/radio.svg +4 -0
- package/lib/src/components/base.scss +26 -0
- package/lib/src/components/boxes/boxes.module.scss +37 -0
- package/lib/src/components/boxes/boxes.ts +125 -0
- package/lib/src/components/btngroup/btngroup.module.scss +29 -0
- package/lib/src/components/btngroup/btngroup.ts +106 -0
- package/lib/src/components/button/button.module.scss +154 -0
- package/lib/src/components/button/button.ts +117 -0
- package/lib/src/components/calendar/calendar-check-sharp-light.svg +1 -0
- package/lib/src/components/calendar/calendar.module.scss +163 -0
- package/lib/src/{calendar.ts → components/calendar/calendar.ts} +81 -83
- package/lib/src/components/calendar/chevron-left-sharp-light.svg +1 -0
- package/lib/src/components/calendar/chevron-right-sharp-light.svg +1 -0
- package/lib/src/components/checkbox/check.svg +4 -0
- package/lib/src/components/checkbox/checkbox.module.scss +142 -0
- package/lib/src/components/checkbox/checkbox.ts +125 -0
- package/lib/src/components/colorinput/colorinput.module.scss +65 -0
- package/lib/src/components/colorinput/colorinput.ts +88 -0
- package/lib/src/components/colorinput/crosshairs-simple-sharp-light.svg +1 -0
- package/lib/src/components/colorpicker/colorpicker.module.scss +133 -0
- package/lib/src/components/colorpicker/colorpicker.ts +477 -0
- package/lib/src/components/combobox/combobox.module.scss +121 -0
- package/lib/src/components/combobox/combobox.ts +190 -0
- package/lib/src/components/combobox/updown.svg +4 -0
- package/lib/src/components/dialog/dialog.module.scss +71 -0
- package/lib/src/components/dialog/dialog.ts +91 -0
- package/lib/src/components/dialog/xmark-sharp-light.svg +1 -0
- package/lib/src/components/form/form.module.scss +34 -0
- package/lib/src/components/form/form.ts +36 -0
- package/lib/src/components/header/header.module.scss +40 -0
- package/lib/src/components/header/header.ts +124 -0
- package/lib/src/components/icon/icon.module.scss +30 -0
- package/lib/src/components/icon/icon.ts +134 -0
- package/lib/src/components/image/image.module.scss +21 -0
- package/lib/src/components/image/image.ts +67 -0
- package/lib/src/components/input/input.module.scss +69 -0
- package/lib/src/components/input/input.ts +274 -0
- package/lib/src/components/label/label.module.scss +52 -0
- package/lib/src/components/label/label.ts +55 -0
- package/lib/src/components/listbox/listbox.module.scss +103 -0
- package/lib/src/components/listbox/listbox.ts +427 -0
- package/lib/src/components/menu/caret-right-solid.svg +1 -0
- package/lib/src/components/menu/menu.module.scss +108 -0
- package/lib/src/components/menu/menu.ts +168 -0
- package/lib/src/components/messages/circle-exclamation.svg +1 -0
- package/lib/src/components/messages/messages.module.scss +47 -0
- package/lib/src/components/messages/messages.ts +64 -0
- package/lib/src/components/normalize.scss +386 -0
- package/lib/src/components/notification/circle-check-solid.svg +1 -0
- package/lib/src/components/notification/circle-exclamation-solid.svg +1 -0
- package/lib/src/components/notification/circle-notch-light.svg +1 -0
- package/lib/src/components/notification/notification.module.scss +82 -0
- package/lib/src/components/notification/notification.ts +108 -0
- package/lib/src/components/notification/xmark-sharp-light.svg +1 -0
- package/lib/src/components/panel/panel.module.scss +48 -0
- package/lib/src/components/panel/panel.ts +57 -0
- package/lib/src/components/popup/popup.module.scss +43 -0
- package/lib/src/components/popup/popup.ts +395 -0
- package/lib/src/components/progress/progress.module.scss +57 -0
- package/lib/src/components/progress/progress.ts +43 -0
- package/lib/src/components/rating/rating.module.scss +23 -0
- package/lib/src/components/rating/rating.ts +125 -0
- package/lib/src/components/rating/star-sharp-light.svg +1 -0
- package/lib/src/components/rating/star-sharp-solid.svg +1 -0
- package/lib/src/components/shared.scss +76 -0
- package/lib/src/components/sizers/sizer.module.scss +90 -0
- package/lib/src/components/sizers/sizer.ts +120 -0
- package/lib/src/components/slider/slider.module.scss +71 -0
- package/lib/src/components/slider/slider.ts +143 -0
- package/lib/src/components/switch/switch.module.scss +127 -0
- package/lib/src/components/switch/switch.ts +56 -0
- package/lib/src/components/tabs/tabs.module.scss +46 -0
- package/lib/src/components/tabs/tabs.ts +157 -0
- package/lib/src/components/textarea/textarea.module.scss +59 -0
- package/lib/src/components/textarea/textarea.ts +54 -0
- package/lib/src/components/textedit/textedit.module.scss +114 -0
- package/lib/src/components/textedit/textedit.ts +82 -0
- package/lib/src/components/themes.scss +77 -0
- package/lib/src/components/tooltips/circle-info-sharp-light.svg +1 -0
- package/lib/src/components/tooltips/tooltips.scss +51 -0
- package/lib/src/components/tooltips/tooltips.ts +103 -0
- package/lib/src/components/treeview/chevron-down-light.svg +1 -0
- package/lib/src/components/treeview/treeview.module.scss +116 -0
- package/lib/src/components/treeview/treeview.ts +403 -0
- package/lib/src/components/viewport/viewport.module.scss +25 -0
- package/lib/src/components/viewport/viewport.ts +38 -0
- package/lib/src/core/component.ts +979 -0
- package/lib/src/core/core_colors.ts +250 -0
- package/lib/src/{dom_events.ts → core/core_dom.ts} +195 -39
- package/lib/src/{drag_manager.ts → core/core_dragdrop.ts} +29 -44
- package/lib/src/core/core_element.ts +98 -0
- package/lib/src/core/core_events.ts +149 -0
- package/lib/src/{i18n.ts → core/core_i18n.ts} +43 -42
- package/lib/src/{router.ts → core/core_router.ts} +27 -40
- package/lib/src/core/core_styles.ts +215 -0
- package/lib/src/core/core_svg.ts +550 -0
- package/lib/src/core/core_tools.ts +673 -0
- package/lib/src/main.scss +21 -0
- package/lib/src/main.tsx +323 -0
- package/lib/src/x4.scss +19 -0
- package/lib/types/x4.d.ts +2624 -0
- package/package.json +67 -59
- package/scripts/build.mjs +351 -0
- package/scripts/prepack.mjs +15 -0
- package/src/assets/house-light.svg +1 -0
- package/src/assets/radio.svg +4 -0
- package/src/components/base.scss +26 -0
- package/src/components/boxes/boxes.module.scss +37 -0
- package/src/components/boxes/boxes.ts +125 -0
- package/src/components/btngroup/btngroup.module.scss +29 -0
- package/src/components/btngroup/btngroup.ts +106 -0
- package/src/components/button/button.module.scss +154 -0
- package/src/components/button/button.ts +117 -0
- package/src/components/calendar/calendar-check-sharp-light.svg +1 -0
- package/src/components/calendar/calendar.module.scss +163 -0
- package/src/components/calendar/calendar.ts +326 -0
- package/src/components/calendar/chevron-left-sharp-light.svg +1 -0
- package/src/components/calendar/chevron-right-sharp-light.svg +1 -0
- package/src/components/checkbox/check.svg +4 -0
- package/src/components/checkbox/checkbox.module.scss +142 -0
- package/src/components/checkbox/checkbox.ts +125 -0
- package/src/components/colorinput/colorinput.module.scss +65 -0
- package/src/components/colorinput/colorinput.ts +88 -0
- package/src/components/colorinput/crosshairs-simple-sharp-light.svg +1 -0
- package/src/components/colorpicker/colorpicker.module.scss +133 -0
- package/src/components/colorpicker/colorpicker.ts +477 -0
- package/src/components/combobox/combobox.module.scss +121 -0
- package/src/components/combobox/combobox.ts +190 -0
- package/src/components/combobox/updown.svg +4 -0
- package/src/components/dialog/dialog.module.scss +71 -0
- package/src/components/dialog/dialog.ts +91 -0
- package/src/components/dialog/xmark-sharp-light.svg +1 -0
- package/src/components/form/form.module.scss +34 -0
- package/src/components/form/form.ts +36 -0
- package/src/components/header/header.module.scss +40 -0
- package/src/components/header/header.ts +124 -0
- package/src/components/icon/icon.module.scss +30 -0
- package/src/components/icon/icon.ts +134 -0
- package/src/components/image/image.module.scss +21 -0
- package/src/components/image/image.ts +67 -0
- package/src/components/input/input.module.scss +69 -0
- package/src/components/input/input.ts +274 -0
- package/src/components/label/label.module.scss +52 -0
- package/src/components/label/label.ts +55 -0
- package/src/components/listbox/listbox.module.scss +103 -0
- package/src/components/listbox/listbox.ts +427 -0
- package/src/components/menu/caret-right-solid.svg +1 -0
- package/src/components/menu/menu.module.scss +108 -0
- package/src/components/menu/menu.ts +168 -0
- package/src/components/messages/circle-exclamation.svg +1 -0
- package/src/components/messages/messages.module.scss +47 -0
- package/src/components/messages/messages.ts +64 -0
- package/src/components/normalize.scss +386 -0
- package/src/components/notification/circle-check-solid.svg +1 -0
- package/src/components/notification/circle-exclamation-solid.svg +1 -0
- package/src/components/notification/circle-notch-light.svg +1 -0
- package/src/components/notification/notification.module.scss +82 -0
- package/src/components/notification/notification.ts +108 -0
- package/src/components/notification/xmark-sharp-light.svg +1 -0
- package/src/components/panel/panel.module.scss +48 -0
- package/src/components/panel/panel.ts +57 -0
- package/src/components/popup/popup.module.scss +43 -0
- package/src/components/popup/popup.ts +395 -0
- package/src/components/progress/progress.module.scss +57 -0
- package/src/components/progress/progress.ts +43 -0
- package/src/components/rating/rating.module.scss +23 -0
- package/src/components/rating/rating.ts +125 -0
- package/src/components/rating/star-sharp-light.svg +1 -0
- package/src/components/rating/star-sharp-solid.svg +1 -0
- package/src/components/shared.scss +76 -0
- package/src/components/sizers/sizer.module.scss +90 -0
- package/src/components/sizers/sizer.ts +120 -0
- package/src/components/slider/slider.module.scss +71 -0
- package/src/components/slider/slider.ts +143 -0
- package/src/components/switch/switch.module.scss +127 -0
- package/src/components/switch/switch.ts +56 -0
- package/src/components/tabs/tabs.module.scss +46 -0
- package/src/components/tabs/tabs.ts +157 -0
- package/src/components/textarea/textarea.module.scss +59 -0
- package/src/components/textarea/textarea.ts +54 -0
- package/src/components/textedit/textedit.module.scss +114 -0
- package/src/components/textedit/textedit.ts +82 -0
- package/src/components/themes.scss +77 -0
- package/src/components/tooltips/circle-info-sharp-light.svg +1 -0
- package/src/components/tooltips/tooltips.scss +51 -0
- package/src/components/tooltips/tooltips.ts +103 -0
- package/src/components/treeview/chevron-down-light.svg +1 -0
- package/src/components/treeview/treeview.module.scss +116 -0
- package/src/components/treeview/treeview.ts +403 -0
- package/src/components/viewport/viewport.module.scss +25 -0
- package/src/components/viewport/viewport.ts +38 -0
- package/src/core/component.ts +979 -0
- package/src/core/core_colors.ts +250 -0
- package/src/core/core_dom.ts +471 -0
- package/src/core/core_dragdrop.ts +201 -0
- package/src/core/core_element.ts +98 -0
- package/src/core/core_events.ts +149 -0
- package/src/core/core_i18n.ts +377 -0
- package/src/core/core_router.ts +221 -0
- package/src/core/core_styles.ts +215 -0
- package/src/core/core_svg.ts +550 -0
- package/src/core/core_tools.ts +673 -0
- package/src/main.scss +21 -0
- package/src/main.tsx +323 -0
- package/src/x4.scss +19 -0
- package/tsconfig.json +14 -0
- package/types/scss.d.ts +4 -0
- package/types/svg.d.ts +4 -0
- package/types/x4react.d.ts +9 -0
- package/lib/changelog.txt +0 -23
- package/lib/cjs/x4js.js +0 -39
- package/lib/cjs/x4js.js.map +0 -7
- package/lib/esm/x4js.mjs +0 -15972
- package/lib/esm/x4js.mjs.map +0 -7
- package/lib/licence.md +0 -21
- package/lib/src/MIT-license.md +0 -14
- package/lib/src/action.ts +0 -88
- package/lib/src/alpha.jpg +0 -0
- package/lib/src/app_sockets.ts +0 -81
- package/lib/src/application.ts +0 -262
- package/lib/src/autocomplete.ts +0 -232
- package/lib/src/base64.ts +0 -166
- package/lib/src/base_component.ts +0 -152
- package/lib/src/button.ts +0 -355
- package/lib/src/canvas.ts +0 -510
- package/lib/src/cardview.ts +0 -228
- package/lib/src/checkbox.ts +0 -188
- package/lib/src/color.ts +0 -752
- package/lib/src/colorpicker.ts +0 -1649
- package/lib/src/combobox.ts +0 -512
- package/lib/src/component.ts +0 -2367
- package/lib/src/copyright.txt +0 -27
- package/lib/src/datastore.ts +0 -1302
- package/lib/src/dialog.ts +0 -656
- package/lib/src/drawtext.ts +0 -355
- package/lib/src/fileupload.ts +0 -213
- package/lib/src/form.ts +0 -413
- package/lib/src/formatters.ts +0 -105
- package/lib/src/gridview.ts +0 -1185
- package/lib/src/icon.ts +0 -362
- package/lib/src/image.ts +0 -225
- package/lib/src/index.ts +0 -89
- package/lib/src/input.ts +0 -297
- package/lib/src/label.ts +0 -153
- package/lib/src/layout.ts +0 -442
- package/lib/src/link.ts +0 -86
- package/lib/src/listview.ts +0 -765
- package/lib/src/md5.ts +0 -438
- package/lib/src/menu.ts +0 -425
- package/lib/src/messagebox.ts +0 -224
- package/lib/src/panel.ts +0 -86
- package/lib/src/popup.ts +0 -494
- package/lib/src/property_editor.ts +0 -337
- package/lib/src/radiobtn.ts +0 -197
- package/lib/src/rating.ts +0 -135
- package/lib/src/request.ts +0 -300
- package/lib/src/settings.ts +0 -77
- package/lib/src/sidebarview.ts +0 -108
- package/lib/src/spreadsheet.ts +0 -1449
- package/lib/src/styles.ts +0 -343
- package/lib/src/svgcomponent.ts +0 -592
- package/lib/src/tabbar.ts +0 -151
- package/lib/src/tabview.ts +0 -110
- package/lib/src/textarea.ts +0 -235
- package/lib/src/textedit.ts +0 -533
- package/lib/src/toaster.ts +0 -80
- package/lib/src/tools.ts +0 -1473
- package/lib/src/tooltips.ts +0 -191
- package/lib/src/treeview.ts +0 -716
- package/lib/src/version.ts +0 -30
- package/lib/src/x4.less +0 -2242
- package/lib/src/x4dom.ts +0 -57
- package/lib/src/x4events.ts +0 -585
- package/lib/src/x4js.ts +0 -89
- package/lib/src/x4react.ts +0 -90
- package/lib/styles/x4.css +0 -1785
- package/lib/styles/x4.less +0 -2242
- package/lib/types/x4js.d.ts +0 -6728
- package/license.md +0 -21
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ___ ___ __
|
|
3
|
+
* \ \/ / / _
|
|
4
|
+
* \ / /_| |_
|
|
5
|
+
* / \____ _|
|
|
6
|
+
* /__/\__\ |_|
|
|
7
|
+
*
|
|
8
|
+
* @file calendar.module.scss
|
|
9
|
+
* @author Etienne Cochard
|
|
10
|
+
*
|
|
11
|
+
* @copyright (c) 2024 R-libre ingenierie
|
|
12
|
+
*
|
|
13
|
+
* Use of this source code is governed by an MIT-style license
|
|
14
|
+
* that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
|
|
15
|
+
**/
|
|
16
|
+
|
|
17
|
+
@use "../shared.scss";
|
|
18
|
+
|
|
19
|
+
:root {
|
|
20
|
+
--calendar-btn-background: inherit;
|
|
21
|
+
--calendar-btn-color: var( --text-secondary );
|
|
22
|
+
--calendar-btn-color-hover: var( --text-primary );
|
|
23
|
+
|
|
24
|
+
--calendar-week-color: var( --accent-background );
|
|
25
|
+
--calendar-week-color-hover: var( --accent-background-hover );
|
|
26
|
+
|
|
27
|
+
--calendard-day-background-hover: var( --accent-background-hover );
|
|
28
|
+
--calendard-day-color-hover: var( --accent-color-hover );
|
|
29
|
+
|
|
30
|
+
--calendar-sel-background: var( --accent-background );
|
|
31
|
+
--calendar-sel-color: var( --accent-color );
|
|
32
|
+
|
|
33
|
+
--calendar-today-background: var( --alert-background );
|
|
34
|
+
--calendar-today-color: var( --alert-color );
|
|
35
|
+
--calendar-today-border: var( --accent-background );
|
|
36
|
+
|
|
37
|
+
--calendar-header-color: var( --text-primary );
|
|
38
|
+
--calendar-out-color: var( --disabled-color-dark );
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.x4calendar {
|
|
42
|
+
border: 1px solid var( --border );
|
|
43
|
+
padding: 4px;
|
|
44
|
+
|
|
45
|
+
.month-sel {
|
|
46
|
+
height: 2em;
|
|
47
|
+
align-items: center;
|
|
48
|
+
padding-left: 2em;
|
|
49
|
+
|
|
50
|
+
.month {
|
|
51
|
+
padding-right: 4px;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.year {
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.month,
|
|
59
|
+
.year {
|
|
60
|
+
cursor: pointer;
|
|
61
|
+
&:hover {
|
|
62
|
+
text-decoration: underline;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.x4label {
|
|
67
|
+
font-weight: bold;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.x4button {
|
|
71
|
+
height: auto;
|
|
72
|
+
background-color: var( --calendar-btn-background );
|
|
73
|
+
color: var( --calendar-btn-color );
|
|
74
|
+
|
|
75
|
+
&:hover {
|
|
76
|
+
color: var( --calendar-btn-color-hover );
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
margin-bottom: 8px;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.week {
|
|
84
|
+
@extend .flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
padding: 2px;
|
|
87
|
+
|
|
88
|
+
.cell {
|
|
89
|
+
@extend .flex;
|
|
90
|
+
min-width: 28px;
|
|
91
|
+
min-height: 28px;
|
|
92
|
+
|
|
93
|
+
color: var( --gray-900 );
|
|
94
|
+
text-align: center;
|
|
95
|
+
|
|
96
|
+
.text {
|
|
97
|
+
@extend .hbox;
|
|
98
|
+
|
|
99
|
+
transition: background-color 0.3s, color 0.3s;
|
|
100
|
+
justify-content: center;
|
|
101
|
+
border: 1px solid transparent;
|
|
102
|
+
margin: auto;
|
|
103
|
+
border-radius: 14px;
|
|
104
|
+
width: 28px;
|
|
105
|
+
height: 28px;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.today {
|
|
110
|
+
.text {
|
|
111
|
+
font-weight: bold;
|
|
112
|
+
background-color: var( --calendar-today-background );
|
|
113
|
+
color: var( --calendar-today-color );
|
|
114
|
+
//border-color: var( --calendar-today-border );
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.selection {
|
|
119
|
+
.text {
|
|
120
|
+
background-color: var( --calendar-sel-background );
|
|
121
|
+
color: var( --calendar-sel-color );
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.weeknum {
|
|
126
|
+
width: 2em;
|
|
127
|
+
color: var( --calendar-week-color );
|
|
128
|
+
font-size: 70%;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
&:hover .weeknum {
|
|
132
|
+
font-weight: bold;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.day {
|
|
136
|
+
cursor: pointer;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.out {
|
|
140
|
+
color: var( --calendar-out-color );
|
|
141
|
+
font-size: 80%;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.day:hover {
|
|
145
|
+
.text {
|
|
146
|
+
background-color: var( --calendard-day-background-hover );
|
|
147
|
+
color: var( --calendard-day-color-hover );
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.header {
|
|
153
|
+
.cell {
|
|
154
|
+
color: var( --calendar-header-color );
|
|
155
|
+
height: 1.5em;
|
|
156
|
+
justify-content: center;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
&:hover {
|
|
160
|
+
background-color: inherit;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -1,53 +1,41 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ___ ___ __
|
|
3
|
-
* \ \/ / / _
|
|
4
|
-
* \ / /_| |_
|
|
5
|
-
* / \____ _|
|
|
6
|
-
* /__/\__\ |_|
|
|
7
|
-
*
|
|
8
|
-
* @file calendar.ts
|
|
9
|
-
* @author Etienne Cochard
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
import
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
import { Component, CProps, ContainerEventMap, Flex } from './component'
|
|
35
|
-
import { EvChange, EventCallback } from './x4events'
|
|
36
|
-
import { Point } from "./tools"
|
|
37
|
-
|
|
38
|
-
import { _tr } from './i18n';
|
|
39
|
-
import { Label } from './label';
|
|
40
|
-
import { HLayout, VLayout } from './layout'
|
|
41
|
-
import { date_hash, date_clone, formatIntlDate } from './tools'
|
|
42
|
-
import { Menu, MenuItem } from './menu';
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
interface CalendarEventMap extends ContainerEventMap {
|
|
1
|
+
/**
|
|
2
|
+
* ___ ___ __
|
|
3
|
+
* \ \/ / / _
|
|
4
|
+
* \ / /_| |_
|
|
5
|
+
* / \____ _|
|
|
6
|
+
* /__/\__\ |_|
|
|
7
|
+
*
|
|
8
|
+
* @file calendar.ts
|
|
9
|
+
* @author Etienne Cochard
|
|
10
|
+
*
|
|
11
|
+
* @copyright (c) 2024 R-libre ingenierie
|
|
12
|
+
*
|
|
13
|
+
* Use of this source code is governed by an MIT-style license
|
|
14
|
+
* that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
|
|
15
|
+
**/
|
|
16
|
+
|
|
17
|
+
import { Component, ComponentEvents, ComponentProps, EvChange, Flex } from '@core/component'
|
|
18
|
+
import { date_clone, date_hash, formatIntlDate, Point, unsafeHtml } from "@core/core_tools"
|
|
19
|
+
import { _tr } from '@core/core_i18n';
|
|
20
|
+
import { EventCallback } from '@core/core_events.js';
|
|
21
|
+
|
|
22
|
+
import { Button } from '../button/button';
|
|
23
|
+
import { Popup } from '../popup/popup';
|
|
24
|
+
import { Label } from '../label/label';
|
|
25
|
+
import { HBox, VBox } from '../boxes/boxes'
|
|
26
|
+
import { Menu, MenuItem } from '../menu/menu';
|
|
27
|
+
|
|
28
|
+
import "./calendar.module.scss"
|
|
29
|
+
import icon_prev from "./chevron-left-sharp-light.svg";
|
|
30
|
+
import icon_today from "./calendar-check-sharp-light.svg";
|
|
31
|
+
import icon_next from "./chevron-right-sharp-light.svg";
|
|
32
|
+
|
|
33
|
+
interface CalendarEventMap extends ComponentEvents {
|
|
46
34
|
change?: EvChange;
|
|
47
35
|
}
|
|
48
36
|
|
|
49
37
|
|
|
50
|
-
interface CalendarProps extends
|
|
38
|
+
interface CalendarProps extends ComponentProps {
|
|
51
39
|
date?: Date; // initial date to display
|
|
52
40
|
minDate?: Date; // minimal date before the user cannot go
|
|
53
41
|
maxDate?: Date; // maximal date after the user cannot go
|
|
@@ -63,7 +51,7 @@ interface CalendarProps extends CProps<CalendarEventMap> {
|
|
|
63
51
|
* EventChange ( value = Date )
|
|
64
52
|
*/
|
|
65
53
|
|
|
66
|
-
export class Calendar extends
|
|
54
|
+
export class Calendar extends VBox<CalendarProps, CalendarEventMap>
|
|
67
55
|
{
|
|
68
56
|
private m_date: Date;
|
|
69
57
|
|
|
@@ -71,12 +59,14 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
71
59
|
super(props);
|
|
72
60
|
|
|
73
61
|
this.mapPropEvents( props, 'change' );
|
|
74
|
-
this.m_date = props.date
|
|
62
|
+
this.m_date = props.date ? date_clone( props.date ) : new Date();
|
|
63
|
+
|
|
64
|
+
this._update( );
|
|
75
65
|
}
|
|
76
66
|
|
|
77
67
|
/** @ignore */
|
|
78
68
|
|
|
79
|
-
|
|
69
|
+
private _update( ) {
|
|
80
70
|
|
|
81
71
|
let month_start = date_clone(this.m_date);
|
|
82
72
|
month_start.setDate(1);
|
|
@@ -89,7 +79,8 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
89
79
|
month_start.setDate(-day + 1 + 1);
|
|
90
80
|
let dte = date_clone(month_start);
|
|
91
81
|
|
|
92
|
-
let
|
|
82
|
+
let selection = date_hash( this.m_date );
|
|
83
|
+
let today = date_hash( new Date() );
|
|
93
84
|
|
|
94
85
|
let month_end = date_clone(this.m_date);
|
|
95
86
|
month_end.setDate(1);
|
|
@@ -98,10 +89,10 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
98
89
|
|
|
99
90
|
let end_of_month = date_hash(month_end);
|
|
100
91
|
|
|
101
|
-
let rows:
|
|
92
|
+
let rows: HBox[] = [];
|
|
102
93
|
|
|
103
94
|
// month selector
|
|
104
|
-
let header = new
|
|
95
|
+
let header = new HBox({
|
|
105
96
|
cls: 'month-sel',
|
|
106
97
|
content: [
|
|
107
98
|
new Label({
|
|
@@ -118,9 +109,10 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
118
109
|
click: () => this._choose('year')
|
|
119
110
|
}
|
|
120
111
|
}),
|
|
121
|
-
new Flex(),
|
|
122
|
-
new Button({
|
|
123
|
-
new Button({
|
|
112
|
+
new Flex( ),
|
|
113
|
+
new Button({ icon: icon_prev, click: () => this._next(false) } ),
|
|
114
|
+
new Button({ icon: icon_today, click: () => this.setDate(new Date()), tooltip: _tr.global.today } ),
|
|
115
|
+
new Button({ icon: icon_next, click: () => this._next(true) } )
|
|
124
116
|
]
|
|
125
117
|
});
|
|
126
118
|
|
|
@@ -131,19 +123,18 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
131
123
|
|
|
132
124
|
// day names
|
|
133
125
|
// empty week num
|
|
134
|
-
day_names.push(new
|
|
126
|
+
day_names.push(new HBox({
|
|
135
127
|
cls: 'weeknum cell',
|
|
136
128
|
}));
|
|
137
129
|
|
|
138
130
|
for (let d = 0; d < 7; d++) {
|
|
139
131
|
day_names.push(new Label({
|
|
140
132
|
cls: 'cell',
|
|
141
|
-
flex: 1,
|
|
142
133
|
text: _tr.global.day_short[(d + 1) % 7]
|
|
143
134
|
}));
|
|
144
135
|
}
|
|
145
136
|
|
|
146
|
-
rows.push(new
|
|
137
|
+
rows.push(new HBox({
|
|
147
138
|
cls: 'week header',
|
|
148
139
|
content: day_names
|
|
149
140
|
}));
|
|
@@ -155,14 +146,18 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
155
146
|
while (date_hash(dte) <= end_of_month) {
|
|
156
147
|
|
|
157
148
|
let days = [
|
|
158
|
-
new
|
|
149
|
+
new HBox({ cls: 'weeknum cell', content: new Component({ tag: 'span', content: formatIntlDate(dte, 'w') }) })
|
|
159
150
|
];
|
|
160
151
|
|
|
161
152
|
// days
|
|
162
153
|
for (let d = 0; d < 7; d++) {
|
|
163
154
|
|
|
164
155
|
let cls = 'cell day';
|
|
165
|
-
if (dte
|
|
156
|
+
if (date_hash(dte) == selection) {
|
|
157
|
+
cls += ' selection';
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (date_hash(dte) == today) {
|
|
166
161
|
cls += ' today';
|
|
167
162
|
}
|
|
168
163
|
|
|
@@ -171,12 +166,12 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
171
166
|
}
|
|
172
167
|
|
|
173
168
|
const mkItem = ( dte: Date ) => {
|
|
174
|
-
return new
|
|
169
|
+
return new HBox({
|
|
175
170
|
cls,
|
|
176
171
|
flex: 1,
|
|
177
172
|
content: new Component({
|
|
178
|
-
|
|
179
|
-
content: formatIntlDate(dte, 'd'),
|
|
173
|
+
cls: "text",
|
|
174
|
+
content: unsafeHtml( `<span>${formatIntlDate(dte, 'd')}</span>` ),
|
|
180
175
|
}),
|
|
181
176
|
dom_events: {
|
|
182
177
|
click: () => this.select(dte)
|
|
@@ -184,13 +179,13 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
184
179
|
})
|
|
185
180
|
}
|
|
186
181
|
|
|
187
|
-
days.push( mkItem( dte
|
|
182
|
+
days.push( mkItem( date_clone( dte ) ) );
|
|
188
183
|
|
|
189
184
|
dte.setDate(dte.getDate() + 1);
|
|
190
185
|
first = false;
|
|
191
186
|
}
|
|
192
187
|
|
|
193
|
-
rows.push(new
|
|
188
|
+
rows.push(new HBox({
|
|
194
189
|
cls: 'week',
|
|
195
190
|
flex: 1,
|
|
196
191
|
content: days
|
|
@@ -207,8 +202,8 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
207
202
|
|
|
208
203
|
private select(date: Date) {
|
|
209
204
|
this.m_date = date;
|
|
210
|
-
this.
|
|
211
|
-
this.
|
|
205
|
+
this.fire('change', {value:date} );
|
|
206
|
+
this._update();
|
|
212
207
|
}
|
|
213
208
|
|
|
214
209
|
/**
|
|
@@ -217,7 +212,7 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
217
212
|
|
|
218
213
|
private _next(n: boolean) {
|
|
219
214
|
this.m_date.setMonth(this.m_date.getMonth() + (n ? 1 : -1));
|
|
220
|
-
this.
|
|
215
|
+
this._update();
|
|
221
216
|
}
|
|
222
217
|
|
|
223
218
|
/**
|
|
@@ -230,22 +225,22 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
230
225
|
|
|
231
226
|
if (type == 'month') {
|
|
232
227
|
for (let m = 0; m < 12; m++) {
|
|
233
|
-
items.push(
|
|
228
|
+
items.push(({
|
|
234
229
|
text: _tr.global.month_long[m],
|
|
235
|
-
click: () => { this.m_date.setMonth(m); this.
|
|
230
|
+
click: () => { this.m_date.setMonth(m); this._update(); }
|
|
236
231
|
}));
|
|
237
232
|
}
|
|
238
233
|
}
|
|
239
234
|
else if (type == 'year') {
|
|
240
235
|
|
|
241
|
-
let min = this.
|
|
242
|
-
let max = this.
|
|
236
|
+
let min = this.props.minDate?.getFullYear() ?? 1900;
|
|
237
|
+
let max = this.props.maxDate?.getFullYear() ?? 2037;
|
|
243
238
|
|
|
244
239
|
for (let m = max; m >= min; m--) {
|
|
245
|
-
items.push(
|
|
240
|
+
items.push({
|
|
246
241
|
text: '' + m,
|
|
247
|
-
click: () => { this.m_date.setFullYear(m); this.
|
|
248
|
-
})
|
|
242
|
+
click: () => { this.m_date.setFullYear(m); this._update(); }
|
|
243
|
+
});
|
|
249
244
|
}
|
|
250
245
|
}
|
|
251
246
|
|
|
@@ -257,19 +252,22 @@ export class Calendar extends VLayout<CalendarProps, CalendarEventMap>
|
|
|
257
252
|
menu.displayAt(rc.left, rc.top);
|
|
258
253
|
}
|
|
259
254
|
|
|
260
|
-
|
|
255
|
+
getDate() {
|
|
261
256
|
return this.m_date;
|
|
262
257
|
}
|
|
263
258
|
|
|
264
|
-
|
|
259
|
+
setDate(date: Date) {
|
|
265
260
|
this.m_date = date;
|
|
266
|
-
this.
|
|
261
|
+
this._update();
|
|
267
262
|
}
|
|
268
263
|
}
|
|
269
264
|
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
|
|
270
268
|
/**
|
|
271
269
|
* default popup calendar
|
|
272
|
-
|
|
270
|
+
* /
|
|
273
271
|
|
|
274
272
|
export class PopupCalendar extends Popup {
|
|
275
273
|
|
|
@@ -308,7 +306,7 @@ export class PopupCalendar extends Popup {
|
|
|
308
306
|
this.close();
|
|
309
307
|
}
|
|
310
308
|
|
|
311
|
-
|
|
309
|
+
/ ** @ignore * /
|
|
312
310
|
show(modal?: boolean, at?: Point ) {
|
|
313
311
|
x4document.addEventListener('mousedown', this._handleClick);
|
|
314
312
|
if( at ) {
|
|
@@ -319,10 +317,10 @@ export class PopupCalendar extends Popup {
|
|
|
319
317
|
}
|
|
320
318
|
}
|
|
321
319
|
|
|
322
|
-
|
|
320
|
+
/ ** @ignore * /
|
|
323
321
|
close() {
|
|
324
322
|
x4document.removeEventListener('mousedown', this._handleClick);
|
|
325
323
|
super.close();
|
|
326
324
|
}
|
|
327
|
-
|
|
328
|
-
|
|
325
|
+
}
|
|
326
|
+
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" fill="currentColor"><!--!Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.--><path d="M9.4 256l11.3-11.3 192-192L224 41.4 246.6 64 235.3 75.3 54.6 256 235.3 436.7 246.6 448 224 470.6l-11.3-11.3-192-192L9.4 256z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" fill="currentColor"><!--!Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.--><path d="M310.6 256l-11.3 11.3-192 192L96 470.6 73.4 448l11.3-11.3L265.4 256 84.7 75.3 73.4 64 96 41.4l11.3 11.3 192 192L310.6 256z"/></svg>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg viewBox="0 0 10 7" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
2
|
+
<path d="M4 4.586L1.707 2.293A1 1 0 1 0 .293 3.707l3 3a.997.997 0 0 0 1.414 0l5-5A1 1 0 1 0 8.293.293L4 4.586z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd">
|
|
3
|
+
</path>
|
|
4
|
+
</svg>
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ___ ___ __
|
|
3
|
+
* \ \/ / / _
|
|
4
|
+
* \ / /_| |_
|
|
5
|
+
* / \____ _|
|
|
6
|
+
* /__/\__\ |_|
|
|
7
|
+
*
|
|
8
|
+
* @file checkbox.module.scss
|
|
9
|
+
* @author Etienne Cochard
|
|
10
|
+
*
|
|
11
|
+
* @copyright (c) 2024 R-libre ingenierie
|
|
12
|
+
*
|
|
13
|
+
* Use of this source code is governed by an MIT-style license
|
|
14
|
+
* that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
|
|
15
|
+
**/
|
|
16
|
+
|
|
17
|
+
@use "../shared.scss";
|
|
18
|
+
|
|
19
|
+
:root {
|
|
20
|
+
--checkbox-background-check: var( --accent-background );
|
|
21
|
+
--checkbox-background-check-hover: var( --accent-background-hover );
|
|
22
|
+
--checkbox-background-disabled: var( --disabled-color );
|
|
23
|
+
--checkbox-background-disabled-check: var( --disabled-background );
|
|
24
|
+
--checkbox-color-disabled: var( --disabled-background );
|
|
25
|
+
--checkbox-check-border: var( --border );
|
|
26
|
+
--checkbox-check-border-hover: var( --border-hover );
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.x4checkbox {
|
|
30
|
+
@extend .hbox;
|
|
31
|
+
|
|
32
|
+
display: flex;
|
|
33
|
+
flex-direction: row;
|
|
34
|
+
align-items: center;
|
|
35
|
+
|
|
36
|
+
margin: 5px;
|
|
37
|
+
padding: 4px;
|
|
38
|
+
gap: 4px;
|
|
39
|
+
cursor: pointer;
|
|
40
|
+
|
|
41
|
+
.inner {
|
|
42
|
+
height: 1rem;
|
|
43
|
+
width: 1rem;
|
|
44
|
+
color: white;
|
|
45
|
+
position: relative;
|
|
46
|
+
order: 1;
|
|
47
|
+
|
|
48
|
+
input {
|
|
49
|
+
appearance: none;
|
|
50
|
+
outline: none;
|
|
51
|
+
|
|
52
|
+
cursor: pointer;
|
|
53
|
+
display: block;
|
|
54
|
+
margin: 0;
|
|
55
|
+
padding: 0;
|
|
56
|
+
left: 0;
|
|
57
|
+
top: 0;
|
|
58
|
+
width: 100%;
|
|
59
|
+
height: 100%;
|
|
60
|
+
transition: opacity .1s ease;
|
|
61
|
+
|
|
62
|
+
&:checked {
|
|
63
|
+
background-color: var( --checkbox-background-check );
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&:checked:hover {
|
|
67
|
+
background-color: var( --checkbox-background-check-hover );
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
&:not(:checked) {
|
|
71
|
+
border: 1px solid var( --checkbox-check-border );
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
&:not(:checked):hover {
|
|
75
|
+
border: 1px solid var( --checkbox-check-border-hover );
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
svg {
|
|
80
|
+
margin: auto;
|
|
81
|
+
pointer-events: none;
|
|
82
|
+
position: absolute;
|
|
83
|
+
opacity: 0;
|
|
84
|
+
left: 0;
|
|
85
|
+
right: 0;
|
|
86
|
+
top: 0;
|
|
87
|
+
bottom: 0;
|
|
88
|
+
width: 100%;
|
|
89
|
+
height: 50%;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
&:has(input:checked) {
|
|
93
|
+
input {
|
|
94
|
+
opacity: 1;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
svg {
|
|
98
|
+
opacity: 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
&:focus-within {
|
|
104
|
+
label #text {
|
|
105
|
+
text-decoration: underline;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
&[disabled] {
|
|
110
|
+
&, * {
|
|
111
|
+
cursor: not-allowed;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
label {
|
|
115
|
+
|
|
116
|
+
pointer-events: none;
|
|
117
|
+
color: var( --checkbox-color-disabled );
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.inner {
|
|
121
|
+
pointer-events: none;
|
|
122
|
+
input {
|
|
123
|
+
background-color: var( --checkbox-background-disabled );
|
|
124
|
+
|
|
125
|
+
&:checked {
|
|
126
|
+
background-color: var( --checkbox-background-disabled-check );
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
label {
|
|
133
|
+
text-align: right;
|
|
134
|
+
cursor: inherit;
|
|
135
|
+
order: 2;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
&.left #label {
|
|
139
|
+
order: 0;
|
|
140
|
+
text-align: left;
|
|
141
|
+
}
|
|
142
|
+
}
|