@things-factory/integration-ui 6.2.37 → 6.2.39

Sign up to get free protection for your applications and to get access to all the features.
@@ -34,6 +34,7 @@ export default function bootstrap() {
34
34
  'http-body': 'property-editor-http-body',
35
35
  'entity-selector': 'property-editor-entity-selector',
36
36
  'scenario-step-input': 'property-editor-scenario-step-input',
37
+ 'tag-scenarios': 'property-editor-tag-scenarios',
37
38
  'procedure-parameters': 'property-editor-procedure-parameters'
38
39
  })
39
40
  }
@@ -5,6 +5,7 @@ import './things-editor-http-headers'
5
5
  import './things-editor-http-parameters'
6
6
  import './things-editor-http-body'
7
7
  import './things-editor-oracle-procedure'
8
+ import './things-editor-tag-scenarios'
8
9
 
9
10
  import { html } from 'lit'
10
11
 
@@ -98,3 +99,27 @@ export class PropertyEditorProcedureParameters extends OxPropertyEditor {
98
99
  }
99
100
 
100
101
  customElements.define('property-editor-procedure-parameters', PropertyEditorProcedureParameters)
102
+
103
+ export class PropertyEditorTagScenarios extends OxPropertyEditor {
104
+ static get styles() {
105
+ return [...OxPropertyEditor.styles]
106
+ }
107
+
108
+ editorTemplate(value, spec) {
109
+ /* context must be a datagrid(grist) instance, and host must be a record */
110
+ const { context: grid, host: record } = spec
111
+ const steps = grid?.dirtyData.records.filter(rec => rec.name !== record.name).map(rec => rec.name) || []
112
+
113
+ return html`
114
+ <things-editor-tag-scenarios
115
+ id="editor"
116
+ .value=${value}
117
+ .properties=${spec.property}
118
+ .steps=${steps}
119
+ fullwidth
120
+ ></things-editor-tag-scenarios>
121
+ `
122
+ }
123
+ }
124
+
125
+ customElements.define('property-editor-tag-scenarios', PropertyEditorTagScenarios)
@@ -0,0 +1,244 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import '@operato/input/ox-select.js'
6
+
7
+ import gql from 'graphql-tag'
8
+ import { css, html, LitElement } from 'lit'
9
+ import { customElement, property, state } from 'lit/decorators.js'
10
+ import { keyed } from 'lit/directives/keyed.js'
11
+
12
+ import { client } from '@operato/graphql'
13
+
14
+ /**
15
+ tag-scenarios map editor element
16
+
17
+ Example:
18
+
19
+ <things-editor-tag-scenarios value=${map}>
20
+ </things-editor-tag-scenarios>
21
+ */
22
+ @customElement('things-editor-tag-scenarios')
23
+ export default class ThingsEditorTagScenarios extends LitElement {
24
+ static styles = [
25
+ css`
26
+ :host {
27
+ display: flex;
28
+ flex-direction: column;
29
+ align-content: center;
30
+
31
+ width: 100%;
32
+ overflow: visible;
33
+ border: 1px solid #ccc;
34
+ margin: 5px 0;
35
+
36
+ background-color: #ddd;
37
+ }
38
+
39
+ div[data-record],
40
+ div[data-record-new] {
41
+ display: flex;
42
+ flex-flow: row nowrap;
43
+ align-items: center;
44
+ }
45
+
46
+ div[data-record] > *,
47
+ div[data-record-new] > * {
48
+ min-height: 20px;
49
+ margin: 2px;
50
+ }
51
+
52
+ button {
53
+ text-align: center;
54
+ border-radius: 50%;
55
+ font-size: 1em;
56
+ }
57
+
58
+ input,
59
+ ox-select {
60
+ flex: 1;
61
+ }
62
+
63
+ input {
64
+ padding: 5px;
65
+ box-sizing: border-box;
66
+ }
67
+
68
+ ox-select {
69
+ --input-padding: 4px;
70
+ }
71
+
72
+ ox-popup-list {
73
+ max-height: 300px;
74
+ overflow: auto;
75
+ }
76
+
77
+ select,
78
+ ox-select,
79
+ input:not([type='checkbox']) {
80
+ border: 1px solid rgba(0, 0, 0, 0.2);
81
+ border-radius: 4px;
82
+ background-color: white;
83
+ }
84
+ `
85
+ ]
86
+
87
+ @property({ type: Object }) value: { [key: string]: string } = {}
88
+
89
+ _changingNow: boolean = false
90
+
91
+ @state() private scenarios: string[] = []
92
+
93
+ firstUpdated() {
94
+ this.renderRoot.addEventListener('change', this._onChange.bind(this))
95
+ this.fetchScenarios()
96
+ }
97
+
98
+ async fetchScenarios() {
99
+ const { data, errors } = await client.query({
100
+ query: gql`
101
+ query {
102
+ scenarios {
103
+ items {
104
+ id
105
+ name
106
+ }
107
+ }
108
+ }
109
+ `
110
+ })
111
+
112
+ if (data) {
113
+ this.scenarios = (data?.scenarios.items || []).map(item => item.name)
114
+ }
115
+ }
116
+
117
+ render() {
118
+ const spec = {
119
+ queryName: 'scenarios'
120
+ }
121
+
122
+ return html`
123
+ ${this._toArray(this.value).map(
124
+ item => html`
125
+ <div data-record>
126
+ <input type="text" data-key placeholder="(set tag)" .value=${item.key} />
127
+ <ox-select data-value placeholder="(select scenario)" .value=${item.value}>
128
+ <ox-popup-list with-search>
129
+ <div option value="">&nbsp;</div>
130
+ ${this.scenarios.map(scenario => html` <div option value=${scenario}>${scenario}</div> `)}
131
+ </ox-popup-list>
132
+ </ox-select>
133
+
134
+ <button class="record-action" @click=${e => this._delete(e)} tabindex="-1">x</button>
135
+ </div>
136
+ `
137
+ )}
138
+
139
+ <div data-record-new>
140
+ <input type="text" data-key placeholder="(set tag)" value="" />
141
+ ${keyed(
142
+ Date.now(),
143
+ html`
144
+ <ox-select data-value placeholder="(select scenario)" value="">
145
+ <ox-popup-list with-search>
146
+ <div option value="">&nbsp;</div>
147
+ ${this.scenarios.map(scenario => html` <div option value=${scenario}>${scenario}</div> `)}
148
+ </ox-popup-list>
149
+ </ox-select>
150
+ `
151
+ )}
152
+
153
+ <button class="record-action" @click=${e => this._add()} tabindex="-1">+</button>
154
+ </div>
155
+ `
156
+ }
157
+
158
+ _onChange(e) {
159
+ if (this._changingNow) {
160
+ return
161
+ }
162
+
163
+ this._changingNow = true
164
+
165
+ var input = e.target
166
+ var value = input.value
167
+
168
+ var div = input.parentElement
169
+
170
+ if (div.hasAttribute('data-record')) {
171
+ var dataList = div.querySelectorAll('[data-value]:not([hidden])')
172
+ for (var i = 0; i < dataList.length; i++) {
173
+ if (dataList[i] !== input) {
174
+ dataList[i].value = value || ''
175
+ }
176
+ }
177
+ }
178
+
179
+ if (div.hasAttribute('data-record')) {
180
+ this._build()
181
+ } else if (div.hasAttribute('data-record-new') && input.hasAttribute('data-value')) {
182
+ this._add()
183
+ }
184
+
185
+ this._changingNow = false
186
+ }
187
+
188
+ _build(includeNewRecord?) {
189
+ if (includeNewRecord) var records = this.renderRoot.querySelectorAll('[data-record],[data-record-new]')
190
+ else var records = this.renderRoot.querySelectorAll('[data-record]')
191
+
192
+ var newmap = {}
193
+
194
+ for (var i = 0; i < records.length; i++) {
195
+ var record = records[i]
196
+
197
+ var key = (record.querySelector('[data-key]') as HTMLInputElement).value
198
+ var inputs = record.querySelectorAll('[data-value]:not([style*="display: none"])')
199
+ if (!inputs || inputs.length == 0) continue
200
+
201
+ var input = inputs[inputs.length - 1] as HTMLInputElement
202
+
203
+ var value = input.value
204
+
205
+ if (key) newmap[key] = value || ''
206
+ }
207
+
208
+ this.value = newmap
209
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))
210
+ }
211
+
212
+ /* map아이템들을 template(dom-repeat)용 배열로 변환하는 함수 */
213
+ _toArray(map) {
214
+ var array: { key: any; value: any }[] = []
215
+
216
+ for (var key in map) {
217
+ array.push({
218
+ key: key,
219
+ value: map[key]
220
+ })
221
+ }
222
+
223
+ return array
224
+ }
225
+
226
+ _add() {
227
+ this._build(true)
228
+
229
+ var inputs = this.renderRoot.querySelectorAll('[data-record-new] input:not([style*="display: none"])')
230
+
231
+ for (var i = 0; i < inputs.length; i++) {
232
+ let input = inputs[i] as HTMLInputElement
233
+ input.value = ''
234
+ }
235
+
236
+ ;(inputs[0] as HTMLInputElement).focus()
237
+ }
238
+
239
+ _delete(e) {
240
+ var record = e.target.parentElement
241
+ record.querySelector('[data-key]').value = ''
242
+ this._build()
243
+ }
244
+ }
@@ -24,6 +24,7 @@ export default function bootstrap() {
24
24
  'http-body': 'property-editor-http-body',
25
25
  'entity-selector': 'property-editor-entity-selector',
26
26
  'scenario-step-input': 'property-editor-scenario-step-input',
27
+ 'tag-scenarios': 'property-editor-tag-scenarios',
27
28
  'procedure-parameters': 'property-editor-procedure-parameters'
28
29
  });
29
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../client/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAC3B,OAAO,yBAAyB,CAAA;AAChC,OAAO,2BAA2B,CAAA;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAA;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAA;AAC/F,OAAO,EACL,cAAc,IAAI,mBAAmB,EACrC,gBAAgB,IAAI,qBAAqB,EAE1C,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAA;AAEvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAA;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAE7D,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,mBAAmB,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;IAClD,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAA;IACnD,mBAAmB,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAA;IACrD,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAC9C,mBAAmB,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAA;IAC1D,mBAAmB,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAA;IAEpD,qBAAqB,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAA;IAExD,gBAAgB,CAAC,QAAQ,CAAC;QACxB,cAAc,EAAE,8BAA8B;QAC9C,iBAAiB,EAAE,iCAAiC;QACpD,WAAW,EAAE,2BAA2B;QACxC,iBAAiB,EAAE,iCAAiC;QACpD,qBAAqB,EAAE,qCAAqC;QAC5D,sBAAsB,EAAE,sCAAsC;KAC/D,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import '@material/mwc-icon'\nimport './editors/entity-editor'\nimport './editors/property-editor'\n\nimport { OxGristEditorJson } from '@operato/app/grist-editor/ox-grist-editor-json.js'\nimport { OxGristRendererCrontab } from '@operato/app/grist-editor/ox-grist-renderer-crontab.js'\nimport {\n registerEditor as registerGristEditor,\n registerRenderer as registerGristRenderer,\n OxGristRendererJson5\n} from '@operato/data-grist'\nimport { OxGristEditorCrontab } from '@operato/grist-editor/ox-grist-editor-crontab.js'\nimport { OxGristEditorPrivilege } from '@operato/app/grist-editor/ox-grist-editor-privilege.js'\nimport { OxGristEditorParameters } from '@operato/grist-editor/ox-grist-editor-parameters.js'\nimport { OxPropertyEditor } from '@operato/property-editor'\n\nimport { ConnectionSelector } from './grist/connection-selector'\nimport { ConnectorSelector } from './grist/connector-selector'\nimport { TaskTypeSelector } from './grist/task-type-selector'\n\nexport default function bootstrap() {\n registerGristEditor('task-type', TaskTypeSelector)\n registerGristEditor('connector', ConnectorSelector)\n registerGristEditor('connection', ConnectionSelector)\n registerGristEditor('json', OxGristEditorJson)\n registerGristEditor('parameters', OxGristEditorParameters)\n registerGristEditor('crontab', OxGristEditorCrontab)\n\n registerGristRenderer('crontab', OxGristRendererCrontab)\n\n OxPropertyEditor.register({\n 'http-headers': 'property-editor-http-headers',\n 'http-parameters': 'property-editor-http-parameters',\n 'http-body': 'property-editor-http-body',\n 'entity-selector': 'property-editor-entity-selector',\n 'scenario-step-input': 'property-editor-scenario-step-input',\n 'procedure-parameters': 'property-editor-procedure-parameters'\n })\n}\n"]}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../client/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAC3B,OAAO,yBAAyB,CAAA;AAChC,OAAO,2BAA2B,CAAA;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAA;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAA;AAC/F,OAAO,EACL,cAAc,IAAI,mBAAmB,EACrC,gBAAgB,IAAI,qBAAqB,EAE1C,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAA;AAEvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAA;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAE7D,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,mBAAmB,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;IAClD,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAA;IACnD,mBAAmB,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAA;IACrD,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAC9C,mBAAmB,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAA;IAC1D,mBAAmB,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAA;IAEpD,qBAAqB,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAA;IAExD,gBAAgB,CAAC,QAAQ,CAAC;QACxB,cAAc,EAAE,8BAA8B;QAC9C,iBAAiB,EAAE,iCAAiC;QACpD,WAAW,EAAE,2BAA2B;QACxC,iBAAiB,EAAE,iCAAiC;QACpD,qBAAqB,EAAE,qCAAqC;QAC5D,eAAe,EAAE,+BAA+B;QAChD,sBAAsB,EAAE,sCAAsC;KAC/D,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import '@material/mwc-icon'\nimport './editors/entity-editor'\nimport './editors/property-editor'\n\nimport { OxGristEditorJson } from '@operato/app/grist-editor/ox-grist-editor-json.js'\nimport { OxGristRendererCrontab } from '@operato/app/grist-editor/ox-grist-renderer-crontab.js'\nimport {\n registerEditor as registerGristEditor,\n registerRenderer as registerGristRenderer,\n OxGristRendererJson5\n} from '@operato/data-grist'\nimport { OxGristEditorCrontab } from '@operato/grist-editor/ox-grist-editor-crontab.js'\nimport { OxGristEditorPrivilege } from '@operato/app/grist-editor/ox-grist-editor-privilege.js'\nimport { OxGristEditorParameters } from '@operato/grist-editor/ox-grist-editor-parameters.js'\nimport { OxPropertyEditor } from '@operato/property-editor'\n\nimport { ConnectionSelector } from './grist/connection-selector'\nimport { ConnectorSelector } from './grist/connector-selector'\nimport { TaskTypeSelector } from './grist/task-type-selector'\n\nexport default function bootstrap() {\n registerGristEditor('task-type', TaskTypeSelector)\n registerGristEditor('connector', ConnectorSelector)\n registerGristEditor('connection', ConnectionSelector)\n registerGristEditor('json', OxGristEditorJson)\n registerGristEditor('parameters', OxGristEditorParameters)\n registerGristEditor('crontab', OxGristEditorCrontab)\n\n registerGristRenderer('crontab', OxGristRendererCrontab)\n\n OxPropertyEditor.register({\n 'http-headers': 'property-editor-http-headers',\n 'http-parameters': 'property-editor-http-parameters',\n 'http-body': 'property-editor-http-body',\n 'entity-selector': 'property-editor-entity-selector',\n 'scenario-step-input': 'property-editor-scenario-step-input',\n 'tag-scenarios': 'property-editor-tag-scenarios',\n 'procedure-parameters': 'property-editor-procedure-parameters'\n })\n}\n"]}
@@ -2,6 +2,7 @@ import './things-editor-http-headers';
2
2
  import './things-editor-http-parameters';
3
3
  import './things-editor-http-body';
4
4
  import './things-editor-oracle-procedure';
5
+ import './things-editor-tag-scenarios';
5
6
  import { OxPropertyEditor } from '@operato/property-editor';
6
7
  export declare class PropertyEditorScenarioStepInput extends OxPropertyEditor {
7
8
  static get styles(): import("lit").CSSResult[];
@@ -23,3 +24,7 @@ export declare class PropertyEditorProcedureParameters extends OxPropertyEditor
23
24
  static get styles(): import("lit").CSSResult[];
24
25
  editorTemplate(value: any, spec: any): import("lit-html").TemplateResult<1>;
25
26
  }
27
+ export declare class PropertyEditorTagScenarios extends OxPropertyEditor {
28
+ static get styles(): import("lit").CSSResult[];
29
+ editorTemplate(value: any, spec: any): import("lit-html").TemplateResult<1>;
30
+ }
@@ -5,6 +5,7 @@ import './things-editor-http-headers';
5
5
  import './things-editor-http-parameters';
6
6
  import './things-editor-http-body';
7
7
  import './things-editor-oracle-procedure';
8
+ import './things-editor-tag-scenarios';
8
9
  import { html } from 'lit';
9
10
  import { OxPropertyEditor } from '@operato/property-editor';
10
11
  export class PropertyEditorScenarioStepInput extends OxPropertyEditor {
@@ -79,4 +80,24 @@ export class PropertyEditorProcedureParameters extends OxPropertyEditor {
79
80
  }
80
81
  }
81
82
  customElements.define('property-editor-procedure-parameters', PropertyEditorProcedureParameters);
83
+ export class PropertyEditorTagScenarios extends OxPropertyEditor {
84
+ static get styles() {
85
+ return [...OxPropertyEditor.styles];
86
+ }
87
+ editorTemplate(value, spec) {
88
+ /* context must be a datagrid(grist) instance, and host must be a record */
89
+ const { context: grid, host: record } = spec;
90
+ const steps = (grid === null || grid === void 0 ? void 0 : grid.dirtyData.records.filter(rec => rec.name !== record.name).map(rec => rec.name)) || [];
91
+ return html `
92
+ <things-editor-tag-scenarios
93
+ id="editor"
94
+ .value=${value}
95
+ .properties=${spec.property}
96
+ .steps=${steps}
97
+ fullwidth
98
+ ></things-editor-tag-scenarios>
99
+ `;
100
+ }
101
+ }
102
+ customElements.define('property-editor-tag-scenarios', PropertyEditorTagScenarios);
82
103
  //# sourceMappingURL=property-editor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"property-editor.js","sourceRoot":"","sources":["../../client/editors/property-editor.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nimport './things-editor-http-headers'\nimport './things-editor-http-parameters'\nimport './things-editor-http-body'\nimport './things-editor-oracle-procedure'\n\nimport { html } from 'lit'\n\nimport { OxPropertyEditor } from '@operato/property-editor'\n\nexport class PropertyEditorScenarioStepInput extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n /* context must be a datagrid(grist) instance, and host must be a record */\n const { context: grid, host: record } = spec\n const steps = grid?.dirtyData.records.filter(rec => rec.name !== record.name).map(rec => rec.name) || []\n\n return html`\n <input id=\"editor\" .value=${value || ''} list=\"step-list\" />\n <datalist id=\"step-list\">${steps.map(id => html` <option value=${id}></option> `)}</datalist>\n `\n }\n}\n\ncustomElements.define('property-editor-scenario-step-input', PropertyEditorScenarioStepInput)\n\nexport class PropertyEditorHttpHeaders extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n return html`\n <things-editor-http-headers id=\"editor\" .value=${value} .properties=${spec.property}></things-editor-http-headers>\n `\n }\n}\n\ncustomElements.define('property-editor-http-headers', PropertyEditorHttpHeaders)\n\nexport class PropertyEditorHttpParameters extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n return html`\n <things-editor-http-parameters\n id=\"editor\"\n .value=${value}\n .properties=${spec.property}\n ></things-editor-http-parameters>\n `\n }\n}\n\ncustomElements.define('property-editor-http-parameters', PropertyEditorHttpParameters)\n\nexport class PropertyEditorHttpBody extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n return html`\n <things-editor-http-body id=\"editor\" .value=${value} .properties=${spec.property}></things-editor-http-body>\n `\n }\n}\n\ncustomElements.define('property-editor-http-body', PropertyEditorHttpBody)\n\nexport class PropertyEditorProcedureParameters extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n /* context must be a datagrid(grist) instance, and host must be a record */\n const { context: grid, host: record } = spec\n const steps = grid?.dirtyData.records.filter(rec => rec.name !== record.name).map(rec => rec.name) || []\n\n return html`\n <things-editor-oracle-procedure\n id=\"editor\"\n .value=${value}\n .properties=${spec.property}\n .steps=${steps}\n fullwidth\n ></things-editor-oracle-procedure>\n `\n }\n}\n\ncustomElements.define('property-editor-procedure-parameters', PropertyEditorProcedureParameters)\n"]}
1
+ {"version":3,"file":"property-editor.js","sourceRoot":"","sources":["../../client/editors/property-editor.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nimport './things-editor-http-headers'\nimport './things-editor-http-parameters'\nimport './things-editor-http-body'\nimport './things-editor-oracle-procedure'\nimport './things-editor-tag-scenarios'\n\nimport { html } from 'lit'\n\nimport { OxPropertyEditor } from '@operato/property-editor'\n\nexport class PropertyEditorScenarioStepInput extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n /* context must be a datagrid(grist) instance, and host must be a record */\n const { context: grid, host: record } = spec\n const steps = grid?.dirtyData.records.filter(rec => rec.name !== record.name).map(rec => rec.name) || []\n\n return html`\n <input id=\"editor\" .value=${value || ''} list=\"step-list\" />\n <datalist id=\"step-list\">${steps.map(id => html` <option value=${id}></option> `)}</datalist>\n `\n }\n}\n\ncustomElements.define('property-editor-scenario-step-input', PropertyEditorScenarioStepInput)\n\nexport class PropertyEditorHttpHeaders extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n return html`\n <things-editor-http-headers id=\"editor\" .value=${value} .properties=${spec.property}></things-editor-http-headers>\n `\n }\n}\n\ncustomElements.define('property-editor-http-headers', PropertyEditorHttpHeaders)\n\nexport class PropertyEditorHttpParameters extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n return html`\n <things-editor-http-parameters\n id=\"editor\"\n .value=${value}\n .properties=${spec.property}\n ></things-editor-http-parameters>\n `\n }\n}\n\ncustomElements.define('property-editor-http-parameters', PropertyEditorHttpParameters)\n\nexport class PropertyEditorHttpBody extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n return html`\n <things-editor-http-body id=\"editor\" .value=${value} .properties=${spec.property}></things-editor-http-body>\n `\n }\n}\n\ncustomElements.define('property-editor-http-body', PropertyEditorHttpBody)\n\nexport class PropertyEditorProcedureParameters extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n /* context must be a datagrid(grist) instance, and host must be a record */\n const { context: grid, host: record } = spec\n const steps = grid?.dirtyData.records.filter(rec => rec.name !== record.name).map(rec => rec.name) || []\n\n return html`\n <things-editor-oracle-procedure\n id=\"editor\"\n .value=${value}\n .properties=${spec.property}\n .steps=${steps}\n fullwidth\n ></things-editor-oracle-procedure>\n `\n }\n}\n\ncustomElements.define('property-editor-procedure-parameters', PropertyEditorProcedureParameters)\n\nexport class PropertyEditorTagScenarios extends OxPropertyEditor {\n static get styles() {\n return [...OxPropertyEditor.styles]\n }\n\n editorTemplate(value, spec) {\n /* context must be a datagrid(grist) instance, and host must be a record */\n const { context: grid, host: record } = spec\n const steps = grid?.dirtyData.records.filter(rec => rec.name !== record.name).map(rec => rec.name) || []\n\n return html`\n <things-editor-tag-scenarios\n id=\"editor\"\n .value=${value}\n .properties=${spec.property}\n .steps=${steps}\n fullwidth\n ></things-editor-tag-scenarios>\n `\n }\n}\n\ncustomElements.define('property-editor-tag-scenarios', PropertyEditorTagScenarios)\n"]}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import '@operato/input/ox-select.js';
5
+ import { LitElement } from 'lit';
6
+ /**
7
+ tag-scenarios map editor element
8
+
9
+ Example:
10
+
11
+ <things-editor-tag-scenarios value=${map}>
12
+ </things-editor-tag-scenarios>
13
+ */
14
+ export default class ThingsEditorTagScenarios extends LitElement {
15
+ static styles: import("lit").CSSResult[];
16
+ value: {
17
+ [key: string]: string;
18
+ };
19
+ _changingNow: boolean;
20
+ private scenarios;
21
+ firstUpdated(): void;
22
+ fetchScenarios(): Promise<void>;
23
+ render(): import("lit-html").TemplateResult<1>;
24
+ _onChange(e: any): void;
25
+ _build(includeNewRecord?: any): void;
26
+ _toArray(map: any): {
27
+ key: any;
28
+ value: any;
29
+ }[];
30
+ _add(): void;
31
+ _delete(e: any): void;
32
+ }
@@ -0,0 +1,226 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { __decorate, __metadata } from "tslib";
5
+ import '@operato/input/ox-select.js';
6
+ import gql from 'graphql-tag';
7
+ import { css, html, LitElement } from 'lit';
8
+ import { customElement, property, state } from 'lit/decorators.js';
9
+ import { keyed } from 'lit/directives/keyed.js';
10
+ import { client } from '@operato/graphql';
11
+ /**
12
+ tag-scenarios map editor element
13
+
14
+ Example:
15
+
16
+ <things-editor-tag-scenarios value=${map}>
17
+ </things-editor-tag-scenarios>
18
+ */
19
+ let ThingsEditorTagScenarios = class ThingsEditorTagScenarios extends LitElement {
20
+ constructor() {
21
+ super(...arguments);
22
+ this.value = {};
23
+ this._changingNow = false;
24
+ this.scenarios = [];
25
+ }
26
+ firstUpdated() {
27
+ this.renderRoot.addEventListener('change', this._onChange.bind(this));
28
+ this.fetchScenarios();
29
+ }
30
+ async fetchScenarios() {
31
+ const { data, errors } = await client.query({
32
+ query: gql `
33
+ query {
34
+ scenarios {
35
+ items {
36
+ id
37
+ name
38
+ }
39
+ }
40
+ }
41
+ `
42
+ });
43
+ if (data) {
44
+ this.scenarios = ((data === null || data === void 0 ? void 0 : data.scenarios.items) || []).map(item => item.name);
45
+ }
46
+ }
47
+ render() {
48
+ const spec = {
49
+ queryName: 'scenarios'
50
+ };
51
+ return html `
52
+ ${this._toArray(this.value).map(item => html `
53
+ <div data-record>
54
+ <input type="text" data-key placeholder="(set tag)" .value=${item.key} />
55
+ <ox-select data-value placeholder="(select scenario)" .value=${item.value}>
56
+ <ox-popup-list with-search>
57
+ <div option value="">&nbsp;</div>
58
+ ${this.scenarios.map(scenario => html ` <div option value=${scenario}>${scenario}</div> `)}
59
+ </ox-popup-list>
60
+ </ox-select>
61
+
62
+ <button class="record-action" @click=${e => this._delete(e)} tabindex="-1">x</button>
63
+ </div>
64
+ `)}
65
+
66
+ <div data-record-new>
67
+ <input type="text" data-key placeholder="(set tag)" value="" />
68
+ ${keyed(Date.now(), html `
69
+ <ox-select data-value placeholder="(select scenario)" value="">
70
+ <ox-popup-list with-search>
71
+ <div option value="">&nbsp;</div>
72
+ ${this.scenarios.map(scenario => html ` <div option value=${scenario}>${scenario}</div> `)}
73
+ </ox-popup-list>
74
+ </ox-select>
75
+ `)}
76
+
77
+ <button class="record-action" @click=${e => this._add()} tabindex="-1">+</button>
78
+ </div>
79
+ `;
80
+ }
81
+ _onChange(e) {
82
+ if (this._changingNow) {
83
+ return;
84
+ }
85
+ this._changingNow = true;
86
+ var input = e.target;
87
+ var value = input.value;
88
+ var div = input.parentElement;
89
+ if (div.hasAttribute('data-record')) {
90
+ var dataList = div.querySelectorAll('[data-value]:not([hidden])');
91
+ for (var i = 0; i < dataList.length; i++) {
92
+ if (dataList[i] !== input) {
93
+ dataList[i].value = value || '';
94
+ }
95
+ }
96
+ }
97
+ if (div.hasAttribute('data-record')) {
98
+ this._build();
99
+ }
100
+ else if (div.hasAttribute('data-record-new') && input.hasAttribute('data-value')) {
101
+ this._add();
102
+ }
103
+ this._changingNow = false;
104
+ }
105
+ _build(includeNewRecord) {
106
+ if (includeNewRecord)
107
+ var records = this.renderRoot.querySelectorAll('[data-record],[data-record-new]');
108
+ else
109
+ var records = this.renderRoot.querySelectorAll('[data-record]');
110
+ var newmap = {};
111
+ for (var i = 0; i < records.length; i++) {
112
+ var record = records[i];
113
+ var key = record.querySelector('[data-key]').value;
114
+ var inputs = record.querySelectorAll('[data-value]:not([style*="display: none"])');
115
+ if (!inputs || inputs.length == 0)
116
+ continue;
117
+ var input = inputs[inputs.length - 1];
118
+ var value = input.value;
119
+ if (key)
120
+ newmap[key] = value || '';
121
+ }
122
+ this.value = newmap;
123
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }));
124
+ }
125
+ /* map아이템들을 template(dom-repeat)용 배열로 변환하는 함수 */
126
+ _toArray(map) {
127
+ var array = [];
128
+ for (var key in map) {
129
+ array.push({
130
+ key: key,
131
+ value: map[key]
132
+ });
133
+ }
134
+ return array;
135
+ }
136
+ _add() {
137
+ this._build(true);
138
+ var inputs = this.renderRoot.querySelectorAll('[data-record-new] input:not([style*="display: none"])');
139
+ for (var i = 0; i < inputs.length; i++) {
140
+ let input = inputs[i];
141
+ input.value = '';
142
+ }
143
+ ;
144
+ inputs[0].focus();
145
+ }
146
+ _delete(e) {
147
+ var record = e.target.parentElement;
148
+ record.querySelector('[data-key]').value = '';
149
+ this._build();
150
+ }
151
+ };
152
+ ThingsEditorTagScenarios.styles = [
153
+ css `
154
+ :host {
155
+ display: flex;
156
+ flex-direction: column;
157
+ align-content: center;
158
+
159
+ width: 100%;
160
+ overflow: visible;
161
+ border: 1px solid #ccc;
162
+ margin: 5px 0;
163
+
164
+ background-color: #ddd;
165
+ }
166
+
167
+ div[data-record],
168
+ div[data-record-new] {
169
+ display: flex;
170
+ flex-flow: row nowrap;
171
+ align-items: center;
172
+ }
173
+
174
+ div[data-record] > *,
175
+ div[data-record-new] > * {
176
+ min-height: 20px;
177
+ margin: 2px;
178
+ }
179
+
180
+ button {
181
+ text-align: center;
182
+ border-radius: 50%;
183
+ font-size: 1em;
184
+ }
185
+
186
+ input,
187
+ ox-select {
188
+ flex: 1;
189
+ }
190
+
191
+ input {
192
+ padding: 5px;
193
+ box-sizing: border-box;
194
+ }
195
+
196
+ ox-select {
197
+ --input-padding: 4px;
198
+ }
199
+
200
+ ox-popup-list {
201
+ max-height: 300px;
202
+ overflow: auto;
203
+ }
204
+
205
+ select,
206
+ ox-select,
207
+ input:not([type='checkbox']) {
208
+ border: 1px solid rgba(0, 0, 0, 0.2);
209
+ border-radius: 4px;
210
+ background-color: white;
211
+ }
212
+ `
213
+ ];
214
+ __decorate([
215
+ property({ type: Object }),
216
+ __metadata("design:type", Object)
217
+ ], ThingsEditorTagScenarios.prototype, "value", void 0);
218
+ __decorate([
219
+ state(),
220
+ __metadata("design:type", Array)
221
+ ], ThingsEditorTagScenarios.prototype, "scenarios", void 0);
222
+ ThingsEditorTagScenarios = __decorate([
223
+ customElement('things-editor-tag-scenarios')
224
+ ], ThingsEditorTagScenarios);
225
+ export default ThingsEditorTagScenarios;
226
+ //# sourceMappingURL=things-editor-tag-scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"things-editor-tag-scenarios.js","sourceRoot":"","sources":["../../client/editors/things-editor-tag-scenarios.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport '@operato/input/ox-select.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\n\nimport { client } from '@operato/graphql'\n\n/**\ntag-scenarios map editor element\n\nExample:\n\n <things-editor-tag-scenarios value=${map}>\n </things-editor-tag-scenarios>\n*/\n@customElement('things-editor-tag-scenarios')\nexport default class ThingsEditorTagScenarios extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n align-content: center;\n\n width: 100%;\n overflow: visible;\n border: 1px solid #ccc;\n margin: 5px 0;\n\n background-color: #ddd;\n }\n\n div[data-record],\n div[data-record-new] {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n }\n\n div[data-record] > *,\n div[data-record-new] > * {\n min-height: 20px;\n margin: 2px;\n }\n\n button {\n text-align: center;\n border-radius: 50%;\n font-size: 1em;\n }\n\n input,\n ox-select {\n flex: 1;\n }\n\n input {\n padding: 5px;\n box-sizing: border-box;\n }\n\n ox-select {\n --input-padding: 4px;\n }\n\n ox-popup-list {\n max-height: 300px;\n overflow: auto;\n }\n\n select,\n ox-select,\n input:not([type='checkbox']) {\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 4px;\n background-color: white;\n }\n `\n ]\n\n @property({ type: Object }) value: { [key: string]: string } = {}\n\n _changingNow: boolean = false\n\n @state() private scenarios: string[] = []\n\n firstUpdated() {\n this.renderRoot.addEventListener('change', this._onChange.bind(this))\n this.fetchScenarios()\n }\n\n async fetchScenarios() {\n const { data, errors } = await client.query({\n query: gql`\n query {\n scenarios {\n items {\n id\n name\n }\n }\n }\n `\n })\n\n if (data) {\n this.scenarios = (data?.scenarios.items || []).map(item => item.name)\n }\n }\n\n render() {\n const spec = {\n queryName: 'scenarios'\n }\n\n return html`\n ${this._toArray(this.value).map(\n item => html`\n <div data-record>\n <input type=\"text\" data-key placeholder=\"(set tag)\" .value=${item.key} />\n <ox-select data-value placeholder=\"(select scenario)\" .value=${item.value}>\n <ox-popup-list with-search>\n <div option value=\"\">&nbsp;</div>\n ${this.scenarios.map(scenario => html` <div option value=${scenario}>${scenario}</div> `)}\n </ox-popup-list>\n </ox-select>\n\n <button class=\"record-action\" @click=${e => this._delete(e)} tabindex=\"-1\">x</button>\n </div>\n `\n )}\n\n <div data-record-new>\n <input type=\"text\" data-key placeholder=\"(set tag)\" value=\"\" />\n ${keyed(\n Date.now(),\n html`\n <ox-select data-value placeholder=\"(select scenario)\" value=\"\">\n <ox-popup-list with-search>\n <div option value=\"\">&nbsp;</div>\n ${this.scenarios.map(scenario => html` <div option value=${scenario}>${scenario}</div> `)}\n </ox-popup-list>\n </ox-select>\n `\n )}\n\n <button class=\"record-action\" @click=${e => this._add()} tabindex=\"-1\">+</button>\n </div>\n `\n }\n\n _onChange(e) {\n if (this._changingNow) {\n return\n }\n\n this._changingNow = true\n\n var input = e.target\n var value = input.value\n\n var div = input.parentElement\n\n if (div.hasAttribute('data-record')) {\n var dataList = div.querySelectorAll('[data-value]:not([hidden])')\n for (var i = 0; i < dataList.length; i++) {\n if (dataList[i] !== input) {\n dataList[i].value = value || ''\n }\n }\n }\n\n if (div.hasAttribute('data-record')) {\n this._build()\n } else if (div.hasAttribute('data-record-new') && input.hasAttribute('data-value')) {\n this._add()\n }\n\n this._changingNow = false\n }\n\n _build(includeNewRecord?) {\n if (includeNewRecord) var records = this.renderRoot.querySelectorAll('[data-record],[data-record-new]')\n else var records = this.renderRoot.querySelectorAll('[data-record]')\n\n var newmap = {}\n\n for (var i = 0; i < records.length; i++) {\n var record = records[i]\n\n var key = (record.querySelector('[data-key]') as HTMLInputElement).value\n var inputs = record.querySelectorAll('[data-value]:not([style*=\"display: none\"])')\n if (!inputs || inputs.length == 0) continue\n\n var input = inputs[inputs.length - 1] as HTMLInputElement\n\n var value = input.value\n\n if (key) newmap[key] = value || ''\n }\n\n this.value = newmap\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))\n }\n\n /* map아이템들을 template(dom-repeat)용 배열로 변환하는 함수 */\n _toArray(map) {\n var array: { key: any; value: any }[] = []\n\n for (var key in map) {\n array.push({\n key: key,\n value: map[key]\n })\n }\n\n return array\n }\n\n _add() {\n this._build(true)\n\n var inputs = this.renderRoot.querySelectorAll('[data-record-new] input:not([style*=\"display: none\"])')\n\n for (var i = 0; i < inputs.length; i++) {\n let input = inputs[i] as HTMLInputElement\n input.value = ''\n }\n\n ;(inputs[0] as HTMLInputElement).focus()\n }\n\n _delete(e) {\n var record = e.target.parentElement\n record.querySelector('[data-key]').value = ''\n this._build()\n }\n}\n"]}