@operato/context 2.0.0-alpha.0 → 2.0.0-alpha.100

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 (62) hide show
  1. package/CHANGELOG.md +584 -0
  2. package/demo/index.html +13 -2
  3. package/dist/src/layouts/ox-context-page-toolbar.d.ts +9 -4
  4. package/dist/src/layouts/ox-context-page-toolbar.js +30 -10
  5. package/dist/src/layouts/ox-context-page-toolbar.js.map +1 -1
  6. package/dist/src/layouts/ox-context-toolbar.d.ts +5 -3
  7. package/dist/src/layouts/ox-context-toolbar.js +142 -73
  8. package/dist/src/layouts/ox-context-toolbar.js.map +1 -1
  9. package/dist/src/styles/ox-context-toolbar-overlay-style.js +2 -2
  10. package/dist/src/styles/ox-context-toolbar-overlay-style.js.map +1 -1
  11. package/dist/src/tools/ox-page-action-context-bar.d.ts +12 -5
  12. package/dist/src/tools/ox-page-action-context-bar.js +43 -48
  13. package/dist/src/tools/ox-page-action-context-bar.js.map +1 -1
  14. package/dist/src/tools/ox-page-action-overlay-template.d.ts +2 -2
  15. package/dist/src/tools/ox-page-action-overlay-template.js +22 -31
  16. package/dist/src/tools/ox-page-action-overlay-template.js.map +1 -1
  17. package/dist/src/tools/ox-page-title-bar.d.ts +2 -2
  18. package/dist/src/tools/ox-page-title-bar.js +6 -8
  19. package/dist/src/tools/ox-page-title-bar.js.map +1 -1
  20. package/dist/src/tools/ox-title-bar.d.ts +2 -2
  21. package/dist/src/tools/ox-title-bar.js +6 -8
  22. package/dist/src/tools/ox-title-bar.js.map +1 -1
  23. package/dist/stories/ox-context-page-toolbar-select-buttons.stories.d.ts +25 -0
  24. package/dist/stories/ox-context-page-toolbar-select-buttons.stories.js +127 -0
  25. package/dist/stories/ox-context-page-toolbar-select-buttons.stories.js.map +1 -0
  26. package/dist/stories/ox-context-page-toolbar-select.stories.d.ts +24 -0
  27. package/dist/stories/ox-context-page-toolbar-select.stories.js +85 -0
  28. package/dist/stories/ox-context-page-toolbar-select.stories.js.map +1 -0
  29. package/dist/stories/ox-context-page-toolbar.stories.d.ts +24 -0
  30. package/dist/stories/ox-context-page-toolbar.stories.js +93 -0
  31. package/dist/stories/ox-context-page-toolbar.stories.js.map +1 -0
  32. package/dist/stories/ox-context-toolbar-complex.stories.d.ts +19 -0
  33. package/dist/stories/ox-context-toolbar-complex.stories.js +150 -0
  34. package/dist/stories/ox-context-toolbar-complex.stories.js.map +1 -0
  35. package/dist/stories/ox-context-toolbar-empty.stories.d.ts +19 -0
  36. package/dist/stories/ox-context-toolbar-empty.stories.js +88 -0
  37. package/dist/stories/ox-context-toolbar-empty.stories.js.map +1 -0
  38. package/dist/stories/ox-context-toolbar-overflow.stories.d.ts +19 -0
  39. package/dist/stories/ox-context-toolbar-overflow.stories.js +131 -0
  40. package/dist/stories/ox-context-toolbar-overflow.stories.js.map +1 -0
  41. package/dist/stories/ox-context-toolbar.stories.d.ts +19 -0
  42. package/dist/stories/ox-context-toolbar.stories.js +188 -0
  43. package/dist/stories/ox-context-toolbar.stories.js.map +1 -0
  44. package/dist/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +20 -20
  46. package/src/layouts/ox-context-page-toolbar.ts +33 -10
  47. package/src/layouts/ox-context-toolbar.ts +143 -70
  48. package/src/styles/ox-context-toolbar-overlay-style.ts +2 -2
  49. package/src/tools/ox-page-action-context-bar.ts +71 -67
  50. package/src/tools/ox-page-action-overlay-template.ts +42 -51
  51. package/src/tools/ox-page-title-bar.ts +6 -8
  52. package/src/tools/ox-title-bar.ts +6 -8
  53. package/stories/ox-context-page-toolbar-select-buttons.stories.ts +141 -0
  54. package/stories/ox-context-page-toolbar-select.stories.ts +99 -0
  55. package/stories/ox-context-page-toolbar.stories.ts +107 -0
  56. package/stories/ox-context-toolbar-complex.stories.ts +162 -0
  57. package/stories/ox-context-toolbar-empty.stories.ts +100 -0
  58. package/stories/ox-context-toolbar-overflow.stories.ts +143 -0
  59. package/stories/ox-context-toolbar.stories.ts +200 -0
  60. package/themes/app-theme.css +161 -0
  61. package/themes/context-theme.css +74 -0
  62. package/themes/material-theme.css +88 -0
@@ -1,6 +1,6 @@
1
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
2
2
 
3
- import { css, html, LitElement, nothing } from 'lit'
3
+ import { css, html, LitElement, nothing, PropertyValues } from 'lit'
4
4
  import { customElement, property, query, state } from 'lit/decorators.js'
5
5
  import { connect } from 'pwa-helpers/connect-mixin.js'
6
6
 
@@ -14,77 +14,110 @@ export class ContextToolbar extends connect(store)(LitElement) {
14
14
  css`
15
15
  :host {
16
16
  display: flex;
17
- position: relative;
18
17
 
19
18
  background-color: var(--context-toolbar-background-color);
20
- justify-content: space-between;
21
19
  box-shadow: var(--context-toolbar-shadow-line);
22
- }
23
- #front-end {
24
- padding-left: var(--context-toolbar-side-padding);
25
- }
26
- #rear-end {
27
- padding-right: var(--context-toolbar-side-padding);
28
- }
29
- #front-end mwc-icon,
30
- #front mwc-icon {
31
- background-color: var(--context-toolbar-function-button-background-color);
32
- border: var(--context-toolbar-function-button-border);
33
- height: var(--context-toolbar-function-button-height);
34
- margin: var(--context-toolbar-button-margin);
35
- padding: var(--context-toolbar-function-button-padding);
36
- color: var(--context-toolbar-function-button-color);
37
- line-height: var(--context-toolbar-function-button-lineheight);
38
- cursor: pointer;
39
- }
40
- #front-end mwc-icon:first-child,
41
- #front mwc-icon:first-child {
42
- border-top-left-radius: var(--context-toolbar-function-button-radius);
43
- border-bottom-left-radius: var(--context-toolbar-function-button-radius);
44
- }
45
- #front-end mwc-icon:last-child,
46
- #front mwc-icon:last-child {
47
- border-top-right-radius: var(--context-toolbar-function-button-radius);
48
- border-bottom-right-radius: var(--context-toolbar-function-button-radius);
49
- }
50
20
 
51
- #front-end mwc-icon {
52
- background-color: var(--primary-color);
53
- }
54
- #front-end mwc-icon:hover {
55
- background-color: var(--context-toolbar-function-button-background-color);
56
- }
57
- #front mwc-icon:hover {
58
- background-color: var(--context-toolbar-function-button-hover-background-color);
21
+ padding: 0;
22
+
23
+ --md-icon-size: 20px;
59
24
  }
60
25
 
61
- #center {
26
+ div[container] {
62
27
  flex: 1;
63
- align-items: center;
64
- justify-content: end;
65
- }
66
28
 
67
- #center > * {
68
- align-items: center;
69
- }
70
- #rear-end > *,
71
- #rear > * {
72
- margin: var(--context-toolbar-button-margin);
73
- }
74
- #rear-end {
75
- align-items: start;
76
- }
29
+ display: flex;
30
+ position: relative;
31
+ overflow: hidden;
32
+
33
+ justify-content: space-between;
77
34
 
78
- div > * {
79
- align-items: center;
35
+ gap: var(--padding-narrow);
36
+ padding: 6px 10px;
37
+
38
+ &:not(:has(> *)) {
39
+ padding: 0;
40
+ }
41
+
42
+ div {
43
+ display: flex;
44
+ flex-direction: row;
45
+ flex-wrap: nowrap;
46
+
47
+ align-items: center;
48
+ overflow: hidden;
49
+ padding: 0;
50
+ }
51
+
52
+ #front-end md-icon,
53
+ #front md-icon {
54
+ background-color: var(--context-toolbar-function-button-background-color);
55
+ border: var(--context-toolbar-function-button-border);
56
+ color: var(--context-toolbar-function-button-color);
57
+ }
58
+
59
+ #front-end md-icon {
60
+ background-color: var(--primary-color);
61
+ }
62
+ #front-end md-icon:hover {
63
+ background-color: var(--context-toolbar-function-button-background-color);
64
+ }
65
+ #front md-icon:hover {
66
+ background-color: var(--context-toolbar-function-button-hover-background-color);
67
+ }
68
+
69
+ md-icon {
70
+ background-color: var(--button-background-color, #fafbfc);
71
+ border: 1px solid rgba(var(--primary-color-rgb), 0.5);
72
+ border-radius: var(--button-border-radius);
73
+ padding: var(--iconbtn-padding, 2px);
74
+
75
+ color: var(--primary-color);
76
+
77
+ &:hover {
78
+ background-color: var(--primary-color);
79
+
80
+ color: var(--theme-white-color);
81
+ }
82
+ }
83
+
84
+ div md-icon {
85
+ border-radius: 0;
86
+ }
87
+
88
+ div md-icon:first-child {
89
+ border-top-left-radius: var(--context-toolbar-function-button-radius);
90
+ border-bottom-left-radius: var(--context-toolbar-function-button-radius);
91
+ }
92
+
93
+ div md-icon:last-child {
94
+ border-top-right-radius: var(--context-toolbar-function-button-radius);
95
+ border-bottom-right-radius: var(--context-toolbar-function-button-radius);
96
+ }
97
+
98
+ #center {
99
+ flex: 1;
100
+ justify-content: end;
101
+ }
102
+
103
+ * {
104
+ cursor: pointer;
105
+ }
80
106
  }
81
107
 
82
- div {
83
- display: flex;
84
- flex-wrap: nowrap;
85
- align-items: center;
86
- overflow: hidden;
87
- padding: 0;
108
+ @media only screen and (max-width: 460px) {
109
+ div[container] {
110
+ padding: 0;
111
+ gap: 0;
112
+ }
113
+
114
+ div[container] div md-icon {
115
+ border-radius: 0;
116
+ }
117
+
118
+ div[container] div md-icon:not(:last-child) {
119
+ border-right-width: 0;
120
+ }
88
121
  }
89
122
  `
90
123
  ]
@@ -93,6 +126,8 @@ export class ContextToolbar extends connect(store)(LitElement) {
93
126
  @state() private context: any
94
127
  @state() private tools?: any[]
95
128
 
129
+ @query('[container]') private container!: HTMLDivElement
130
+
96
131
  render() {
97
132
  if (this.context.toolbar === false) {
98
133
  return nothing
@@ -112,20 +147,58 @@ export class ContextToolbar extends connect(store)(LitElement) {
112
147
  let rearEndTools = tools.filter(tool => tool.position == TOOL_POSITION.REAR_END)
113
148
 
114
149
  return html`
115
- <div id="front-end">${frontEndTools.map(tool => html` ${tool.template} `)}</div>
150
+ <div container>
151
+ ${frontEndTools.length > 0
152
+ ? html`<div id="front-end">${frontEndTools.map(tool => html` ${tool.template} `)}</div>`
153
+ : nothing}
154
+ ${frontTools.length > 0
155
+ ? html`<div id="front">${frontTools.map(tool => html` ${tool.template} `)}</div>`
156
+ : nothing}
157
+ ${centerTools.length > 0
158
+ ? html`<div id="center">${centerTools.map(tool => html` ${tool.template} `)}</div>`
159
+ : nothing}
160
+ ${rearTools.length > 0
161
+ ? html`<div id="rear">${rearTools.map(tool => html` ${tool.template} `)}</div>`
162
+ : nothing}
163
+ ${rearEndTools.length > 0
164
+ ? html`<div id="rear-end">${rearEndTools.map(tool => html` ${tool.template} `)}</div>`
165
+ : nothing}
166
+ </div>
167
+ `
168
+ }
116
169
 
117
- <div id="front">${frontTools.map(tool => html` ${tool.template} `)}</div>
170
+ updated(changes: PropertyValues<this>) {
171
+ requestAnimationFrame(() => {
172
+ /*
173
+ 하위 엘리먼트들이 실제로 보일 필요가 없을 때는, 이 엘리먼트도 숨김 처리함.
174
+ &:not(:has(> *)) 처리로 모두 해결되지 않으므로, 로직 처리로 보완함.
175
+ &:not(:has(> *)) 가 필요없으나, 남겨 두었음.
176
+ */
177
+ if (!this.container) {
178
+ return
179
+ }
118
180
 
119
- <div id="center">${centerTools.map(tool => html` ${tool.template} `)}</div>
181
+ const children = this.container.querySelectorAll('*')
120
182
 
121
- <div id="rear">${rearTools.map(tool => html` ${tool.template} `)}</div>
183
+ let zero = true
122
184
 
123
- <div id="rear-end">${rearEndTools.map(tool => html` ${tool.template} `)}</div>
124
- `
185
+ // 모든 하위 엘리먼트의 높이를 확인
186
+ for (const child of Array.from(children)) {
187
+ if ((child as HTMLElement).offsetHeight !== 0) {
188
+ zero = false
189
+ break
190
+ }
191
+ }
192
+
193
+ // 모든 하위 엘리먼트의 높이가 0이면 부모 엘리먼트의 display를 none으로 변경
194
+ this.container.style.padding = zero ? '0' : 'revert-layer'
195
+ })
125
196
  }
126
197
 
127
198
  stateChanged(state: any) {
128
- this.tools = state.context.tools
129
- this.context = state.route.context
199
+ if (state.context) {
200
+ this.tools = state.context.tools || []
201
+ this.context = state.route.context || {}
202
+ }
130
203
  }
131
204
  }
@@ -23,7 +23,7 @@ export const ContextToolbarOverlayStyle = css`
23
23
  padding: var(--context-ui-list-padding);
24
24
  }
25
25
 
26
- li > mwc-icon {
26
+ li > md-icon {
27
27
  font-size: 1em;
28
28
 
29
29
  padding: var(--context-ui-padding);
@@ -37,7 +37,7 @@ export const ContextToolbarOverlayStyle = css`
37
37
  color: var(--context-ui-list-color);
38
38
  }
39
39
 
40
- li:hover mwc-icon,
40
+ li:hover md-icon,
41
41
  li:hover span {
42
42
  color: #fff;
43
43
  }
@@ -1,5 +1,4 @@
1
- import '@material/mwc-button'
2
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
3
2
  import './ox-page-action-overlay-template.js'
4
3
 
5
4
  import { css, html, LitElement, PropertyValues } from 'lit'
@@ -10,63 +9,54 @@ import { connect } from 'pwa-helpers/connect-mixin'
10
9
  import { openOverlay } from '@operato/layout'
11
10
  import { store } from '@operato/shell'
12
11
  import { sleep } from '@operato/utils'
12
+ import { ButtonContainerStyles } from '@operato/styles'
13
13
 
14
14
  @customElement('ox-page-action-context-bar')
15
15
  export class PageActionContextBar extends connect(store)(LitElement) {
16
16
  static get styles() {
17
17
  return [
18
+ ButtonContainerStyles,
18
19
  css`
19
20
  :host {
20
21
  display: flex;
21
22
  overflow: hidden;
22
- position: relative;
23
+ gap: var(--padding-narrow);
23
24
  }
24
25
 
25
26
  :host *:focus {
26
27
  outline: none;
27
28
  }
28
29
 
29
- mwc-button {
30
- white-space: nowrap;
31
- margin: var(--context-action-bar-button-margin);
32
- border-radius: var(--context-action-bar-more-button-border-radius);
33
- }
34
-
35
- [danger] {
36
- --mdc-theme-primary: var(--mdc-danger-button-primary-color);
37
- --mdc-button-outline-color: var(--mdc-danger-button-outline-color);
38
- }
39
-
40
30
  [more] {
41
31
  position: absolute;
42
32
  top: 0;
43
- right: 38px;
33
+ right: 0;
44
34
  background-color: var(--context-action-bar-more-button-background-color);
45
35
  box-shadow: -2px 0px 2px 1px rgba(0, 0, 0, 0.2);
46
36
  padding: var(--context-action-bar-more-button-padding);
47
37
  color: var(--context-action-bar-more-button-color);
38
+ padding: 11px 10px;
48
39
  font-size: 2rem;
49
40
  }
50
41
 
51
- mwc-icon {
52
- background-color: var(--theme-white-color);
42
+ select,
43
+ input[type='text'] {
44
+ background-color: var(--button-background-color, #fafbfc);
53
45
  border: 1px solid rgba(var(--primary-color-rgb), 0.5);
54
- padding: 1px 2px;
55
- color: var(--primary-color);
46
+ border-radius: var(--button-border-radius);
47
+ padding: 0 var(--padding-narrow);
48
+
49
+ font-size: var(--fontsize-default);
50
+ color: var(--secondary-color);
56
51
  }
57
52
 
58
53
  @media screen and (max-width: 460px) {
59
- mwc-button {
60
- --mdc-button-horizontal-padding: var(--padding-default);
61
- --mdc-shape-small: var(--context-action-bar-more-button-border-radius);
54
+ :host {
55
+ gap: 0;
62
56
  }
63
57
 
64
58
  [more] {
65
- position: absolute;
66
- margin-top: -10px;
67
- right: 0px;
68
- padding: var(--padding-default);
69
- font-size: 2rem;
59
+ margin-top: -7px;
70
60
  }
71
61
  }
72
62
 
@@ -82,7 +72,15 @@ export class PageActionContextBar extends connect(store)(LitElement) {
82
72
  ]
83
73
  }
84
74
 
85
- @state() actions: any[] = []
75
+ @property({ type: Array }) actions: {
76
+ title: string
77
+ action: () => void
78
+ icon: string
79
+ type: string
80
+ select: string[]
81
+ href?: string
82
+ emphasis?: boolean
83
+ }[] = []
86
84
  @state() private overflown: boolean = false
87
85
 
88
86
  private overflownUpdaterThrottle: any
@@ -115,7 +113,7 @@ export class PageActionContextBar extends connect(store)(LitElement) {
115
113
  render() {
116
114
  return html`
117
115
  ${this.renderActions()}
118
- ${this.overflown ? html` <mwc-icon more @click=${this.showMore.bind(this)}>more_horiz</mwc-icon> ` : html``}
116
+ ${this.overflown ? html` <md-icon more @click=${this.showMore.bind(this)}>more_horiz</md-icon> ` : html``}
119
117
  `
120
118
  }
121
119
 
@@ -123,47 +121,49 @@ export class PageActionContextBar extends connect(store)(LitElement) {
123
121
  return html`
124
122
  ${this.actions.map(($action, idx) => {
125
123
  let { type, title, icon, action, select, href, emphasis } = $action as any
126
- let { outlined, raised, dense, danger } = emphasis || {}
124
+ let { outlined, raised, dense, danger, filled } = emphasis || {}
127
125
 
128
126
  return type == 'text'
129
127
  ? html` <span @click=${action}>${title}</span> `
130
128
  : type == 'select' || (select && select.length > 0)
131
- ? html`
132
- <select @change=${action}>
133
- ${select.map((option: any) => html` <option>${option}</option> `)}
134
- </select>
135
- `
136
- : type == 'link'
137
- ? html` <a href=${href}>${title}</a> `
138
- : type == 'icon'
139
- ? html`<mwc-icon @click=${action}>${icon}</mwc-icon>`
140
- : html`
141
- <mwc-button
142
- label=${title}
143
- icon=${icon || 'done_all'}
144
- ?dense=${dense}
145
- ?raised=${raised}
146
- ?outlined=${outlined}
147
- ?danger=${danger}
148
- @click=${async (e: MouseEvent) => {
149
- /* all actions should be bloked for a second */
150
- const button = e.currentTarget as any
151
- button.icon = 'rotate_right'
152
- button.setAttribute('working', true)
153
- button.disabled = true
154
-
155
- try {
156
- await action()
157
- } finally {
158
- await sleep(1000)
159
- button.disabled = false
160
- /* because icon can be changed after sleep, don't use closure 'icon'. */
161
- button.icon = this.actions[idx]?.icon || 'done_all'
162
- button.removeAttribute('working')
163
- }
164
- }}
165
- ></mwc-button>
166
- `
129
+ ? html`
130
+ <select @change=${action}>
131
+ ${select.map((option: any) => html` <option>${option}</option> `)}
132
+ </select>
133
+ `
134
+ : type == 'link'
135
+ ? html` <a href=${href}>${title}</a> `
136
+ : type == 'icon'
137
+ ? html`<md-icon @click=${action}>${icon}</md-icon>`
138
+ : html`
139
+ <button
140
+ ?dense=${dense}
141
+ ?raised=${raised}
142
+ ?outlined=${outlined}
143
+ ?danger=${danger}
144
+ ?filled=${filled}
145
+ @click=${async (e: MouseEvent) => {
146
+ /* all actions should be bloked for a second */
147
+ const button = e.currentTarget as any
148
+ button.icon = 'rotate_right'
149
+ button.setAttribute('working', true)
150
+ button.disabled = true
151
+
152
+ try {
153
+ await action()
154
+ } finally {
155
+ await sleep(1000)
156
+ button.disabled = false
157
+ /* because icon can be changed after sleep, don't use closure 'icon'. */
158
+ button.icon = this.actions[idx]?.icon || 'done_all'
159
+ button.removeAttribute('working')
160
+ }
161
+ }}
162
+ >
163
+ <md-icon>${icon || 'done_all'}</md-icon>
164
+ ${title}
165
+ </button>
166
+ `
167
167
  })}
168
168
  `
169
169
  }
@@ -175,7 +175,11 @@ export class PageActionContextBar extends connect(store)(LitElement) {
175
175
  }
176
176
 
177
177
  stateChanged(state: any) {
178
- this.actions = state.route?.context?.actions?.filter((action: any) => !!action) || []
178
+ const { actions } = state.route?.context || {}
179
+
180
+ if (actions) {
181
+ this.actions = actions.filter((action: any) => !!action)
182
+ }
179
183
  }
180
184
 
181
185
  showMore() {
@@ -1,11 +1,11 @@
1
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
2
2
 
3
3
  import { css, html, LitElement } from 'lit'
4
4
  import { customElement, property, query, state } from 'lit/decorators.js'
5
5
  import { connect } from 'pwa-helpers'
6
6
 
7
7
  import { store } from '@operato/shell'
8
- import { ScrollbarStyles } from '@operato/styles'
8
+ import { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles'
9
9
  import { sleep } from '@operato/utils'
10
10
 
11
11
  import { ContextToolbarOverlayStyle } from '../styles/ox-context-toolbar-overlay-style.js'
@@ -15,34 +15,23 @@ export class PageActionOverlayTemplate extends connect(store)(LitElement) {
15
15
  static get styles() {
16
16
  return [
17
17
  ScrollbarStyles,
18
+ ButtonContainerStyles,
18
19
  ContextToolbarOverlayStyle,
19
20
  css`
20
21
  :host {
21
22
  display: flex;
22
23
  flex-wrap: wrap;
23
- gap: var(--margin-narrow);
24
+ gap: var(--padding-narrow);
24
25
  }
25
26
  :host *:focus {
26
27
  outline: none;
27
28
  }
28
29
 
29
- mwc-button {
30
+ button {
30
31
  background-color: var(--main-section-background-color);
31
32
  border-radius: var(--context-action-bar-more-button-border-radius);
32
33
  }
33
34
 
34
- [danger] {
35
- --mdc-theme-primary: var(--mdc-danger-button-primary-color);
36
- --mdc-button-outline-color: var(--mdc-danger-button-outline-color);
37
- }
38
-
39
- @media screen and (max-width: 460px) {
40
- mwc-button {
41
- --mdc-button-horizontal-padding: var(--padding-default);
42
- border-radius: 4px;
43
- }
44
- }
45
-
46
35
  @keyframes rotate {
47
36
  from {
48
37
  transform: rotate(0deg);
@@ -61,47 +50,49 @@ export class PageActionOverlayTemplate extends connect(store)(LitElement) {
61
50
  return html`
62
51
  ${this.actions.map(($action, idx) => {
63
52
  let { type, title, icon, action, select, href, emphasis } = $action as any
64
- let { outlined, raised, dense, danger } = emphasis || {}
53
+ let { outlined, raised, dense, danger, filled } = emphasis || {}
65
54
 
66
55
  return type == 'text'
67
56
  ? html` <span>${title}</span> `
68
57
  : type == 'select' || (select && select.length > 0)
69
- ? html`
70
- <select @change=${action}>
71
- ${select.map((option: any) => html` <option>${option}</option> `)}
72
- </select>
73
- `
74
- : type == 'link'
75
- ? html` <a href=${href}>${title}</a> `
76
- : html`
77
- <mwc-button
78
- label=${title}
79
- icon=${icon || 'done_all'}
80
- ?dense=${dense}
81
- ?raised=${raised}
82
- ?outlined=${outlined}
83
- ?danger=${danger}
84
- @click=${async (e: MouseEvent) => {
85
- /* all actions should be bloked for a second */
86
- const button = e.currentTarget as any
87
- button.icon = 'rotate_right'
88
- button.setAttribute('working', true)
89
- button.disabled = true
58
+ ? html`
59
+ <select @change=${action}>
60
+ ${select.map((option: any) => html` <option>${option}</option> `)}
61
+ </select>
62
+ `
63
+ : type == 'link'
64
+ ? html` <a href=${href}>${title}</a> `
65
+ : html`
66
+ <button
67
+ ?dense=${dense}
68
+ ?raised=${raised}
69
+ ?outlined=${outlined}
70
+ ?danger=${danger}
71
+ ?filled=${filled}
72
+ @click=${async (e: MouseEvent) => {
73
+ /* all actions should be bloked for a second */
74
+ const button = e.currentTarget as any
75
+ button.icon = 'rotate_right'
76
+ button.setAttribute('working', true)
77
+ button.disabled = true
90
78
 
91
- try {
92
- action()
93
- } finally {
94
- await sleep(1000)
95
- button.disabled = false
96
- /* because icon can be changed after sleep, don't use closure 'icon'. */
97
- button.icon = this.actions[idx]?.icon || 'done_all'
98
- button.removeAttribute('working')
79
+ try {
80
+ action()
81
+ } finally {
82
+ await sleep(1000)
83
+ button.disabled = false
84
+ /* because icon can be changed after sleep, don't use closure 'icon'. */
85
+ button.icon = this.actions[idx]?.icon || 'done_all'
86
+ button.removeAttribute('working')
99
87
 
100
- window.history.back()
101
- }
102
- }}
103
- ></mwc-button>
104
- `
88
+ window.history.back()
89
+ }
90
+ }}
91
+ >
92
+ <md-icon>${icon || 'done_all'}</md-icon>
93
+ ${title}
94
+ </button>
95
+ `
105
96
  })}
106
97
  `
107
98
  }
@@ -1,4 +1,4 @@
1
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
2
2
  import '@operato/input/ox-input-search.js'
3
3
 
4
4
  import { css, html, LitElement } from 'lit'
@@ -22,7 +22,7 @@ export class PageTitleBar extends connect(store)(LitElement) {
22
22
  --help-icon-opacity: 0.2;
23
23
  --help-icon-size: 20px;
24
24
 
25
- --mdc-icon-size: 20px;
25
+ --md-icon-size: 20px;
26
26
 
27
27
  --input-search-padding: var(--padding-narrow);
28
28
  --input-search-font: normal 14px var(--theme-font);
@@ -92,10 +92,8 @@ export class PageTitleBar extends connect(store)(LitElement) {
92
92
  }
93
93
 
94
94
  return html`
95
- ${title ? html` <div titler>${icon ? html`<mwc-icon>${icon}</mwc-icon>&nbsp;` : html``}${text}</div> ` : html``}
96
- ${help && title
97
- ? html` &nbsp;<mwc-icon @click=${(e: MouseEvent) => openHelp(help)} help>help</mwc-icon> `
98
- : html``}
95
+ ${title ? html` <div titler>${icon ? html`<md-icon>${icon}</md-icon>&nbsp;` : html``}${text}</div> ` : html``}
96
+ ${help && title ? html` &nbsp;<md-icon @click=${(e: MouseEvent) => openHelp(help)} help>help</md-icon> ` : html``}
99
97
  ${searchable || filterable
100
98
  ? html`
101
99
  <div search>
@@ -110,9 +108,9 @@ export class PageTitleBar extends connect(store)(LitElement) {
110
108
  ></ox-input-search>`
111
109
  : html``}
112
110
  ${!title && help && searchable
113
- ? html`<mwc-icon @click=${(e: MouseEvent) => openHelp(help)} help>help</mwc-icon>`
111
+ ? html`<md-icon @click=${(e: MouseEvent) => openHelp(help)} help>help</md-icon>`
114
112
  : html``}
115
- ${filterable ? html`<mwc-icon @click=${(e: MouseEvent) => filterHandler()}>unfold_more</mwc-icon>` : html``}
113
+ ${filterable ? html`<md-icon @click=${(e: MouseEvent) => filterHandler()}>unfold_more</md-icon>` : html``}
116
114
  </div>
117
115
  `
118
116
  : html``}