ywana-core8 0.0.573 → 0.0.574
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/dist/index.cjs +17 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1 -0
- package/dist/index.css.map +1 -1
- package/dist/index.modern.js +18 -7
- package/dist/index.modern.js.map +1 -1
- package/dist/index.umd.js +17 -6
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/domain/CollectionPage.css +1 -0
- package/src/domain2/Content.js +33 -0
- package/src/domain2/ContentFilters.js +74 -0
- package/src/domain2/ContentPage.js +96 -0
- package/src/domain2/FORMATS.js +15 -0
- package/src/domain2/TYPES.js +11 -0
- package/src/widgets/planner/Planner.js +16 -17
package/package.json
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
import { FORMATS } from "./FORMATS";
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Content
|
5
|
+
*/
|
6
|
+
class Content {
|
7
|
+
|
8
|
+
constructor(schema, value) {
|
9
|
+
this.schema = schema;
|
10
|
+
this.value = value;
|
11
|
+
}
|
12
|
+
|
13
|
+
}
|
14
|
+
|
15
|
+
const ADDRESS_SCHEMA = {
|
16
|
+
id : { type: TYPES.STRING },
|
17
|
+
street : { type: TYPES.STRING, default: '' },
|
18
|
+
city : { type: TYPES.STRING, default: '' },
|
19
|
+
state : { type: TYPES.STRING, default: '' },
|
20
|
+
zip : { type: TYPES.STRING, default: '' },
|
21
|
+
country: { type: TYPES.STRING, default: '' },
|
22
|
+
}
|
23
|
+
|
24
|
+
const PERSON_SCHEMA = {
|
25
|
+
id : { type: TYPES.STRING },
|
26
|
+
name : { type: TYPES.STRING , format: FORMATS.NONE, label: 'Name' },
|
27
|
+
address : { type: TYPES.ENTITY, item: ADDRESS_SCHEMA, format: FORMATS.NONE, label: 'Address' },
|
28
|
+
age : { type: TYPES.NUMBER , format: FORMATS.NONE, label: 'Age' , default: 0 },
|
29
|
+
married : { type: TYPES.BOOLEAN , format: FORMATS.NONE, label: 'Married' , default: false },
|
30
|
+
children: { type: TYPES.ARRAY , item: TYPES.STRING , format: FORMATS.NONE, label: 'Children', default: [] },
|
31
|
+
}
|
32
|
+
|
33
|
+
const person = new Content(PERSON_SCHEMA, {})
|
@@ -0,0 +1,74 @@
|
|
1
|
+
export const ContentFilters = (props) => {
|
2
|
+
|
3
|
+
const [pageContext, setPageContext] = useContext(PageContext)
|
4
|
+
const { filters } = pageContext
|
5
|
+
const { schema, onSave } = props
|
6
|
+
const [form, setForm] = useState({})
|
7
|
+
|
8
|
+
const filterSchema = useMemo(() => {
|
9
|
+
const filterSchema = Object.assign({}, schema)
|
10
|
+
for (var key in filterSchema) {
|
11
|
+
if (filterSchema[key].filter === false) {
|
12
|
+
delete filterSchema[key]
|
13
|
+
} else {
|
14
|
+
if (filterSchema[key].type === TYPES.ENTITY) {
|
15
|
+
const fs = filterSchema[key].item
|
16
|
+
for (var key in fs) {
|
17
|
+
if (fs[key].filter === false) delete fs[key]
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
//Object.values(filterSchema).forEach(field => field.section = null)
|
23
|
+
delete filterSchema.flows
|
24
|
+
return filterSchema
|
25
|
+
}, [schema])
|
26
|
+
|
27
|
+
const likes = useMemo(() => {
|
28
|
+
const fields = Object.values(schema)
|
29
|
+
return fields.reduce((likes, field) => {
|
30
|
+
if (field.like === true) likes.push(field.id)
|
31
|
+
return likes
|
32
|
+
}, [])
|
33
|
+
}, [schema])
|
34
|
+
|
35
|
+
useEffect(() => {
|
36
|
+
if (filters) setForm(filters)
|
37
|
+
}, [filters])
|
38
|
+
|
39
|
+
useEffect(() => {
|
40
|
+
reload()
|
41
|
+
}, [form])
|
42
|
+
|
43
|
+
async function change(next) {
|
44
|
+
setForm(next)
|
45
|
+
}
|
46
|
+
|
47
|
+
async function reload() {
|
48
|
+
await pageContext.load(form, likes)
|
49
|
+
setPageContext(Object.assign({}, pageContext))
|
50
|
+
}
|
51
|
+
|
52
|
+
function clear() {
|
53
|
+
change({})
|
54
|
+
}
|
55
|
+
|
56
|
+
function save() {
|
57
|
+
if (onSave) {
|
58
|
+
onSave(form)
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
const content = new Content(filterSchema, form)
|
63
|
+
return (
|
64
|
+
<Fragment>
|
65
|
+
<Header className="table-filters" title={<Text>Filters</Text>} >
|
66
|
+
<Icon icon="filter_list_off" size="small" clickable action={clear} />
|
67
|
+
{onSave ? <Icon icon="save" size="small" clickable action={save} /> : null}
|
68
|
+
</Header>
|
69
|
+
<main className="table-filters">
|
70
|
+
<ContentEditor content={content} onChange={change} />
|
71
|
+
</main>
|
72
|
+
</Fragment>
|
73
|
+
)
|
74
|
+
}
|
@@ -0,0 +1,96 @@
|
|
1
|
+
export const ContentPage = (props) => {
|
2
|
+
|
3
|
+
const {
|
4
|
+
icon, title, className,
|
5
|
+
schema, url,
|
6
|
+
} = props
|
7
|
+
|
8
|
+
return (
|
9
|
+
<>
|
10
|
+
<header className="content-page"></header>
|
11
|
+
<nav className="content-page"></nav>
|
12
|
+
<menu className="content-page">
|
13
|
+
|
14
|
+
</menu>
|
15
|
+
<main className="content-page">
|
16
|
+
|
17
|
+
</main>
|
18
|
+
<aside className="content-page"></aside>
|
19
|
+
<footer className="content-page"></footer>
|
20
|
+
</>
|
21
|
+
)
|
22
|
+
}
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
/**
|
27
|
+
* Content API
|
28
|
+
*/
|
29
|
+
const ContentAPI = (url, host) => {
|
30
|
+
|
31
|
+
const http = HTTPClient(host || window.API || process.env.REACT_APP_API, Session);
|
32
|
+
|
33
|
+
return {
|
34
|
+
all(filters = [], likes = [], page) {
|
35
|
+
let queryParams = page ? `?page=${page}&` : "?"
|
36
|
+
const filterQuery = Object.keys(filters).reduce((query, key) => {
|
37
|
+
const value = filters[key]
|
38
|
+
if (typeof (value) === 'boolean') return query.concat(`${key}=${value}&`)
|
39
|
+
if (Array.isArray(value)) {
|
40
|
+
const param = value.length === 0 ? '' : value.reduce((param, item) => {
|
41
|
+
param = param.concat(`${key}=${item}&`)
|
42
|
+
return param
|
43
|
+
}, "")
|
44
|
+
return query.concat(param)
|
45
|
+
}
|
46
|
+
const likeSymbol = likes.includes(key) ? '%' : ''
|
47
|
+
return query.concat(`${key}=${likeSymbol}${value}${likeSymbol}&`)
|
48
|
+
}, "")
|
49
|
+
queryParams = queryParams.concat(filterQuery)
|
50
|
+
return http.GET(url + queryParams)
|
51
|
+
},
|
52
|
+
|
53
|
+
find(id) {
|
54
|
+
return http.GET(`${url}/${id}`)
|
55
|
+
},
|
56
|
+
|
57
|
+
create(form) {
|
58
|
+
const body = JSON.stringify(form)
|
59
|
+
return http.POST(url, body)
|
60
|
+
},
|
61
|
+
|
62
|
+
update(form) {
|
63
|
+
const body = JSON.stringify(form)
|
64
|
+
return http.PUT(`${url}/${form.id}`, body)
|
65
|
+
},
|
66
|
+
|
67
|
+
updateProperty(id, propertyName, form) {
|
68
|
+
const body = JSON.stringify(form)
|
69
|
+
return http.PUT(`${url}/${id}/${propertyName}`, body)
|
70
|
+
},
|
71
|
+
|
72
|
+
patch(id, form) {
|
73
|
+
const body = JSON.stringify(form)
|
74
|
+
return http.PATCH(`${url}/${id}`, body)
|
75
|
+
},
|
76
|
+
|
77
|
+
remove(id) {
|
78
|
+
return http.DELETE(`${url}/${id}`)
|
79
|
+
},
|
80
|
+
|
81
|
+
queries(user) {
|
82
|
+
const queryParams = user ? `?user=${user}` : ""
|
83
|
+
return http.GET(`/queries/${url}${queryParams}`)
|
84
|
+
},
|
85
|
+
|
86
|
+
createQuery(form) {
|
87
|
+
const body = JSON.stringify(form)
|
88
|
+
return http.POST(`/queries/${url}`, body)
|
89
|
+
},
|
90
|
+
|
91
|
+
removeQuery(id) {
|
92
|
+
return http.DELETE(`/queries/${url}/${id}`)
|
93
|
+
},
|
94
|
+
|
95
|
+
}
|
96
|
+
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { useEffect, useMemo, useState } from "react";
|
1
|
+
import React, { useEffect, useMemo, useState, useRef } from "react";
|
2
2
|
import { DropDown, Header, Icon, Text, TextField, Button } from "../../html";
|
3
3
|
import moment from "moment";
|
4
4
|
import { extendMoment } from "moment-range";
|
@@ -15,15 +15,17 @@ const DATE_RANGE = [
|
|
15
15
|
/**
|
16
16
|
* Planner
|
17
17
|
*/
|
18
|
-
export const Planner = ({ title, events = [], lanes = [], navigation = true, onSelectCell, focusEvent, config = { range: "year", from: "2022-01-01", to: "2022-12-30"}, onChange }) => {
|
18
|
+
export const Planner = ({ title, events = [], lanes = [], navigation = true, onSelectCell, focusEvent, config = { range: "year", from: "2022-01-01", to: "2022-12-30" }, onChange }) => {
|
19
19
|
|
20
20
|
const [dateRange, setDateRange] = useState(config.range);
|
21
21
|
const [from, setFrom] = useState(config.from);
|
22
22
|
const [to, setTo] = useState(config.to);
|
23
|
-
|
23
|
+
const thisMondayElement = useRef(null)
|
24
|
+
|
24
25
|
useEffect(() => {
|
25
|
-
|
26
|
-
|
26
|
+
console.log(thisMondayElement.current)
|
27
|
+
if (thisMondayElement.current) { showThisWeek() }
|
28
|
+
})
|
27
29
|
|
28
30
|
useEffect(() => {
|
29
31
|
const element = document.getElementById(focusEvent)
|
@@ -93,7 +95,7 @@ export const Planner = ({ title, events = [], lanes = [], navigation = true, onS
|
|
93
95
|
{navigation ? (
|
94
96
|
<Header title={label}>
|
95
97
|
|
96
|
-
<Button label="Esta Semana" outlined action={showThisWeek}/>
|
98
|
+
<Button label="Esta Semana" outlined action={showThisWeek} />
|
97
99
|
<Icon icon="chevron_right" clickable action={next} />
|
98
100
|
<TextField id="to" type="date" label="Hasta" value={to} onChange={(id, value) => setTo(value)} />
|
99
101
|
<div className="expand"></div>
|
@@ -108,11 +110,7 @@ export const Planner = ({ title, events = [], lanes = [], navigation = true, onS
|
|
108
110
|
|
109
111
|
<div className="column0">
|
110
112
|
<div className="column-header"></div>
|
111
|
-
{lanes.map((lane) =>
|
112
|
-
<div className="row-header">
|
113
|
-
{lane.label}
|
114
|
-
</div>
|
115
|
-
))}
|
113
|
+
{lanes.map((lane) => <div className="row-header">{lane.label}</div>)}
|
116
114
|
</div>
|
117
115
|
|
118
116
|
<div className="rows">
|
@@ -145,7 +143,7 @@ export const Planner = ({ title, events = [], lanes = [], navigation = true, onS
|
|
145
143
|
})}
|
146
144
|
</div>
|
147
145
|
|
148
|
-
{lanes.map((lane) => <PlannerRow key={lane.id} lane={lane} events={events} period={period} onSelectCell={selectCell} onChange={onChange}/>)}
|
146
|
+
{lanes.map((lane) => <PlannerRow key={lane.id} lane={lane} events={events} period={period} onSelectCell={selectCell} onChange={onChange} thisMondayRef={thisMondayElement} />)}
|
149
147
|
|
150
148
|
</div>
|
151
149
|
</main>
|
@@ -158,7 +156,7 @@ export const Planner = ({ title, events = [], lanes = [], navigation = true, onS
|
|
158
156
|
*/
|
159
157
|
const PlannerRow = (props) => {
|
160
158
|
|
161
|
-
const { lane, events = [], period, onSelectCell, onChange } = props
|
159
|
+
const { lane, events = [], period, onSelectCell, onChange, thisMondayRef } = props
|
162
160
|
const rowEvents = events.filter(event => event.lane === lane.id)
|
163
161
|
|
164
162
|
|
@@ -177,7 +175,7 @@ const PlannerRow = (props) => {
|
|
177
175
|
return eventDate.getTime() === slotDate.getTime();
|
178
176
|
})
|
179
177
|
return (
|
180
|
-
<PlannerCell key={`${lane.id}-${slotDate.toString()}`} lane={lane} date={date} events={cellEvents} onSelect={onSelectCell} onDrop={change}/>
|
178
|
+
<PlannerCell key={`${lane.id}-${slotDate.toString()}`} lane={lane} date={date} events={cellEvents} onSelect={onSelectCell} onDrop={change} thisMondayRef={thisMondayRef} />
|
181
179
|
);
|
182
180
|
})}
|
183
181
|
</div>
|
@@ -187,7 +185,7 @@ const PlannerRow = (props) => {
|
|
187
185
|
/**
|
188
186
|
* Planner Cell
|
189
187
|
*/
|
190
|
-
const PlannerCell = ({ lane, events, date, disabled = false, onAdd, onDelete, onSelect, onDrop, editable = false }) => {
|
188
|
+
const PlannerCell = ({ lane, events, date, disabled = false, onAdd, onDelete, onSelect, onDrop, editable = false, thisMondayRef }) => {
|
191
189
|
|
192
190
|
const [dragOver, setDragOver] = useState(false);
|
193
191
|
|
@@ -225,10 +223,11 @@ const PlannerCell = ({ lane, events, date, disabled = false, onAdd, onDelete, on
|
|
225
223
|
|
226
224
|
const today = moment()
|
227
225
|
var weekStart = today.clone().startOf('week')
|
226
|
+
const isThisMonday = (date.moment.isSame(weekStart))
|
228
227
|
const thisMonday = (date.moment.isSame(weekStart)) ? "thisMonday" : ""
|
229
228
|
const dragOverStyle = dragOver ? "drag-over" : ""
|
230
|
-
|
231
|
-
<div className={`cell ${thisMonday} ${weekend} ${dragOverStyle}`} onDragOver={onDragOver} onDragLeave={onDragLeave} onDrop={drop} onClick={select}>
|
229
|
+
return (
|
230
|
+
<div className={`cell ${thisMonday} ${weekend} ${dragOverStyle}`} ref={isThisMonday ? thisMondayRef : null} onDragOver={onDragOver} onDragLeave={onDragLeave} onDrop={drop} onClick={select}>
|
232
231
|
{events.map(event => {
|
233
232
|
const { Renderer = EventCard } = event
|
234
233
|
return <Renderer key={event.id} event={event} />
|