@operato/data-grist 1.5.36 → 1.5.41
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/CHANGELOG.md +18 -0
- package/dist/src/data-grid/data-grid-body.d.ts +2 -1
- package/dist/src/data-grid/data-grid-body.js +6 -4
- package/dist/src/data-grid/data-grid-body.js.map +1 -1
- package/dist/src/data-grid/data-grid-field.d.ts +1 -0
- package/dist/src/data-grid/data-grid-field.js +4 -0
- package/dist/src/data-grid/data-grid-field.js.map +1 -1
- package/dist/src/data-grid/event-handlers/data-grid-body-keydown-handler.js +3 -3
- package/dist/src/data-grid/event-handlers/data-grid-body-keydown-handler.js.map +1 -1
- package/dist/src/editors/image-input.d.ts +7 -0
- package/dist/src/editors/image-input.js +31 -0
- package/dist/src/editors/image-input.js.map +1 -0
- package/dist/src/editors/input-editors.d.ts +68 -0
- package/dist/src/editors/input-editors.js +329 -0
- package/dist/src/editors/input-editors.js.map +1 -0
- package/dist/src/editors/ox-grist-editor.js +6 -2
- package/dist/src/editors/ox-grist-editor.js.map +1 -1
- package/dist/src/renderers/boolean-renderer.d.ts +2 -0
- package/dist/src/renderers/boolean-renderer.js +30 -0
- package/dist/src/renderers/boolean-renderer.js.map +1 -0
- package/dist/src/renderers/color-renderer.d.ts +2 -0
- package/dist/src/renderers/color-renderer.js +6 -0
- package/dist/src/renderers/color-renderer.js.map +1 -0
- package/dist/src/renderers/date-renderer.d.ts +2 -0
- package/dist/src/renderers/date-renderer.js +52 -0
- package/dist/src/renderers/date-renderer.js.map +1 -0
- package/dist/src/renderers/image-renderer.d.ts +2 -0
- package/dist/src/renderers/image-renderer.js +24 -0
- package/dist/src/renderers/image-renderer.js.map +1 -0
- package/dist/src/renderers/json5-renderer.d.ts +2 -0
- package/dist/src/renderers/json5-renderer.js +7 -0
- package/dist/src/renderers/json5-renderer.js.map +1 -0
- package/dist/src/renderers/link-renderer.d.ts +2 -0
- package/dist/src/renderers/link-renderer.js +12 -0
- package/dist/src/renderers/link-renderer.js.map +1 -0
- package/dist/src/renderers/password-renderer.d.ts +2 -0
- package/dist/src/renderers/password-renderer.js +4 -0
- package/dist/src/renderers/password-renderer.js.map +1 -0
- package/dist/src/renderers/progress-renderer.d.ts +2 -0
- package/dist/src/renderers/progress-renderer.js +68 -0
- package/dist/src/renderers/progress-renderer.js.map +1 -0
- package/dist/src/renderers/select-renderer.d.ts +2 -0
- package/dist/src/renderers/select-renderer.js +15 -0
- package/dist/src/renderers/select-renderer.js.map +1 -0
- package/dist/src/renderers/text-renderer.d.ts +2 -0
- package/dist/src/renderers/text-renderer.js +6 -0
- package/dist/src/renderers/text-renderer.js.map +1 -0
- package/dist/stories/{dynamic-enabled-property.stories.js → default-filters.stories copy.js } +7 -35
- package/dist/stories/default-filters.stories copy.js.map +1 -0
- package/dist/stories/default-grid.stories.js +127 -116
- package/dist/stories/default.stories.d.ts +25 -0
- package/dist/stories/default.stories.js +195 -0
- package/dist/stories/default.stories.js.map +1 -0
- package/dist/stories/index.stories.d.ts +33 -0
- package/dist/stories/index.stories.js +33 -0
- package/dist/stories/index.stories.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/data-grid/data-grid-body.ts +7 -5
- package/src/data-grid/data-grid-field.ts +1 -0
- package/src/data-grid/event-handlers/data-grid-body-keydown-handler.ts +3 -3
- package/src/editors/ox-grist-editor.ts +4 -2
- package/dist/stories/dynamic-enabled-property.stories.js.map +0 -1
- /package/dist/stories/{dynamic-enabled-property.stories.d.ts → default-filters.stories copy.d.ts} +0 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { css, html, LitElement } from 'lit';
|
|
3
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
4
|
+
import { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config';
|
|
5
|
+
const STYLE = css `
|
|
6
|
+
:host {
|
|
7
|
+
display: block;
|
|
8
|
+
|
|
9
|
+
width: 100%;
|
|
10
|
+
height: 100%;
|
|
11
|
+
|
|
12
|
+
border: 0;
|
|
13
|
+
background-color: transparent;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
:host > * {
|
|
17
|
+
display: flex;
|
|
18
|
+
|
|
19
|
+
width: 100%;
|
|
20
|
+
height: 100%;
|
|
21
|
+
|
|
22
|
+
border: 0;
|
|
23
|
+
background-color: transparent;
|
|
24
|
+
|
|
25
|
+
box-sizing: border-box;
|
|
26
|
+
|
|
27
|
+
font-size: inherit;
|
|
28
|
+
font-family: inherit;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
:host > style {
|
|
32
|
+
display: none;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
:host > input[type='checkbox'] {
|
|
36
|
+
width: initial;
|
|
37
|
+
margin: auto;
|
|
38
|
+
}
|
|
39
|
+
input[type='checkbox'],
|
|
40
|
+
input[type='radio'] {
|
|
41
|
+
zoom: var(--grist-input-zoom);
|
|
42
|
+
}
|
|
43
|
+
*:focus {
|
|
44
|
+
outline: none;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
input[type='file'] {
|
|
48
|
+
opacity: 0%;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@media screen and (max-width: 460px) {
|
|
52
|
+
:host > * {
|
|
53
|
+
border: initial;
|
|
54
|
+
background-color: initial;
|
|
55
|
+
}
|
|
56
|
+
*:focus {
|
|
57
|
+
outline: none;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
`;
|
|
61
|
+
let InputEditor = class InputEditor extends LitElement {
|
|
62
|
+
constructor() {
|
|
63
|
+
super(...arguments);
|
|
64
|
+
this.column = ZERO_COLUMN;
|
|
65
|
+
this.record = ZERO_RECORD;
|
|
66
|
+
}
|
|
67
|
+
render() {
|
|
68
|
+
return this.editorTemplate;
|
|
69
|
+
}
|
|
70
|
+
get editor() {
|
|
71
|
+
return this.renderRoot.firstElementChild;
|
|
72
|
+
}
|
|
73
|
+
async firstUpdated() {
|
|
74
|
+
this.renderRoot.addEventListener('change', this._onchange.bind(this));
|
|
75
|
+
this.renderRoot.addEventListener('focusout', this._onfocusout.bind(this));
|
|
76
|
+
this.renderRoot.addEventListener('click', this._onclick.bind(this));
|
|
77
|
+
this.renderRoot.addEventListener('dblclick', this._ondblclick.bind(this));
|
|
78
|
+
const align = this.column.record.align;
|
|
79
|
+
if (align) {
|
|
80
|
+
this.style.textAlign = align;
|
|
81
|
+
this.style.textAlignLast = align; /* for select */
|
|
82
|
+
}
|
|
83
|
+
const name = this.column.name || '';
|
|
84
|
+
this.value = this._dirtyValue = this.formatForEditor(this.record[name]);
|
|
85
|
+
this.focus();
|
|
86
|
+
await this.updateComplete;
|
|
87
|
+
this.select();
|
|
88
|
+
}
|
|
89
|
+
select() {
|
|
90
|
+
var _a;
|
|
91
|
+
if ((_a = this.editor) === null || _a === void 0 ? void 0 : _a.select) {
|
|
92
|
+
return this.editor.select();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
focus() {
|
|
96
|
+
var _a;
|
|
97
|
+
(_a = this.editor) === null || _a === void 0 ? void 0 : _a.focus();
|
|
98
|
+
}
|
|
99
|
+
formatForEditor(value) {
|
|
100
|
+
return value === undefined ? '' : value;
|
|
101
|
+
}
|
|
102
|
+
formatFromEditor(e) {
|
|
103
|
+
return e.target.value;
|
|
104
|
+
}
|
|
105
|
+
_onfocusout() {
|
|
106
|
+
if (this._dirtyValue !== this.value) {
|
|
107
|
+
this.dispatchEvent(new CustomEvent('field-change', {
|
|
108
|
+
bubbles: true,
|
|
109
|
+
composed: true,
|
|
110
|
+
detail: {
|
|
111
|
+
before: this.value,
|
|
112
|
+
after: this._dirtyValue,
|
|
113
|
+
column: this.column,
|
|
114
|
+
record: this.record,
|
|
115
|
+
row: this.row
|
|
116
|
+
}
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
_onchange(e) {
|
|
121
|
+
e.stopPropagation();
|
|
122
|
+
this._dirtyValue = this.formatFromEditor(e);
|
|
123
|
+
}
|
|
124
|
+
_onclick(e) {
|
|
125
|
+
e.stopPropagation();
|
|
126
|
+
}
|
|
127
|
+
_ondblclick(e) {
|
|
128
|
+
e.stopPropagation();
|
|
129
|
+
}
|
|
130
|
+
get editorTemplate() {
|
|
131
|
+
return html ``;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
InputEditor.styles = STYLE;
|
|
135
|
+
__decorate([
|
|
136
|
+
property({ type: Object })
|
|
137
|
+
], InputEditor.prototype, "value", void 0);
|
|
138
|
+
__decorate([
|
|
139
|
+
property({ type: Object })
|
|
140
|
+
], InputEditor.prototype, "column", void 0);
|
|
141
|
+
__decorate([
|
|
142
|
+
property({ type: Object })
|
|
143
|
+
], InputEditor.prototype, "record", void 0);
|
|
144
|
+
__decorate([
|
|
145
|
+
property({ type: Number })
|
|
146
|
+
], InputEditor.prototype, "rowIndex", void 0);
|
|
147
|
+
__decorate([
|
|
148
|
+
property({ type: Object })
|
|
149
|
+
], InputEditor.prototype, "field", void 0);
|
|
150
|
+
__decorate([
|
|
151
|
+
property({ type: Number })
|
|
152
|
+
], InputEditor.prototype, "row", void 0);
|
|
153
|
+
InputEditor = __decorate([
|
|
154
|
+
customElement('ox-input-editor')
|
|
155
|
+
], InputEditor);
|
|
156
|
+
export { InputEditor };
|
|
157
|
+
let TextInput = class TextInput extends InputEditor {
|
|
158
|
+
get editorTemplate() {
|
|
159
|
+
return html ` <input type="text" .value=${this.value} /> `;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
TextInput = __decorate([
|
|
163
|
+
customElement('ox-text-input')
|
|
164
|
+
], TextInput);
|
|
165
|
+
export { TextInput };
|
|
166
|
+
let EmailInput = class EmailInput extends InputEditor {
|
|
167
|
+
get editorTemplate() {
|
|
168
|
+
return html ` <input type="email" .value=${this.value} /> `;
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
EmailInput = __decorate([
|
|
172
|
+
customElement('ox-email-input')
|
|
173
|
+
], EmailInput);
|
|
174
|
+
export { EmailInput };
|
|
175
|
+
let TelInput = class TelInput extends InputEditor {
|
|
176
|
+
get editorTemplate() {
|
|
177
|
+
return html ` <input type="tel" .value=${this.value} /> `;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
TelInput = __decorate([
|
|
181
|
+
customElement('ox-tel-input')
|
|
182
|
+
], TelInput);
|
|
183
|
+
export { TelInput };
|
|
184
|
+
let NumberInput = class NumberInput extends InputEditor {
|
|
185
|
+
formatFromEditor(e) {
|
|
186
|
+
let value = e.target.value;
|
|
187
|
+
switch (this.column.type) {
|
|
188
|
+
case 'float':
|
|
189
|
+
return Number.parseFloat(value);
|
|
190
|
+
case 'integer':
|
|
191
|
+
return Number.parseInt(value);
|
|
192
|
+
default:
|
|
193
|
+
return Number(value);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
get editorTemplate() {
|
|
197
|
+
var { min = -Infinity, max = Infinity } = this.column.record.options || {};
|
|
198
|
+
return html ` <input type="number" .value=${this.value} .min=${Number(min)} .max=${Number(max)} /> `;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
NumberInput = __decorate([
|
|
202
|
+
customElement('ox-number-input')
|
|
203
|
+
], NumberInput);
|
|
204
|
+
export { NumberInput };
|
|
205
|
+
let PasswordInput = class PasswordInput extends InputEditor {
|
|
206
|
+
get editorTemplate() {
|
|
207
|
+
return html ` <input type="password" .value=${this.value} /> `;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
PasswordInput = __decorate([
|
|
211
|
+
customElement('ox-password-input')
|
|
212
|
+
], PasswordInput);
|
|
213
|
+
export { PasswordInput };
|
|
214
|
+
let DateInput = class DateInput extends InputEditor {
|
|
215
|
+
get editorTemplate() {
|
|
216
|
+
return html ` <input type="date" .value=${this.value} /> `;
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
DateInput = __decorate([
|
|
220
|
+
customElement('ox-date-input')
|
|
221
|
+
], DateInput);
|
|
222
|
+
export { DateInput };
|
|
223
|
+
let MonthInput = class MonthInput extends InputEditor {
|
|
224
|
+
get editorTemplate() {
|
|
225
|
+
return html ` <input type="month" .value=${this.value} /> `;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
MonthInput = __decorate([
|
|
229
|
+
customElement('ox-month-input')
|
|
230
|
+
], MonthInput);
|
|
231
|
+
export { MonthInput };
|
|
232
|
+
let WeekInput = class WeekInput extends InputEditor {
|
|
233
|
+
get editorTemplate() {
|
|
234
|
+
return html ` <input type="week" .value=${this.value} /> `;
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
WeekInput = __decorate([
|
|
238
|
+
customElement('ox-week-input')
|
|
239
|
+
], WeekInput);
|
|
240
|
+
export { WeekInput };
|
|
241
|
+
let TimeInput = class TimeInput extends InputEditor {
|
|
242
|
+
get editorTemplate() {
|
|
243
|
+
return html ` <input type="time" .value=${this.value} /> `;
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
TimeInput = __decorate([
|
|
247
|
+
customElement('ox-time-input')
|
|
248
|
+
], TimeInput);
|
|
249
|
+
export { TimeInput };
|
|
250
|
+
let DateTimeInput = class DateTimeInput extends InputEditor {
|
|
251
|
+
formatForEditor(timestamp) {
|
|
252
|
+
if (!timestamp) {
|
|
253
|
+
timestamp = Date.now();
|
|
254
|
+
}
|
|
255
|
+
var datetime = new Date(timestamp);
|
|
256
|
+
var tzoffset = datetime.getTimezoneOffset() * 60000; //offset in milliseconds
|
|
257
|
+
return new Date(timestamp - tzoffset).toISOString().slice(0, -1);
|
|
258
|
+
}
|
|
259
|
+
formatFromEditor(e) {
|
|
260
|
+
var value = e.target.value;
|
|
261
|
+
var datetime = new Date(value);
|
|
262
|
+
return datetime.getTime();
|
|
263
|
+
}
|
|
264
|
+
get editorTemplate() {
|
|
265
|
+
return html ` <input type="datetime-local" .value=${this.value} /> `;
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
DateTimeInput = __decorate([
|
|
269
|
+
customElement('ox-datetime-input')
|
|
270
|
+
], DateTimeInput);
|
|
271
|
+
export { DateTimeInput };
|
|
272
|
+
let ColorInput = class ColorInput extends InputEditor {
|
|
273
|
+
get editorTemplate() {
|
|
274
|
+
return html ` <input type="color" .value=${this.value} /> `;
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
ColorInput = __decorate([
|
|
278
|
+
customElement('ox-color-input')
|
|
279
|
+
], ColorInput);
|
|
280
|
+
export { ColorInput };
|
|
281
|
+
let CheckboxInput = class CheckboxInput extends InputEditor {
|
|
282
|
+
formatFromEditor(e) {
|
|
283
|
+
return e.target.checked;
|
|
284
|
+
}
|
|
285
|
+
get editorTemplate() {
|
|
286
|
+
return html ` <input type="checkbox" .checked=${!!this.value} /> `;
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
CheckboxInput = __decorate([
|
|
290
|
+
customElement('ox-checkbox-input')
|
|
291
|
+
], CheckboxInput);
|
|
292
|
+
export { CheckboxInput };
|
|
293
|
+
let Select = class Select extends InputEditor {
|
|
294
|
+
get editorTemplate() {
|
|
295
|
+
var rowOptionField = this.record[this.column.record.rowOptionField || ''];
|
|
296
|
+
var { options = [] } = rowOptionField ? rowOptionField : this.column.record;
|
|
297
|
+
if (typeof options == 'function') {
|
|
298
|
+
options = options.call(null, this.value, this.column, this.record, this.rowIndex, this.field);
|
|
299
|
+
}
|
|
300
|
+
options = options.map((option) => {
|
|
301
|
+
switch (typeof option) {
|
|
302
|
+
case 'string':
|
|
303
|
+
return {
|
|
304
|
+
display: option,
|
|
305
|
+
value: option
|
|
306
|
+
};
|
|
307
|
+
case 'object':
|
|
308
|
+
return {
|
|
309
|
+
display: option.display,
|
|
310
|
+
value: option.value
|
|
311
|
+
};
|
|
312
|
+
default:
|
|
313
|
+
return option;
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
return html `
|
|
317
|
+
<select>
|
|
318
|
+
${options.map((option) => html `
|
|
319
|
+
<option ?selected=${option.value == this.value} value=${option.value}>${option.display}</option>
|
|
320
|
+
`)}
|
|
321
|
+
</select>
|
|
322
|
+
`;
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
Select = __decorate([
|
|
326
|
+
customElement('ox-select-input')
|
|
327
|
+
], Select);
|
|
328
|
+
export { Select };
|
|
329
|
+
//# sourceMappingURL=input-editors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-editors.js","sourceRoot":"","sources":["../../../src/editors/input-editors.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'\nimport { DataGridField } from '../data-grid/data-grid-field'\nimport { ColumnConfig, GristRecord } from '../types'\n\nconst STYLE = css`\n :host {\n display: block;\n\n width: 100%;\n height: 100%;\n\n border: 0;\n background-color: transparent;\n }\n\n :host > * {\n display: flex;\n\n width: 100%;\n height: 100%;\n\n border: 0;\n background-color: transparent;\n\n box-sizing: border-box;\n\n font-size: inherit;\n font-family: inherit;\n }\n\n :host > style {\n display: none;\n }\n\n :host > input[type='checkbox'] {\n width: initial;\n margin: auto;\n }\n input[type='checkbox'],\n input[type='radio'] {\n zoom: var(--grist-input-zoom);\n }\n *:focus {\n outline: none;\n }\n\n input[type='file'] {\n opacity: 0%;\n }\n\n @media screen and (max-width: 460px) {\n :host > * {\n border: initial;\n background-color: initial;\n }\n *:focus {\n outline: none;\n }\n }\n`\n\n@customElement('ox-input-editor')\nexport class InputEditor extends LitElement {\n static styles = STYLE\n\n @property({ type: Object }) value?: any\n @property({ type: Object }) column: ColumnConfig = ZERO_COLUMN\n @property({ type: Object }) record: GristRecord = ZERO_RECORD\n @property({ type: Number }) rowIndex?: number\n @property({ type: Object }) field?: DataGridField\n @property({ type: Number }) row?: number\n\n protected _dirtyValue?: any\n\n render() {\n return this.editorTemplate\n }\n\n get editor(): HTMLElement | null {\n return this.renderRoot.firstElementChild as HTMLElement\n }\n\n async firstUpdated() {\n this.renderRoot.addEventListener('change', this._onchange.bind(this))\n this.renderRoot.addEventListener('focusout', this._onfocusout.bind(this))\n this.renderRoot.addEventListener('click', this._onclick.bind(this))\n this.renderRoot.addEventListener('dblclick', this._ondblclick.bind(this))\n\n const align = this.column.record.align\n if (align) {\n this.style.textAlign = align\n this.style.textAlignLast = align /* for select */\n }\n\n const name = this.column.name || ''\n this.value = this._dirtyValue = this.formatForEditor(this.record[name])\n\n this.focus()\n await this.updateComplete\n this.select()\n }\n\n select() {\n if ((this.editor as HTMLInputElement)?.select) {\n return (this.editor as HTMLInputElement).select()\n }\n }\n\n focus() {\n this.editor?.focus()\n }\n\n formatForEditor(value: any): any {\n return value === undefined ? '' : value\n }\n\n formatFromEditor(e: Event): any {\n return (e.target as HTMLInputElement).value\n }\n\n _onfocusout() {\n if (this._dirtyValue !== this.value) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: this._dirtyValue,\n column: this.column,\n record: this.record,\n row: this.row\n }\n })\n )\n }\n }\n\n _onchange(e: Event): void {\n e.stopPropagation()\n\n this._dirtyValue = this.formatFromEditor(e)\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n }\n\n _ondblclick(e: Event): void {\n e.stopPropagation()\n }\n\n get editorTemplate() {\n return html``\n }\n}\n\n@customElement('ox-text-input')\nexport class TextInput extends InputEditor {\n get editorTemplate() {\n return html` <input type=\"text\" .value=${this.value} /> `\n }\n}\n\n@customElement('ox-email-input')\nexport class EmailInput extends InputEditor {\n get editorTemplate() {\n return html` <input type=\"email\" .value=${this.value} /> `\n }\n}\n\n@customElement('ox-tel-input')\nexport class TelInput extends InputEditor {\n get editorTemplate() {\n return html` <input type=\"tel\" .value=${this.value} /> `\n }\n}\n\n@customElement('ox-number-input')\nexport class NumberInput extends InputEditor {\n formatFromEditor(e: Event) {\n let value = (e.target as HTMLInputElement).value\n\n switch (this.column.type) {\n case 'float':\n return Number.parseFloat(value)\n case 'integer':\n return Number.parseInt(value)\n default:\n return Number(value)\n }\n }\n\n get editorTemplate() {\n var { min = -Infinity, max = Infinity } = this.column.record.options || {}\n\n return html` <input type=\"number\" .value=${this.value} .min=${Number(min)} .max=${Number(max)} /> `\n }\n}\n\n@customElement('ox-password-input')\nexport class PasswordInput extends InputEditor {\n get editorTemplate() {\n return html` <input type=\"password\" .value=${this.value} /> `\n }\n}\n\n@customElement('ox-date-input')\nexport class DateInput extends InputEditor {\n get editorTemplate() {\n return html` <input type=\"date\" .value=${this.value} /> `\n }\n}\n\n@customElement('ox-month-input')\nexport class MonthInput extends InputEditor {\n get editorTemplate() {\n return html` <input type=\"month\" .value=${this.value} /> `\n }\n}\n\n@customElement('ox-week-input')\nexport class WeekInput extends InputEditor {\n get editorTemplate() {\n return html` <input type=\"week\" .value=${this.value} /> `\n }\n}\n\n@customElement('ox-time-input')\nexport class TimeInput extends InputEditor {\n get editorTemplate() {\n return html` <input type=\"time\" .value=${this.value} /> `\n }\n}\n\n@customElement('ox-datetime-input')\nexport class DateTimeInput extends InputEditor {\n formatForEditor(timestamp: any) {\n if (!timestamp) {\n timestamp = Date.now()\n }\n var datetime = new Date(timestamp)\n\n var tzoffset = datetime.getTimezoneOffset() * 60000 //offset in milliseconds\n\n return new Date(timestamp - tzoffset).toISOString().slice(0, -1)\n }\n\n formatFromEditor(e: Event) {\n var value = (e.target as HTMLInputElement).value\n var datetime = new Date(value)\n\n return datetime.getTime()\n }\n\n get editorTemplate() {\n return html` <input type=\"datetime-local\" .value=${this.value} /> `\n }\n}\n\n@customElement('ox-color-input')\nexport class ColorInput extends InputEditor {\n get editorTemplate() {\n return html` <input type=\"color\" .value=${this.value} /> `\n }\n}\n\n@customElement('ox-checkbox-input')\nexport class CheckboxInput extends InputEditor {\n formatFromEditor(e: Event) {\n return (e.target as HTMLInputElement).checked\n }\n\n get editorTemplate() {\n return html` <input type=\"checkbox\" .checked=${!!this.value} /> `\n }\n}\n\n@customElement('ox-select-input')\nexport class Select extends InputEditor {\n get editorTemplate() {\n var rowOptionField = this.record[this.column.record.rowOptionField || '']\n var { options = [] } = rowOptionField ? rowOptionField : this.column.record\n\n if (typeof options == 'function') {\n options = options.call(null, this.value, this.column, this.record, this.rowIndex, this.field)\n }\n\n options = options.map((option: any) => {\n switch (typeof option) {\n case 'string':\n return {\n display: option,\n value: option\n }\n case 'object':\n return {\n display: option.display,\n value: option.value\n }\n default:\n return option\n }\n })\n\n return html`\n <select>\n ${options.map(\n (option: any) => html`\n <option ?selected=${option.value == this.value} value=${option.value}>${option.display}</option>\n `\n )}\n </select>\n `\n }\n}\n"]}
|
|
@@ -83,6 +83,7 @@ let OxGristEditor = class OxGristEditor extends LitElement {
|
|
|
83
83
|
return this.renderRoot.firstElementChild;
|
|
84
84
|
}
|
|
85
85
|
async firstUpdated() {
|
|
86
|
+
var _a;
|
|
86
87
|
this.renderRoot.addEventListener('change', this._onchange.bind(this));
|
|
87
88
|
this.renderRoot.addEventListener('focusout', this._onfocusout.bind(this));
|
|
88
89
|
this.addEventListener('click', this._onclick.bind(this));
|
|
@@ -102,15 +103,18 @@ let OxGristEditor = class OxGristEditor extends LitElement {
|
|
|
102
103
|
if (typeof currentValue == 'undefined' && defaultValue) {
|
|
103
104
|
currentValue = getDefaultValue(defaultValue, this.record);
|
|
104
105
|
}
|
|
105
|
-
|
|
106
|
+
// 입력을 위한 키를 누르면서 편집모드가 될때는 누른 키가 처음에 입력되도록, enter 같은 것을 눌러서 편집모드가 되면 현재 값으로 편집모드 전환
|
|
107
|
+
const editorValue = ((_a = this.field) === null || _a === void 0 ? void 0 : _a.valueWithEdit) ? this.field.valueWithEdit : this.formatForEditor(currentValue);
|
|
108
|
+
this.value = this._dirtyValue = editorValue;
|
|
106
109
|
requestAnimationFrame(() => {
|
|
107
110
|
this.focus();
|
|
108
111
|
this.select();
|
|
109
112
|
});
|
|
110
113
|
}
|
|
111
114
|
select() {
|
|
115
|
+
var _a;
|
|
112
116
|
const editor = this.editor;
|
|
113
|
-
if (editor === null || editor === void 0 ? void 0 : editor.select) {
|
|
117
|
+
if ((editor === null || editor === void 0 ? void 0 : editor.select) && !((_a = this.field) === null || _a === void 0 ? void 0 : _a.valueWithEdit)) {
|
|
114
118
|
return editor.select();
|
|
115
119
|
}
|
|
116
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-grist-editor.js","sourceRoot":"","sources":["../../../src/editors/ox-grist-editor.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAkB,MAAM,KAAK,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,KAAK,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEhB,CAAA;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;QAIuB,WAAM,GAAiB,WAAW,CAAA;QAClC,WAAM,GAAgB,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"ox-grist-editor.js","sourceRoot":"","sources":["../../../src/editors/ox-grist-editor.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAkB,MAAM,KAAK,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,KAAK,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEhB,CAAA;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;QAIuB,WAAM,GAAiB,WAAW,CAAA;QAClC,WAAM,GAAgB,WAAW,CAAA;IAiH/D,CAAC;IA1GC,MAAM;QACJ,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAgC,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,YAAY;;QAChB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACrE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACzE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACxD,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9D,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAE5D,wFAAwF;QACxF,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAA;QACrE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAA;QACrE,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAA;QAEnE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QACjC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAElD,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAA;YAC5B,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAA,CAAC,gBAAgB;SAClD;QAED,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAEpC,IAAI,OAAO,YAAY,IAAI,WAAW,IAAI,YAAY,EAAE;YACtD,YAAY,GAAG,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;SAC1D;QAED,oFAAoF;QACpF,MAAM,WAAW,GAAG,CAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,aAAa,EAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;QAC7G,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAE3C,qBAAqB,CAAC,GAAG,EAAE;YACzB,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,IAAI,CAAC,MAAM,EAAE,CAAA;QACf,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM;;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,CAAC,MAA2B,aAA3B,MAAM,uBAAN,MAAM,CAAuB,MAAM,KAAI,CAAC,CAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,aAAa,CAAA,EAAE;YACtE,OAAQ,MAA2B,CAAC,MAAM,EAAE,CAAA;SAC7C;IACH,CAAC;IAED,KAAK;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,MAAM,EAAE;YACV,MAAM,CAAC,KAAK,EAAE,CAAA;SACf;IACH,CAAC;IAED,eAAe,CAAC,KAAU;QACxB,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IACnC,CAAC;IAED,gBAAgB,CAAC,CAAQ;QACvB,OAAQ,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAA;IAC7C,CAAC;IAED,WAAW;QACT,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QACjC,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QAE1C,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,EAAE;YACrC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,MAAM,EAAE,YAAY;oBACpB,KAAK,EAAE,IAAI,CAAC,WAAW;oBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd;aACF,CAAC,CACH,CAAA;SACF;IACH,CAAC;IAED,SAAS,CAAC,CAAQ;QAChB,CAAC,CAAC,eAAe,EAAE,CAAA;QAEnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;IAED,UAAU,CAAC,CAAQ,IAAS,CAAC;IAE7B,QAAQ,CAAC,CAAQ;QACf,CAAC,CAAC,eAAe,EAAE,CAAA;IACrB,CAAC;IAED,WAAW,CAAC,CAAQ;QAClB,CAAC,CAAC,eAAe,EAAE,CAAA;IACrB,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAA,EAAE,CAAA;IACf,CAAC;;AApHM,oBAAM,GAAG,KAAK,AAAR,CAAQ;AAEO;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAY;AACX;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAmC;AAClC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAkC;AACjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CAAkB;AACjB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAsB;AACrB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAAa;AAR7B,aAAa;IADzB,aAAa,CAAC,iBAAiB,CAAC;GACpB,aAAa,CAsHzB","sourcesContent":["import { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'\nimport { DataGridField } from '../data-grid/data-grid-field'\nimport { ColumnConfig, GristRecord } from '../types'\nimport { getDefaultValue } from '../value-generator'\n\nconst STYLE = css`\n :host {\n display: flex;\n\n align-items: center;\n\n width: 100%;\n height: 100%;\n\n border: 0;\n background-color: transparent;\n\n overflow: visible;\n justify-content: var(--data-grid-field-justify-content, flex-start);\n }\n\n :host > * {\n display: flex;\n\n width: 100%;\n height: 100%;\n\n border: 0;\n background-color: transparent;\n\n box-sizing: border-box;\n\n align-items: center;\n }\n\n :host > style {\n display: none;\n }\n\n :host > input[type='checkbox'] {\n width: initial;\n margin: 0;\n }\n input[type='checkbox'],\n input[type='radio'] {\n zoom: var(--grist-input-zoom);\n }\n *:focus {\n outline: none;\n }\n\n input[type='file'] {\n opacity: 0%;\n }\n\n @media screen and (max-width: 460px) {\n :host > * {\n border: initial;\n background-color: initial;\n }\n\n *:focus {\n outline: none;\n }\n\n input,\n select,\n textarea {\n font-size: 16px;\n }\n }\n`\n\n@customElement('ox-grist-editor')\nexport class OxGristEditor extends LitElement {\n static styles = STYLE\n\n @property({ type: Object }) value?: any\n @property({ type: Object }) column: ColumnConfig = ZERO_COLUMN\n @property({ type: Object }) record: GristRecord = ZERO_RECORD\n @property({ type: Number }) rowIndex?: number\n @property({ type: Object }) field?: DataGridField\n @property({ type: Number }) row?: number\n\n protected _dirtyValue?: any\n\n render() {\n return this.editorTemplate\n }\n\n get editor(): HTMLElement | null {\n return this.renderRoot.firstElementChild as HTMLElement\n }\n\n async firstUpdated() {\n this.renderRoot.addEventListener('change', this._onchange.bind(this))\n this.renderRoot.addEventListener('focusout', this._onfocusout.bind(this))\n this.addEventListener('click', this._onclick.bind(this))\n this.addEventListener('dblclick', this._ondblclick.bind(this))\n this.addEventListener('keydown', this._onkeydown.bind(this))\n\n /* editor mode 인 경우의 마우스 움직임이, grist-body의 이벤트 처리에 의해서 에디터를 리셋시킬 수 있으므로, 이벤트 전파를 막는다. */\n this.addEventListener('mousedown', (e: Event) => e.stopPropagation())\n this.addEventListener('mousemove', (e: Event) => e.stopPropagation())\n this.addEventListener('mouseup', (e: Event) => e.stopPropagation())\n\n const { name = '' } = this.column\n const { align, defaultValue } = this.column.record\n\n if (align) {\n this.style.textAlign = align\n this.style.textAlignLast = align /* for select */\n }\n\n var currentValue = this.record[name]\n\n if (typeof currentValue == 'undefined' && defaultValue) {\n currentValue = getDefaultValue(defaultValue, this.record)\n }\n\n // 입력을 위한 키를 누르면서 편집모드가 될때는 누른 키가 처음에 입력되도록, enter 같은 것을 눌러서 편집모드가 되면 현재 값으로 편집모드 전환\n const editorValue = this.field?.valueWithEdit ? this.field.valueWithEdit : this.formatForEditor(currentValue)\n this.value = this._dirtyValue = editorValue\n\n requestAnimationFrame(() => {\n this.focus()\n this.select()\n })\n }\n\n select() {\n const editor = this.editor\n if ((editor as HTMLInputElement)?.select && !this.field?.valueWithEdit) {\n return (editor as HTMLInputElement).select()\n }\n }\n\n focus() {\n const editor = this.editor\n if (editor) {\n editor.focus()\n }\n }\n\n formatForEditor(value: any): any {\n return value == null ? '' : value\n }\n\n formatFromEditor(e: Event): any {\n return (e.target as HTMLInputElement).value\n }\n\n _onfocusout() {\n const { name = '' } = this.column\n var currentValue = this.record[name] || ''\n\n if (this._dirtyValue !== currentValue) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: currentValue,\n after: this._dirtyValue,\n column: this.column,\n record: this.record,\n row: this.row\n }\n })\n )\n }\n }\n\n _onchange(e: Event): void {\n e.stopPropagation()\n\n this._dirtyValue = this.formatFromEditor(e)\n }\n\n _onkeydown(e: Event): void {}\n\n _onclick(e: Event): void {\n e.stopPropagation()\n }\n\n _ondblclick(e: Event): void {\n e.stopPropagation()\n }\n\n get editorTemplate() {\n return html``\n }\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
export const BooleanRenderer = (value, column, record, rowIndex, field) => {
|
|
3
|
+
return html `
|
|
4
|
+
<input
|
|
5
|
+
type="checkbox"
|
|
6
|
+
.checked=${!!value}
|
|
7
|
+
?disabled=${!column.record.editable}
|
|
8
|
+
@click=${(e) => {
|
|
9
|
+
/*
|
|
10
|
+
* 특별하게, checkbox인 경우에, editor가 활성화되지 않아도, renderer에서 값을 변경할 수 있게 함.
|
|
11
|
+
* checkbox가 클릭되면, 클릭에 의해 변경된 값을 레코드에 반영하기 위해서 value-changed 이벤트를 발생시킨다.
|
|
12
|
+
*
|
|
13
|
+
* 만일, readonly인 경우에는 click 이벤트가 발생하지 않으므로, 클릭으로 에디트할 수 없게 됨.
|
|
14
|
+
*/
|
|
15
|
+
field.dispatchEvent(new CustomEvent('field-change', {
|
|
16
|
+
bubbles: true,
|
|
17
|
+
composed: true,
|
|
18
|
+
detail: {
|
|
19
|
+
before: value,
|
|
20
|
+
after: e.target.checked,
|
|
21
|
+
column: column,
|
|
22
|
+
record: record,
|
|
23
|
+
row: rowIndex
|
|
24
|
+
}
|
|
25
|
+
}));
|
|
26
|
+
}}
|
|
27
|
+
/>
|
|
28
|
+
`;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=boolean-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean-renderer.js","sourceRoot":"","sources":["../../../src/renderers/boolean-renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE1B,MAAM,CAAC,MAAM,eAAe,GAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IACvF,OAAO,IAAI,CAAA;;;iBAGI,CAAC,CAAC,KAAK;kBACN,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ;eAC1B,CAAC,CAAQ,EAAE,EAAE;QACpB;;;;;WAKG;QACH,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,cAAc,EAAE;YAC9B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,MAAM,EAAE,KAAK;gBACb,KAAK,EAAG,CAAC,CAAC,MAA2B,CAAC,OAAO;gBAC7C,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,QAAQ;aACd;SACF,CAAC,CACH,CAAA;IACH,CAAC;;GAEJ,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { FieldRenderer } from '../types'\nimport { html } from 'lit'\n\nexport const BooleanRenderer: FieldRenderer = (value, column, record, rowIndex, field) => {\n return html`\n <input\n type=\"checkbox\"\n .checked=${!!value}\n ?disabled=${!column.record.editable}\n @click=${(e: Event) => {\n /*\n * 특별하게, checkbox인 경우에, editor가 활성화되지 않아도, renderer에서 값을 변경할 수 있게 함.\n * checkbox가 클릭되면, 클릭에 의해 변경된 값을 레코드에 반영하기 위해서 value-changed 이벤트를 발생시킨다.\n *\n * 만일, readonly인 경우에는 click 이벤트가 발생하지 않으므로, 클릭으로 에디트할 수 없게 됨.\n */\n field.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: value,\n after: (e.target as HTMLInputElement).checked,\n column: column,\n record: record,\n row: rowIndex\n }\n })\n )\n }}\n />\n `\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
export const ColorRenderer = (value, column, record, rowIndex, field) => {
|
|
3
|
+
value = value === undefined ? '#000' : value;
|
|
4
|
+
return html ` <div style="display:block;background-color:${value}">${value}</div> `;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=color-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-renderer.js","sourceRoot":"","sources":["../../../src/renderers/color-renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE1B,MAAM,CAAC,MAAM,aAAa,GAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IACrF,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;IAE5C,OAAO,IAAI,CAAA,+CAA+C,KAAK,KAAK,KAAK,SAAS,CAAA;AACpF,CAAC,CAAA","sourcesContent":["import { FieldRenderer } from '../types'\nimport { html } from 'lit'\n\nexport const ColorRenderer: FieldRenderer = (value, column, record, rowIndex, field) => {\n value = value === undefined ? '#000' : value\n\n return html` <div style=\"display:block;background-color:${value}\">${value}</div> `\n}\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// TODO 로케일 설정에 따라서 포맷이 바뀌도록 해야한다.
|
|
2
|
+
const DATETIME_OPTIONS = {
|
|
3
|
+
year: 'numeric',
|
|
4
|
+
month: 'numeric',
|
|
5
|
+
day: 'numeric',
|
|
6
|
+
hour: 'numeric',
|
|
7
|
+
minute: 'numeric',
|
|
8
|
+
second: 'numeric',
|
|
9
|
+
hour12: false
|
|
10
|
+
};
|
|
11
|
+
const DATE_OPTIONS = {
|
|
12
|
+
year: 'numeric',
|
|
13
|
+
month: 'numeric',
|
|
14
|
+
day: 'numeric'
|
|
15
|
+
};
|
|
16
|
+
const TIME_OPTIONS = {
|
|
17
|
+
hour: 'numeric',
|
|
18
|
+
minute: 'numeric',
|
|
19
|
+
second: 'numeric'
|
|
20
|
+
};
|
|
21
|
+
const OPTIONS = {
|
|
22
|
+
datetime: DATETIME_OPTIONS,
|
|
23
|
+
time: TIME_OPTIONS,
|
|
24
|
+
date: DATE_OPTIONS
|
|
25
|
+
};
|
|
26
|
+
function getsec(time) {
|
|
27
|
+
var arr = time.split(':');
|
|
28
|
+
return Number(arr[0]) * 3600 + Number(arr[1]) * 60 + (Number(arr[2]) || 0);
|
|
29
|
+
}
|
|
30
|
+
/*
|
|
31
|
+
TODO date, time, month, week 등 datetime 이 외의 타입인 경우에는 문자열로 처리하도록 한다.
|
|
32
|
+
따라서, 이 경우는 타임존에 대한 처리가 불필요하다.
|
|
33
|
+
*/
|
|
34
|
+
export const DateRenderer = (value, column, record, rowIndex, field) => {
|
|
35
|
+
if (!value) {
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
if (!isNaN(Number(value)))
|
|
39
|
+
value = Number(value);
|
|
40
|
+
var options = column.record.options || OPTIONS[column.type];
|
|
41
|
+
var formatter = new Intl.DateTimeFormat(navigator.language, options);
|
|
42
|
+
switch (column.type) {
|
|
43
|
+
case 'datetime':
|
|
44
|
+
return formatter.format(new Date(value));
|
|
45
|
+
case 'date':
|
|
46
|
+
return formatter.format(new Date(value));
|
|
47
|
+
case 'time':
|
|
48
|
+
default:
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=date-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-renderer.js","sourceRoot":"","sources":["../../../src/renderers/date-renderer.ts"],"names":[],"mappings":"AAEA,kCAAkC;AAClC,MAAM,gBAAgB,GAAG;IACvB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,KAAK;CACd,CAAA;AAED,MAAM,YAAY,GAAG;IACnB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;CACf,CAAA;AAED,MAAM,YAAY,GAAG;IACnB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;CAClB,CAAA;AAED,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;CACnB,CAAA;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AAC5E,CAAC;AAED;;;EAGE;AACF,MAAM,CAAC,MAAM,YAAY,GAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IACpF,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,EAAE,CAAA;KACV;IAED,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAEhD,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,IAAoC,CAAC,CAAA;IAC3F,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEpE,QAAQ,MAAM,CAAC,IAAI,EAAE;QACnB,KAAK,UAAU;YACb,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1C,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1C,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,KAAK,CAAA;KACf;AACH,CAAC,CAAA","sourcesContent":["import { FieldRenderer } from '../types'\n\n// TODO 로케일 설정에 따라서 포맷이 바뀌도록 해야한다.\nconst DATETIME_OPTIONS = {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n hour12: false\n}\n\nconst DATE_OPTIONS = {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric'\n}\n\nconst TIME_OPTIONS = {\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric'\n}\n\nconst OPTIONS = {\n datetime: DATETIME_OPTIONS,\n time: TIME_OPTIONS,\n date: DATE_OPTIONS\n}\n\nfunction getsec(time: string): number {\n var arr = time.split(':')\n return Number(arr[0]) * 3600 + Number(arr[1]) * 60 + (Number(arr[2]) || 0)\n}\n\n/* \n TODO date, time, month, week 등 datetime 이 외의 타입인 경우에는 문자열로 처리하도록 한다. \n 따라서, 이 경우는 타임존에 대한 처리가 불필요하다.\n*/\nexport const DateRenderer: FieldRenderer = (value, column, record, rowIndex, field) => {\n if (!value) {\n return ''\n }\n\n if (!isNaN(Number(value))) value = Number(value)\n\n var options = column.record.options || OPTIONS[column.type as 'datetime' | 'date' | 'time']\n var formatter = new Intl.DateTimeFormat(navigator.language, options)\n\n switch (column.type) {\n case 'datetime':\n return formatter.format(new Date(value))\n case 'date':\n return formatter.format(new Date(value))\n case 'time':\n default:\n return value\n }\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
const IMAGE_FALLBACK = new URL('../../../assets/images/no-image.png', import.meta.url).href;
|
|
3
|
+
export const ImageRenderer = (value, column, record, rowIndex, field) => {
|
|
4
|
+
let src;
|
|
5
|
+
if (!value) {
|
|
6
|
+
src = IMAGE_FALLBACK;
|
|
7
|
+
}
|
|
8
|
+
else if (typeof value === 'string') {
|
|
9
|
+
src = value;
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
src = URL.createObjectURL(value);
|
|
13
|
+
requestAnimationFrame(() => URL.revokeObjectURL(src));
|
|
14
|
+
}
|
|
15
|
+
const { width, height } = column.record.options || {};
|
|
16
|
+
return html ` <img
|
|
17
|
+
src=${src}
|
|
18
|
+
width=${width}
|
|
19
|
+
height=${height}
|
|
20
|
+
style="max-width: 100%;"
|
|
21
|
+
onerror="this.src !== '${IMAGE_FALLBACK}' && (this.src = '${IMAGE_FALLBACK}')"
|
|
22
|
+
/>`;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=image-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-renderer.js","sourceRoot":"","sources":["../../../src/renderers/image-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAI1B,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,qCAAqC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;AAE3F,MAAM,CAAC,MAAM,aAAa,GAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IACrF,IAAI,GAAW,CAAA;IAEf,IAAI,CAAC,KAAK,EAAE;QACV,GAAG,GAAG,cAAc,CAAA;KACrB;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACpC,GAAG,GAAG,KAAK,CAAA;KACZ;SAAM;QACL,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAChC,qBAAqB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;KACtD;IAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;IAErD,OAAO,IAAI,CAAA;UACH,GAAG;YACD,KAAK;aACJ,MAAM;;6BAEU,cAAc,qBAAqB,cAAc;KACzE,CAAA;AACL,CAAC,CAAA","sourcesContent":["import { html } from 'lit'\n\nimport { FieldRenderer } from '../types'\n\nconst IMAGE_FALLBACK = new URL('../../../assets/images/no-image.png', import.meta.url).href\n\nexport const ImageRenderer: FieldRenderer = (value, column, record, rowIndex, field) => {\n let src: string\n\n if (!value) {\n src = IMAGE_FALLBACK\n } else if (typeof value === 'string') {\n src = value\n } else {\n src = URL.createObjectURL(value)\n requestAnimationFrame(() => URL.revokeObjectURL(src))\n }\n\n const { width, height } = column.record.options || {}\n\n return html` <img\n src=${src}\n width=${width}\n height=${height}\n style=\"max-width: 100%;\"\n onerror=\"this.src !== '${IMAGE_FALLBACK}' && (this.src = '${IMAGE_FALLBACK}')\"\n />`\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import JSON5 from 'json5';
|
|
2
|
+
import { html } from 'lit';
|
|
3
|
+
export const Json5Renderer = (value, column, record, rowIndex, field) => {
|
|
4
|
+
const text = value === undefined || value === null ? '' : JSON5.stringify(value);
|
|
5
|
+
return html `<span>${text}</span>`;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=json5-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json5-renderer.js","sourceRoot":"","sources":["../../../src/renderers/json5-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE1B,MAAM,CAAC,MAAM,aAAa,GAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IACrF,MAAM,IAAI,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAChF,OAAO,IAAI,CAAA,SAAS,IAAI,SAAS,CAAA;AACnC,CAAC,CAAA","sourcesContent":["import { FieldRenderer } from '../types'\nimport JSON5 from 'json5'\nimport { html } from 'lit'\n\nexport const Json5Renderer: FieldRenderer = (value, column, record, rowIndex, field) => {\n const text = value === undefined || value === null ? '' : JSON5.stringify(value)\n return html`<span>${text}</span>`\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
export const LinkRenderer = (value, column, record, rowIndex, field) => {
|
|
3
|
+
var { href, target } = column.record.options || {};
|
|
4
|
+
value = value === undefined ? '' : value;
|
|
5
|
+
if (typeof href == 'function') {
|
|
6
|
+
href = href(value, column, record, rowIndex, field);
|
|
7
|
+
}
|
|
8
|
+
return target
|
|
9
|
+
? html ` <a style="text-decoration:none;color:inherit" href=${href || value} target=${target}>${value}</a> `
|
|
10
|
+
: html ` <a style="text-decoration:none;color:inherit" href=${href || value}>${value}</a> `;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=link-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-renderer.js","sourceRoot":"","sources":["../../../src/renderers/link-renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE1B,MAAM,CAAC,MAAM,YAAY,GAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IACpF,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;IAElD,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAExC,IAAI,OAAO,IAAI,IAAI,UAAU,EAAE;QAC7B,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;KACpD;IAED,OAAO,MAAM;QACX,CAAC,CAAC,IAAI,CAAA,uDAAuD,IAAI,IAAI,KAAK,WAAW,MAAM,IAAI,KAAK,OAAO;QAC3G,CAAC,CAAC,IAAI,CAAA,uDAAuD,IAAI,IAAI,KAAK,IAAI,KAAK,OAAO,CAAA;AAC9F,CAAC,CAAA","sourcesContent":["import { FieldRenderer } from '../types'\nimport { html } from 'lit'\n\nexport const LinkRenderer: FieldRenderer = (value, column, record, rowIndex, field) => {\n var { href, target } = column.record.options || {}\n\n value = value === undefined ? '' : value\n\n if (typeof href == 'function') {\n href = href(value, column, record, rowIndex, field)\n }\n\n return target\n ? html` <a style=\"text-decoration:none;color:inherit\" href=${href || value} target=${target}>${value}</a> `\n : html` <a style=\"text-decoration:none;color:inherit\" href=${href || value}>${value}</a> `\n}\n"]}
|