@jinntec/fore 1.0.0-5 → 1.0.0

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.
Files changed (63) hide show
  1. package/README.md +6 -27
  2. package/dist/fore-dev.js +43 -0
  3. package/dist/fore-dev.js.map +1 -0
  4. package/dist/fore.js +37 -0
  5. package/dist/fore.js.map +1 -0
  6. package/index.js +2 -1
  7. package/package.json +35 -39
  8. package/resources/fore.css +22 -54
  9. package/src/DependencyNotifyingDomFacade.js +5 -13
  10. package/src/ForeElementMixin.js +13 -20
  11. package/src/actions/abstract-action.js +14 -9
  12. package/src/actions/fx-action.js +6 -5
  13. package/src/actions/fx-append.js +8 -17
  14. package/src/actions/fx-confirm.js +3 -1
  15. package/src/actions/fx-delete.js +6 -3
  16. package/src/actions/fx-dispatch.js +9 -8
  17. package/src/actions/fx-hide.js +9 -6
  18. package/src/actions/fx-insert.js +27 -14
  19. package/src/actions/fx-message.js +3 -1
  20. package/src/actions/fx-refresh.js +11 -1
  21. package/src/actions/fx-replace.js +68 -0
  22. package/src/actions/fx-return.js +42 -0
  23. package/src/actions/fx-send.js +3 -1
  24. package/src/actions/fx-setvalue.js +58 -51
  25. package/src/actions/fx-show.js +8 -4
  26. package/src/actions/fx-toggle.js +13 -9
  27. package/src/actions/fx-update.js +3 -1
  28. package/src/dep_graph.js +1 -1
  29. package/src/drawdown.js +67 -82
  30. package/src/fore.js +141 -25
  31. package/src/functions/fx-function.js +11 -3
  32. package/src/fx-bind.js +39 -199
  33. package/src/fx-fore.js +101 -68
  34. package/src/fx-header.js +3 -1
  35. package/src/fx-instance.js +9 -1
  36. package/src/fx-model.js +31 -23
  37. package/src/fx-submission.js +73 -47
  38. package/src/fx-var.js +7 -4
  39. package/src/getInScopeContext.js +23 -16
  40. package/src/modelitem.js +4 -4
  41. package/src/relevance.js +65 -0
  42. package/src/ui/abstract-control.js +55 -35
  43. package/src/ui/fx-alert.js +7 -1
  44. package/src/ui/fx-case.js +3 -1
  45. package/src/ui/fx-container.js +4 -2
  46. package/src/ui/fx-control.js +283 -33
  47. package/src/ui/fx-dialog.js +50 -45
  48. package/src/ui/fx-group.js +3 -1
  49. package/src/ui/fx-hint.js +4 -1
  50. package/src/ui/fx-inspector.js +117 -17
  51. package/src/ui/fx-items.js +7 -5
  52. package/src/ui/fx-output.js +14 -5
  53. package/src/ui/fx-repeat.js +13 -26
  54. package/src/ui/fx-repeatitem.js +10 -4
  55. package/src/ui/fx-switch.js +3 -1
  56. package/src/ui/fx-trigger.js +3 -1
  57. package/src/xpath-evaluation.js +114 -102
  58. package/src/xpath-util.js +1 -5
  59. package/dist/fore-all.js +0 -140
  60. package/dist/fore-debug.js +0 -140
  61. package/src/.DS_Store +0 -0
  62. package/src/actions/.DS_Store +0 -0
  63. package/src/ui/.DS_Store +0 -0
package/src/drawdown.js CHANGED
@@ -4,72 +4,67 @@
4
4
  */
5
5
 
6
6
  function markdown(src) {
7
- var rx_lt = /</g;
8
- var rx_gt = />/g;
9
- var rx_space = /\t|\r|\uf8ff/g;
10
- var rx_escape = /\\([\\\|`*_{}\[\]()#+\-~])/g;
11
- var rx_hr = /^([*\-=_] *){3,}$/gm;
12
- var rx_blockquote = /\n *&gt; *([^]*?)(?=(\n|$){2})/g;
13
- var rx_list = /\n( *)(?:[*\-+]|((\d+)|([a-z])|[A-Z])[.)]) +([^]*?)(?=(\n|$){2})/g;
14
- var rx_listjoin = /<\/(ol|ul)>\n\n<\1>/g;
15
- var rx_highlight = /(^|[^A-Za-z\d\\])(([*_])|(~)|(\^)|(--)|(\+\+)|`)(\2?)([^<]*?)\2\8(?!\2)(?=\W|_|$)/g;
16
- var rx_code = /\n((```|~~~).*\n?([^]*?)\n?\2|(( .*?\n)+))/g;
17
- var rx_link = /((!?)\[(.*?)\]\((.*?)( ".*")?\)|\\([\\`*_{}\[\]()#+\-.!~]))/g;
18
- var rx_table = /\n(( *\|.*?\| *\n)+)/g;
19
- var rx_thead = /^.*\n( *\|( *\:?-+\:?-+\:? *\|)* *\n|)/;
20
- var rx_row = /.*\n/g;
21
- var rx_cell = /\||(.*?[^\\])\|/g;
22
- var rx_heading = /(?=^|>|\n)([>\s]*?)(#{1,6}) (.*?)( #*)? *(?=\n|$)/g;
23
- var rx_para = /(?=^|>|\n)\s*\n+([^<]+?)\n+\s*(?=\n|<|$)/g;
24
- var rx_stash = /-\d+\uf8ff/g;
7
+ const rx_lt = /</g;
8
+ const rx_gt = />/g;
9
+ const rx_space = /\t|\r|\uf8ff/g;
10
+ const rx_escape = /\\([\\\|`*_{}\[\]()#+\-~])/g;
11
+ const rx_hr = /^([*\-=_] *){3,}$/gm;
12
+ const rx_blockquote = /\n *&gt; *([^]*?)(?=(\n|$){2})/g;
13
+ const rx_list = /\n( *)(?:[*\-+]|((\d+)|([a-z])|[A-Z])[.)]) +([^]*?)(?=(\n|$){2})/g;
14
+ const rx_listjoin = /<\/(ol|ul)>\n\n<\1>/g;
15
+ const rx_highlight = /(^|[^A-Za-z\d\\])(([*_])|(~)|(\^)|(--)|(\+\+)|`)(\2?)([^<]*?)\2\8(?!\2)(?=\W|_|$)/g;
16
+ const rx_code = /\n((```|~~~).*\n?([^]*?)\n?\2|(( {4}.*?\n)+))/g;
17
+ const rx_link = /((!?)\[(.*?)\]\((.*?)( ".*")?\)|\\([\\`*_{}\[\]()#+\-.!~]))/g;
18
+ const rx_table = /\n(( *\|.*?\| *\n)+)/g;
19
+ const rx_thead = /^.*\n( *\|( *\:?-+\:?-+\:? *\|)* *\n|)/;
20
+ const rx_row = /.*\n/g;
21
+ const rx_cell = /\||(.*?[^\\])\|/g;
22
+ const rx_heading = /(?=^|>|\n)([>\s]*?)(#{1,6}) (.*?)( #*)? *(?=\n|$)/g;
23
+ const rx_para = /(?=^|>|\n)\s*\n+([^<]+?)\n+\s*(?=\n|<|$)/g;
24
+ const rx_stash = /-\d+\uf8ff/g;
25
25
 
26
26
  function replace(rex, fn) {
27
27
  src = src.replace(rex, fn);
28
28
  }
29
29
 
30
30
  function element(tag, content) {
31
- return '<' + tag + '>' + content + '</' + tag + '>';
31
+ return `<${tag}>${content}</${tag}>`;
32
32
  }
33
33
 
34
34
  function blockquote(src) {
35
- return src.replace(rx_blockquote, function(all, content) {
36
- return element('blockquote', blockquote(highlight(content.replace(/^ *&gt; */gm, ''))));
37
- });
35
+ return src.replace(rx_blockquote, (all, content) =>
36
+ element('blockquote', blockquote(highlight(content.replace(/^ *&gt; */gm, '')))),
37
+ );
38
38
  }
39
39
 
40
40
  function list(src) {
41
- return src.replace(rx_list, function(all, ind, ol, num, low, content) {
42
- var entry = element(
41
+ return src.replace(rx_list, (all, ind, ol, num, low, content) => {
42
+ const entry = element(
43
43
  'li',
44
44
  highlight(
45
45
  content
46
- .split(RegExp('\n ?' + ind + '(?:(?:\\d+|[a-zA-Z])[.)]|[*\\-+]) +', 'g'))
46
+ .split(RegExp(`\n ?${ind}(?:(?:\\d+|[a-zA-Z])[.)]|[*\\-+]) +`, 'g'))
47
47
  .map(list)
48
48
  .join('</li><li>'),
49
49
  ),
50
50
  );
51
51
 
52
- return (
53
- '\n' +
54
- (ol
55
- ? '<ol start="' +
56
- (num
57
- ? ol + '">'
58
- : parseInt(ol, 36) -
59
- 9 +
60
- '" style="list-style-type:' +
61
- (low ? 'low' : 'upp') +
62
- 'er-alpha">') +
63
- entry +
64
- '</ol>'
65
- : element('ul', entry))
66
- );
52
+ return `\n${
53
+ ol
54
+ ? `<ol start="${
55
+ num
56
+ ? `${ol}">`
57
+ : `${parseInt(ol, 36) - 9}" style="list-style-type:${low ? 'low' : 'upp'}er-alpha">`
58
+ }${entry}</ol>`
59
+ : element('ul', entry)
60
+ }`;
67
61
  });
68
62
  }
69
63
 
70
64
  function highlight(src) {
71
- return src.replace(rx_highlight, function(all, _, p1, emp, sub, sup, small, big, p2, content) {
72
- return (
65
+ return src.replace(
66
+ rx_highlight,
67
+ (all, _, p1, emp, sub, sup, small, big, p2, content) =>
73
68
  _ +
74
69
  element(
75
70
  emp
@@ -88,19 +83,18 @@ function markdown(src) {
88
83
  ? 'big'
89
84
  : 'code',
90
85
  highlight(content),
91
- )
92
- );
93
- });
86
+ ),
87
+ );
94
88
  }
95
89
 
96
90
  function unesc(str) {
97
91
  return str.replace(rx_escape, '$1');
98
92
  }
99
93
 
100
- var stash = [];
101
- var si = 0;
94
+ const stash = [];
95
+ let si = 0;
102
96
 
103
- src = '\n' + src + '\n';
97
+ src = `\n${src}\n`;
104
98
 
105
99
  replace(rx_lt, '&lt;');
106
100
  replace(rx_gt, '&gt;');
@@ -117,56 +111,47 @@ function markdown(src) {
117
111
  replace(rx_listjoin, '');
118
112
 
119
113
  // code
120
- replace(rx_code, function(all, p1, p2, p3, p4) {
121
- stash[--si] = element('pre', element('code', p3 || p4.replace(/^ /gm, '')));
122
- return si + '\uf8ff';
114
+ replace(rx_code, (all, p1, p2, p3, p4) => {
115
+ stash[--si] = element('pre', element('code', p3 || p4.replace(/^ {4}/gm, '')));
116
+ return `${si}\uf8ff`;
123
117
  });
124
118
 
125
119
  // link or image
126
- replace(rx_link, function(all, p1, p2, p3, p4, p5, p6) {
120
+ replace(rx_link, (all, p1, p2, p3, p4, p5, p6) => {
127
121
  stash[--si] = p4
128
122
  ? p2
129
- ? '<img src="' + p4 + '" alt="' + p3 + '"/>'
130
- : '<a href="' + p4 + '">' + unesc(highlight(p3)) + '</a>'
123
+ ? `<img src="${p4}" alt="${p3}"/>`
124
+ : `<a href="${p4}">${unesc(highlight(p3))}</a>`
131
125
  : p6;
132
- return si + '\uf8ff';
126
+ return `${si}\uf8ff`;
133
127
  });
134
128
 
135
129
  // table
136
- replace(rx_table, function(all, table) {
137
- var sep = table.match(rx_thead)[1];
138
- return (
139
- '\n' +
140
- element(
141
- 'table',
142
- table.replace(rx_row, function(row, ri) {
143
- return row == sep
144
- ? ''
145
- : element(
146
- 'tr',
147
- row.replace(rx_cell, function(all, cell, ci) {
148
- return ci ? element(sep && !ri ? 'th' : 'td', unesc(highlight(cell || ''))) : '';
149
- }),
150
- );
151
- }),
152
- )
153
- );
130
+ replace(rx_table, (all, table) => {
131
+ const sep = table.match(rx_thead)[1];
132
+ return `\n${element(
133
+ 'table',
134
+ table.replace(rx_row, (row, ri) =>
135
+ row == sep
136
+ ? ''
137
+ : element(
138
+ 'tr',
139
+ row.replace(rx_cell, (all, cell, ci) =>
140
+ ci ? element(sep && !ri ? 'th' : 'td', unesc(highlight(cell || ''))) : '',
141
+ ),
142
+ ),
143
+ ),
144
+ )}`;
154
145
  });
155
146
 
156
147
  // heading
157
- replace(rx_heading, function(all, _, p1, p2) {
158
- return _ + element('h' + p1.length, unesc(highlight(p2)));
159
- });
148
+ replace(rx_heading, (all, _, p1, p2) => _ + element(`h${p1.length}`, unesc(highlight(p2))));
160
149
 
161
150
  // paragraph
162
- replace(rx_para, function(all, content) {
163
- return element('p', unesc(highlight(content)));
164
- });
151
+ replace(rx_para, (all, content) => element('p', unesc(highlight(content))));
165
152
 
166
153
  // stash
167
- replace(rx_stash, function(all) {
168
- return stash[parseInt(all)];
169
- });
154
+ replace(rx_stash, all => stash[parseInt(all)]);
170
155
 
171
156
  return src.trim();
172
157
  }
package/src/fore.js CHANGED
@@ -127,7 +127,11 @@ export class Fore {
127
127
  const { children } = startElement;
128
128
  if (children) {
129
129
  Array.from(children).forEach(element => {
130
+ if (element.nodeName.toUpperCase() === 'FX-FORE') {
131
+ resolve('done');
132
+ }
130
133
  if (Fore.isUiElement(element.nodeName) && typeof element.refresh === 'function') {
134
+ // console.log('refreshing ',element);
131
135
  element.refresh();
132
136
  } else if (element.nodeName.toUpperCase() !== 'FX-MODEL') {
133
137
  Fore.refreshChildren(element, force);
@@ -140,14 +144,21 @@ export class Fore {
140
144
  return refreshed;
141
145
  }
142
146
 
143
- static isRepeated(element) {
144
- return element.closest('fx-repeatitem') !== null;
145
- }
146
-
147
- static getRepeatTarget(element, id) {
148
- const repeatContextItem = element.closest('fx-repeatitem');
149
- const target = repeatContextItem.querySelector(`#${id}`);
150
- return target;
147
+ /**
148
+ * Alternative to `closest` that respects subcontrol boundaries
149
+ */
150
+ static getClosest(querySelector, start) {
151
+ while (!start.matches(querySelector)) {
152
+ if (start.matches('fx-fore')) {
153
+ // Subform reached. Bail out
154
+ return null;
155
+ }
156
+ start = start.parentNode;
157
+ if (!start) {
158
+ return null;
159
+ }
160
+ }
161
+ return start;
151
162
  }
152
163
 
153
164
  /**
@@ -193,13 +204,11 @@ export class Fore {
193
204
  static fadeOutElement(element, duration) {
194
205
  // const duration = duration;
195
206
  let fadeOut = () => {
196
-
197
207
  // Stop all current animations
198
208
  if (element.getAnimations) {
199
209
  element.getAnimations().map(anim => anim.finish());
200
210
  }
201
211
 
202
-
203
212
  // Play the animation with the newly specified duration
204
213
  fadeOut = element.animate(
205
214
  {
@@ -214,7 +223,7 @@ export class Fore {
214
223
 
215
224
  static dispatch(target, eventName, detail) {
216
225
  const event = new CustomEvent(eventName, {
217
- composed: true,
226
+ composed: false,
218
227
  bubbles: true,
219
228
  detail,
220
229
  });
@@ -225,22 +234,25 @@ export class Fore {
225
234
  static prettifyXml(source) {
226
235
  const xmlDoc = new DOMParser().parseFromString(source, 'application/xml');
227
236
  const xsltDoc = new DOMParser().parseFromString(
228
- [
229
- // describes how we want to modify the XML - indent everything
230
- '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">',
231
- ' <xsl:strip-space elements="*"/>',
232
- ' <xsl:template match="para[content-style][not(text())]">', // change to just text() to strip space in text nodes
233
- ' <xsl:value-of select="normalize-space(.)"/>',
234
- ' </xsl:template>',
235
- ' <xsl:template match="node()|@*">',
236
- ' <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>',
237
- ' </xsl:template>',
238
- ' <xsl:output indent="yes"/>',
239
- '</xsl:stylesheet>',
240
- ].join('\n'),
241
- 'application/xml',
237
+ [
238
+ // describes how we want to modify the XML - indent everything
239
+ '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">',
240
+ ' <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>',
241
+ ' <xsl:strip-space elements="*"/>',
242
+ ' <xsl:template match="text()">', // change to just text() to strip space in text nodes
243
+ ' <xsl:value-of select="normalize-space(.)"/>',
244
+ ' </xsl:template>',
245
+ ' <xsl:template match="node()|@*">',
246
+ ' <xsl:copy>',
247
+ ' <xsl:apply-templates select="node()|@*"/>',
248
+ ' </xsl:copy>',
249
+ ' </xsl:template>',
250
+ '</xsl:stylesheet>',
251
+ ].join('\n'),
252
+ 'application/xml',
242
253
  );
243
254
 
255
+
244
256
  const xsltProcessor = new XSLTProcessor();
245
257
  xsltProcessor.importStylesheet(xsltDoc);
246
258
  const resultDoc = xsltProcessor.transformToDocument(xmlDoc);
@@ -248,6 +260,110 @@ export class Fore {
248
260
  return resultXml;
249
261
  }
250
262
 
263
+ static formatXml (xml) {
264
+ var reg = /(>)(<)(\/*)/g;
265
+ var wsexp = / *(.*) +\n/g;
266
+ var contexp = /(<.+>)(.+\n)/g;
267
+ xml = xml.replace(reg, '$1\n$2$3').replace(wsexp, '$1\n').replace(contexp, '$1\n$2');
268
+ var pad = 0;
269
+ var formatted = '';
270
+ var lines = xml.split('\n');
271
+ var indent = 0;
272
+ var lastType = 'other';
273
+ // 4 types of tags - single, closing, opening, other (text, doctype, comment) - 4*4 = 16 transitions
274
+ var transitions = {
275
+ 'single->single': 0,
276
+ 'single->closing': -1,
277
+ 'single->opening': 0,
278
+ 'single->other': 0,
279
+ 'closing->single': 0,
280
+ 'closing->closing': -1,
281
+ 'closing->opening': 0,
282
+ 'closing->other': 0,
283
+ 'opening->single': 1,
284
+ 'opening->closing': 0,
285
+ 'opening->opening': 1,
286
+ 'opening->other': 1,
287
+ 'other->single': 0,
288
+ 'other->closing': -1,
289
+ 'other->opening': 0,
290
+ 'other->other': 0
291
+ };
292
+
293
+ for (var i = 0; i < lines.length; i++) {
294
+ var ln = lines[i];
295
+ var single = Boolean(ln.match(/<.+\/>/)); // is this line a single tag? ex. <br />
296
+ var closing = Boolean(ln.match(/<\/.+>/)); // is this a closing tag? ex. </a>
297
+ var opening = Boolean(ln.match(/<[^!].*>/)); // is this even a tag (that's not <!something>)
298
+ var type = single ? 'single' : closing ? 'closing' : opening ? 'opening' : 'other';
299
+ var fromTo = lastType + '->' + type;
300
+ lastType = type;
301
+ var padding = '';
302
+
303
+ indent += transitions[fromTo];
304
+ for (var j = 0; j < indent; j++) {
305
+ padding += ' ';
306
+ }
307
+
308
+ formatted += padding + ln + '\n';
309
+ }
310
+ }
311
+
312
+ static async loadForeFromUrl(hostElement, url) {
313
+ console.log('########## loading Fore from ', this.src, '##########');
314
+ await fetch(url, {
315
+ method: 'GET',
316
+ mode: 'cors',
317
+ credentials: 'include',
318
+ headers: {
319
+ 'Content-Type': 'text/html',
320
+ },
321
+ })
322
+ .then(response => {
323
+ const responseContentType = response.headers.get('content-type').toLowerCase();
324
+ console.log('********** responseContentType *********', responseContentType);
325
+ if (responseContentType.startsWith('text/html')) {
326
+ return response.text().then(result =>
327
+ // console.log('xml ********', result);
328
+ new DOMParser().parseFromString(result, 'text/html'),
329
+ );
330
+ }
331
+ return 'done';
332
+ })
333
+ .then(data => {
334
+ // const theFore = fxEvaluateXPathToFirstNode('//fx-fore', data.firstElementChild);
335
+ const theFore = data.querySelector('fx-fore');
336
+ // console.log('thefore', theFore)
337
+ if (!theFore) {
338
+ hostElement.dispatchEvent(
339
+ new CustomEvent('error', {
340
+ composed: false,
341
+ bubbles: true,
342
+ detail: {
343
+ message: 'cyclic graph',
344
+ },
345
+ }),
346
+ );
347
+ }
348
+ hostElement.appendChild(theFore);
349
+ theFore.classList.add('widget');
350
+ // return theFore;
351
+ // theFore.setAttribute('from-src', this.src);
352
+ // this.replaceWith(theFore);
353
+ })
354
+ .catch(error => {
355
+ hostElement.dispatchEvent(
356
+ new CustomEvent('error', {
357
+ composed: false,
358
+ bubbles: true,
359
+ detail: {
360
+ error: error,
361
+ message: `'${url}' not found or does not contain Fore element.`,
362
+ },
363
+ }),
364
+ );
365
+ });
366
+ }
251
367
 
252
368
  /**
253
369
  * clear all text nodes and attribute values to get a 'clean' template.
@@ -1,6 +1,6 @@
1
1
  import { registerCustomXPathFunction } from 'fontoxpath';
2
2
  import { foreElementMixin } from '../ForeElementMixin.js';
3
- import { evaluateXPath } from '../xpath-evaluation.js';
3
+ import { evaluateXPath, globallyDeclaredFunctionLocalNames } from '../xpath-evaluation.js';
4
4
 
5
5
  /**
6
6
  * Allows to extend a form with local custom functions.
@@ -41,10 +41,16 @@ export class FxFunction extends foreElementMixin(HTMLElement) {
41
41
 
42
42
  // TODO: lookup prefix
43
43
  const functionIdentifier =
44
- prefix === 'local'
44
+ prefix === 'local' || !prefix
45
45
  ? { namespaceURI: 'http://www.w3.org/2005/xquery-local-functions', localName }
46
46
  : `${prefix}:${localName}`;
47
47
 
48
+ // Make the function available globally w/o a prefix. See the functionNameResolver for for how
49
+ // this is picked up
50
+ if (!prefix) {
51
+ globallyDeclaredFunctionLocalNames.push(localName);
52
+ }
53
+
48
54
  const paramParts = params
49
55
  ? params.split(',').map(param => {
50
56
  const match = param.match(/(?<variableName>\$[^\s]+)(?:\sas\s(?<varType>.+))/);
@@ -102,4 +108,6 @@ export class FxFunction extends foreElementMixin(HTMLElement) {
102
108
  }
103
109
  }
104
110
  }
105
- customElements.define('fx-function', FxFunction);
111
+ if (!customElements.get('fx-function')) {
112
+ customElements.define('fx-function', FxFunction);
113
+ }