5htp-core 0.4.1 → 0.4.2
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/package.json +2 -3
- package/src/client/app/index.ts +8 -7
- package/src/client/assets/css/components/button.less +13 -9
- package/src/client/assets/css/components/table.less +13 -1
- package/src/client/assets/css/core.less +0 -1
- package/src/client/assets/css/text/text.less +1 -2
- package/src/client/assets/css/utils/layouts.less +8 -0
- package/src/client/components/Form.ts +7 -1
- package/src/client/components/Select/index.tsx +14 -2
- package/src/client/components/Table/index.tsx +56 -80
- package/src/client/components/containers/Popover/index.tsx +2 -2
- package/src/client/components/input/Checkbox/index.tsx +6 -4
- package/src/client/components/inputv3/date/Calendar.css +156 -0
- package/src/client/components/inputv3/date/Clock.css +62 -0
- package/src/client/components/inputv3/date/DateTimePicker.css +132 -0
- package/src/client/components/inputv3/date/index.tsx +9 -9
- package/src/client/components/inputv3/index.tsx +36 -38
- package/src/client/services/router/index.tsx +3 -2
- package/src/client/services/router/request/api.ts +27 -10
- package/src/client/services/router/request/index.ts +0 -8
- package/src/common/router/layouts.ts +3 -2
- package/src/common/validation/schema.ts +2 -5
- package/src/common/validation/validators.ts +5 -6
- package/src/server/services/database/index.ts +2 -2
- package/src/server/services/router/response/index.ts +0 -0
- package/src/server/services/router/response/page/document.tsx +4 -6
- package/src/client/assets/fonts/Inter.zip +0 -0
- package/src/client/assets/fonts/Lato/index.less +0 -71
- package/src/client/assets/fonts/Lato/latin-400.woff2 +0 -0
- package/src/client/assets/fonts/Lato/latin-700.woff2 +0 -0
- package/src/client/assets/fonts/Lato/latin-900.woff2 +0 -0
- package/src/client/assets/fonts/Lato/latin-ext-400.woff2 +0 -0
- package/src/client/assets/fonts/Lato/latin-ext-700.woff2 +0 -0
- package/src/client/assets/fonts/Lato/latin-ext-900.woff2 +0 -0
- package/src/client/assets/fonts/Oswald.zip +0 -0
- package/src/client/components/inputv3/date/react-calendar.less +0 -143
- package/src/client/components/inputv3/date/react-daterange-picker.less +0 -112
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "5htp-core",
|
|
3
3
|
"description": "Convenient TypeScript framework designed for Performance and Productivity.",
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.2",
|
|
5
5
|
"author": "Gaetan Le Gac (https://github.com/gaetanlegac)",
|
|
6
6
|
"repository": "git://github.com/gaetanlegac/5htp-core.git",
|
|
7
7
|
"license": "MIT",
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"framework"
|
|
14
14
|
],
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@wojtekmaj/react-daterange-picker": "^5.0.2",
|
|
17
16
|
"accepts": "^1.3.7",
|
|
18
17
|
"activity-detector": "^3.0.0",
|
|
19
18
|
"ansi-to-html": "^0.7.1",
|
|
@@ -65,7 +64,7 @@
|
|
|
65
64
|
"picomatch": "^2.3.1",
|
|
66
65
|
"preact": "^10.5.15",
|
|
67
66
|
"preact-render-to-string": "^5.1.19",
|
|
68
|
-
"react-datetime-picker": "^5.0
|
|
67
|
+
"react-datetime-picker": "^5.6.0",
|
|
69
68
|
"react-scrollbars-custom": "^4.0.27",
|
|
70
69
|
"react-slider": "^2.0.1",
|
|
71
70
|
"react-textarea-autosize": "^8.3.3",
|
package/src/client/app/index.ts
CHANGED
|
@@ -88,13 +88,13 @@ export default abstract class Application {
|
|
|
88
88
|
public bindErrorHandlers() {
|
|
89
89
|
|
|
90
90
|
// Impossible de recup le stacktrace ...
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
});*/
|
|
91
|
+
window.addEventListener("unhandledrejection", (e) => {
|
|
92
|
+
const error = new Error(e.reason); // How to get stacktrace ?
|
|
93
|
+
this.handleError(error);
|
|
94
|
+
});
|
|
96
95
|
|
|
97
|
-
window.onerror = (message, file, line, col, stacktrace) =>
|
|
96
|
+
window.onerror = (message, file, line, col, stacktrace) => {
|
|
97
|
+
console.error(`Exception catched by method B`, message);
|
|
98
98
|
this.reportBug({
|
|
99
99
|
stacktrace: stacktrace?.stack || JSON.stringify({ message, file, line, col })
|
|
100
100
|
}).then(() => {
|
|
@@ -106,9 +106,10 @@ export default abstract class Application {
|
|
|
106
106
|
{ autohide: false });*/
|
|
107
107
|
|
|
108
108
|
})
|
|
109
|
+
}
|
|
109
110
|
}
|
|
110
111
|
|
|
111
|
-
public abstract handleError( error: CoreError | Error
|
|
112
|
+
public abstract handleError( error: CoreError | Error );
|
|
112
113
|
|
|
113
114
|
// TODO: move on app side
|
|
114
115
|
public reportBug = (infos: TBugReportInfos) => fetch('/feedback/bug/ui', {
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
z-index: 1; // Make the label on top of ::before for example
|
|
70
70
|
|
|
71
71
|
// Handle overflow
|
|
72
|
-
white-space: nowrap;
|
|
72
|
+
//white-space: nowrap;
|
|
73
73
|
text-overflow: ellipsis;
|
|
74
74
|
overflow: hidden;
|
|
75
75
|
|
|
@@ -169,6 +169,9 @@
|
|
|
169
169
|
|
|
170
170
|
> .label {
|
|
171
171
|
flex-direction: column;
|
|
172
|
+
|
|
173
|
+
white-space: normal;
|
|
174
|
+
text-align: center;
|
|
172
175
|
}
|
|
173
176
|
}
|
|
174
177
|
|
|
@@ -246,7 +249,7 @@ ul.row {
|
|
|
246
249
|
|
|
247
250
|
> .label {
|
|
248
251
|
|
|
249
|
-
|
|
252
|
+
visibility: hidden;
|
|
250
253
|
position: absolute;
|
|
251
254
|
|
|
252
255
|
background: #111;
|
|
@@ -261,7 +264,7 @@ ul.row {
|
|
|
261
264
|
}
|
|
262
265
|
|
|
263
266
|
&:not([disabled]):hover > .label {
|
|
264
|
-
|
|
267
|
+
visibility: visible;
|
|
265
268
|
}
|
|
266
269
|
}
|
|
267
270
|
}
|
|
@@ -277,15 +280,15 @@ ul.row {
|
|
|
277
280
|
position: relative;
|
|
278
281
|
|
|
279
282
|
// Submenu
|
|
280
|
-
&:not(:hover) > .btn + .menu,
|
|
283
|
+
&:not(.contPopover):not(:hover) > .btn + .menu,
|
|
281
284
|
> .btn[disabled] + .menu {
|
|
282
|
-
|
|
285
|
+
visibility: hidden;
|
|
283
286
|
}
|
|
284
287
|
}
|
|
285
288
|
|
|
286
289
|
&.menu > li {
|
|
287
290
|
&:hover > .btn:not([disabled]):hover > .label {
|
|
288
|
-
|
|
291
|
+
visibility: visible;
|
|
289
292
|
}
|
|
290
293
|
}
|
|
291
294
|
|
|
@@ -319,7 +322,7 @@ ul.col {
|
|
|
319
322
|
}
|
|
320
323
|
|
|
321
324
|
&:not([disabled]):hover > .label {
|
|
322
|
-
|
|
325
|
+
visibility: visible;
|
|
323
326
|
}
|
|
324
327
|
}
|
|
325
328
|
}
|
|
@@ -373,15 +376,16 @@ ul.col {
|
|
|
373
376
|
|
|
374
377
|
// Submenu
|
|
375
378
|
ul.row {
|
|
379
|
+
|
|
376
380
|
.btn.icon > .label,
|
|
377
381
|
> li > .btn + .menu {
|
|
378
382
|
bottom: 100%;
|
|
379
|
-
margin-bottom:
|
|
383
|
+
margin-bottom: 0; // User's mouse shouldnt go outside the li so the hover state is not lost
|
|
380
384
|
}
|
|
381
385
|
|
|
382
386
|
> li > .btn + .menu.pos-bottom {
|
|
383
387
|
bottom: auto;
|
|
384
388
|
top: 100%;
|
|
385
|
-
margin-
|
|
389
|
+
margin-top: 0; // User's mouse shouldnt go outside the li so the hover state is not lost
|
|
386
390
|
}
|
|
387
391
|
}
|
|
@@ -9,7 +9,7 @@ table {
|
|
|
9
9
|
width: 100%;
|
|
10
10
|
padding: 0;
|
|
11
11
|
border-collapse: separate;
|
|
12
|
-
border-spacing: 0 0
|
|
12
|
+
border-spacing: 0 0; // must be fully managed by padding
|
|
13
13
|
|
|
14
14
|
// By default, chrome disables text inherits
|
|
15
15
|
line-height: inherit;
|
|
@@ -25,6 +25,10 @@ table {
|
|
|
25
25
|
padding: 1em 1em;
|
|
26
26
|
text-align: left;
|
|
27
27
|
|
|
28
|
+
+ td, th {
|
|
29
|
+
border-left: solid 1px #F5F5F5
|
|
30
|
+
}
|
|
31
|
+
|
|
28
32
|
&:first-child {
|
|
29
33
|
padding-left: 2em;
|
|
30
34
|
}
|
|
@@ -48,6 +52,14 @@ table {
|
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
|
|
55
|
+
// Size
|
|
56
|
+
&.s, .table.s & {
|
|
57
|
+
td, th {
|
|
58
|
+
padding: 0.7em 1em;
|
|
59
|
+
font-size: 1rem;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
51
63
|
// Tableua responsive
|
|
52
64
|
// Utilisation déconseillée (lauvaise utilisation de l'espace, ergonomie horrible
|
|
53
65
|
/*@media (max-width: @responsive2) {
|
|
@@ -28,6 +28,14 @@
|
|
|
28
28
|
|
|
29
29
|
.scrollable {
|
|
30
30
|
overflow: auto;
|
|
31
|
+
-ms-overflow-style: none; /* IE and Edge */
|
|
32
|
+
scrollbar-width: none; /* Firefox */
|
|
33
|
+
|
|
34
|
+
/* For Chrome, Safari, and other WebKit-based browsers */
|
|
35
|
+
&::-webkit-scrollbar {
|
|
36
|
+
display: none;
|
|
37
|
+
}
|
|
38
|
+
|
|
31
39
|
}
|
|
32
40
|
|
|
33
41
|
.row {
|
|
@@ -225,7 +225,13 @@ export default function useForm<TFormData extends {}>(
|
|
|
225
225
|
const form = {
|
|
226
226
|
fields: fields.current,
|
|
227
227
|
data,
|
|
228
|
-
set:
|
|
228
|
+
set: data => {
|
|
229
|
+
setState(current => ({
|
|
230
|
+
...current,
|
|
231
|
+
hasChanged: true
|
|
232
|
+
}));
|
|
233
|
+
setData(data);
|
|
234
|
+
},
|
|
229
235
|
validate,
|
|
230
236
|
submit,
|
|
231
237
|
options,
|
|
@@ -64,7 +64,7 @@ export default ({
|
|
|
64
64
|
noneSelection,
|
|
65
65
|
enableSearch,
|
|
66
66
|
value: current,
|
|
67
|
-
onChange,
|
|
67
|
+
onChange: onChangeCallback,
|
|
68
68
|
multiple,
|
|
69
69
|
dropdown,
|
|
70
70
|
...otherProps
|
|
@@ -136,6 +136,18 @@ export default ({
|
|
|
136
136
|
typeof initChoices === 'function' ? true : initChoices
|
|
137
137
|
]);
|
|
138
138
|
|
|
139
|
+
const onChange = (...args) => {
|
|
140
|
+
|
|
141
|
+
if (onChangeCallback) {
|
|
142
|
+
onChangeCallback(...args);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Close the popover
|
|
146
|
+
if (popoverState[1] && !multiple) {
|
|
147
|
+
popoverState[1](false);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
139
151
|
/*----------------------------------
|
|
140
152
|
- RENDER
|
|
141
153
|
----------------------------------*/
|
|
@@ -168,7 +180,7 @@ export default ({
|
|
|
168
180
|
|
|
169
181
|
return dropdown ? (
|
|
170
182
|
<Popover content={(
|
|
171
|
-
<div class="card col">
|
|
183
|
+
<div class="card col al-top">
|
|
172
184
|
|
|
173
185
|
<div class="col">
|
|
174
186
|
|
|
@@ -7,15 +7,15 @@ import React from 'react';
|
|
|
7
7
|
import { ComponentChild } from 'preact';
|
|
8
8
|
|
|
9
9
|
// Composants
|
|
10
|
-
import Button, { Props as
|
|
11
|
-
import
|
|
12
|
-
|
|
10
|
+
import Button, { Props as TButtonProps } from '@client/components/button';
|
|
11
|
+
import Popover from '../containers/Popover';
|
|
12
|
+
import Checkbox from '../input/Checkbox';
|
|
13
13
|
|
|
14
14
|
/*----------------------------------
|
|
15
15
|
- TYPES
|
|
16
16
|
----------------------------------*/
|
|
17
17
|
|
|
18
|
-
export type TDonneeInconnue = {[cle: string]: any};
|
|
18
|
+
export type TDonneeInconnue = { id: any } & {[cle: string]: any};
|
|
19
19
|
|
|
20
20
|
export type Props<TRow> = {
|
|
21
21
|
|
|
@@ -36,6 +36,13 @@ export type TColumn = {
|
|
|
36
36
|
class?: string
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
export type TAction<TRow> = Omit<TButtonProps, 'onClick'> & {
|
|
40
|
+
onClick: (row: TRow) => void,
|
|
41
|
+
label: ComponentChild,
|
|
42
|
+
multi?: boolean,
|
|
43
|
+
default?: boolean,
|
|
44
|
+
}
|
|
45
|
+
|
|
39
46
|
/*----------------------------------
|
|
40
47
|
- COMPOSANTS
|
|
41
48
|
----------------------------------*/
|
|
@@ -55,101 +62,77 @@ export default function Liste<TRow extends TDonneeInconnue>({
|
|
|
55
62
|
);
|
|
56
63
|
|
|
57
64
|
const [selection, setSelection] = React.useState<number[]>([]);
|
|
58
|
-
const [sort, setSort] = React.useState<{ col: number, dir: 1 | -1 } | null>(null);
|
|
59
|
-
|
|
60
|
-
const trier = (colonne: TColumn, iColonne: number) => {
|
|
61
|
-
|
|
62
|
-
if (!setData)
|
|
63
|
-
return console.warn(`[ui][table] Please specify a setData function to enable sorting features.`);
|
|
64
|
-
|
|
65
|
-
const ordre = sort && iColonne === sort.col
|
|
66
|
-
? -1 * sort.dir as (1 | -1) // Inversement ordre
|
|
67
|
-
: 1;
|
|
68
|
-
|
|
69
|
-
setData([
|
|
70
|
-
...rows.sort((a: TRow, b: TRow) => {
|
|
71
|
-
|
|
72
|
-
const valA = colonne.valeur(a);
|
|
73
|
-
const valB = colonne.valeur(b);
|
|
74
|
-
|
|
75
|
-
const typeA = typeof valA;
|
|
76
|
-
const typeB = typeof valB;
|
|
77
|
-
|
|
78
|
-
if (typeA === 'number' && typeB === 'number')
|
|
79
|
-
return ordre === 1 ? (valA as number) - (valB as number) : (valB as number) - (valA as number)
|
|
80
|
-
else if (typeA === 'string' && typeB === 'string')
|
|
81
|
-
return ordre === 1
|
|
82
|
-
? (valA as string).localeCompare(valB as string)
|
|
83
|
-
: (valB as string).localeCompare(valA as string)
|
|
84
|
-
else
|
|
85
|
-
throw new Error(`Type de données incompatible entre deux lignes: ${valA}:${typeA} vs ${valB}:${typeB}.`);
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
})
|
|
89
|
-
]);
|
|
90
|
-
|
|
91
|
-
setSort({ col: iColonne, dir: ordre });
|
|
92
|
-
}
|
|
93
|
-
|
|
94
65
|
const selectionMultiple = actions && actions.some((action) => action.multi);
|
|
95
66
|
|
|
67
|
+
const defaultAction = actions && actions.find((action) => action.default);
|
|
68
|
+
|
|
96
69
|
/*----------------------------------
|
|
97
70
|
- RENDU COLONNES / LIGNES
|
|
98
71
|
----------------------------------*/
|
|
99
72
|
let renduColonnes: ComponentChild[] = [];
|
|
100
73
|
|
|
101
74
|
const renduLignes = rows.map((row: TRow, iDonnee: number) => (
|
|
102
|
-
<tr
|
|
103
|
-
|
|
75
|
+
<tr {...defaultAction ? {
|
|
76
|
+
onClick: () => defaultAction.onClick(row),
|
|
77
|
+
class: 'clickable'
|
|
78
|
+
} : {}}>
|
|
79
|
+
{selectionMultiple && (
|
|
104
80
|
<td>
|
|
105
81
|
<Checkbox
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
valeur={selection.includes(iDonnee)}
|
|
82
|
+
id={"selectionner" + iDonnee}
|
|
83
|
+
value={selection.includes(row.id)}
|
|
109
84
|
onChange={(selectionner: boolean) => {
|
|
110
|
-
setSelection(selectionner
|
|
85
|
+
setSelection(current => selectionner
|
|
111
86
|
// Ajoute
|
|
112
|
-
? [...
|
|
87
|
+
? [...current, row.id]
|
|
113
88
|
// Retire
|
|
114
|
-
:
|
|
89
|
+
: current.filter((currentId, i) => currentId !== row.id))
|
|
115
90
|
}}
|
|
116
91
|
/>
|
|
117
92
|
</td>
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
{columns(row, rows, iDonnee).map((colonne, iColonne) => {
|
|
93
|
+
)}
|
|
121
94
|
|
|
122
|
-
|
|
95
|
+
{columns(row, rows, iDonnee).map((col) => {
|
|
123
96
|
|
|
124
97
|
if (iDonnee === 0) renduColonnes.push(
|
|
125
|
-
<th
|
|
126
|
-
|
|
127
|
-
className={triable !== undefined ? 'cliquable' : undefined}
|
|
128
|
-
>
|
|
129
|
-
{colonne.label}
|
|
98
|
+
<th>
|
|
99
|
+
{col.label}
|
|
130
100
|
</th>
|
|
131
101
|
);
|
|
132
102
|
|
|
133
|
-
const affichageBrut = ['number', 'string'].includes(typeof
|
|
103
|
+
const affichageBrut = ['number', 'string'].includes(typeof col.cell) || React.isValidElement(col.cell);
|
|
134
104
|
|
|
135
|
-
let classe =
|
|
136
|
-
if (typeof
|
|
105
|
+
let classe = col.class || '';
|
|
106
|
+
if (typeof col.raw === 'number')
|
|
137
107
|
classe += 'txtRight';
|
|
138
108
|
|
|
139
109
|
return (
|
|
140
110
|
<td class={classe}>
|
|
141
|
-
{affichageBrut ?
|
|
111
|
+
{affichageBrut ? col.cell : JSON.stringify(col.cell)}
|
|
142
112
|
</td>
|
|
143
113
|
)
|
|
144
114
|
})}
|
|
145
115
|
|
|
146
|
-
{
|
|
116
|
+
{actions !== undefined && (
|
|
147
117
|
<td>
|
|
148
|
-
<Popover
|
|
149
|
-
<
|
|
118
|
+
<Popover content={(
|
|
119
|
+
<ul class="col menu card bg white">
|
|
120
|
+
{actions.map(({ label, onClick, ...props }: TAction<TRow>) => (
|
|
121
|
+
<li>
|
|
122
|
+
<Button {...props}
|
|
123
|
+
onClick={() => onClick && onClick(row)}
|
|
124
|
+
|
|
125
|
+
>
|
|
126
|
+
{label}
|
|
127
|
+
</Button>
|
|
128
|
+
</li>
|
|
129
|
+
))}
|
|
130
|
+
</ul>
|
|
131
|
+
)}>
|
|
132
|
+
<Button size="s" icon="solid/ellipsis-h" />
|
|
150
133
|
</Popover>
|
|
151
134
|
</td>
|
|
152
|
-
)
|
|
135
|
+
)}
|
|
153
136
|
</tr>
|
|
154
137
|
));
|
|
155
138
|
|
|
@@ -170,11 +153,9 @@ export default function Liste<TRow extends TDonneeInconnue>({
|
|
|
170
153
|
{selectionMultiple && (
|
|
171
154
|
<th>
|
|
172
155
|
<Checkbox
|
|
173
|
-
|
|
174
|
-
label={false}
|
|
175
|
-
valeur={selection.length >= rows.length}
|
|
156
|
+
value={selection.length >= rows.length}
|
|
176
157
|
onChange={(status: boolean) => {
|
|
177
|
-
setSelection(status ?
|
|
158
|
+
setSelection(status ? rows.map(r => r.id) : []);
|
|
178
159
|
}}
|
|
179
160
|
/>
|
|
180
161
|
</th>
|
|
@@ -197,24 +178,19 @@ export default function Liste<TRow extends TDonneeInconnue>({
|
|
|
197
178
|
<div className="card pdv-05 row inline pos_bottom">
|
|
198
179
|
<strong>{selection.length} selected items</strong>
|
|
199
180
|
|
|
200
|
-
{actions.map((
|
|
181
|
+
{actions.map(({ label, multi, onClick, ...props }: TAction<TRow>) => {
|
|
201
182
|
|
|
202
|
-
if (!
|
|
183
|
+
if (!multi)
|
|
203
184
|
return;
|
|
204
185
|
|
|
205
|
-
const
|
|
186
|
+
const selectedRows = selection.map((index: number) => rows[index]);
|
|
206
187
|
|
|
207
188
|
return (
|
|
208
189
|
<Button
|
|
209
|
-
{...
|
|
210
|
-
|
|
211
|
-
: action.bouton(row, iDonnee)
|
|
212
|
-
) : {})}
|
|
213
|
-
icone={action.icone}
|
|
214
|
-
onClick={() => action.onClick && action.onClick(donneesSelection, selection)}
|
|
215
|
-
lien={action.lien && action.lien(donneesSelection, selection)}
|
|
190
|
+
{...props}
|
|
191
|
+
onClick={() => onClick && onClick(selectedRows)}
|
|
216
192
|
>
|
|
217
|
-
{
|
|
193
|
+
{label}
|
|
218
194
|
</Button>
|
|
219
195
|
)
|
|
220
196
|
})}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
// Npm
|
|
6
6
|
import React from 'react';
|
|
7
|
-
import { JSX, ComponentChild } from 'preact';
|
|
7
|
+
import { JSX, ComponentChild, VNode } from 'preact';
|
|
8
8
|
import type { StateUpdater } from 'preact/hooks';
|
|
9
9
|
|
|
10
10
|
// Libs
|
|
@@ -20,7 +20,7 @@ export type Props = JSX.HTMLAttributes<HTMLDivElement> & {
|
|
|
20
20
|
id?: string,
|
|
21
21
|
|
|
22
22
|
// Display
|
|
23
|
-
content?:
|
|
23
|
+
content?: ComponentChild,
|
|
24
24
|
state?: [boolean, StateUpdater<boolean>],
|
|
25
25
|
width?: number | string,
|
|
26
26
|
disable?: boolean
|
|
@@ -14,7 +14,7 @@ import { useInput, InputBaseProps } from '../../inputv3/base';
|
|
|
14
14
|
----------------------------------*/
|
|
15
15
|
export type Props = {
|
|
16
16
|
id: string,
|
|
17
|
-
label
|
|
17
|
+
label?: ComponentChild,
|
|
18
18
|
// State
|
|
19
19
|
inputRef?: React.Ref<HTMLInputElement>
|
|
20
20
|
}
|
|
@@ -68,9 +68,11 @@ export default ({
|
|
|
68
68
|
{...fieldProps}
|
|
69
69
|
/>
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
{
|
|
73
|
-
|
|
71
|
+
{labelText !== undefined && (
|
|
72
|
+
<label htmlFor={id} class="col-1 txt-left">
|
|
73
|
+
{labelText}
|
|
74
|
+
</label>
|
|
75
|
+
)}
|
|
74
76
|
|
|
75
77
|
</div>
|
|
76
78
|
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
.react-calendar {
|
|
2
|
+
width: 350px;
|
|
3
|
+
max-width: 100%;
|
|
4
|
+
background: white;
|
|
5
|
+
border: 1px solid #a0a096;
|
|
6
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
7
|
+
line-height: 1.125em;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.react-calendar--doubleView {
|
|
11
|
+
width: 700px;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.react-calendar--doubleView .react-calendar__viewContainer {
|
|
15
|
+
display: flex;
|
|
16
|
+
margin: -0.5em;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.react-calendar--doubleView .react-calendar__viewContainer > * {
|
|
20
|
+
width: 50%;
|
|
21
|
+
margin: 0.5em;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.react-calendar,
|
|
25
|
+
.react-calendar *,
|
|
26
|
+
.react-calendar *:before,
|
|
27
|
+
.react-calendar *:after {
|
|
28
|
+
-moz-box-sizing: border-box;
|
|
29
|
+
-webkit-box-sizing: border-box;
|
|
30
|
+
box-sizing: border-box;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.react-calendar button {
|
|
34
|
+
margin: 0;
|
|
35
|
+
border: 0;
|
|
36
|
+
outline: none;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.react-calendar button:enabled:hover {
|
|
40
|
+
cursor: pointer;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.react-calendar__navigation {
|
|
44
|
+
display: flex;
|
|
45
|
+
height: 44px;
|
|
46
|
+
margin-bottom: 1em;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.react-calendar__navigation button {
|
|
50
|
+
min-width: 44px;
|
|
51
|
+
background: none;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.react-calendar__navigation button:disabled {
|
|
55
|
+
background-color: #f0f0f0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.react-calendar__navigation button:enabled:hover,
|
|
59
|
+
.react-calendar__navigation button:enabled:focus {
|
|
60
|
+
background-color: #e6e6e6;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.react-calendar__month-view__weekdays {
|
|
64
|
+
text-align: center;
|
|
65
|
+
text-transform: uppercase;
|
|
66
|
+
font: inherit;
|
|
67
|
+
font-size: 0.75em;
|
|
68
|
+
font-weight: bold;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.react-calendar__month-view__weekdays__weekday {
|
|
72
|
+
padding: 0.5em;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.react-calendar__month-view__weekNumbers .react-calendar__tile {
|
|
76
|
+
display: flex;
|
|
77
|
+
align-items: center;
|
|
78
|
+
justify-content: center;
|
|
79
|
+
font: inherit;
|
|
80
|
+
font-size: 0.75em;
|
|
81
|
+
font-weight: bold;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.react-calendar__month-view__days__day--weekend {
|
|
85
|
+
color: #d10000;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.react-calendar__month-view__days__day--neighboringMonth,
|
|
89
|
+
.react-calendar__decade-view__years__year--neighboringDecade,
|
|
90
|
+
.react-calendar__century-view__decades__decade--neighboringCentury {
|
|
91
|
+
color: #757575;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.react-calendar__year-view .react-calendar__tile,
|
|
95
|
+
.react-calendar__decade-view .react-calendar__tile,
|
|
96
|
+
.react-calendar__century-view .react-calendar__tile {
|
|
97
|
+
padding: 2em 0.5em;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.react-calendar__tile {
|
|
101
|
+
max-width: 100%;
|
|
102
|
+
padding: 10px 6.6667px;
|
|
103
|
+
background: none;
|
|
104
|
+
text-align: center;
|
|
105
|
+
line-height: 16px;
|
|
106
|
+
font: inherit;
|
|
107
|
+
font-size: 0.833em;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.react-calendar__tile:disabled {
|
|
111
|
+
background-color: #f0f0f0;
|
|
112
|
+
color: #ababab;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.react-calendar__month-view__days__day--neighboringMonth:disabled,
|
|
116
|
+
.react-calendar__decade-view__years__year--neighboringDecade:disabled,
|
|
117
|
+
.react-calendar__century-view__decades__decade--neighboringCentury:disabled {
|
|
118
|
+
color: #cdcdcd;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.react-calendar__tile:enabled:hover,
|
|
122
|
+
.react-calendar__tile:enabled:focus {
|
|
123
|
+
background-color: #e6e6e6;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.react-calendar__tile--now {
|
|
127
|
+
background: #ffff76;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.react-calendar__tile--now:enabled:hover,
|
|
131
|
+
.react-calendar__tile--now:enabled:focus {
|
|
132
|
+
background: #ffffa9;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.react-calendar__tile--hasActive {
|
|
136
|
+
background: #76baff;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.react-calendar__tile--hasActive:enabled:hover,
|
|
140
|
+
.react-calendar__tile--hasActive:enabled:focus {
|
|
141
|
+
background: #a9d4ff;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.react-calendar__tile--active {
|
|
145
|
+
background: #006edc;
|
|
146
|
+
color: white;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.react-calendar__tile--active:enabled:hover,
|
|
150
|
+
.react-calendar__tile--active:enabled:focus {
|
|
151
|
+
background: #1087ff;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.react-calendar--selectRange .react-calendar__tile--hover {
|
|
155
|
+
background-color: #e6e6e6;
|
|
156
|
+
}
|