@operato/input 7.1.3 → 8.0.0-alpha.1

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@operato/input",
3
3
  "description": "Webcomponents for input following open-wc recommendations",
4
4
  "author": "heartyoh@hatiolab.com",
5
- "version": "7.1.3",
5
+ "version": "8.0.0-alpha.1",
6
6
  "main": "dist/src/index.js",
7
7
  "module": "dist/src/index.js",
8
8
  "license": "MIT",
@@ -210,11 +210,11 @@
210
210
  "@ctrl/tinycolor": "^4.1.0",
211
211
  "@lit/localize": "^0.12.1",
212
212
  "@material/web": "^2.0.0",
213
- "@operato/color-picker": "^7.1.1",
214
- "@operato/i18n": "^7.1.1",
215
- "@operato/popup": "^7.1.1",
216
- "@operato/styles": "^7.1.1",
217
- "@operato/utils": "^7.1.1",
213
+ "@operato/color-picker": "^8.0.0-alpha.0",
214
+ "@operato/i18n": "^8.0.0-alpha.0",
215
+ "@operato/popup": "^8.0.0-alpha.0",
216
+ "@operato/styles": "^8.0.0-alpha.0",
217
+ "@operato/utils": "^8.0.0-alpha.0",
218
218
  "@polymer/paper-dropdown-menu": "^3.2.0",
219
219
  "@polymer/paper-item": "^3.0.1",
220
220
  "@thebespokepixel/es-tinycolor": "^3.1.0",
@@ -258,5 +258,5 @@
258
258
  "prettier --write"
259
259
  ]
260
260
  },
261
- "gitHead": "c1c9c82ac98fcafee6c7beb5abe112140675d0b7"
261
+ "gitHead": "7e2725314b1cb79c18f27b5a8db9dccd2461a1a3"
262
262
  }
@@ -29,19 +29,9 @@ export class OxInputSignature extends OxFormField {
29
29
  overflow: hidden;
30
30
  }
31
31
 
32
- .signature-preview {
33
- flex: 1;
34
-
35
- border: 1px solid var(--md-sys-color-outline);
36
- background-size: contain;
37
- background-repeat: no-repeat;
38
- background-position: center;
39
- }
40
-
41
- dialog canvas {
32
+ canvas {
42
33
  width: 100%;
43
- height: 100%;
44
- border: 1px solid var(--md-sys-color-outline);
34
+ border: 1px solid #000;
45
35
  }
46
36
 
47
37
  .controls {
@@ -55,56 +45,46 @@ export class OxInputSignature extends OxFormField {
55
45
 
56
46
  private ctx!: CanvasRenderingContext2D
57
47
  private canvas!: HTMLCanvasElement
58
- private dialog!: HTMLDialogElement
59
- private previewDiv!: HTMLDivElement
60
- private previewCtx!: CanvasRenderingContext2D
61
48
 
62
49
  render() {
63
50
  return html`
64
- <div class="signature-preview" @click=${this.openDialog}></div>
65
-
66
- <dialog>
67
- <canvas
68
- width="800"
69
- height="400"
70
- @mousedown=${this.startDrawing}
71
- @mouseup=${this.stopDrawing}
72
- @mousemove=${this.draw}
73
- @mouseleave=${this.stopDrawing}
74
- @touchstart=${this.startDrawing}
75
- @touchend=${this.stopDrawing}
76
- @touchmove=${this.draw}
77
- ></canvas>
78
- <div class="controls">
79
- <button @click="${this.clearCanvas}">Clear</button>
80
- <button @click="${this.saveSignature}">Save</button>
81
- <button @click="${this.closeDialog}">Close</button>
82
- </div>
83
- </dialog>
51
+ <canvas
52
+ width="400"
53
+ height="200"
54
+ @mousedown=${this.startDrawing}
55
+ @mouseup=${this.stopDrawing}
56
+ @mousemove=${this.draw}
57
+ @mouseleave=${this.stopDrawing}
58
+ @touchstart=${this.startDrawing}
59
+ @touchend=${this.stopDrawing}
60
+ @touchmove=${this.draw}
61
+ ></canvas>
62
+
63
+ ${!this.disabled
64
+ ? html` <div class="controls">
65
+ <button @click="${this.clearCanvas}">Clear</button>
66
+ <button @click="${this.saveSignature}">Save</button>
67
+ </div>`
68
+ : nothing}
84
69
  `
85
70
  }
86
71
 
87
72
  firstUpdated() {
88
- this.previewDiv = this.shadowRoot!.querySelector('.signature-preview')!
89
- this.dialog = this.shadowRoot!.querySelector('dialog')!
90
- this.canvas = this.dialog.querySelector('canvas')!
73
+ this.canvas = this.shadowRoot!.querySelector('canvas')!
91
74
  this.ctx = this.canvas.getContext('2d')!
92
75
  this.ctx.strokeStyle = '#000'
93
76
  this.ctx.lineWidth = 2
94
77
 
95
- // 처음 로딩 시 서명 데이터를 미리보기 div에 표시
78
+ // 처음 로딩 시 서명 데이터를 캔버스에 표시
96
79
  if (this.value) {
97
80
  this.loadSignature(this.value)
98
81
  }
99
82
  }
100
83
 
101
- openDialog() {
102
- if (this.disabled) return
103
- this.dialog.showModal()
104
- }
105
-
106
- closeDialog() {
107
- this.dialog.close()
84
+ updated(changedProperties: Map<string | number | symbol, unknown>) {
85
+ if (changedProperties.has('value') && this.value) {
86
+ this.loadSignature(this.value)
87
+ }
108
88
  }
109
89
 
110
90
  startDrawing(event: MouseEvent | TouchEvent) {
@@ -136,12 +116,15 @@ export class OxInputSignature extends OxFormField {
136
116
  saveSignature() {
137
117
  this.value = this.canvas.toDataURL()
138
118
  this._notifyChange()
139
- this.previewDiv.style.backgroundImage = `url(${this.value})`
140
- this.closeDialog()
141
119
  }
142
120
 
143
121
  loadSignature(dataUrl: string) {
144
- this.previewDiv.style.backgroundImage = `url(${dataUrl})`
122
+ const image = new Image()
123
+ image.onload = () => {
124
+ this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) // 이전 내용을 지움
125
+ this.ctx.drawImage(image, 0, 0) // 이미지를 캔버스에 그림
126
+ }
127
+ image.src = dataUrl
145
128
  }
146
129
 
147
130
  getEventPosition(event: MouseEvent | TouchEvent) {
@@ -7,8 +7,7 @@ export default {
7
7
  title: 'ox-input-signature',
8
8
  component: 'ox-input-signature',
9
9
  argTypes: {
10
- disabled: { control: 'boolean' },
11
- value: { control: 'text' }
10
+ disabled: { control: 'boolean' }
12
11
  }
13
12
  }
14
13
 
@@ -19,11 +18,12 @@ interface Story<T> {
19
18
  }
20
19
 
21
20
  interface ArgTypes {
22
- value?: string
21
+ label?: string
22
+ name?: string
23
23
  disabled?: boolean
24
24
  }
25
25
 
26
- const Template: Story<ArgTypes> = ({ value, disabled }: ArgTypes) => html`
26
+ const Template: Story<ArgTypes> = ({ label = 'signature', name = 'signature', disabled }: ArgTypes) => html`
27
27
  <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
28
28
 
29
29
  <link href="/themes/light.css" rel="stylesheet" />
@@ -49,7 +49,7 @@ const Template: Story<ArgTypes> = ({ value, disabled }: ArgTypes) => html`
49
49
 
50
50
  <style>
51
51
  .container {
52
- height: 600px;
52
+ height: 500px;
53
53
  text-align: center;
54
54
  padding: 20px;
55
55
 
@@ -60,7 +60,6 @@ const Template: Story<ArgTypes> = ({ value, disabled }: ArgTypes) => html`
60
60
 
61
61
  <div class="container md-typescale-body-large-prominent">
62
62
  <ox-input-signature
63
- .value=${value || ''}
64
63
  ?disabled=${disabled}
65
64
  @change=${(e: Event) => console.log(((e as CustomEvent).target as any)!.value)}
66
65
  >
@@ -69,7 +68,4 @@ const Template: Story<ArgTypes> = ({ value, disabled }: ArgTypes) => html`
69
68
  `
70
69
 
71
70
  export const Regular = Template.bind({})
72
- Regular.args = {
73
- value:
74
- 'data:image/png;base64,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'
75
- }
71
+ Regular.args = {}