ywana-core8 0.0.629 → 0.0.632
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 +65 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +3 -0
- package/dist/index.css.map +1 -1
- package/dist/index.modern.js +65 -75
- package/dist/index.modern.js.map +1 -1
- package/dist/index.umd.js +65 -75
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/domain/CollectionPage.css +3 -0
- package/src/domain/CollectionPage.js +30 -20
- package/src/domain/ContentEditor.js +0 -24
- package/src/domain/ContentType.js +33 -28
- package/src/site/site.test.js +4 -4
package/package.json
CHANGED
@@ -2,7 +2,7 @@ import equal from 'deep-equal'
|
|
2
2
|
import React, { Fragment, useContext, useEffect, useRef, useState, useMemo } from 'react'
|
3
3
|
import { HTTPClient, Session } from '../http'
|
4
4
|
import { PageContext } from '../site'
|
5
|
-
import { Button, Header, Icon, List, Menu, MenuIcon, MenuItem, Text, Tree, TreeItem, TreeNode, TextField } from '../html'
|
5
|
+
import { Button, Header, Icon, List, Menu, MenuIcon, MenuItem, Text, Tree, TreeItem, TreeNode, TextField, Chip } from '../html'
|
6
6
|
import { Content, TYPES } from './ContentType'
|
7
7
|
import { ContentEditor, TabbedContentEditor, TreededContentEditor } from './ContentEditor'
|
8
8
|
import { CreateContentDialog } from './CreateContentDialog'
|
@@ -30,7 +30,7 @@ export const CollectionPage = (props) => {
|
|
30
30
|
|
31
31
|
const [pageContext, setPageContext] = useContext(PageContext)
|
32
32
|
const context = CollectionContext(url, field, host, page, fetching)
|
33
|
-
|
33
|
+
|
34
34
|
const { all } = pageContext
|
35
35
|
|
36
36
|
useEffect(async () => {
|
@@ -38,9 +38,7 @@ export const CollectionPage = (props) => {
|
|
38
38
|
setPageContext(context)
|
39
39
|
}, [])
|
40
40
|
|
41
|
-
|
42
|
-
setShowFilter(!showFilter)
|
43
|
-
}
|
41
|
+
|
44
42
|
|
45
43
|
async function reload() {
|
46
44
|
await pageContext.load()
|
@@ -79,14 +77,11 @@ export const CollectionPage = (props) => {
|
|
79
77
|
{renderActions()}
|
80
78
|
</Header>
|
81
79
|
<menu className={`collection-page ${className}`}>
|
82
|
-
<
|
83
|
-
{canFilter ? showFilter ? <Icon icon="filter_list" size="small" clickable action={toggleFilters} /> : <Icon icon="filter_list_off" size="small" clickable action={toggleFilters} /> : false}
|
84
|
-
</Header>
|
85
|
-
{canFilter && showFilter ? <CollectionFilters schema={schema} /> : null}
|
80
|
+
{canFilter ? <CollectionFilters schema={schema} /> : null}
|
86
81
|
{levels ? <CollectionTree schema={schema} icon={icon} levels={levels} onSelect={onSelect} sorter={sorter} searchBy={searchBy} /> : <CollectionList groupBy={groupBy} onSelect={onSelect} searchBy={searchBy} />}
|
87
82
|
</menu>
|
88
83
|
<main key={id} className={`collection-page ${className}`}>
|
89
|
-
<CollectionEditor icon={icon} schema={schema} layout={editor} autosave={autosave} delay={delay} canDelete={canDelete} canEdit={canEdit} onReload={reloadSelection} patch={patch}/>
|
84
|
+
<CollectionEditor icon={icon} schema={schema} layout={editor} autosave={autosave} delay={delay} canDelete={canDelete} canEdit={canEdit} onReload={reloadSelection} patch={patch} />
|
90
85
|
{children ? <article>{children}</article> : null}
|
91
86
|
<footer>
|
92
87
|
{footer}
|
@@ -103,6 +98,7 @@ export const CollectionFilters = (props) => {
|
|
103
98
|
|
104
99
|
const { schema, onChange } = props
|
105
100
|
const [form, setForm] = useState({})
|
101
|
+
const [showFilter, setShowFilter] = useState(false)
|
106
102
|
|
107
103
|
const filterSchema = useMemo(() => {
|
108
104
|
const filterSchema = Object.assign({}, schema)
|
@@ -133,15 +129,29 @@ export const CollectionFilters = (props) => {
|
|
133
129
|
change({})
|
134
130
|
}
|
135
131
|
|
132
|
+
function toggleFilters() {
|
133
|
+
setShowFilter(!showFilter)
|
134
|
+
}
|
135
|
+
|
136
136
|
const content = new Content(filterSchema, form)
|
137
137
|
return (
|
138
138
|
<Fragment>
|
139
|
-
<
|
140
|
-
<
|
141
|
-
|
142
|
-
|
143
|
-
<
|
144
|
-
</
|
139
|
+
<header>
|
140
|
+
<div className='expand'>
|
141
|
+
<Chip label="Activas" />
|
142
|
+
</div>
|
143
|
+
{showFilter ? <Icon icon="expand_less" size="small" clickable action={toggleFilters} /> : <Icon icon="expand_more" size="small" clickable action={toggleFilters} />}
|
144
|
+
</header>
|
145
|
+
{showFilter ? (
|
146
|
+
<>
|
147
|
+
<nav className="collection-filters">
|
148
|
+
<Icon icon="clear_all" size="small" clickable action={clear} />
|
149
|
+
</nav>
|
150
|
+
<main className="collection-filters">
|
151
|
+
<ContentEditor content={content} onChange={change} />
|
152
|
+
</main>
|
153
|
+
</>
|
154
|
+
) : null}
|
145
155
|
</Fragment>
|
146
156
|
)
|
147
157
|
}
|
@@ -310,7 +320,7 @@ export const CollectionTree = (props) => {
|
|
310
320
|
const CollectionEditor = (props) => {
|
311
321
|
const [pageContext, setPageContext] = useContext(PageContext)
|
312
322
|
const { selected } = pageContext
|
313
|
-
const { icon, schema, layout, autosave = false, delay = 1000, canDelete, canEdit, onReload, patch=false } = props
|
323
|
+
const { icon, schema, layout, autosave = false, delay = 1000, canDelete, canEdit, onReload, patch = false } = props
|
314
324
|
const timer = useRef(null)
|
315
325
|
const [form, setForm] = useState(selected)
|
316
326
|
|
@@ -348,10 +358,10 @@ const CollectionEditor = (props) => {
|
|
348
358
|
}
|
349
359
|
|
350
360
|
async function save() {
|
351
|
-
if (patch) {
|
361
|
+
if (patch) {
|
352
362
|
await pageContext.patch(form.id, form)
|
353
|
-
}
|
354
|
-
await pageContext.update(form)
|
363
|
+
} else {
|
364
|
+
await pageContext.update(form)
|
355
365
|
}
|
356
366
|
setPageContext(Object.assign({}, pageContext))
|
357
367
|
}
|
@@ -412,34 +412,10 @@ export const CollectionEditor = ({ field, value = [], onChange, onReload }) => {
|
|
412
412
|
}
|
413
413
|
}
|
414
414
|
|
415
|
-
function change(index, cellId, cellValue) {
|
416
|
-
if (onChange) {
|
417
|
-
const next = value.slice()
|
418
|
-
next[index][cellId] = cellValue
|
419
|
-
onChange(id, next)
|
420
|
-
}
|
421
|
-
}
|
422
|
-
|
423
415
|
function reload() {
|
424
416
|
if (onReload) onReload()
|
425
417
|
}
|
426
418
|
|
427
|
-
/* const columns = Object.values(item)
|
428
|
-
.filter(field => field.column === true)
|
429
|
-
.map((item) => ({ ...item, onChange: change }))
|
430
|
-
columns.push({ id: 'actions', label: 'Actions' })
|
431
|
-
|
432
|
-
const rows = value.map((item, index) => ({
|
433
|
-
...item,
|
434
|
-
id: index,
|
435
|
-
actions: [
|
436
|
-
<Icon icon='delete' clickable action={() => remove(index)} size="small" />
|
437
|
-
]
|
438
|
-
}))
|
439
|
-
|
440
|
-
const table = { columns, rows }
|
441
|
-
*/
|
442
|
-
|
443
419
|
return (
|
444
420
|
<div className='collection-editor'>
|
445
421
|
{
|
@@ -79,7 +79,7 @@ export class ContentType {
|
|
79
79
|
const attributes = Object.entries(this._schema)
|
80
80
|
return attributes
|
81
81
|
.filter(([name, attr]) => attr.required === true)
|
82
|
-
.every(([name, attr]) => data[name] !== undefined ? this.checkType(attr, data[name]) : false)
|
82
|
+
.every(([name, attr]) => data[name] && typeof(data[name]) !== undefined ? this.checkType(attr, data[name]) : false)
|
83
83
|
}
|
84
84
|
|
85
85
|
/**
|
@@ -123,42 +123,47 @@ export class ContentType {
|
|
123
123
|
const fields = Object.entries(this._schema)
|
124
124
|
const next = fields.reduce((next, [name, field]) => {
|
125
125
|
|
126
|
-
const { type, item, optional } = field
|
126
|
+
const { type, item, optional, outsider } = field
|
127
127
|
const entryData = data ? data[name] : null
|
128
128
|
|
129
|
-
|
129
|
+
if (outsider === true) {
|
130
|
+
// Dont send outsider data
|
131
|
+
} else {
|
130
132
|
|
131
|
-
|
132
|
-
next[name] = entryData || field.default
|
133
|
-
break;
|
133
|
+
switch (type) {
|
134
134
|
|
135
|
-
|
136
|
-
|
137
|
-
|
135
|
+
case TYPES.STRING:
|
136
|
+
next[name] = entryData || field.default
|
137
|
+
break;
|
138
138
|
|
139
|
-
|
140
|
-
|
141
|
-
|
139
|
+
case TYPES.NUMBER:
|
140
|
+
next[name] = entryData || field.default
|
141
|
+
break;
|
142
142
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
next[name] = child1.value(entryData)
|
147
|
-
break;
|
143
|
+
case TYPES.BOOLEAN:
|
144
|
+
next[name] = entryData || field.default
|
145
|
+
break
|
148
146
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
next[name] = entryData ? entryData.map(data2 => child2.value(data2)) : []
|
155
|
-
}
|
156
|
-
break;
|
147
|
+
case TYPES.ENTITY:
|
148
|
+
if (optional === true && !entryData) break;
|
149
|
+
const child1 = new ContentType(item)
|
150
|
+
next[name] = child1.value(entryData)
|
151
|
+
break;
|
157
152
|
|
158
|
-
|
159
|
-
|
160
|
-
|
153
|
+
case TYPES.ARRAY:
|
154
|
+
if (item === TYPES.STRING) {
|
155
|
+
next[name] = entryData ? entryData : []
|
156
|
+
} else {
|
157
|
+
const child2 = new ContentType(item)
|
158
|
+
next[name] = entryData ? entryData.map(data2 => child2.value(data2)) : []
|
159
|
+
}
|
160
|
+
break;
|
161
|
+
|
162
|
+
default:
|
163
|
+
next[name] = field
|
164
|
+
break;
|
161
165
|
|
166
|
+
}
|
162
167
|
}
|
163
168
|
|
164
169
|
return next
|
package/src/site/site.test.js
CHANGED
@@ -20,7 +20,7 @@ const SiteTest = (prop) => {
|
|
20
20
|
const footer = <div>FOOTER</div>
|
21
21
|
|
22
22
|
return (
|
23
|
-
<Site icon="star" title="Site Test" init={"
|
23
|
+
<Site icon="star" title="Site Test" init={"PAGE5"} footer={footer}>
|
24
24
|
<Page id="PAGE1" section="SECTION1" icon="description" title="Page 1" layout="workspace">
|
25
25
|
<Page1 />
|
26
26
|
</Page>
|
@@ -201,7 +201,7 @@ const Page5 = (props) => {
|
|
201
201
|
const schema = {
|
202
202
|
field6: { id: "field6", section: "C", type: TYPES.ARRAY , item: ENTITYTYPE , filter: false , label: "Collection 100"},
|
203
203
|
name : { id: "name" , section: "A", type: TYPES.STRING , format: FORMATS.NONE , required: true, tab: false, grouper: true , column: true , filter: true , like: true, label: "Name" },
|
204
|
-
state : { id: "state" , section: "A", type: TYPES.STRING , format: FORMATS.NONE , required: true, tab: true , grouper: true , column: true , filter:
|
204
|
+
state : { id: "state" , section: "A", type: TYPES.STRING , format: FORMATS.NONE , required: true, tab: true , grouper: true , column: true , filter: true , label: "State" , options: [
|
205
205
|
{ label: "Pendiente", value: "NOT_CLASSIFIED" },
|
206
206
|
{ label: "Clasificada", value: "CLASSIFIED"},
|
207
207
|
]},
|
@@ -217,9 +217,9 @@ const Page5 = (props) => {
|
|
217
217
|
<CollectionPage
|
218
218
|
title="Referencias"
|
219
219
|
schema={schema} host="http://localhost:3000" url="/references" fetching={true} // resource
|
220
|
-
searchBy={["
|
220
|
+
searchBy={["name"]} levels={["color"]} canFilter={true} // menu
|
221
221
|
editor="TABBED" canAdd={true} // editor
|
222
222
|
/>
|
223
223
|
</Fragment>
|
224
224
|
)
|
225
|
-
}
|
225
|
+
}
|