@operato/process 1.1.35 → 1.1.36

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 (44) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/src/modeller/property-sidebar/effects/property-event-hover.js +1 -5
  3. package/dist/src/modeller/property-sidebar/effects/property-event-hover.js.map +1 -1
  4. package/dist/src/modeller/property-sidebar/effects/property-event-tap.d.ts +1 -0
  5. package/dist/src/modeller/property-sidebar/effects/property-event-tap.js +2 -5
  6. package/dist/src/modeller/property-sidebar/effects/property-event-tap.js.map +1 -1
  7. package/dist/src/modeller/property-sidebar/inspector/inspector.d.ts +1 -1
  8. package/dist/src/ox-editor-process-selector.d.ts +15 -0
  9. package/dist/src/ox-editor-process-selector.js +86 -0
  10. package/dist/src/ox-editor-process-selector.js.map +1 -0
  11. package/dist/src/ox-process-selector.d.ts +15 -0
  12. package/dist/src/ox-process-selector.js +86 -0
  13. package/dist/src/ox-process-selector.js.map +1 -0
  14. package/dist/src/ox-property-editor-process-selector.d.ts +4 -0
  15. package/dist/src/ox-property-editor-process-selector.js +22 -0
  16. package/dist/src/ox-property-editor-process-selector.js.map +1 -0
  17. package/dist/src/selector/ox-process-creation-card.d.ts +14 -0
  18. package/dist/src/selector/ox-process-creation-card.js +87 -0
  19. package/dist/src/selector/ox-process-creation-card.js.map +1 -0
  20. package/dist/src/selector/ox-process-selector.d.ts +44 -0
  21. package/dist/src/selector/ox-process-selector.js +306 -0
  22. package/dist/src/selector/ox-process-selector.js.map +1 -0
  23. package/dist/src/selector/process-creation-card.d.ts +14 -0
  24. package/dist/src/selector/process-creation-card.js +87 -0
  25. package/dist/src/selector/process-creation-card.js.map +1 -0
  26. package/dist/src/selector/process-creation-popup.d.ts +19 -0
  27. package/dist/src/selector/process-creation-popup.js +100 -0
  28. package/dist/src/selector/process-creation-popup.js.map +1 -0
  29. package/dist/src/selector/process-selector.d.ts +44 -0
  30. package/dist/src/selector/process-selector.js +306 -0
  31. package/dist/src/selector/process-selector.js.map +1 -0
  32. package/dist/src/selector/process-thumbnail-card.d.ts +15 -0
  33. package/dist/src/selector/process-thumbnail-card.js +169 -0
  34. package/dist/src/selector/process-thumbnail-card.js.map +1 -0
  35. package/dist/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +24 -8
  37. package/src/modeller/property-sidebar/effects/property-event-hover.ts +1 -5
  38. package/src/modeller/property-sidebar/effects/property-event-tap.ts +2 -5
  39. package/src/ox-editor-process-selector.ts +91 -0
  40. package/src/ox-property-editor-process-selector.ts +23 -0
  41. package/src/selector/ox-process-creation-card.ts +94 -0
  42. package/src/selector/ox-process-selector.ts +321 -0
  43. package/src/selector/process-creation-popup.ts +102 -0
  44. package/src/selector/process-thumbnail-card.ts +175 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@operato/process",
3
- "version": "1.1.35",
3
+ "version": "1.1.36",
4
4
  "description": "Webcomponent for business process modeling following open-wc recommendations",
5
5
  "author": "heartyoh",
6
6
  "main": "dist/src/index.js",
@@ -19,6 +19,10 @@
19
19
  "./ox-process-list.js": "./dist/src/ox-process-list.js",
20
20
  "./ox-process-viewer.js": "./dist/src/ox-process-viewer.js",
21
21
  "./ox-process-modeller.js": "./dist/src/ox-process-modeller.js",
22
+ "./ox-editor-process-selector.js": "./dist/src/ox-editor-process-selector.js",
23
+ "./ox-property-editor-process-selector.js": "./dist/src/ox-property-editor-process-selector.js",
24
+ "./ox-process-selector.js": "./dist/src/selector/ox-process-selector.js",
25
+ "./ox-process-creation-card.js": "./dist/src/selector/ox-process-creation-card.js",
22
26
  "./register-default-groups.js": "./dist/src/component/register-default-groups.js"
23
27
  },
24
28
  "typesVersions": {
@@ -32,6 +36,18 @@
32
36
  "ox-process-modeller.js": [
33
37
  "./dist/src/ox-process-modeller.d.ts"
34
38
  ],
39
+ "ox-editor-process-selector.js": [
40
+ "./dist/src/ox-editor-process-selector.d.ts"
41
+ ],
42
+ "ox-property-editor-process-selector.js": [
43
+ "./dist/src/ox-property-editor-process-selector.d.ts"
44
+ ],
45
+ "ox-process-selector.js": [
46
+ "./dist/src/selector/ox-process-selector.d.ts"
47
+ ],
48
+ "ox-process-creation-card.js": [
49
+ "./dist/src/selector/ox-process-creation-card.d.ts"
50
+ ],
35
51
  "register-default-groups.js": [
36
52
  "./dist/src/register-default-groups.d.ts"
37
53
  ]
@@ -51,16 +67,16 @@
51
67
  },
52
68
  "dependencies": {
53
69
  "@open-wc/scoped-elements": "^2.1.3",
54
- "@operato/app": "^1.1.35",
55
- "@operato/board": "^1.1.35",
56
- "@operato/data-grist": "^1.1.35",
57
- "@operato/font": "^1.1.35",
70
+ "@operato/app": "^1.1.36",
71
+ "@operato/board": "^1.1.36",
72
+ "@operato/data-grist": "^1.1.36",
73
+ "@operato/font": "^1.1.36",
58
74
  "@operato/graphql": "^1.1.13",
59
75
  "@operato/i18n": "^1.1.13",
60
- "@operato/input": "^1.1.35",
76
+ "@operato/input": "^1.1.36",
61
77
  "@operato/markdown": "^1.1.28",
62
78
  "@operato/popup": "^1.1.28",
63
- "@operato/property-editor": "^1.1.35",
79
+ "@operato/property-editor": "^1.1.36",
64
80
  "@operato/styles": "^1.1.28",
65
81
  "@operato/utils": "^1.1.15",
66
82
  "@polymer/paper-dropdown-menu": "^3.2.0",
@@ -111,5 +127,5 @@
111
127
  "prettier --write"
112
128
  ]
113
129
  },
114
- "gitHead": "b82d99051caa643ebe7b042afd53be5bbc092195"
130
+ "gitHead": "115403ba66873bd4b8e59644095930653c49206b"
115
131
  }
@@ -47,11 +47,7 @@ export class PropertyEventHover extends LitElement {
47
47
 
48
48
  ${action == 'popup'
49
49
  ? html`
50
- <things-editor-board-selector
51
- value-key="target"
52
- .value=${target}
53
- custom-editor
54
- ></things-editor-board-selector>
50
+ <ox-editor-process-selector value-key="target" .value=${target} custom-editor></ox-editor-process-selector>
55
51
  `
56
52
  : html`
57
53
  <input
@@ -4,6 +4,7 @@
4
4
 
5
5
  import '@operato/input/ox-input-data.js'
6
6
  import '@operato/i18n/ox-i18n.js'
7
+ import '../../../ox-editor-process-selector.js'
7
8
 
8
9
  import { html, LitElement } from 'lit'
9
10
  import { property, state } from 'lit/decorators.js'
@@ -71,11 +72,7 @@ export class PropertyEventTap extends LitElement {
71
72
 
72
73
  ${action === 'goto' || action?.includes('popup')
73
74
  ? html`
74
- <things-editor-board-selector
75
- value-key="target"
76
- .value=${target}
77
- custom-editor
78
- ></things-editor-board-selector>
75
+ <ox-editor-process-selector value-key="target" .value=${target} custom-editor></ox-editor-process-selector>
79
76
  `
80
77
  : action !== 'run'
81
78
  ? html`
@@ -0,0 +1,91 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import '@material/mwc-icon'
6
+ import './selector/ox-process-selector'
7
+
8
+ import { css, html, LitElement } from 'lit'
9
+ import { customElement, property } from 'lit/decorators.js'
10
+
11
+ import { i18next } from '@operato/i18n'
12
+ import { openPopup } from '@operato/layout'
13
+
14
+ @customElement('ox-editor-process-selector')
15
+ export class ProcessSelector extends LitElement {
16
+ static get styles() {
17
+ return [
18
+ css`
19
+ :host {
20
+ position: relative;
21
+ display: inline-block;
22
+ }
23
+
24
+ input[type='text'] {
25
+ box-sizing: border-box;
26
+ width: 100%;
27
+ height: 100%;
28
+ border: 1px solid rgba(0, 0, 0, 0.2);
29
+ }
30
+
31
+ mwc-icon {
32
+ position: absolute;
33
+ top: 0;
34
+ right: 0;
35
+ }
36
+ `
37
+ ]
38
+ }
39
+
40
+ @property({ type: String }) value?: string
41
+ @property({ type: Object }) properties?: any
42
+
43
+ private popup: any
44
+
45
+ render() {
46
+ return html`
47
+ <input id="text" type="text" .value=${this.value || ''} @change=${(e: Event) => this._onInputChanged(e)} />
48
+
49
+ <mwc-icon @click=${(e: MouseEvent) => this.openSelector()}>dashboard</mwc-icon>
50
+ `
51
+ }
52
+
53
+ _onInputChanged(e: Event) {
54
+ this.value = (e.target as any)?.value
55
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))
56
+ }
57
+
58
+ openSelector() {
59
+ if (this.popup) {
60
+ delete this.popup
61
+ }
62
+
63
+ /*
64
+ * 기존 설정된 보드가 선택된 상태가 되게 하기 위해서는 selector에 value를 전달해줄 필요가 있음.
65
+ * 주의. value는 object일 수도 있고, string일 수도 있다.
66
+ * string인 경우에는 해당 보드의 id로 해석한다.
67
+ */
68
+ var value = this.value || {}
69
+
70
+ var template = html`
71
+ <ox-process-selector
72
+ .creatable=${true}
73
+ .value=${value}
74
+ @process-selected=${async (e: CustomEvent) => {
75
+ var process = e.detail.process
76
+ this.value = process.id
77
+
78
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))
79
+
80
+ this.popup && this.popup.close()
81
+ }}
82
+ ></ox-process-selector>
83
+ `
84
+
85
+ this.popup = openPopup(template, {
86
+ backdrop: true,
87
+ size: 'large',
88
+ title: i18next.t('title.select process')
89
+ })
90
+ }
91
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import './ox-editor-process-selector'
6
+
7
+ import { html } from 'lit'
8
+ import { customElement } from 'lit/decorators.js'
9
+
10
+ import { OxPropertyEditor, PropertySpec } from '@operato/property-editor'
11
+
12
+ @customElement('ox-property-editor-process-selector')
13
+ class PropertyEditorProcessSelector extends OxPropertyEditor {
14
+ static get styles() {
15
+ return [...OxPropertyEditor.styles]
16
+ }
17
+
18
+ editorTemplate(value: any, spec: PropertySpec) {
19
+ return html`
20
+ <ox-editor-process-selector id="editor" .value=${value} .properties=${spec.property}></ox-editor-process-selector>
21
+ `
22
+ }
23
+ }
@@ -0,0 +1,94 @@
1
+ import '@material/mwc-icon'
2
+ import './process-creation-popup'
3
+
4
+ import { css, html, LitElement } from 'lit'
5
+ import { customElement, property } from 'lit/decorators.js'
6
+
7
+ import { i18next, localize } from '@operato/i18n'
8
+ import { openPopup } from '@operato/layout'
9
+
10
+ @customElement('ox-process-creation-card')
11
+ export class ProcessCreationCard extends localize(i18next)(LitElement) {
12
+ static get styles() {
13
+ return [
14
+ css`
15
+ :host {
16
+ display: flex;
17
+ border: var(--card-list-create-border);
18
+ border-radius: var(--card-list-create-border-radius);
19
+
20
+ background-color: #fff;
21
+
22
+ align-content: center;
23
+ justify-content: center;
24
+ }
25
+
26
+ div {
27
+ text-align: center;
28
+ font-size: 0.8em;
29
+ color: var(--card-list-create-color);
30
+ text-transform: capitalize;
31
+ }
32
+
33
+ mwc-icon {
34
+ display: block;
35
+ font-size: 3.5em;
36
+ color: var(--card-list-create-icon-color);
37
+ }
38
+ `
39
+ ]
40
+ }
41
+
42
+ /* default group id */
43
+ @property({ type: String }) defaultGroup?: string
44
+ @property({ type: Array }) groups: any
45
+
46
+ private popup: any
47
+
48
+ render() {
49
+ return html`<div @click=${(e: Event) => this.onClick()}>
50
+ <mwc-icon>add_circle_outline</mwc-icon>create process
51
+ </div> `
52
+ }
53
+
54
+ onClick() {
55
+ if (this.popup) {
56
+ delete this.popup
57
+ }
58
+
59
+ /*
60
+ * 기존 설정된 이미지가 선택된 상태가 되게 하기 위해서는 selector에 value를 전달해줄 필요가 있음.
61
+ * 주의. value는 object일 수도 있고, string일 수도 있다.
62
+ * string인 경우에는 해당 보드의 id로 해석한다.
63
+ */
64
+ var template = html`
65
+ <process-creation-popup
66
+ .defaultGroup=${this.defaultGroup}
67
+ .groups=${this.groups}
68
+ @create-process=${async (e: CustomEvent) => {
69
+ var { name, description, groupId } = e.detail
70
+
71
+ this.dispatchEvent(
72
+ new CustomEvent('create-process', {
73
+ detail: {
74
+ name,
75
+ description,
76
+ groupId
77
+ }
78
+ })
79
+ )
80
+
81
+ this.popup && this.popup.close()
82
+ }}
83
+ ></process-creation-popup>
84
+ `
85
+
86
+ this.popup = openPopup(template, {
87
+ backdrop: true,
88
+ size: 'large',
89
+ title: i18next.t('title.create-process')
90
+ })
91
+ }
92
+
93
+ reset() {}
94
+ }
@@ -0,0 +1,321 @@
1
+ import './ox-process-creation-card'
2
+
3
+ import gql from 'graphql-tag'
4
+ import { css, html, LitElement, PropertyValues } from 'lit'
5
+ import { customElement, property } from 'lit/decorators.js'
6
+
7
+ import { buildArgs, client, gqlContext } from '@operato/graphql'
8
+ import { i18next, localize } from '@operato/i18n'
9
+ import { ScrollbarStyles } from '@operato/styles'
10
+ import InfiniteScrollable from '@operato/utils/mixins/infinite-scrollable.js'
11
+
12
+ const FETCH_PROCESS_LIST_GQL = (listParam: any) => {
13
+ return gql`
14
+ {
15
+ processes(${buildArgs(listParam)}) {
16
+ items {
17
+ id
18
+ name
19
+ description
20
+ thumbnail
21
+ }
22
+ total
23
+ }
24
+ }
25
+ `
26
+ }
27
+
28
+ const FETCH_PROCESS_GROUP_LIST_GQL = gql`
29
+ {
30
+ processGroups {
31
+ items {
32
+ id
33
+ name
34
+ description
35
+ }
36
+ total
37
+ }
38
+ }
39
+ `
40
+
41
+ const CREATE_PROCESS_GQL = gql`
42
+ mutation CreateProcess($process: NewProcess!) {
43
+ createProcess(process: $process) {
44
+ id
45
+ name
46
+ description
47
+ model
48
+ createdAt
49
+ updatedAt
50
+ }
51
+ }
52
+ `
53
+
54
+ @customElement('ox-process-selector')
55
+ export class ProcessSelector extends InfiniteScrollable(localize(i18next)(LitElement)) {
56
+ static get styles() {
57
+ return [
58
+ ScrollbarStyles,
59
+ css`
60
+ :host {
61
+ display: grid;
62
+ grid-template-rows: auto auto 1fr;
63
+ overflow: hidden;
64
+ background-color: var(--popup-content-background-color);
65
+ }
66
+
67
+ #main {
68
+ overflow: auto;
69
+ padding: var(--popup-content-padding);
70
+ display: grid;
71
+ grid-template-columns: var(--card-list-template);
72
+ grid-auto-rows: var(--card-list-rows-height);
73
+ grid-gap: 20px;
74
+ }
75
+
76
+ .card {
77
+ display: flex;
78
+ flex-direction: column;
79
+ align-items: center;
80
+ overflow: hidden;
81
+ border-radius: var(--card-list-border-radius);
82
+ background-color: var(--card-list-background-color);
83
+ }
84
+
85
+ .card[selected] {
86
+ border: red solid;
87
+ }
88
+
89
+ .card.create {
90
+ overflow: visible;
91
+ }
92
+
93
+ .card:hover {
94
+ cursor: pointer;
95
+ }
96
+
97
+ .card > .name {
98
+ background-color: var(--board-renderer-name-background-color);
99
+ opacity: 0.8;
100
+ margin-top: -35px;
101
+ width: 100%;
102
+ color: #fff;
103
+ font-weight: bolder;
104
+ font-size: 13px;
105
+ text-indent: 7px;
106
+ }
107
+
108
+ .card > .description {
109
+ background-color: rgba(0, 0, 0, 0.7);
110
+ width: 100%;
111
+ min-height: 15px;
112
+ font-size: 0.6rem;
113
+ color: #fff;
114
+ text-indent: 7px;
115
+ }
116
+ .card img {
117
+ max-height: 100%;
118
+ min-height: 100%;
119
+ }
120
+
121
+ #filter {
122
+ padding: var(--popup-content-padding);
123
+ background-color: #fff;
124
+ box-shadow: var(--box-shadow);
125
+ }
126
+
127
+ #filter * {
128
+ font-size: 15px;
129
+ }
130
+
131
+ select {
132
+ text-transform: capitalize;
133
+ float: right;
134
+ }
135
+ `
136
+ ]
137
+ }
138
+
139
+ @property({ type: Array }) groups: { id: string; name: string; description: string }[] = []
140
+ @property({ type: Array }) processes: any[] = []
141
+ @property({ type: String }) group?: string
142
+ @property({ type: Boolean }) creatable: boolean = false
143
+ @property({ type: String }) value?: string
144
+
145
+ private _page: number = 1
146
+ private _total: number = 0
147
+
148
+ constructor() {
149
+ super()
150
+
151
+ this._infiniteScrollOptions.limit = 20
152
+ }
153
+
154
+ render() {
155
+ return html`
156
+ <div id="filter">
157
+ <select
158
+ @change=${(e: Event) => {
159
+ this.group = (e.currentTarget as any)?.value
160
+ this.requestUpdate()
161
+ }}
162
+ >
163
+ <option value="">${i18next.t('label.all')}</option>
164
+ ${this.groups.map(group => html` <option value=${group.id}>${group.description}</option> `)}
165
+ </select>
166
+ </div>
167
+
168
+ <div
169
+ id="main"
170
+ @scroll=${(e: Event) => {
171
+ this.onScroll(e)
172
+ }}
173
+ >
174
+ ${this.creatable
175
+ ? html`
176
+ <ox-process-creation-card
177
+ class="card create"
178
+ .groups=${this.groups}
179
+ .defaultGroup=${this.group}
180
+ @create-process=${(e: CustomEvent) => this.onCreateProcess(e)}
181
+ ></ox-process-creation-card>
182
+ `
183
+ : html``}
184
+ ${this.processes.map(
185
+ process => html`
186
+ <div
187
+ class="card"
188
+ @click=${(e: Event) => this.onClickSelect(process)}
189
+ ?selected=${this.value === process.id}
190
+ >
191
+ <img src=${process.thumbnail} />
192
+ <div class="name">${process.name}</div>
193
+ <div class="description">${process.description}</div>
194
+ </div>
195
+ `
196
+ )}
197
+ </div>
198
+ `
199
+ }
200
+
201
+ //@ts-ignore
202
+ get scrollTargetEl(): HTMLElement | null {
203
+ return this.renderRoot.querySelector('#main') as HTMLElement
204
+ }
205
+
206
+ async scrollAction() {
207
+ return this.appendProcesses()
208
+ }
209
+
210
+ firstUpdated() {
211
+ this.refreshGroups()
212
+ }
213
+
214
+ async updated(changed: PropertyValues<this>) {
215
+ if (changed.has('group')) {
216
+ this.refreshProcesses()
217
+ }
218
+ }
219
+
220
+ onClickSelect(process: any) {
221
+ this.dispatchEvent(
222
+ new CustomEvent('process-selected', {
223
+ composed: true,
224
+ bubbles: true,
225
+ detail: {
226
+ process
227
+ }
228
+ })
229
+ )
230
+ }
231
+
232
+ async onCreateProcess(e: CustomEvent) {
233
+ var { name, description, groupId } = e.detail
234
+
235
+ await this.createProcess(name, description, groupId)
236
+ this.refreshProcesses()
237
+ }
238
+
239
+ async refreshGroups() {
240
+ var groupListResponse = await client.query({
241
+ query: FETCH_PROCESS_GROUP_LIST_GQL,
242
+ context: gqlContext()
243
+ })
244
+
245
+ if (!groupListResponse || !groupListResponse.data) return
246
+
247
+ var groups = groupListResponse.data.processGroups.items
248
+ this.groups = [...groups]
249
+
250
+ this.group = groups.filter((group: { id: string }) => group.id == this.group).length > 0 ? this.group : ''
251
+ }
252
+
253
+ async refreshProcesses() {
254
+ var processes = await this.getProcesses()
255
+ this.processes = [...processes]
256
+
257
+ var creationCard = this.renderRoot.querySelector('ox-process-creation-card')
258
+ if (creationCard) {
259
+ ;(creationCard as any).reset()
260
+ }
261
+ }
262
+
263
+ async appendProcesses() {
264
+ var processes = await this.getProcesses({ page: this._page + 1 })
265
+ this.processes = [...this.processes, ...processes]
266
+ }
267
+
268
+ async getProcesses({ page = 1, limit = this._infiniteScrollOptions.limit } = {}) {
269
+ var filters = []
270
+ var sortings = [] as any[]
271
+ var pagination = {
272
+ limit,
273
+ page
274
+ }
275
+
276
+ if (this.group)
277
+ filters.push({
278
+ name: 'groupId',
279
+ operator: 'eq',
280
+ value: this.group
281
+ })
282
+
283
+ var params = {
284
+ filters,
285
+ sortings,
286
+ pagination
287
+ }
288
+ var processListResponse = await client.query({
289
+ query: FETCH_PROCESS_LIST_GQL(params),
290
+ context: gqlContext()
291
+ })
292
+
293
+ if (!processListResponse || !processListResponse.data) return []
294
+ this._total = processListResponse.data.processes.total
295
+ this._page = page
296
+
297
+ return processListResponse.data.processes.items
298
+ }
299
+
300
+ async createProcess(name: string, description: string, groupId: string) {
301
+ var model = JSON.stringify({
302
+ width: 800,
303
+ height: 600
304
+ })
305
+
306
+ const response = await client.mutate({
307
+ mutation: CREATE_PROCESS_GQL,
308
+ variables: {
309
+ process: {
310
+ name,
311
+ description,
312
+ groupId,
313
+ model
314
+ }
315
+ },
316
+ context: gqlContext()
317
+ })
318
+
319
+ return response.data
320
+ }
321
+ }