neo.mjs 5.17.0 → 5.18.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.
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='5.17.0'
23
+ * @member {String} version='5.18.0'
24
24
  */
25
- version: '5.17.0'
25
+ version: '5.18.0'
26
26
  }
27
27
 
28
28
  /**
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='5.17.0'
23
+ * @member {String} version='5.18.0'
24
24
  */
25
- version: '5.17.0'
25
+ version: '5.18.0'
26
26
  }
27
27
 
28
28
  /**
@@ -1,9 +1,9 @@
1
- import CheckBox from '../../../src/form/field/CheckBox.mjs';
1
+ import CheckBox from '../../../src/form/field/CheckBox.mjs';
2
2
  import ConfigurationViewport from '../../ConfigurationViewport.mjs';
3
- import NumberField from '../../../src/form/field/Number.mjs';
4
- import Radio from '../../../src/form/field/Radio.mjs';
5
- import StatusBadge from '../../../src/component/StatusBadge.mjs';
6
- import TextField from '../../../src/form/field/Text.mjs';
3
+ import NumberField from '../../../src/form/field/Number.mjs';
4
+ import Radio from '../../../src/form/field/Radio.mjs';
5
+ import StatusBadge from '../../../src/component/StatusBadge.mjs';
6
+ import TextField from '../../../src/form/field/Text.mjs';
7
7
 
8
8
  /**
9
9
  * @class Neo.examples.component.statusbadge.MainContainer
@@ -11,58 +11,173 @@ import TextField from '../../../src/form/field/Text.mjs';
11
11
  */
12
12
  class MainContainer extends ConfigurationViewport {
13
13
  static config = {
14
- className : 'Neo.examples.component.statusbadge.MainContainer',
15
- autoMount : true,
14
+ className: 'Neo.examples.component.statusbadge.MainContainer',
15
+ autoMount: true,
16
16
  configItemLabelWidth: 110,
17
- configItemWidth : 230,
18
- layout : {ntype: 'hbox', align: 'stretch'}
17
+ configItemWidth: 230,
18
+ layout: { ntype: 'hbox', align: 'stretch' }
19
19
  }
20
20
 
21
21
  createConfigurationComponents() {
22
22
  let me = this;
23
23
 
24
24
  return [{
25
- module : CheckBox,
26
- checked : me.exampleComponent.closable,
25
+ module: CheckBox,
26
+ checked: me.exampleComponent.closable,
27
27
  labelText: 'closable',
28
- listeners: {change: me.onConfigChange.bind(me, 'closable')}
29
- }, {
30
- module : NumberField,
31
- clearable : true,
32
- labelText : 'height',
33
- listeners : {change: me.onConfigChange.bind(me, 'height')},
34
- maxValue : 100,
35
- minValue : 20,
36
- stepSize : 2,
37
- style : {marginTop: '10px'},
38
- value : me.exampleComponent.height
39
- }, {
40
- module : Radio,
41
- checked : me.exampleComponent.state === 'error',
28
+ listeners: { change: me.onConfigChange.bind(me, 'closable') }
29
+ }, {
30
+ module: NumberField,
31
+ clearable: true,
32
+ labelText: 'height',
33
+ listeners: { change: me.onConfigChange.bind(me, 'height') },
34
+ maxValue: 100,
35
+ minValue: 20,
36
+ stepSize: 2,
37
+ style: { marginTop: '10px' },
38
+ value: me.exampleComponent.height
39
+ }, {
40
+ module: NumberField,
41
+ clearable: true,
42
+ labelText: 'width',
43
+ listeners: { change: me.onConfigChange.bind(me, 'width') },
44
+ maxValue: 300,
45
+ minValue: 100,
46
+ stepSize: 5,
47
+ style: { marginTop: '10px' },
48
+ value: me.exampleComponent.width
49
+ }, {
50
+ module: TextField,
51
+ labelText: 'label Alert',
52
+ listeners: { change: me.onConfigChange.bind(me, 'labelAlert') },
53
+ style: { marginTop: '20px' },
54
+ value: me.exampleComponent.labelAlert
55
+ }, {
56
+ module: TextField,
57
+ labelText: 'icon Alert',
58
+ listeners: { change: me.onConfigChange.bind(me, 'iconAlert') },
59
+ value: me.exampleComponent.iconAlert
60
+ }, {
61
+ module: TextField,
62
+ labelText: 'side-icon Alert',
63
+ listeners: { change: me.onConfigChange.bind(me, 'sideIconAlert') },
64
+ value: me.exampleComponent.sideIconAlert
65
+ }, {
66
+ module: TextField,
67
+ labelText: 'label Error',
68
+ listeners: { change: me.onConfigChange.bind(me, 'labelError') },
69
+ style: { marginTop: '10px' },
70
+ value: me.exampleComponent.labelError
71
+ }, {
72
+ module: TextField,
73
+ labelText: 'icon Error',
74
+ listeners: { change: me.onConfigChange.bind(me, 'iconError') },
75
+ value: me.exampleComponent.iconError
76
+ }, {
77
+ module: TextField,
78
+ labelText: 'side-icon Error',
79
+ listeners: { change: me.onConfigChange.bind(me, 'sideIconError') },
80
+ value: me.exampleComponent.sideIconError
81
+ },{
82
+ module: TextField,
83
+ labelText: 'label Info',
84
+ listeners: { change: me.onConfigChange.bind(me, 'labelInfo') },
85
+ style: { marginTop: '10px' },
86
+ value: me.exampleComponent.labelInfo
87
+ }, {
88
+ module: TextField,
89
+ labelText: 'icon Info',
90
+ listeners: { change: me.onConfigChange.bind(me, 'iconInfo') },
91
+ value: me.exampleComponent.iconInfo
92
+ }, {
93
+ module: TextField,
94
+ labelText: 'side-icon Info',
95
+ listeners: { change: me.onConfigChange.bind(me, 'sideIconInfo') },
96
+ value: me.exampleComponent.sideIconInfo
97
+ }, {
98
+ module: TextField,
99
+ labelText: 'label Neutral',
100
+ listeners: { change: me.onConfigChange.bind(me, 'labelNeutral') },
101
+ style: { marginTop: '10px' },
102
+ value: me.exampleComponent.labelNeutral
103
+ }, {
104
+ module: TextField,
105
+ labelText: 'icon Neutral',
106
+ listeners: { change: me.onConfigChange.bind(me, 'iconNeutral') },
107
+ value: me.exampleComponent.iconNeutral
108
+ }, {
109
+ module: TextField,
110
+ labelText: 'side-icon Neutral',
111
+ listeners: { change: me.onConfigChange.bind(me, 'sideIconNeutral') },
112
+ value: me.exampleComponent.sideIconNeutral
113
+ }, {
114
+ module: TextField,
115
+ labelText: 'label Success',
116
+ listeners: { change: me.onConfigChange.bind(me, 'labelSuccess') },
117
+ style: { marginTop: '10px' },
118
+ value: me.exampleComponent.labelSuccess
119
+ }, {
120
+ module: TextField,
121
+ labelText: 'icon Success',
122
+ listeners: { change: me.onConfigChange.bind(me, 'iconSuccess') },
123
+ value: me.exampleComponent.iconSuccess
124
+ }, {
125
+ module: TextField,
126
+ labelText: 'side-icon Success',
127
+ listeners: { change: me.onConfigChange.bind(me, 'sideIconSuccess') },
128
+ value: me.exampleComponent.sideIconSuccess
129
+ }, {
130
+ module: CheckBox,
131
+ checked: me.exampleComponent.deactivateStateIcons,
132
+ labelText: 'deactivate State Icons',
133
+ style: { marginTop: '20px' },
134
+ listeners: { change: me.onConfigChange.bind(me, 'deactivateStateIcons') },
135
+ }, {
136
+ module: CheckBox,
137
+ checked: me.exampleComponent.deactivateSideIcons,
138
+ labelText: 'deactivate Side Icons',
139
+ listeners: { change: me.onConfigChange.bind(me, 'deactivateSideIcons') },
140
+ }, {
141
+ module: Radio,
142
+ checked: me.exampleComponent.state === 'alert',
42
143
  hideValueLabel: false,
43
- labelText : 'state',
44
- listeners : {change: me.onRadioChange.bind(me, 'state', 'error')},
45
- name : 'state',
46
- style : {marginTop: '10px'},
144
+ labelText: 'state',
145
+ listeners: { change: me.onRadioChange.bind(me, 'state', 'alert') },
146
+ name: 'state',
147
+ style: { marginTop: '20px' },
148
+ valueLabelText: 'alert'
149
+ }, {
150
+ module: Radio,
151
+ checked: me.exampleComponent.state === 'error',
152
+ hideValueLabel: false,
153
+ labelText: '',
154
+ listeners: { change: me.onRadioChange.bind(me, 'state', 'error') },
155
+ name: 'state',
47
156
  valueLabelText: 'error'
48
157
  }, {
49
- module : Radio,
50
- checked : me.exampleComponent.badgePosition === 'success',
158
+ module: Radio,
159
+ checked: me.exampleComponent.state === 'info',
51
160
  hideValueLabel: false,
52
- labelText : '',
53
- listeners : {change: me.onRadioChange.bind(me, 'state', 'success')},
54
- name : 'state',
55
- valueLabelText: 'success'
161
+ labelText: '',
162
+ listeners: { change: me.onRadioChange.bind(me, 'state', 'info') },
163
+ name: 'state',
164
+ valueLabelText: 'info'
165
+ }, {
166
+ module: Radio,
167
+ checked: me.exampleComponent.state === 'neutral',
168
+ hideValueLabel: false,
169
+ labelText: '',
170
+ listeners: { change: me.onRadioChange.bind(me, 'state', 'neutral') },
171
+ name: 'state',
172
+ valueLabelText: 'neutral'
56
173
  }, {
57
- module : NumberField,
58
- clearable : true,
59
- labelText : 'width',
60
- listeners : {change: me.onConfigChange.bind(me, 'width')},
61
- maxValue : 300,
62
- minValue : 100,
63
- stepSize : 5,
64
- style : {marginTop: '10px'},
65
- value : me.exampleComponent.width
174
+ module: Radio,
175
+ checked: me.exampleComponent.state === 'success',
176
+ hideValueLabel: false,
177
+ labelText: '',
178
+ listeners: { change: me.onRadioChange.bind(me, 'state', 'success') },
179
+ name: 'state',
180
+ valueLabelText: 'success'
66
181
  }]
67
182
  }
68
183
 
@@ -70,7 +185,7 @@ class MainContainer extends ConfigurationViewport {
70
185
  return Neo.create({
71
186
  module: StatusBadge,
72
187
  height: 30,
73
- state : 'error'
188
+ state: 'info'
74
189
  })
75
190
  }
76
191
  }
@@ -140,6 +140,21 @@ class MainContainer extends ConfigurationViewport {
140
140
  xls : 1,
141
141
  pdf : 1
142
142
  }
143
+ }, {
144
+ module : FileUploadField,
145
+ id : 'my-failing-document-status-test',
146
+ uploadUrl : 'http://127.0.0.1:3000/file-upload-test',
147
+ documentStatusUrl : 'http://127.0.0.1:3000/document-status-fails?documentId={documentId}',
148
+ documentDeleteUrl : 'http://127.0.0.1:3000/document-delete?documentId={documentId}',
149
+ downloadUrl : 'http://127.0.0.1:3000/getDocument?documentId={documentId}',
150
+ width : 350,
151
+ maxSize : '10mb',
152
+ types : {
153
+ png : 1,
154
+ jpg : 1,
155
+ xls : 1,
156
+ pdf : 1
157
+ }
143
158
  }]
144
159
  });
145
160
  }
@@ -9,11 +9,11 @@ app.use(cors());
9
9
  app.post('/file-upload-test', async (req, res) => {
10
10
 
11
11
  await new Promise(resolve => setTimeout(resolve, 3000));
12
-
12
+
13
13
  res.set('Content-Type', 'application/json');
14
14
  res.send('{"success":true,"documentId":"1"}');
15
15
  })
16
-
16
+
17
17
  app.post('/file-upload-test-fail', async (req, res) => {
18
18
  res.set('Content-Type', 'application/json');
19
19
  res.send('{"success":false,"message":"Something went wrong"}');
@@ -21,7 +21,7 @@ app.post('/file-upload-test-fail', async (req, res) => {
21
21
 
22
22
  app.get('/document-status', async(req, res) => {
23
23
  res.set('Content-Type', 'application/json');
24
- res.send('{"status":"scanning"}');
24
+ res.send('{"status":"SCANNING"}');
25
25
  });
26
26
 
27
27
  app.get('/document-delete', async(req, res) => {
@@ -31,17 +31,27 @@ app.get('/document-delete', async(req, res) => {
31
31
 
32
32
  app.get('/document-status-fail', async(req, res) => {
33
33
  res.set('Content-Type', 'application/json');
34
- res.send('{"status":"scan-failed"}');
34
+ res.send('{"status":"MALWARE_DETECTED"}');
35
35
  });
36
36
 
37
37
  app.get('/document-status-downloadable', async(req, res) => {
38
38
  res.set('Content-Type', 'application/json');
39
- res.send('{"status":"downloadable"}');
39
+ res.send('{"status":"DOWNLOADABLE","fileName":"testfile.pdf","size":9653413}');
40
40
  });
41
41
 
42
42
  app.get('/document-status-not-downloadable', async(req, res) => {
43
43
  res.set('Content-Type', 'application/json');
44
- res.send('{"status":"not-downloadable"}');
44
+ res.send('{"status":"UN_DOWNLOADABLE","fileName":"testfile.pdf","size":9653413}');
45
+ });
46
+
47
+ app.get('/document-status-non-existent', async(req, res) => {
48
+ res.set('Content-Type', 'application/json');
49
+ res.send('{"status":"DELETED","fileName":"testfile.pdf","size":9653413}');
50
+ });
51
+
52
+ app.get('/document-status-fails', async(req, res) => {
53
+ res.status(500);
54
+ res.send('');
45
55
  });
46
56
 
47
57
  app.listen(port, () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "5.17.0",
3
+ "version": "5.18.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -1,9 +1,49 @@
1
1
  .neo-status-badge {
2
+ display: flex;
3
+ padding: v(status-badge-padding);
4
+ align-items: v(status-badge-align-items);
5
+
6
+ &.neo-state-alert {
7
+ background-color: v(status-badge-state-alert-background-color);
8
+ color: v(status-badge-state-alert-text-color);
9
+ }
10
+
2
11
  &.neo-state-error {
3
- background-color: red;
12
+ background-color: v(status-badge-state-error-background-color);
13
+ color: v(status-badge-state-error-text-color);
14
+ }
15
+
16
+ &.neo-state-info {
17
+ background-color: v(status-badge-state-info-background-color);
18
+ color: v(status-badge-state-info-text-color);
19
+ }
20
+
21
+ &.neo-state-neutral {
22
+ background-color: v(status-badge-state-neutral-background-color);
23
+ color: v(status-badge-state-neutral-text-color);
4
24
  }
5
25
 
6
26
  &.neo-state-success {
7
- background-color: darkgreen;
27
+ background-color: v(status-badge-state-success-background-color);
28
+ color: v(status-badge-state-success-text-color);
29
+
30
+ }
31
+
32
+ .neo-state-glyph {
33
+ font-size: v(status-badge-font-size);
34
+ pointer-events: none;
8
35
  }
9
- }
36
+
37
+ .neo-state-text {
38
+ flex: 1 1 auto;
39
+ font-family: v(status-badge-font-family);
40
+ font-size: v(status-badge-font-size);
41
+ font-weight: v(status-badge-font-weight);
42
+ line-height: v(status-badge-line-height);
43
+ pointer-events: none;
44
+ text-align: v(status-badge-align-items);
45
+ text-transform: v(status-badge-transform);
46
+ }
47
+
48
+
49
+ }
@@ -0,0 +1,41 @@
1
+ $neoMap: map-merge($neoMap, (
2
+ 'status-badge-padding' : 0px 5px 0px 5px,
3
+ 'status-badge-align-items' : center,
4
+ 'status-badge-state-alert-background-color' : orange,
5
+ 'status-badge-state-alert-text-color' : black,
6
+ 'status-badge-state-error-background-color' : red,
7
+ 'status-badge-state-error-text-color' : white,
8
+ 'status-badge-state-info-background-color' : lightblue,
9
+ 'status-badge-state-info-text-color' : black,
10
+ 'status-badge-state-neutral-background-color' : white,
11
+ 'status-badge-state-neutral-text-color' : black,
12
+ 'status-badge-state-success-background-color' : green,
13
+ 'status-badge-state-success-text-color' : white,
14
+ 'status-badge-font-size' : 11px,
15
+ 'status-badge-font-family' : #{neo(neo-font-family)},
16
+ 'status-badge-font-weight' : 600,
17
+ 'status-badge-line-height' : 11px,
18
+ 'status-badge-transform' : none
19
+ ));
20
+
21
+ @if $useCssVars == true {
22
+ :root .neo-theme-dark {
23
+ --status-badge-padding : #{neo(status-badge-padding)};
24
+ --status-badge-align-items : #{neo(status-badge-align-items)};
25
+ --status-badge-state-alert-background-color : #{neo(status-badge-state-alert-background-color)};
26
+ --status-badge-state-alert-text-color : #{neo(status-badge-state-alert-text-color)};
27
+ --status-badge-state-error-background-color : #{neo(status-badge-state-error-background-color)};
28
+ --status-badge-state-error-text-color : #{neo(status-badge-state-error-text-color)};
29
+ --status-badge-state-info-background-color : #{neo(status-badge-state-info-background-color)};
30
+ --status-badge-state-info-text-color : #{neo(status-badge-state-info-text-color)};
31
+ --status-badge-state-neutral-background-color : #{neo(status-badge-state-neutral-background-color)};
32
+ --status-badge-state-neutral-text-color : #{neo(status-badge-state-neutral-text-color)};
33
+ --status-badge-state-success-background-color : #{neo(status-badge-state-success-background-color)};
34
+ --status-badge-state-success-text-color : #{neo(status-badge-state-success-text-color)};
35
+ --status-badge-font-size : #{neo(status-badge-font-size)};
36
+ --status-badge-font-family : #{neo(status-badge-font-family)};
37
+ --status-badge-font-weight : #{neo(status-badge-font-weight)};
38
+ --status-badge-line-height : #{neo(status-badge-line-height)};
39
+ --status-badge-transform : #{neo(status-badge-transform)};
40
+ }
41
+ }
@@ -0,0 +1,41 @@
1
+ $neoMap: map-merge($neoMap, (
2
+ 'status-badge-padding' : 0px 5px 0px 5px,
3
+ 'status-badge-align-items' : center,
4
+ 'status-badge-state-alert-background-color' : orange,
5
+ 'status-badge-state-alert-text-color' : black,
6
+ 'status-badge-state-error-background-color' : red,
7
+ 'status-badge-state-error-text-color' : white,
8
+ 'status-badge-state-info-background-color' : lightblue,
9
+ 'status-badge-state-info-text-color' : black,
10
+ 'status-badge-state-neutral-background-color' : white,
11
+ 'status-badge-state-neutral-text-color' : black,
12
+ 'status-badge-state-success-background-color' : green,
13
+ 'status-badge-state-success-text-color' : white,
14
+ 'status-badge-font-size' : 11px,
15
+ 'status-badge-font-family' : #{neo(neo-font-family)},
16
+ 'status-badge-font-weight' : 600,
17
+ 'status-badge-line-height' : 11px,
18
+ 'status-badge-transform' : none
19
+ ));
20
+
21
+ @if $useCssVars == true {
22
+ :root .neo-theme-light {
23
+ --status-badge-padding : #{neo(status-badge-padding)};
24
+ --status-badge-align-items : #{neo(status-badge-align-items)};
25
+ --status-badge-state-alert-background-color : #{neo(status-badge-state-alert-background-color)};
26
+ --status-badge-state-alert-text-color : #{neo(status-badge-state-alert-text-color)};
27
+ --status-badge-state-error-background-color : #{neo(status-badge-state-error-background-color)};
28
+ --status-badge-state-error-text-color : #{neo(status-badge-state-error-text-color)};
29
+ --status-badge-state-info-background-color : #{neo(status-badge-state-info-background-color)};
30
+ --status-badge-state-info-text-color : #{neo(status-badge-state-info-text-color)};
31
+ --status-badge-state-neutral-background-color : #{neo(status-badge-state-neutral-background-color)};
32
+ --status-badge-state-neutral-text-color : #{neo(status-badge-state-neutral-text-color)};
33
+ --status-badge-state-success-background-color : #{neo(status-badge-state-success-background-color)};
34
+ --status-badge-state-success-text-color : #{neo(status-badge-state-success-text-color)};
35
+ --status-badge-font-size : #{neo(status-badge-font-size)};
36
+ --status-badge-font-family : #{neo(status-badge-font-family)};
37
+ --status-badge-font-weight : #{neo(status-badge-font-weight)};
38
+ --status-badge-line-height : #{neo(status-badge-line-height)};
39
+ --status-badge-transform : #{neo(status-badge-transform)};
40
+ }
41
+ }
@@ -245,12 +245,12 @@ const DefaultConfig = {
245
245
  useVdomWorker: true,
246
246
  /**
247
247
  * buildScripts/injectPackageVersion.mjs will update this value
248
- * @default '5.17.0'
248
+ * @default '5.18.0'
249
249
  * @memberOf! module:Neo
250
250
  * @name config.version
251
251
  * @type String
252
252
  */
253
- version: '5.17.0'
253
+ version: '5.18.0'
254
254
  };
255
255
 
256
256
  Object.assign(DefaultConfig, {
@@ -1,4 +1,4 @@
1
- import Base from '../component/Base.mjs';
1
+ import Base from '../component/Base.mjs';
2
2
  import NeoArray from '../util/Array.mjs';
3
3
 
4
4
  /**
@@ -8,11 +8,11 @@ import NeoArray from '../util/Array.mjs';
8
8
  class StatusBadge extends Base {
9
9
  /**
10
10
  * Valid values for state
11
- * @member {String[]} states=['error','neutral','success']
11
+ * @member {String[]} states=['alert','error','info','neutral','success']
12
12
  * @protected
13
13
  * @static
14
14
  */
15
- static states = ['error', 'neutral', 'success']
15
+ static states = ['alert', 'error', 'info', 'neutral', 'success']
16
16
 
17
17
  static config = {
18
18
  /**
@@ -30,15 +30,297 @@ class StatusBadge extends Base {
30
30
  * @protected
31
31
  */
32
32
  baseCls: ['neo-status-badge'],
33
+ /**
34
+ * @member {String[]} currentStateIcon=null
35
+ */
36
+ _currentStateIcon: null,
37
+ /**
38
+ * @member {String[]} currentSideIcon=null
39
+ */
40
+ _currentSideIcon: null,
41
+ /**
42
+ * false calls Neo.Main.setRoute()
43
+ * @member {Boolean} deactivateStateIcons=false
44
+ */
45
+ deactivateStateIcons_: false,
46
+ /**
47
+ * false calls Neo.Main.setRoute()
48
+ * @member {Boolean} deactivateSideIcons=false
49
+ */
50
+ deactivateSideIcons_: false,
51
+
52
+ /**
53
+ * @member {String} iconAlert='fa-triangle-exclamation'
54
+ */
55
+ iconAlert_: 'fa fa-triangle-exclamation',
56
+ /**
57
+ * @member {String} iconError='fa-xmark'
58
+ */
59
+ iconError_: 'fa fa-xmark',
60
+ /**
61
+ * @member {String} iconInfo='fa-info'
62
+ */
63
+ iconInfo_: 'fa fa-info',
64
+ /**
65
+ * @member {String} iconNeutral='fa-circle'
66
+ */
67
+ iconNeutral_: 'fa fa-circle',
68
+ /**
69
+ * @member {String} iconSuccess='fa-check'
70
+ */
71
+ iconSuccess_: 'fa fa-check',
72
+
73
+ /**
74
+ * @member {String} sideIconAlert='fa fa-registered'
75
+ */
76
+ sideIconAlert_: 'fa fa-registered',
77
+ /**
78
+ * @member {String} sideIconError='fa fa-registered'
79
+ */
80
+ sideIconError_: 'fa fa-registered',
81
+ /**
82
+ * @member {String} sideIconInfo='fa fa-registered'
83
+ */
84
+ sideIconInfo_: 'fa fa-registered',
85
+ /**
86
+ * @member {String} sideIconNeutral='fa fa-registered'
87
+ */
88
+ sideIconNeutral_: 'fa fa-registered',
89
+ /**
90
+ * @member {String} sideIconSuccess='fa fa-registered'
91
+ */
92
+ sideIconSuccess_: 'fa fa-registered',
93
+
94
+
95
+
96
+ /**
97
+ * @member {String} labelAlert_='Alert'
98
+ */
99
+ labelAlert_: 'Alert',
100
+ /**
101
+ * @member {String} labelError_='Error'
102
+ */
103
+ labelError_: 'Error',
104
+ /**
105
+ * @member {String} labelInfo_='Info'
106
+ */
107
+ labelInfo_: 'Info',
108
+ /**
109
+ * @member {String} labelNeutral_='Neutral'
110
+ */
111
+ labelNeutral_: 'Neutral',
112
+ /**
113
+ * @member {String} labelSuccess_='Success'
114
+ */
115
+ labelSuccess_: 'Success',
116
+
117
+
33
118
  /**
34
119
  * @member {String} state_='neutral'
35
120
  */
36
121
  state_: 'neutral',
37
122
  /**
38
- * @member {Object} vdom
123
+ * @member {Object} _vdom
39
124
  */
40
- vdom:
41
- {}
125
+ _vdom:
126
+ {
127
+ tag: 'div', type: 'div', cn: [
128
+ { tag: 'span', cls: ['neo-state-glyph'] },
129
+ { tag: 'span', cls: ['neo-state-text'] },
130
+ { tag: 'span', cls: ['neo-state-glyph'] }
131
+ ]
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Triggered after the deactivateStateIcons config got changed
137
+ * @param {String|null} value
138
+ * @param {String|null} oldValue
139
+ * @protected
140
+ */
141
+ afterSetDeactivateStateIcons(value, oldValue) {
142
+ this.updateStateIconNode(this._currentStateIcon);
143
+ }
144
+
145
+ /**
146
+ * Triggered after the deactivateSideIcons config got changed
147
+ * @param {String|null} value
148
+ * @param {String|null} oldValue
149
+ * @protected
150
+ */
151
+ afterSetDeactivateSideIcons(value, oldValue) {
152
+ this.updateSideIconNode(this._currentSideIcon);
153
+ }
154
+
155
+ /**
156
+ * Triggered after the labelAlert config got changed
157
+ * @param {String|null} value
158
+ * @param {String|null} oldValue
159
+ * @protected
160
+ */
161
+ afterSetLabelAlert(value, oldValue) {
162
+ if (this.state === 'alert') {
163
+ this.updateLabelNode(value);
164
+ }
165
+ }
166
+ /**
167
+ * Triggered after the iconAlert config got changed
168
+ * @param {String|null} value
169
+ * @param {String|null} oldValue
170
+ * @protected
171
+ */
172
+ afterSetIconAlert(value, oldValue) {
173
+ if (this.state === 'alert') {
174
+ this.updateStateIconNode(value);
175
+ }
176
+ }
177
+ /**
178
+ * Triggered after the sideIconAlert config got changed
179
+ * @param {String|null} value
180
+ * @param {String|null} oldValue
181
+ * @protected
182
+ */
183
+ afterSetSideIconAlert(value, oldValue) {
184
+ if (this.state === 'alert') {
185
+ this.updateSideIconNode(value);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Triggered after the labelError config got changed
191
+ * @param {String|null} value
192
+ * @param {String|null} oldValue
193
+ * @protected
194
+ */
195
+ afterSetLabelError(value, oldValue) {
196
+ if (this.state === 'error') {
197
+ this.updateLabelNode(value);
198
+ }
199
+ }
200
+ /**
201
+ * Triggered after the iconError config got changed
202
+ * @param {String|null} value
203
+ * @param {String|null} oldValue
204
+ * @protected
205
+ */
206
+ afterSetIconError(value, oldValue) {
207
+ if (this.state === 'error') {
208
+ this.updateStateIconNode(value);
209
+ }
210
+ }
211
+ /**
212
+ * Triggered after the sideIconError config got changed
213
+ * @param {String|null} value
214
+ * @param {String|null} oldValue
215
+ * @protected
216
+ */
217
+ afterSetSideIconError(value, oldValue) {
218
+ if (this.state === 'error') {
219
+ this.updateSideIconNode(value);
220
+ }
221
+ }
222
+
223
+
224
+ /**
225
+ * Triggered after the labelInfo config got changed
226
+ * @param {String|null} value
227
+ * @param {String|null} oldValue
228
+ * @protected
229
+ */
230
+ afterSetLabelInfo(value, oldValue) {
231
+ if (this.state === 'info') {
232
+ this.updateLabelNode(value);
233
+ }
234
+ }
235
+ /**
236
+ * Triggered after the iconInfo config got changed
237
+ * @param {String|null} value
238
+ * @param {String|null} oldValue
239
+ * @protected
240
+ */
241
+ afterSetIconInfo(value, oldValue) {
242
+ if (this.state === 'info') {
243
+ this.updateStateIconNode(value);
244
+ }
245
+ }
246
+ /**
247
+ * Triggered after the sideIconInfo config got changed
248
+ * @param {String|null} value
249
+ * @param {String|null} oldValue
250
+ * @protected
251
+ */
252
+ afterSetSideIconInfo(value, oldValue) {
253
+ if (this.state === 'info') {
254
+ this.updateSideIconNode(value);
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Triggered after the labelNeutral config got changed
260
+ * @param {String|null} value
261
+ * @param {String|null} oldValue
262
+ * @protected
263
+ */
264
+ afterSetLabelNeutral(value, oldValue) {
265
+ if (this.state === 'neutral') {
266
+ this.updateLabelNode(value);
267
+ }
268
+ }
269
+ /**
270
+ * Triggered after the iconNeutral config got changed
271
+ * @param {String|null} value
272
+ * @param {String|null} oldValue
273
+ * @protected
274
+ */
275
+ afterSetIconNeutral(value, oldValue) {
276
+ if (this.state === 'neutral') {
277
+ this.updateStateIconNode(value);
278
+ }
279
+ }
280
+ /**
281
+ * Triggered after the sideIconNeutral config got changed
282
+ * @param {String|null} value
283
+ * @param {String|null} oldValue
284
+ * @protected
285
+ */
286
+ afterSetSideIconNeutral(value, oldValue) {
287
+ if (this.state === 'neutral') {
288
+ this.updateSideIconNode(value);
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Triggered after the labelSuccess config got changed
294
+ * @param {String|null} value
295
+ * @param {String|null} oldValue
296
+ * @protected
297
+ */
298
+ afterSetLabelSuccess(value, oldValue) {
299
+ if (this.state === 'success') {
300
+ this.updateLabelNode(value);
301
+ }
302
+ }
303
+ /**
304
+ * Triggered after the iconSuccess config got changed
305
+ * @param {String|null} value
306
+ * @param {String|null} oldValue
307
+ * @protected
308
+ */
309
+ afterSetIconSuccess(value, oldValue) {
310
+ if (this.state === 'success') {
311
+ this.updateStateIconNode(value);
312
+ }
313
+ }
314
+ /**
315
+ * Triggered after the sideIconSuccess config got changed
316
+ * @param {String|null} value
317
+ * @param {String|null} oldValue
318
+ * @protected
319
+ */
320
+ afterSetSideIconSuccess(value, oldValue) {
321
+ if (this.state === 'success') {
322
+ this.updateSideIconNode(value);
323
+ }
42
324
  }
43
325
 
44
326
  /**
@@ -48,12 +330,58 @@ class StatusBadge extends Base {
48
330
  * @protected
49
331
  */
50
332
  afterSetState(value, oldValue) {
51
- let cls = this.cls;
333
+
334
+ let cls = this.cls,
335
+ me = this,
336
+ isEmpty = !value || value === '',
337
+ vdomRoot = me.getVdomRoot(),
338
+ labelNode = vdomRoot.cn[1];
52
339
 
53
340
  NeoArray.remove(cls, 'neo-state-' + oldValue);
54
341
  NeoArray.add(cls, 'neo-state-' + value);
55
342
 
56
343
  this.cls = cls
344
+
345
+ labelNode.removeDom = isEmpty;
346
+
347
+ if (!isEmpty) {
348
+ let showLabel = '';
349
+ let showStateIcon = '';
350
+ let showSideIcon = '';
351
+
352
+ switch (value) {
353
+ case 'alert':
354
+ showLabel = me.labelAlert;
355
+ showStateIcon = me.iconAlert;
356
+ showSideIcon = me.sideIconAlert;
357
+ break;
358
+ case 'error':
359
+ showLabel = me.labelError;
360
+ showStateIcon = me.iconError;
361
+ showSideIcon = me.sideIconError;
362
+ break;
363
+ case 'info':
364
+ showLabel = me.labelInfo;
365
+ showStateIcon = me.iconInfo;
366
+ showSideIcon = me.sideIconInfo;
367
+ break;
368
+ case 'neutral':
369
+ showLabel = me.labelNeutral;
370
+ showStateIcon = me.iconNeutral;
371
+ showSideIcon = me.sideIconNeutral;
372
+ break;
373
+ case 'success':
374
+ showLabel = me.labelSuccess;
375
+ showStateIcon = me.iconSuccess;
376
+ showSideIcon = me.sideIconSuccess;
377
+ break;
378
+ }
379
+ labelNode.innerHTML = showLabel;
380
+ this.updateStateIconNode(showStateIcon);
381
+ this.updateSideIconNode(showSideIcon);
382
+ }
383
+
384
+ me.update();
57
385
  }
58
386
 
59
387
  /**
@@ -66,6 +394,105 @@ class StatusBadge extends Base {
66
394
  beforeSetState(value, oldValue) {
67
395
  return this.beforeSetEnumValue(value, oldValue, 'state')
68
396
  }
397
+
398
+ /**
399
+ * Convenience shortcut
400
+ * @returns {Object}
401
+ */
402
+ updateLabelNode(value) {
403
+ let labelNode = this.getVdomRoot().cn[1];
404
+
405
+ labelNode.innerHTML = value;
406
+ labelNode.removeDom = !Boolean(value);
407
+
408
+ this.update();
409
+ }
410
+
411
+ /**
412
+ * Convenience shortcut
413
+ * @returns {Object}
414
+ */
415
+ updateStateIconNode(value) {
416
+ let iconNode = this.getStateIconNode();
417
+ let currentValue = this._currentStateIcon;
418
+
419
+ if (value && !Array.isArray(value)) {
420
+ value = value.split(' ').filter(Boolean);
421
+ }
422
+ if (currentValue && !Array.isArray(currentValue)) {
423
+ currentValue = value.split(' ').filter(Boolean);
424
+ }
425
+
426
+ NeoArray.remove(iconNode.cls, currentValue);
427
+ NeoArray.add(iconNode.cls, value);
428
+
429
+ iconNode.removeDom = !value || value === '' || this.deactivateStateIcons;
430
+
431
+ this._currentStateIcon = value;
432
+ this.update();
433
+ }
434
+
435
+ /**
436
+ * Convenience shortcut
437
+ * @returns {Object}
438
+ */
439
+ getStateIconNode() {
440
+ return this.getVdomRoot().cn[0]
441
+ }
442
+
443
+
444
+ /**
445
+ * Triggered after the StateIcon config got changed
446
+ * @param {String|null} value
447
+ * @param {String|null} oldValue
448
+ * @protected
449
+ */
450
+ afterSetStateIcon(value, oldValue) {
451
+ this.updateStateIconNode(value, oldValue);
452
+ }
453
+
454
+ /**
455
+ * Convenience shortcut
456
+ * @returns {Object}
457
+ */
458
+ updateSideIconNode(value) {
459
+ let iconNode = this.getSideIconNode();
460
+ let currentValue = this._currentSideIcon;
461
+
462
+ if (value && !Array.isArray(value)) {
463
+ value = value.split(' ').filter(Boolean);
464
+ }
465
+ if (currentValue && !Array.isArray(currentValue)) {
466
+ currentValue = value.split(' ').filter(Boolean);
467
+ }
468
+
469
+ NeoArray.remove(iconNode.cls, currentValue);
470
+ NeoArray.add(iconNode.cls, value);
471
+
472
+ iconNode.removeDom = !value || value === '' || this.deactivateSideIcons;
473
+
474
+ this._currentSideIcon = value;
475
+ this.update();
476
+ }
477
+
478
+ /**
479
+ * Convenience shortcut
480
+ * @returns {Object}
481
+ */
482
+ getSideIconNode() {
483
+ return this.getVdomRoot().cn[2]
484
+ }
485
+
486
+
487
+ /**
488
+ * Triggered after the StateIcon config got changed
489
+ * @param {String|null} value
490
+ * @param {String|null} oldValue
491
+ * @protected
492
+ */
493
+ afterSetSideIcon(value, oldValue) {
494
+ this.updateSideIconNode(value, oldValue);
495
+ }
69
496
  }
70
497
 
71
498
  Neo.applyClassConfig(StatusBadge);
@@ -134,7 +134,7 @@ class FileUpload extends Base {
134
134
  * An Object containing a default set of headers to be passed to the server on every HTTP request.
135
135
  * @member {Object} headers
136
136
  */
137
- headers : {},
137
+ headers_ : {},
138
138
 
139
139
  /**
140
140
  * An Object which allows the status text returned from the {@link #property-documentStatusUrl} to be
@@ -217,7 +217,7 @@ class FileUpload extends Base {
217
217
  *
218
218
  * @member {String} downloadUrl
219
219
  */
220
- downloadUrl : null,
220
+ downloadUrl_ : null,
221
221
 
222
222
  /**
223
223
  * The URL of the file status reporting service.
@@ -246,7 +246,7 @@ class FileUpload extends Base {
246
246
  *
247
247
  * @member {String} documentStatusUrl
248
248
  */
249
- documentStatusUrl : null,
249
+ documentStatusUrl_ : null,
250
250
 
251
251
  /**
252
252
  * The polling interval *in milliseconds* to wait between asking the server how the document scan
@@ -279,7 +279,7 @@ class FileUpload extends Base {
279
279
  *
280
280
  * @member {String} documentDeleteUrl
281
281
  */
282
- documentDeleteUrl : null,
282
+ documentDeleteUrl_ : null,
283
283
 
284
284
  /**
285
285
  * @member {String} state_=null
@@ -589,17 +589,12 @@ class FileUpload extends Base {
589
589
  me.state = 'ready';
590
590
  break;
591
591
  default:
592
- const { fileName, size } = serverJson;
593
-
594
- if (fileName) {
595
- me.vdom.cn[1].cn[0].innerHTML = fileName;
596
- me.fileSize = me.formatSize(size);
597
- }
598
592
  me.state = status;
599
593
  }
600
594
  }
601
595
  else {
602
- me.error = `${documentStatusError}: ${statusResponse.statusText}`;
596
+ me.error = `${me.documentStatusError}: ${statusResponse.statusText || `Server error ${statusResponse.status}`}`;
597
+ me.state = 'deleted';
603
598
  }
604
599
  }
605
600
  }
@@ -659,7 +654,7 @@ class FileUpload extends Base {
659
654
  break;
660
655
  case 'not-downloadable':
661
656
  status.innerHTML = me.preExistingDocument ?
662
- me.fileSize : `${successfullyUploaded} \u2022 ${me.fileSize}`;
657
+ me.fileSize : `${me.successfullyUploaded} \u2022 ${me.fileSize}`;
663
658
  break;
664
659
  case 'deleted':
665
660
  status.innerHTML = me.fileWasDeleted;
@@ -694,18 +689,24 @@ class FileUpload extends Base {
694
689
  }
695
690
 
696
691
  beforeGetDocumentStatusUrl(documentStatusUrl) {
692
+ const me = this;
693
+
697
694
  return typeof documentStatusUrl === 'function'? documentStatusUrl.call(me, me) : me.createUrl(documentStatusUrl, {
698
695
  [me.documentIdParameter] : me.documentId
699
696
  });
700
697
  }
701
698
 
702
699
  beforeGetDocumentDeleteUrl(documentDeleteUrl) {
700
+ const me = this;
701
+
703
702
  return typeof documentDeleteUrl === 'function'? documentDeleteUrl.call(me, me) : me.createUrl(documentDeleteUrl, {
704
703
  [me.documentIdParameter] : me.documentId
705
704
  });
706
705
  }
707
706
 
708
707
  beforeGetDownloadUrl(downloadUrl) {
708
+ const me = this;
709
+
709
710
  return typeof downloadUrl === 'function'? downloadUrl.call(me, me) : me.createUrl(downloadUrl, {
710
711
  [me.documentIdParameter] : me.documentId
711
712
  });
@@ -758,7 +759,9 @@ class FileUpload extends Base {
758
759
  * @returns {Boolean}
759
760
  */
760
761
  validate() {
761
- const { isValid, cls } = this;
762
+ const
763
+ { cls } = this,
764
+ isValid = this.isValid();
762
765
 
763
766
  NeoArray.toggle(cls, 'neo-invalid', !isValid);
764
767
  this.cls = cls;
@@ -766,13 +769,13 @@ class FileUpload extends Base {
766
769
  return isValid;
767
770
  }
768
771
 
769
- get isValid() {
772
+ isValid() {
770
773
  const me = this;
771
774
 
772
- return !me.error &&
773
- ((me.state === 'ready' && !me.required) ||
774
- (me.state === 'downloadable') ||
775
- (me.state === 'not-downloadable'));
775
+ return !me.error && !(me.state === 'ready' && me.required) ||
776
+ ( (me.state === 'downloadable') ||
777
+ (me.state === 'not-downloadable')
778
+ );
776
779
  }
777
780
  }
778
781