@things-factory/board-ui 6.1.32 → 6.1.39
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/client/bootstrap.ts +8 -1
- package/client/data-grist/color-map-editor.ts +13 -0
- package/client/data-grist/color-ranges-editor.ts +13 -0
- package/client/data-grist/legend-editor.ts +111 -0
- package/client/pages/theme/theme-editors.ts +56 -0
- package/client/pages/{share/share-list-page.ts → theme/theme-list-page.ts} +23 -73
- package/client/route.ts +4 -0
- package/dist-client/bootstrap.js +7 -1
- package/dist-client/bootstrap.js.map +1 -1
- package/dist-client/data-grist/color-map-editor.d.ts +7 -0
- package/dist-client/data-grist/color-map-editor.js +16 -0
- package/dist-client/data-grist/color-map-editor.js.map +1 -0
- package/dist-client/data-grist/color-ranges-editor.d.ts +7 -0
- package/dist-client/data-grist/color-ranges-editor.js +16 -0
- package/dist-client/data-grist/color-ranges-editor.js.map +1 -0
- package/dist-client/data-grist/legend-editor.d.ts +14 -0
- package/dist-client/data-grist/legend-editor.js +108 -0
- package/dist-client/data-grist/legend-editor.js.map +1 -0
- package/dist-client/pages/share/share-importer.d.ts +2 -2
- package/dist-client/pages/share/share-list-page.d.ts +6 -6
- package/dist-client/pages/theme/theme-editors.d.ts +5 -0
- package/dist-client/pages/theme/theme-editors.js +53 -0
- package/dist-client/pages/theme/theme-editors.js.map +1 -0
- package/dist-client/pages/theme/theme-importer.d.ts +22 -0
- package/dist-client/pages/theme/theme-importer.js +100 -0
- package/dist-client/pages/theme/theme-importer.js.map +1 -0
- package/dist-client/pages/theme/theme-list-page.d.ts +49 -0
- package/dist-client/pages/theme/theme-list-page.js +300 -0
- package/dist-client/pages/theme/theme-list-page.js.map +1 -0
- package/dist-client/route.js +3 -0
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/things-factory.config.js +4 -0
- package/translations/en.json +5 -3
- package/translations/ja.json +2 -0
- package/translations/ko.json +2 -0
- package/translations/ms.json +2 -0
- package/translations/zh.json +2 -0
- package/client/pages/share/share-importer.ts +0 -97
package/client/bootstrap.ts
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import '@operato/board/ox-property-editor-board-selector.js'
|
|
2
2
|
|
|
3
3
|
import { OxPropertyEditor } from '@operato/property-editor'
|
|
4
|
-
import { registerEditor, registerRenderer } from '@operato/data-grist'
|
|
4
|
+
import { OxGristRendererJson5, registerEditor, registerRenderer } from '@operato/data-grist'
|
|
5
5
|
|
|
6
6
|
import { BoardEditor } from './data-grist/board-editor'
|
|
7
7
|
import { BoardRenderer } from './data-grist/board-renderer'
|
|
8
|
+
import { ColorMapEditor } from './data-grist/color-map-editor'
|
|
9
|
+
import { ColorRangesEditor } from './data-grist/color-ranges-editor'
|
|
8
10
|
|
|
9
11
|
export default function bootstrap() {
|
|
10
12
|
registerRenderer('board', BoardRenderer)
|
|
13
|
+
registerRenderer('color-map', OxGristRendererJson5)
|
|
14
|
+
registerRenderer('color-ranges', OxGristRendererJson5)
|
|
15
|
+
|
|
11
16
|
registerEditor('board', BoardEditor)
|
|
17
|
+
registerEditor('color-map', ColorMapEditor)
|
|
18
|
+
registerEditor('color-ranges', ColorRangesEditor)
|
|
12
19
|
|
|
13
20
|
OxPropertyEditor.register({
|
|
14
21
|
'board-selector': 'ox-property-editor-board-selector'
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { customElement } from 'lit/decorators.js'
|
|
2
|
+
|
|
3
|
+
import { OxGristEditorValueMap } from '@operato/grist-editor/ox-grist-editor-value-map.js'
|
|
4
|
+
|
|
5
|
+
@customElement('color-map-editor')
|
|
6
|
+
export class ColorMapEditor extends OxGristEditorValueMap {
|
|
7
|
+
get options() {
|
|
8
|
+
return {
|
|
9
|
+
name: `Color Map : ${this.record.name}`,
|
|
10
|
+
valuetype: 'color'
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { customElement } from 'lit/decorators.js'
|
|
2
|
+
|
|
3
|
+
import { OxGristEditorValueRanges } from '@operato/grist-editor/ox-grist-editor-value-ranges.js'
|
|
4
|
+
|
|
5
|
+
@customElement('color-ranges-editor')
|
|
6
|
+
export class ColorRangesEditor extends OxGristEditorValueRanges {
|
|
7
|
+
get options() {
|
|
8
|
+
return {
|
|
9
|
+
name: `Color Ranges : ${this.record.name}`,
|
|
10
|
+
valuetype: 'color'
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import '@operato/board/ox-board-selector.js'
|
|
2
|
+
import './board-renderer'
|
|
3
|
+
|
|
4
|
+
import { css, html, LitElement } from 'lit'
|
|
5
|
+
import { customElement, property, query } from 'lit/decorators.js'
|
|
6
|
+
|
|
7
|
+
import { OxGristEditor } from '@operato/data-grist'
|
|
8
|
+
import { i18next } from '@operato/i18n'
|
|
9
|
+
import { openPopup } from '@operato/layout'
|
|
10
|
+
|
|
11
|
+
@customElement('legend-editor')
|
|
12
|
+
export class LegendEditor extends OxGristEditor {
|
|
13
|
+
static styles = css`
|
|
14
|
+
:host {
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-flow: row nowrap;
|
|
17
|
+
align-items: center;
|
|
18
|
+
|
|
19
|
+
box-sizing: border-box;
|
|
20
|
+
|
|
21
|
+
width: 100%;
|
|
22
|
+
height: 100%;
|
|
23
|
+
|
|
24
|
+
border: 0;
|
|
25
|
+
background-color: transparent;
|
|
26
|
+
|
|
27
|
+
font: var(--grist-object-editor-font);
|
|
28
|
+
color: var(--grist-object-editor-color);
|
|
29
|
+
|
|
30
|
+
justify-content: inherit;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
board-renderer {
|
|
34
|
+
display: flex;
|
|
35
|
+
flex: auto;
|
|
36
|
+
|
|
37
|
+
justify-content: inherit;
|
|
38
|
+
}
|
|
39
|
+
`
|
|
40
|
+
|
|
41
|
+
@property({ type: Object }) value: any
|
|
42
|
+
@property({ type: Object }) column: any
|
|
43
|
+
@property({ type: Object }) record: any
|
|
44
|
+
@property({ type: Number }) row?: number
|
|
45
|
+
|
|
46
|
+
popup
|
|
47
|
+
|
|
48
|
+
render() {
|
|
49
|
+
var { boardViewerPage } = this.column.record.options || {}
|
|
50
|
+
return html` <board-renderer .value=${this.value} .boardViewerPage=${boardViewerPage}></board-renderer> `
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async firstUpdated() {
|
|
54
|
+
this.value = this.record[this.column.name]
|
|
55
|
+
|
|
56
|
+
await this.updateComplete
|
|
57
|
+
|
|
58
|
+
this.renderRoot.addEventListener('click', e => {
|
|
59
|
+
e.stopPropagation()
|
|
60
|
+
|
|
61
|
+
this.openSelector()
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
this.openSelector()
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
openSelector() {
|
|
68
|
+
if (this.popup) {
|
|
69
|
+
delete this.popup
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/*
|
|
73
|
+
* 기존 설정된 보드가 선택된 상태가 되게 하기 위해서는 selector에 value를 전달해줄 필요가 있음.
|
|
74
|
+
* 주의. value는 object일 수도 있고, string일 수도 있다.
|
|
75
|
+
* string인 경우에는 해당 보드의 id로 해석한다.
|
|
76
|
+
*/
|
|
77
|
+
var value = this.value || {}
|
|
78
|
+
|
|
79
|
+
var template = html`
|
|
80
|
+
<ox-board-selector
|
|
81
|
+
.creatable=${true}
|
|
82
|
+
.value=${this.value}
|
|
83
|
+
@board-selected=${async e => {
|
|
84
|
+
var board = e.detail.board
|
|
85
|
+
|
|
86
|
+
this.dispatchEvent(
|
|
87
|
+
new CustomEvent('field-change', {
|
|
88
|
+
bubbles: true,
|
|
89
|
+
composed: true,
|
|
90
|
+
detail: {
|
|
91
|
+
before: this.value,
|
|
92
|
+
after: this.column.type == 'board' ? board : board.id || '',
|
|
93
|
+
record: this.record,
|
|
94
|
+
column: this.column,
|
|
95
|
+
row: this.row
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
this.popup && this.popup.close()
|
|
101
|
+
}}
|
|
102
|
+
></ox-board-selector>
|
|
103
|
+
`
|
|
104
|
+
|
|
105
|
+
this.popup = openPopup(template, {
|
|
106
|
+
backdrop: true,
|
|
107
|
+
size: 'large',
|
|
108
|
+
title: i18next.t('title.select board')
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { getEditor, getRenderer } from '@operato/data-grist'
|
|
2
|
+
|
|
3
|
+
export function buildThemeValueRecordConfig() {
|
|
4
|
+
return {
|
|
5
|
+
editor: function (value, column, record, rowIndex, field) {
|
|
6
|
+
return getEditor(record.type || 'text')(value, column, record, rowIndex, field)
|
|
7
|
+
},
|
|
8
|
+
renderer: function (value, column, record, rowIndex, field) {
|
|
9
|
+
return getRenderer(record.type || 'text')(value, column, record, rowIndex, field)
|
|
10
|
+
},
|
|
11
|
+
editable: true
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function getEditorType(themeType: string): string {
|
|
16
|
+
switch (themeType) {
|
|
17
|
+
case 'legend':
|
|
18
|
+
case 'color-map':
|
|
19
|
+
return 'value-map'
|
|
20
|
+
case 'color-ranges':
|
|
21
|
+
return 'value-ranges'
|
|
22
|
+
case 'color':
|
|
23
|
+
return 'color'
|
|
24
|
+
default:
|
|
25
|
+
return 'text'
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getRendererType(themeType: string): string {
|
|
30
|
+
switch (themeType) {
|
|
31
|
+
case 'legend':
|
|
32
|
+
case 'color-map':
|
|
33
|
+
case 'color-ranges':
|
|
34
|
+
return 'json5'
|
|
35
|
+
case 'color':
|
|
36
|
+
return 'color'
|
|
37
|
+
default:
|
|
38
|
+
return 'text'
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function getOptions(themeType: string, name: string): any {
|
|
43
|
+
switch (themeType) {
|
|
44
|
+
case 'color-map':
|
|
45
|
+
case 'color-ranges':
|
|
46
|
+
return {
|
|
47
|
+
name: `${themeType.toUpperCase()} : ${name}`,
|
|
48
|
+
valuetype: 'color'
|
|
49
|
+
}
|
|
50
|
+
case 'color':
|
|
51
|
+
default:
|
|
52
|
+
return {
|
|
53
|
+
name: `${themeType?.toUpperCase() || ''} : ${name}`
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -14,23 +14,22 @@ import { i18next, localize } from '@operato/i18n'
|
|
|
14
14
|
import { notify, openPopup } from '@operato/layout'
|
|
15
15
|
import { OxPopup } from '@operato/popup'
|
|
16
16
|
import { isMobileDevice } from '@operato/utils'
|
|
17
|
+
import { buildThemeValueRecordConfig } from './theme-editors'
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
// export interface ShareType {
|
|
19
|
+
// export interface ThemeType {
|
|
21
20
|
// name: string
|
|
22
21
|
// propType: string
|
|
23
22
|
// }
|
|
24
23
|
|
|
25
|
-
// var
|
|
24
|
+
// var ThemeTypes: { [name: string]: ThemeType } = {
|
|
26
25
|
// Legend: {
|
|
27
26
|
// name: 'Legend',
|
|
28
27
|
// propType: 'legend'
|
|
29
28
|
// }
|
|
30
29
|
// }
|
|
31
30
|
|
|
32
|
-
@customElement('
|
|
33
|
-
export class
|
|
31
|
+
@customElement('theme-list-page')
|
|
32
|
+
export class ThemeListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {
|
|
34
33
|
static styles = [
|
|
35
34
|
ScrollbarStyles,
|
|
36
35
|
CommonGristStyles,
|
|
@@ -46,12 +45,6 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
46
45
|
`
|
|
47
46
|
]
|
|
48
47
|
|
|
49
|
-
static get scopedElements() {
|
|
50
|
-
return {
|
|
51
|
-
'share-importer': ShareImporter
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
48
|
@property({ type: Object }) gristConfig: any
|
|
56
49
|
@property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'
|
|
57
50
|
|
|
@@ -64,7 +57,7 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
64
57
|
handler: (search: string) => {
|
|
65
58
|
this.grist.searchText = search
|
|
66
59
|
},
|
|
67
|
-
placeholder: i18next.t('title.
|
|
60
|
+
placeholder: i18next.t('title.theme list'),
|
|
68
61
|
value: this.grist.searchText
|
|
69
62
|
},
|
|
70
63
|
filter: {
|
|
@@ -72,26 +65,19 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
72
65
|
this.grist.toggleHeadroom()
|
|
73
66
|
}
|
|
74
67
|
},
|
|
75
|
-
help: 'board-service/
|
|
68
|
+
help: 'board-service/theme',
|
|
76
69
|
actions: [
|
|
77
70
|
{
|
|
78
71
|
title: i18next.t('button.save'),
|
|
79
|
-
action: this.
|
|
72
|
+
action: this._updateTheme.bind(this),
|
|
80
73
|
...CommonButtonStyles.save
|
|
81
74
|
},
|
|
82
75
|
{
|
|
83
76
|
title: i18next.t('button.delete'),
|
|
84
|
-
action: this.
|
|
77
|
+
action: this._deleteTheme.bind(this),
|
|
85
78
|
...CommonButtonStyles.delete
|
|
86
79
|
}
|
|
87
|
-
]
|
|
88
|
-
exportable: {
|
|
89
|
-
name: i18next.t('title.share list'),
|
|
90
|
-
data: this.exportHandler.bind(this)
|
|
91
|
-
},
|
|
92
|
-
importable: {
|
|
93
|
-
handler: this.importHandler.bind(this)
|
|
94
|
-
}
|
|
80
|
+
]
|
|
95
81
|
}
|
|
96
82
|
}
|
|
97
83
|
|
|
@@ -102,7 +88,7 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
102
88
|
<ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
|
|
103
89
|
<div slot="headroom">
|
|
104
90
|
<div id="filters">
|
|
105
|
-
<ox-filters-form autofocus></ox-filters-form>
|
|
91
|
+
<ox-filters-form autofocus without-search></ox-filters-form>
|
|
106
92
|
</div>
|
|
107
93
|
|
|
108
94
|
<div id="sorters">
|
|
@@ -136,7 +122,7 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
136
122
|
this.gristConfig = {
|
|
137
123
|
list: {
|
|
138
124
|
fields: ['name', 'description'],
|
|
139
|
-
details: ['
|
|
125
|
+
details: ['type', 'updatedAt']
|
|
140
126
|
},
|
|
141
127
|
columns: [
|
|
142
128
|
{ type: 'gutter', gutterName: 'sequence' },
|
|
@@ -167,7 +153,7 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
167
153
|
name: 'type',
|
|
168
154
|
header: i18next.t('field.type'),
|
|
169
155
|
record: {
|
|
170
|
-
options: ['', '
|
|
156
|
+
options: ['', 'color-map', 'color-ranges', 'color', 'text'],
|
|
171
157
|
editable: true
|
|
172
158
|
},
|
|
173
159
|
width: 120
|
|
@@ -178,10 +164,10 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
178
164
|
header: i18next.t('field.value'),
|
|
179
165
|
record: {
|
|
180
166
|
editor: function (value, column, record, rowIndex, field) {
|
|
181
|
-
return getEditor(record.
|
|
167
|
+
return getEditor(record.type || 'text')(value, column, record, rowIndex, field)
|
|
182
168
|
},
|
|
183
169
|
renderer: function (value, column, record, rowIndex, field) {
|
|
184
|
-
return getRenderer(record.
|
|
170
|
+
return getRenderer(record.type || 'text')(value, column, record, rowIndex, field)
|
|
185
171
|
},
|
|
186
172
|
editable: true
|
|
187
173
|
},
|
|
@@ -232,12 +218,13 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
232
218
|
const response = await client.query({
|
|
233
219
|
query: gql`
|
|
234
220
|
query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
|
|
235
|
-
responses:
|
|
221
|
+
responses: themes(filters: $filters, pagination: $pagination, sortings: $sortings) {
|
|
236
222
|
items {
|
|
237
223
|
id
|
|
238
224
|
name
|
|
239
225
|
description
|
|
240
|
-
|
|
226
|
+
type
|
|
227
|
+
value
|
|
241
228
|
updater {
|
|
242
229
|
id
|
|
243
230
|
name
|
|
@@ -261,14 +248,14 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
261
248
|
}
|
|
262
249
|
}
|
|
263
250
|
|
|
264
|
-
async
|
|
251
|
+
async _deleteTheme() {
|
|
265
252
|
if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
|
|
266
253
|
const ids = this.grist.selected.map(record => record.id)
|
|
267
254
|
if (ids && ids.length > 0) {
|
|
268
255
|
const response = await client.mutate({
|
|
269
256
|
mutation: gql`
|
|
270
257
|
mutation ($ids: [String!]!) {
|
|
271
|
-
|
|
258
|
+
deleteThemes(ids: $ids)
|
|
272
259
|
}
|
|
273
260
|
`,
|
|
274
261
|
variables: {
|
|
@@ -286,7 +273,7 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
286
273
|
}
|
|
287
274
|
}
|
|
288
275
|
|
|
289
|
-
async
|
|
276
|
+
async _updateTheme() {
|
|
290
277
|
let patches = this.grist.dirtyRecords
|
|
291
278
|
if (patches && patches.length) {
|
|
292
279
|
patches = patches.map(patch => {
|
|
@@ -302,8 +289,8 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
302
289
|
|
|
303
290
|
const response = await client.mutate({
|
|
304
291
|
mutation: gql`
|
|
305
|
-
mutation ($patches: [
|
|
306
|
-
|
|
292
|
+
mutation ($patches: [ThemePatch!]!) {
|
|
293
|
+
updateMultipleTheme(patches: $patches) {
|
|
307
294
|
name
|
|
308
295
|
}
|
|
309
296
|
}
|
|
@@ -318,41 +305,4 @@ export class ShareListPage extends connect(store)(localize(i18next)(ScopedElemen
|
|
|
318
305
|
}
|
|
319
306
|
}
|
|
320
307
|
}
|
|
321
|
-
|
|
322
|
-
async exportHandler() {
|
|
323
|
-
const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records
|
|
324
|
-
const targetFieldSet = new Set(['id', 'name', 'description', 'active'])
|
|
325
|
-
|
|
326
|
-
return exportTargets.map(share => {
|
|
327
|
-
let tempObj = {}
|
|
328
|
-
for (const field of targetFieldSet) {
|
|
329
|
-
tempObj[field] = share[field]
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
return tempObj
|
|
333
|
-
})
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
async importHandler(records) {
|
|
337
|
-
const popup = openPopup(
|
|
338
|
-
html`
|
|
339
|
-
<share-importer
|
|
340
|
-
.shares=${records}
|
|
341
|
-
@imported=${() => {
|
|
342
|
-
history.back()
|
|
343
|
-
this.grist.fetch()
|
|
344
|
-
}}
|
|
345
|
-
></share-importer>
|
|
346
|
-
`,
|
|
347
|
-
{
|
|
348
|
-
backdrop: true,
|
|
349
|
-
size: 'large',
|
|
350
|
-
title: i18next.t('title.import share')
|
|
351
|
-
}
|
|
352
|
-
)
|
|
353
|
-
|
|
354
|
-
popup.onclosed = () => {
|
|
355
|
-
this.grist.fetch()
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
308
|
}
|
package/client/route.ts
CHANGED
package/dist-client/bootstrap.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import '@operato/board/ox-property-editor-board-selector.js';
|
|
2
2
|
import { OxPropertyEditor } from '@operato/property-editor';
|
|
3
|
-
import { registerEditor, registerRenderer } from '@operato/data-grist';
|
|
3
|
+
import { OxGristRendererJson5, registerEditor, registerRenderer } from '@operato/data-grist';
|
|
4
4
|
import { BoardEditor } from './data-grist/board-editor';
|
|
5
5
|
import { BoardRenderer } from './data-grist/board-renderer';
|
|
6
|
+
import { ColorMapEditor } from './data-grist/color-map-editor';
|
|
7
|
+
import { ColorRangesEditor } from './data-grist/color-ranges-editor';
|
|
6
8
|
export default function bootstrap() {
|
|
7
9
|
registerRenderer('board', BoardRenderer);
|
|
10
|
+
registerRenderer('color-map', OxGristRendererJson5);
|
|
11
|
+
registerRenderer('color-ranges', OxGristRendererJson5);
|
|
8
12
|
registerEditor('board', BoardEditor);
|
|
13
|
+
registerEditor('color-map', ColorMapEditor);
|
|
14
|
+
registerEditor('color-ranges', ColorRangesEditor);
|
|
9
15
|
OxPropertyEditor.register({
|
|
10
16
|
'board-selector': 'ox-property-editor-board-selector'
|
|
11
17
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../client/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,qDAAqD,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../client/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,qDAAqD,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAE5F,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAEpE,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IACxC,gBAAgB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAA;IACnD,gBAAgB,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAA;IAEtD,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACpC,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;IAC3C,cAAc,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAA;IAEjD,gBAAgB,CAAC,QAAQ,CAAC;QACxB,gBAAgB,EAAE,mCAAmC;KACtD,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import '@operato/board/ox-property-editor-board-selector.js'\n\nimport { OxPropertyEditor } from '@operato/property-editor'\nimport { OxGristRendererJson5, registerEditor, registerRenderer } from '@operato/data-grist'\n\nimport { BoardEditor } from './data-grist/board-editor'\nimport { BoardRenderer } from './data-grist/board-renderer'\nimport { ColorMapEditor } from './data-grist/color-map-editor'\nimport { ColorRangesEditor } from './data-grist/color-ranges-editor'\n\nexport default function bootstrap() {\n registerRenderer('board', BoardRenderer)\n registerRenderer('color-map', OxGristRendererJson5)\n registerRenderer('color-ranges', OxGristRendererJson5)\n\n registerEditor('board', BoardEditor)\n registerEditor('color-map', ColorMapEditor)\n registerEditor('color-ranges', ColorRangesEditor)\n\n OxPropertyEditor.register({\n 'board-selector': 'ox-property-editor-board-selector'\n })\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { customElement } from 'lit/decorators.js';
|
|
3
|
+
import { OxGristEditorValueMap } from '@operato/grist-editor/ox-grist-editor-value-map.js';
|
|
4
|
+
let ColorMapEditor = class ColorMapEditor extends OxGristEditorValueMap {
|
|
5
|
+
get options() {
|
|
6
|
+
return {
|
|
7
|
+
name: `Color Map : ${this.record.name}`,
|
|
8
|
+
valuetype: 'color'
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
ColorMapEditor = __decorate([
|
|
13
|
+
customElement('color-map-editor')
|
|
14
|
+
], ColorMapEditor);
|
|
15
|
+
export { ColorMapEditor };
|
|
16
|
+
//# sourceMappingURL=color-map-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-map-editor.js","sourceRoot":"","sources":["../../client/data-grist/color-map-editor.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAA;AAGnF,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,qBAAqB;IACvD,IAAI,OAAO;QACT,OAAO;YACL,IAAI,EAAE,eAAe,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YACvC,SAAS,EAAE,OAAO;SACnB,CAAA;IACH,CAAC;CACF,CAAA;AAPY,cAAc;IAD1B,aAAa,CAAC,kBAAkB,CAAC;GACrB,cAAc,CAO1B;SAPY,cAAc","sourcesContent":["import { customElement } from 'lit/decorators.js'\n\nimport { OxGristEditorValueMap } from '@operato/grist-editor/ox-grist-editor-value-map.js'\n\n@customElement('color-map-editor')\nexport class ColorMapEditor extends OxGristEditorValueMap {\n get options() {\n return {\n name: `Color Map : ${this.record.name}`,\n valuetype: 'color'\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { customElement } from 'lit/decorators.js';
|
|
3
|
+
import { OxGristEditorValueRanges } from '@operato/grist-editor/ox-grist-editor-value-ranges.js';
|
|
4
|
+
let ColorRangesEditor = class ColorRangesEditor extends OxGristEditorValueRanges {
|
|
5
|
+
get options() {
|
|
6
|
+
return {
|
|
7
|
+
name: `Color Ranges : ${this.record.name}`,
|
|
8
|
+
valuetype: 'color'
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
ColorRangesEditor = __decorate([
|
|
13
|
+
customElement('color-ranges-editor')
|
|
14
|
+
], ColorRangesEditor);
|
|
15
|
+
export { ColorRangesEditor };
|
|
16
|
+
//# sourceMappingURL=color-ranges-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-ranges-editor.js","sourceRoot":"","sources":["../../client/data-grist/color-ranges-editor.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uDAAuD,CAAA;AAGzF,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,wBAAwB;IAC7D,IAAI,OAAO;QACT,OAAO;YACL,IAAI,EAAE,kBAAkB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAC1C,SAAS,EAAE,OAAO;SACnB,CAAA;IACH,CAAC;CACF,CAAA;AAPY,iBAAiB;IAD7B,aAAa,CAAC,qBAAqB,CAAC;GACxB,iBAAiB,CAO7B;SAPY,iBAAiB","sourcesContent":["import { customElement } from 'lit/decorators.js'\n\nimport { OxGristEditorValueRanges } from '@operato/grist-editor/ox-grist-editor-value-ranges.js'\n\n@customElement('color-ranges-editor')\nexport class ColorRangesEditor extends OxGristEditorValueRanges {\n get options() {\n return {\n name: `Color Ranges : ${this.record.name}`,\n valuetype: 'color'\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import '@operato/board/ox-board-selector.js';
|
|
2
|
+
import './board-renderer';
|
|
3
|
+
import { OxGristEditor } from '@operato/data-grist';
|
|
4
|
+
export declare class LegendEditor extends OxGristEditor {
|
|
5
|
+
static styles: import("lit").CSSResult;
|
|
6
|
+
value: any;
|
|
7
|
+
column: any;
|
|
8
|
+
record: any;
|
|
9
|
+
row?: number;
|
|
10
|
+
popup: any;
|
|
11
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
12
|
+
firstUpdated(): Promise<void>;
|
|
13
|
+
openSelector(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import '@operato/board/ox-board-selector.js';
|
|
3
|
+
import './board-renderer';
|
|
4
|
+
import { css, html } from 'lit';
|
|
5
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
6
|
+
import { OxGristEditor } from '@operato/data-grist';
|
|
7
|
+
import { i18next } from '@operato/i18n';
|
|
8
|
+
import { openPopup } from '@operato/layout';
|
|
9
|
+
let LegendEditor = class LegendEditor extends OxGristEditor {
|
|
10
|
+
render() {
|
|
11
|
+
var { boardViewerPage } = this.column.record.options || {};
|
|
12
|
+
return html ` <board-renderer .value=${this.value} .boardViewerPage=${boardViewerPage}></board-renderer> `;
|
|
13
|
+
}
|
|
14
|
+
async firstUpdated() {
|
|
15
|
+
this.value = this.record[this.column.name];
|
|
16
|
+
await this.updateComplete;
|
|
17
|
+
this.renderRoot.addEventListener('click', e => {
|
|
18
|
+
e.stopPropagation();
|
|
19
|
+
this.openSelector();
|
|
20
|
+
});
|
|
21
|
+
this.openSelector();
|
|
22
|
+
}
|
|
23
|
+
openSelector() {
|
|
24
|
+
if (this.popup) {
|
|
25
|
+
delete this.popup;
|
|
26
|
+
}
|
|
27
|
+
/*
|
|
28
|
+
* 기존 설정된 보드가 선택된 상태가 되게 하기 위해서는 selector에 value를 전달해줄 필요가 있음.
|
|
29
|
+
* 주의. value는 object일 수도 있고, string일 수도 있다.
|
|
30
|
+
* string인 경우에는 해당 보드의 id로 해석한다.
|
|
31
|
+
*/
|
|
32
|
+
var value = this.value || {};
|
|
33
|
+
var template = html `
|
|
34
|
+
<ox-board-selector
|
|
35
|
+
.creatable=${true}
|
|
36
|
+
.value=${this.value}
|
|
37
|
+
@board-selected=${async (e) => {
|
|
38
|
+
var board = e.detail.board;
|
|
39
|
+
this.dispatchEvent(new CustomEvent('field-change', {
|
|
40
|
+
bubbles: true,
|
|
41
|
+
composed: true,
|
|
42
|
+
detail: {
|
|
43
|
+
before: this.value,
|
|
44
|
+
after: this.column.type == 'board' ? board : board.id || '',
|
|
45
|
+
record: this.record,
|
|
46
|
+
column: this.column,
|
|
47
|
+
row: this.row
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
this.popup && this.popup.close();
|
|
51
|
+
}}
|
|
52
|
+
></ox-board-selector>
|
|
53
|
+
`;
|
|
54
|
+
this.popup = openPopup(template, {
|
|
55
|
+
backdrop: true,
|
|
56
|
+
size: 'large',
|
|
57
|
+
title: i18next.t('title.select board')
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
LegendEditor.styles = css `
|
|
62
|
+
:host {
|
|
63
|
+
display: flex;
|
|
64
|
+
flex-flow: row nowrap;
|
|
65
|
+
align-items: center;
|
|
66
|
+
|
|
67
|
+
box-sizing: border-box;
|
|
68
|
+
|
|
69
|
+
width: 100%;
|
|
70
|
+
height: 100%;
|
|
71
|
+
|
|
72
|
+
border: 0;
|
|
73
|
+
background-color: transparent;
|
|
74
|
+
|
|
75
|
+
font: var(--grist-object-editor-font);
|
|
76
|
+
color: var(--grist-object-editor-color);
|
|
77
|
+
|
|
78
|
+
justify-content: inherit;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
board-renderer {
|
|
82
|
+
display: flex;
|
|
83
|
+
flex: auto;
|
|
84
|
+
|
|
85
|
+
justify-content: inherit;
|
|
86
|
+
}
|
|
87
|
+
`;
|
|
88
|
+
__decorate([
|
|
89
|
+
property({ type: Object }),
|
|
90
|
+
__metadata("design:type", Object)
|
|
91
|
+
], LegendEditor.prototype, "value", void 0);
|
|
92
|
+
__decorate([
|
|
93
|
+
property({ type: Object }),
|
|
94
|
+
__metadata("design:type", Object)
|
|
95
|
+
], LegendEditor.prototype, "column", void 0);
|
|
96
|
+
__decorate([
|
|
97
|
+
property({ type: Object }),
|
|
98
|
+
__metadata("design:type", Object)
|
|
99
|
+
], LegendEditor.prototype, "record", void 0);
|
|
100
|
+
__decorate([
|
|
101
|
+
property({ type: Number }),
|
|
102
|
+
__metadata("design:type", Number)
|
|
103
|
+
], LegendEditor.prototype, "row", void 0);
|
|
104
|
+
LegendEditor = __decorate([
|
|
105
|
+
customElement('legend-editor')
|
|
106
|
+
], LegendEditor);
|
|
107
|
+
export { LegendEditor };
|
|
108
|
+
//# sourceMappingURL=legend-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legend-editor.js","sourceRoot":"","sources":["../../client/data-grist/legend-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/board/ox-board-selector.js'\nimport './board-renderer'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { OxGristEditor } from '@operato/data-grist'\nimport { i18next } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\n\n@customElement('legend-editor')\nexport class LegendEditor extends OxGristEditor {\n static styles = css`\n :host {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n\n box-sizing: border-box;\n\n width: 100%;\n height: 100%;\n\n border: 0;\n background-color: transparent;\n\n font: var(--grist-object-editor-font);\n color: var(--grist-object-editor-color);\n\n justify-content: inherit;\n }\n\n board-renderer {\n display: flex;\n flex: auto;\n\n justify-content: inherit;\n }\n `\n\n @property({ type: Object }) value: any\n @property({ type: Object }) column: any\n @property({ type: Object }) record: any\n @property({ type: Number }) row?: number\n\n popup\n\n render() {\n var { boardViewerPage } = this.column.record.options || {}\n return html` <board-renderer .value=${this.value} .boardViewerPage=${boardViewerPage}></board-renderer> `\n }\n\n async firstUpdated() {\n this.value = this.record[this.column.name]\n\n await this.updateComplete\n\n this.renderRoot.addEventListener('click', e => {\n e.stopPropagation()\n\n this.openSelector()\n })\n\n this.openSelector()\n }\n\n openSelector() {\n if (this.popup) {\n delete this.popup\n }\n\n /*\n * 기존 설정된 보드가 선택된 상태가 되게 하기 위해서는 selector에 value를 전달해줄 필요가 있음.\n * 주의. value는 object일 수도 있고, string일 수도 있다.\n * string인 경우에는 해당 보드의 id로 해석한다.\n */\n var value = this.value || {}\n\n var template = html`\n <ox-board-selector\n .creatable=${true}\n .value=${this.value}\n @board-selected=${async e => {\n var board = e.detail.board\n\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: this.column.type == 'board' ? board : board.id || '',\n record: this.record,\n column: this.column,\n row: this.row\n }\n })\n )\n\n this.popup && this.popup.close()\n }}\n ></ox-board-selector>\n `\n\n this.popup = openPopup(template, {\n backdrop: true,\n size: 'large',\n title: i18next.t('title.select board')\n })\n }\n}\n"]}
|