@entryscape/rdforms 10.7.1 → 10.8.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/main.js CHANGED
@@ -1,15 +1,9 @@
1
1
  import 'whatwg-fetch';
2
- import './loadViewOptions';
3
2
 
4
3
  export { default as renderingContext } from './src/view/renderingContext';
5
4
  export { default as ItemStore } from './src/template/ItemStore';
6
5
  export { default as bundleLoader } from './src/template/bundleLoader';
7
- export { default as Presenter } from './src/view/Presenter';
8
- export { default as Editor } from './src/view/Editor';
9
- export { default as LevelEditor } from './src/view/bootstrap/LevelEditor';
10
- export { default as ValidationPresenter } from './src/view/ValidationPresenter';
11
6
  export { default as utils } from './src/utils';
12
7
  export { default as system } from './src/model/system';
13
8
  export { default as engine } from './src/model/engine';
14
9
  export { default as validate } from './src/model/validate';
15
- export { Editor as EditorWrapper, Presenter as PresenterWrapper} from './src/view/react/Wrappers';
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "application profile",
9
9
  "linked data"
10
10
  ],
11
- "version": "10.7.1",
11
+ "version": "10.8.1",
12
12
  "main": "dist/rdforms.node.js",
13
13
  "browser": "dist/rdforms.react.js",
14
14
  "module": "main.js",
@@ -18,12 +18,12 @@
18
18
  "dependencies": {
19
19
  "@emotion/react": "^11.4.1",
20
20
  "@emotion/styled": "^11.3.0",
21
- "@entryscape/rdfjson": "^2.5.4",
21
+ "@entryscape/rdfjson": "^2.5.7",
22
22
  "@fortawesome/fontawesome-free": "^5.8.1",
23
23
  "@mui/icons-material": "^5.0.3",
24
- "@mui/lab": "^5.0.0-alpha.51",
25
24
  "@mui/material": "^5.0.3",
26
25
  "@mui/styles": "^5.0.1",
26
+ "@mui/x-date-pickers": "^5.0.0-beta.7",
27
27
  "@selectize/selectize": "^0.13.5",
28
28
  "arrive": "^2.4.1",
29
29
  "bootstrap": "^4.3.1",
@@ -31,7 +31,7 @@
31
31
  "bootstrap-material-datetimepicker": "https://bitbucket.org/metasolutions/bootstrap-material-datetimepicker.git#webpack",
32
32
  "bootstrap-material-design": "^4.1.1",
33
33
  "circular-dependency-plugin": "^5.2.2",
34
- "core-js": "^3.1.4",
34
+ "core-js": "^3.4.0",
35
35
  "ifdef-loader": "^2.1.1",
36
36
  "jquery": "^3.3.1",
37
37
  "jquery-mousewheel": "^3.1.13",
@@ -67,7 +67,7 @@
67
67
  "clean-webpack-plugin": "^0.1.18",
68
68
  "copy-webpack-plugin": "^5.0.5",
69
69
  "css-loader": "^3.5.3",
70
- "eslint": "^3.17.1",
70
+ "eslint": "^8.23.0",
71
71
  "eslint-config-airbnb-base": "^11.1.1",
72
72
  "eslint-plugin-import": "^2.2.0",
73
73
  "eslint-plugin-requirejs": "^3.1.1",
@@ -96,8 +96,7 @@
96
96
  "dist",
97
97
  "src",
98
98
  "main*",
99
- "index*",
100
- "loadViewOptions.js"
99
+ "renderers"
101
100
  ],
102
101
  "scripts": {
103
102
  "build:all": "webpack --display-modules --mode=production --config webpack.all.js",
@@ -0,0 +1,9 @@
1
+ import 'whatwg-fetch';
2
+ import '../src/view/bmd/all';
3
+ import '../src/view/bmd/style.css';
4
+
5
+ export { default as Editor } from '../src/view/Editor';
6
+ export { default as Presenter } from '../src/view/Presenter';
7
+ export { default as ValidationPresenter } from '../src/view/ValidationPresenter';
8
+ export { default as LevelEditor } from '../src/view/bootstrap/LevelEditor';
9
+ export * from '../main';
@@ -0,0 +1,8 @@
1
+ import '../src/view/bootstrap/all';
2
+
3
+ export { default as Editor } from '../src/view/Editor';
4
+ export { default as Presenter } from '../src/view/Presenter';
5
+ export { default as ValidationPresenter } from '../src/view/ValidationPresenter';
6
+ export { default as LevelEditor } from '../src/view/bootstrap/LevelEditor';
7
+
8
+ export * from '../main';
@@ -0,0 +1,4 @@
1
+ import '../src/view/jquery/all';
2
+
3
+ export { default as Presenter } from '../src/view/Presenter';
4
+ export * from '../main';
@@ -0,0 +1,5 @@
1
+ import 'regenerator-runtime/runtime';
2
+ import '../src/view/react/all';
3
+
4
+ export * from '../src/view/react/Wrappers';
5
+ export * from '../main';
@@ -28,6 +28,9 @@ const showNow = (editor, item, bindings, includeLevel) => {
28
28
  if (groupedItemsArr.length === 0) {
29
29
  return true; // Corresponds to an extention or pure heading, since no children.
30
30
  }
31
+ if (item.hasStyle('atLeastOneChild') || item.hasStyle('exactlyOneChild')) {
32
+ return true;
33
+ }
31
34
  if (bindings[0].getItemGroupedChildBindings().find((childBindings, idx) =>
32
35
  showNow(editor, groupedItemsArr[idx], childBindings, includeLevel))) {
33
36
  return true;
@@ -230,15 +233,14 @@ export default class Editor extends Presenter {
230
233
  if (!match) {
231
234
  if (binding.isValid()) {
232
235
  renderingContext.domClassToggle(newNode, 'missingDepsWithValue', true);
233
- binding.getCardinalityTracker().setDepsOk(false);
234
236
  } else {
235
237
  renderingContext.domClassToggle(newNode, 'missingDeps', true);
236
238
  }
237
239
  } else {
238
240
  renderingContext.domClassToggle(newNode, 'missingDepsWithValue', false);
239
- binding.getCardinalityTracker().setDepsOk(true);
240
241
  renderingContext.domClassToggle(newNode, 'missingDeps', false);
241
242
  }
243
+ binding.getCardinalityTracker().setDepsOk(match);
242
244
  };
243
245
  const fromBinding = engine.findBindingRelativeToParentBinding(binding.getParent(), path);
244
246
  if (!engine.matchPathBelowBinding(fromBinding, path)) {
package/src/view/View.js CHANGED
@@ -20,9 +20,18 @@ export default class View {
20
20
  this.compact = params.compact !== false;
21
21
  this.showDescription = params.showDescription === true;
22
22
  this.styleCls = params.styleCls || '';
23
- this.filterPredicates = Array.isArray(params.filterPredicates) ?
24
- params.filterPredicates.reduce((prev, current) => { prev[current] = true; return prev; }, {}) :
25
- params.filterPredicates || null;
23
+ if (Array.isArray(params.filterPredicates)) {
24
+ this.filterPredicates =
25
+ params.filterPredicates.reduce((prev, current) => { prev[current] = true; return prev; }, {});
26
+ } else if (typeof params.filterPredicates === 'object') {
27
+ this.filterPredicates = params.filterPredicates;
28
+ } else if (typeof params.filterPredicates === 'string') {
29
+ this.filterPredicates = params.filterPredicates.split(',')
30
+ .reduce((prev, current) => { prev[current] = true; return prev; }, {});
31
+ } else {
32
+ this.filterPredicates = null;
33
+ }
34
+
26
35
  this.restrictToItem = params.restrictToItem;
27
36
  this.fuzzy = params.fuzzy === true;
28
37
  this.markOrigin = params.markOrigin !== false;
@@ -350,7 +359,23 @@ export default class View {
350
359
  const prop = item.getProperty();
351
360
  // Exclude if property matches.
352
361
  if (prop) {
353
- return fp[prop] === true || fp[namespaces.shortenKnown(prop)] === true;
362
+ // Check if we are in a root-like position,
363
+ // i.e. either directly at the root or further down below groups without property set.
364
+ let rootLike = true;
365
+ let view = this;
366
+ while (view.parentView) {
367
+ if (view.getBinding().getItem().getProperty()) {
368
+ rootLike = false;
369
+ }
370
+ view = view.parentView;
371
+ }
372
+ const shortedProp = namespaces.shortenKnown(prop);
373
+ if (rootLike) {
374
+ return fp[prop] === true || fp[shortedProp] === true ||
375
+ fp[`*${prop}`] === true || fp[`${shortedProp}`] === true;
376
+ } else {
377
+ return fp[`*${prop}`] === true || fp[`*${shortedProp}`] === true;
378
+ }
354
379
  } else if (item.getType() === 'group') {
355
380
  // Exclude group headers if all children hidden
356
381
  const childBindings = item.getChildren() || [];
@@ -46,8 +46,10 @@ const addChangeListener = (inp, binding, regex, extLink, help) => {
46
46
  extLink.prop('href', binding.getValue());
47
47
  disableExtLink = false;
48
48
  }
49
- help.toggleClass('rdformsHelpActive', false);
50
- } else {
49
+ if (help) {
50
+ help.toggleClass('rdformsHelpActive', false);
51
+ }
52
+ } else if (help) {
51
53
  help.toggleClass('rdformsHelpActive', true);
52
54
  }
53
55
  if (extLink) {
@@ -153,7 +153,7 @@ const newStruct = (Tag, parent, nodeId) => {
153
153
  };
154
154
  // -- END
155
155
  return (
156
- <Tag id={nodeId} className={clsSet.join(' ')}>
156
+ <Tag id={nodeId} className={Array.from(clsSet).join(' ')}>
157
157
  {childArr.map((child, index) => getReactComponent(child, index))}
158
158
  {text}
159
159
  </Tag>
@@ -1,12 +1,15 @@
1
1
  /* eslint-disable no-unused-vars */
2
2
  import React, { useState, useEffect, useMemo } from 'react';
3
- import { DatePicker, TimePicker, LocalizationProvider } from '@mui/lab';
4
- import DateAdapter from '@mui/lab/AdapterMoment';
3
+ import { DatePicker } from '@mui/x-date-pickers/DatePicker';
4
+ import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
5
+ import { TimePicker } from '@mui/x-date-pickers/TimePicker';
6
+ import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment';
5
7
  import MenuItem from '@mui/material/MenuItem';
6
8
  import FormControl from '@mui/material/FormControl';
7
9
  import { TextField } from '@mui/material';
8
10
  import Select from '@mui/material/Select';
9
11
  import moment from 'moment';
12
+ import CODES from '../../model/CODES';
10
13
  import renderingContext from '../renderingContext';
11
14
  import {
12
15
  getDate,
@@ -19,7 +22,13 @@ import {
19
22
  } from '../viewUtils';
20
23
  import { useNamedGraphId } from './hooks';
21
24
 
22
- const getDatatypeFromBinding = binding => getDatatype(binding.getDatatype()) || getDatatypeFromItem(binding.getItem());
25
+ const getDatatypeFromBinding = (binding, alternatives) => {
26
+ const currentDatatype = getDatatype(binding.getDatatype());
27
+ if (!alternatives[currentDatatype]) {
28
+ alternatives[currentDatatype] = 'error';
29
+ }
30
+ return currentDatatype || getDatatypeFromItem(binding.getItem());
31
+ };
23
32
 
24
33
  const datePresenter = (fieldDiv, binding, context) => {
25
34
  try {
@@ -89,13 +98,20 @@ const dateEditor = (fieldDiv, binding, context) => {
89
98
  const DateComp = () => {
90
99
  const value = binding.getGist();
91
100
  const alternatives = useMemo(() => getAllowedDateAlternatives(binding.getItem()), []);
92
- const onlyOneAlternative = Object.keys(alternatives).length === 1;
93
101
  const [selectedDate, setSelectedDate] = useState(value === '' ? null : getDate(value));
94
- const [selectedDatatype, setDatatype] = useState(getDatatypeFromBinding(binding));
102
+ const [selectedDatatype, setDatatype] = useState(getDatatypeFromBinding(binding, alternatives));
103
+ const onlyOneAlternative = Object.keys(alternatives).length === 1;
104
+ const [error, setError] = useState(binding.getMatchingCode() === CODES.WRONG_DATATYPE);
105
+
106
+ useEffect(() => {
107
+ fieldDiv.toggleClass('mismatchReport', error);
108
+ }, [error]);
109
+
95
110
  useEffect(() => {
96
111
  context.clear = () => {
97
112
  setSelectedDate(null);
98
- setDatatype(getDatatypeFromBinding(binding));
113
+ setDatatype(getDatatypeFromItem(binding.getItem()));
114
+ setError(false);
99
115
  };
100
116
  }, []);
101
117
 
@@ -113,6 +129,7 @@ const dateEditor = (fieldDiv, binding, context) => {
113
129
  binding.setDatatype(getDatatypeURI(event.target.value));
114
130
  binding.setValue(getDateValue(selectedDate, event.target.value));
115
131
  setDatatype(event.target.value);
132
+ setError(alternatives[event.target.value] === 'error');
116
133
  };
117
134
  const inputProps = {
118
135
  'aria-labelledby': context.view.getLabelIndex(binding),
@@ -124,7 +141,8 @@ const dateEditor = (fieldDiv, binding, context) => {
124
141
  const enabledDatePicker = !ngId && (selectedDatatype === 'DateTime' || selectedDatatype === 'Date'
125
142
  || selectedDatatype === 'Year' || selectedDatatype === 'YearMonth' || selectedDatatype === 'MonthDay');
126
143
  return (
127
- <LocalizationProvider dateAdapter={DateAdapter}>
144
+ <>
145
+ <LocalizationProvider dateAdapter={AdapterMoment}>
128
146
  <span className="rdformsDatePicker">
129
147
  {visibleDatePicker && (
130
148
  <DatePicker
@@ -162,34 +180,47 @@ const dateEditor = (fieldDiv, binding, context) => {
162
180
  <Select
163
181
  value={selectedDatatype}
164
182
  inputProps={inputProps}
183
+ error={alternatives[selectedDatatype] === 'error'}
165
184
  onChange={onDatatypeChange}
166
185
  disabled={!!ngId}
167
186
  >
168
187
  {alternatives.Year && (
169
- <MenuItem value="Year">{bundle.date_year}</MenuItem>
188
+ <MenuItem disabled={alternatives.Year === 'error'} className="rdformsDatatypeOption"
189
+ value="Year">{bundle.date_year}</MenuItem>
170
190
  )}
171
191
  {alternatives.Date && (
172
- <MenuItem value="Date">{bundle.date_date}</MenuItem>
192
+ <MenuItem disabled={alternatives.Date === 'error'} className="rdformsDatatypeOption"
193
+ value="Date">{bundle.date_date}</MenuItem>
173
194
  )}
174
195
  {alternatives.DateTime && (
175
- <MenuItem value="DateTime">
196
+ <MenuItem disabled={alternatives.DateTime === 'error'} className="rdformsDatatypeOption"
197
+ value="DateTime">
176
198
  {bundle.date_date_and_time}
177
199
  </MenuItem>
178
200
  )}
179
201
  {alternatives.YearMonth && (
180
- <MenuItem value="YearMonth">{bundle.date_year_and_month}</MenuItem>
202
+ <MenuItem disabled={alternatives.YearMonth === 'error'} className="rdformsDatatypeOption"
203
+ value="YearMonth">{bundle.date_year_and_month}</MenuItem>
181
204
  )}
182
205
  {alternatives.MonthDay && (
183
- <MenuItem value="MonthDay">{bundle.date_month_and_day}</MenuItem>
206
+ <MenuItem disabled={alternatives.MonthDay === 'error'} className="rdformsDatatypeOption"
207
+ value="MonthDay">{bundle.date_month_and_day}</MenuItem>
184
208
  )}
185
209
  {alternatives.Time && (
186
- <MenuItem value="Time">{bundle.date_time}</MenuItem>
210
+ <MenuItem disabled={alternatives.Time === 'error'} className="rdformsDatatypeOption"
211
+ value="Time">{bundle.date_time}</MenuItem>
187
212
  )}
188
213
  </Select>
189
214
  </FormControl>
190
215
  )}
191
216
  </span>
192
217
  </LocalizationProvider>
218
+ {error && (
219
+ <div key="warning" className="rdformsWarning">
220
+ {context.view.messages.wrongDatatypeField}
221
+ </div>
222
+ )}
223
+ </>
193
224
  );
194
225
  };
195
226
  fieldDiv.appendChild(<DateComp key={binding.getHash()}></DateComp>);
@@ -228,3 +228,7 @@ div.MuiTooltip-tooltip {
228
228
  .rdformsHeading>.rdformsDescription {
229
229
  margin: -20px 0 20px;
230
230
  }
231
+
232
+ .Mui-disabled.rdformsDatatypeOption {
233
+ color: red;
234
+ }
@@ -54,5 +54,6 @@
54
54
  "missingValueField": "This field is required, please provide a value.",
55
55
  "dependencyField": "This field depends on another field, please review the field it depends on or remove this value.",
56
56
  "wrongValueField": "This is an invalid value, please change or remove it.",
57
+ "wrongDatatypeField": "The value has an invalid datatype, please change or remove it.",
57
58
  "openLinkExternally": "Open link externally"
58
59
  }
package/index.bmd.js DELETED
@@ -1,16 +0,0 @@
1
- import 'whatwg-fetch';
2
- import 'core-js/stable';
3
- import 'regenerator-runtime/runtime';
4
- import bundleLoader from './src/template/bundleLoader';
5
- import ItemStore from './src/template/ItemStore';
6
-
7
- import './src/view/bmd/all';
8
- import './src/view/bmd/style.css';
9
-
10
- import Editor from './src/view/Editor';
11
- import Presenter from './src/view/Presenter';
12
- import renderingContext from './src/view/renderingContext';
13
- import ValidationPresenter from './src/view/ValidationPresenter';
14
- import LevelEditor from './src/view/bootstrap/LevelEditor';
15
-
16
- export { bundleLoader, ItemStore, Editor, Presenter, ValidationPresenter, LevelEditor, renderingContext };
@@ -1,12 +0,0 @@
1
- import 'core-js/stable';
2
- import 'regenerator-runtime/runtime';
3
- import bundleLoader from './src/template/bundleLoader';
4
- import ItemStore from './src/template/ItemStore';
5
- import './src/view/bootstrap/all';
6
- import Editor from './src/view/Editor';
7
- import Presenter from './src/view/Presenter';
8
- import renderingContext from './src/view/renderingContext';
9
- import ValidationPresenter from './src/view/ValidationPresenter';
10
- import LevelEditor from './src/view/bootstrap/LevelEditor';
11
-
12
- export { bundleLoader, ItemStore, Editor, Presenter, ValidationPresenter, LevelEditor, renderingContext };
package/index.jquery.js DELETED
@@ -1,9 +0,0 @@
1
- import 'core-js/stable';
2
- import 'regenerator-runtime/runtime';
3
- import bundleLoader from './src/template/bundleLoader';
4
- import ItemStore from './src/template/ItemStore';
5
- import './src/view/jquery/all';
6
- import Presenter from './src/view/Presenter';
7
- import renderingContext from './src/view/renderingContext';
8
-
9
- export { bundleLoader, ItemStore, Presenter, renderingContext };
package/index.react.js DELETED
@@ -1,9 +0,0 @@
1
- import 'core-js/stable';
2
- import 'regenerator-runtime/runtime';
3
- import bundleLoader from './src/template/bundleLoader';
4
- import ItemStore from './src/template/ItemStore';
5
- import './src/view/react/all';
6
- import { Editor, Presenter, ValidationPresenter } from './src/view/react/Wrappers';
7
- import renderingContext from './src/view/renderingContext';
8
-
9
- export { bundleLoader, ItemStore, Presenter, Editor, ValidationPresenter, renderingContext };
@@ -1,10 +0,0 @@
1
- /// #if BLOCKS
2
- import 'bootstrap';
3
- import './src/view/bootstrap/Select2';
4
- import './src/view/bootstrap/DateTimeBootstrapDatepicker';
5
- import 'select2/dist/css/select2.css';
6
- import './src/view/bootstrap/style.css';
7
- /// #else
8
- import './src/view/react/all'; // hard coded react
9
- /// #endif
10
-