material 0.8.8 → 0.9.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.
package/index.js CHANGED
@@ -35,6 +35,7 @@ import build from './src/module/build'
35
35
  import dataset from './src/module/dataset'
36
36
  import device from './src/module/device'
37
37
  import display from './src/mixin/display'
38
+ import request from './src/module/request'
38
39
  import events from './src/module/events'
39
40
  import emitter from './src/module/emitter'
40
41
  import jsonToHTML from './src/module/jsontohtml'
@@ -47,5 +48,5 @@ export {
47
48
  File, Form, Image, Layout, List, Loading, Menu, Navigation, Progress, Select,
48
49
  Selecter, Slider, Snackbar, Switch, Switcher, Tabs, TabView, Text, Textfield, Toolbar, Tooltip,
49
50
  View, attributes, build, dataset, device, display, events, emitter, jsonToHTML, mediator,
50
- observer, smoothscroll
51
+ observer, request, smoothscroll
51
52
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "material",
3
- "version": "0.8.8",
3
+ "version": "0.9.0",
4
4
  "description": "A lightweight implementation of Material Design Components for the web - ES6",
5
5
  "main": "index.js",
6
6
  "type": "module",
package/src/button.js CHANGED
@@ -82,8 +82,7 @@ class Button extends EventEmitter {
82
82
  this.element.value = value
83
83
  break
84
84
  case 'label':
85
- if (!this.ui.label) this.buildLabel()
86
- this.ui.label.innerHTML = value
85
+ this.setLabel(value)
87
86
  break
88
87
  case 'text':
89
88
  this.element.innerHTML = value
@@ -126,12 +125,22 @@ class Button extends EventEmitter {
126
125
  case 'value':
127
126
  return this.element.value
128
127
  case 'label':
129
- return this.label?.innerHTML ?? this.element.value
128
+ return this.getText()
129
+ case 'text':
130
+ return this.getText()
130
131
  default:
131
132
  return this.element.value
132
133
  }
133
134
  }
134
135
 
136
+ getText () {
137
+ if (this.ui.label) {
138
+ return this.ui.label.innerHTML
139
+ } else {
140
+ return this.element.innerHTML
141
+ }
142
+ }
143
+
135
144
  disable () {
136
145
  this.element.disabled = true
137
146
  }
package/src/menu.js CHANGED
@@ -6,7 +6,6 @@ import display from './mixin/display'
6
6
  import position from './mixin/position'
7
7
 
8
8
  import Element from './element'
9
- import Button from './button'
10
9
 
11
10
  class Menu extends EventEmitter {
12
11
  static defaults = {
@@ -23,10 +22,8 @@ class Menu extends EventEmitter {
23
22
  ],
24
23
  events: [
25
24
  ['element.click', 'onClick'],
26
- ['element.show', 'close'],
27
- ['element.mouseenter', 'onMouseEnter'],
28
- ['element.mouseleave', 'close'],
29
- ['options.target.mouseleave', 'close']
25
+ ['select', 'destroy'],
26
+ ['underlay.click', 'close']
30
27
  ]
31
28
  }
32
29
 
@@ -35,6 +32,7 @@ class Menu extends EventEmitter {
35
32
 
36
33
  this.init(options)
37
34
  this.build(this.constructor)
35
+ this.buildUnderlay()
38
36
  this.setup()
39
37
 
40
38
  this.render(this.options.items)
@@ -45,11 +43,25 @@ class Menu extends EventEmitter {
45
43
  init (options) {
46
44
  this.options = Object.assign({}, Menu.defaults, options || {})
47
45
  Object.assign(this, build, display, position)
46
+
47
+ this.menus = []
48
+ }
49
+
50
+ buildUnderlay () {
51
+ if (!this.options.parentName) {
52
+ this.underlay = new Element({
53
+ class: 'menu-underlay'
54
+ })
55
+
56
+ this.options.container.appendChild(this.underlay)
57
+ }
48
58
  }
49
59
 
50
60
  setup () {
51
61
  events.attach(this.options.events, this)
52
62
  this.closeTimeout = null
63
+
64
+ document.addEventListener('click', this.handleDocumentClick)
53
65
  }
54
66
 
55
67
  render (items) {
@@ -64,34 +76,81 @@ class Menu extends EventEmitter {
64
76
 
65
77
  add (obj) {
66
78
  if (typeof obj !== 'object') return this
79
+
67
80
  let item
81
+
68
82
  if (obj.type === 'divider') {
69
83
  item = new Element({ tag: 'li', class: 'divider' })
70
84
  } else {
71
- obj.container = this.ui.list
72
- item = new Element(obj).classList.add('item')
85
+ obj.tag = 'li'
86
+ obj.class = obj.class ? obj.class + ' item' : 'item'
87
+ item = new Element(obj)
88
+
89
+ item.addEventListener('mouseenter', () => {
90
+ if (this.menu) {
91
+ this.menu.destroy()
92
+ }
93
+ })
94
+
95
+ if (obj.items && Array.isArray(obj.items)) {
96
+ item.classList.add('sub')
97
+
98
+ item.addEventListener('mouseenter', () => {
99
+ this.menu = new Menu({
100
+ class: 'floating',
101
+ target: item,
102
+ container: this.options.container,
103
+ parentName: obj.name,
104
+ items: obj.items
105
+ }).position(item, {
106
+ align: 'left',
107
+ vAlign: 'inline',
108
+ offsetX: 8,
109
+ offsetY: 8
110
+ }).show()
111
+
112
+ this.menu.on('select', (name) => {
113
+ this.emit('select', `${obj.name}:${name}`)
114
+ }).on('destroy', () => {
115
+ this.menu = null
116
+ })
117
+
118
+ this.menus.push(this.menu)
119
+ })
120
+ }
73
121
  }
74
-
122
+ this.ui.list.appendChild(item)
75
123
  return this
76
124
  }
77
125
 
78
- onMouseEnter () {
79
- clearTimeout(this.closeTimeout)
80
- }
81
-
82
126
  onClick (ev) {
83
- // console.log('onClick', ev.target, ev.target.getAttribute('name'))
127
+ if (ev.target.classList.contains('sub')) return
84
128
  const name = ev.target.getAttribute('name')
85
129
  if (name) {
86
130
  this.emit('select', name)
87
131
  }
88
- this.destroy()
132
+ }
133
+
134
+ destroyMenu (menu) {
135
+ // Trouver l'index de menuToDestroy dans this.menus
136
+ const index = this.menus.indexOf(menu)
137
+
138
+ // Si trouvé, supprimer le menu du tableau
139
+ if (index > -1) {
140
+ this.menus.splice(index, 1)
141
+ }
142
+
143
+ // Appeler la méthode destroy sur le menuToDestroy
144
+ menu.destroy()
89
145
  }
90
146
 
91
147
  close () {
92
- this.closeTimeout = setTimeout(() => {
93
- this.destroy()
94
- }, 200)
148
+ // console.log('')
149
+ this.menus.forEach(menu => {
150
+ menu.destroy()
151
+ })
152
+ this.menus = []
153
+ this.destroy()
95
154
  }
96
155
  }
97
156
 
@@ -8,8 +8,10 @@ export default {
8
8
 
9
9
  if (!target) return
10
10
 
11
+ // console.log('container', this.options.container)
12
+
11
13
  const caller = target.getBoundingClientRect()
12
- const screen = this.element.parentNode.getBoundingClientRect()
14
+ const screen = this.options.container.getBoundingClientRect()
13
15
  const element = this.element.getBoundingClientRect()
14
16
 
15
17
  let left, top
@@ -21,7 +23,6 @@ export default {
21
23
  case 'right':
22
24
  left = caller.left
23
25
  if (left + element.width + offsetX > screen.width) {
24
- console.log('out boundaries')
25
26
  left = caller.left - element.width + caller.width
26
27
  }
27
28
  break
@@ -34,10 +35,16 @@ export default {
34
35
 
35
36
  // ensure that the element remains within the limits of its container
36
37
 
38
+ // if (left < 0) left = offsetX
39
+
40
+ // if (left + element.width + offsetX > screen.width) {
41
+ // left = screen.width - element.width - offsetX
42
+ // }
43
+
37
44
  if (left < 0) left = offsetX
38
45
 
39
- if (left + element.width + offsetX > screen.width) {
40
- left = screen.width - element.width - offsetX
46
+ if (left + element.width > screen.width) {
47
+ left = caller.left - element.width
41
48
  }
42
49
 
43
50
  // console.log('left', left)
@@ -46,15 +53,13 @@ export default {
46
53
 
47
54
  const scrollY = window.scrollY
48
55
 
49
- // console.log('class', name)
50
- // console.log('scrollY', scrollY)
51
- // console.log('vAlign', vAlign)
52
- // console.log('target top', caller.top)
53
-
54
56
  switch (vAlign) {
55
57
  case 'top':
56
58
  top = caller.top + scrollY - element.height
57
59
  break
60
+ case 'inline':
61
+ top = caller.top + scrollY
62
+ break
58
63
  case 'bottom':
59
64
  top = caller.top + caller.height + scrollY
60
65
  break
@@ -71,6 +76,12 @@ export default {
71
76
  top = caller.top + scrollY + (caller.height / 2) - (element.height / 2)
72
77
  }
73
78
 
79
+ // console.log('screen height', screen.height, element.height, offsetX)
80
+
81
+ if (top + element.height + offsetY > screen.height) {
82
+ top = screen.height - element.height - offsetX
83
+ }
84
+
74
85
  this.element.style.left = `${left}px`
75
86
  this.element.style.top = `${top}px`
76
87