@dssp/supervision 0.0.29 → 0.0.30

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.
@@ -0,0 +1,277 @@
1
+ import '@material/web/icon/icon.js'
2
+ import '@operato/input/ox-input-switch.js'
3
+ import '@operato/mini-map/ox-zoomable-image.js'
4
+
5
+ import gql from 'graphql-tag'
6
+ import { css, html, PropertyValues } from 'lit'
7
+ import { customElement, state } from 'lit/decorators.js'
8
+
9
+ import { PageView } from '@operato/shell'
10
+ import { CommonGristStyles, ScrollbarStyles } from '@operato/styles'
11
+ import { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'
12
+ import { client } from '@operato/graphql'
13
+
14
+ import './component/building-inspection-detail-header'
15
+
16
+ @customElement('building-inspection-detail-camera')
17
+ export class BuildingInspectionCamera extends PageView {
18
+ static styles = [
19
+ ScrollbarStyles,
20
+ CommonGristStyles,
21
+ css`
22
+ :host {
23
+ display: grid;
24
+ grid-template-rows: 75px auto;
25
+ color: #4e5055;
26
+ width: 100%;
27
+ background-color: #f7f7f7;
28
+ overflow-y: auto;
29
+ }
30
+
31
+ div[body] {
32
+ display: flex;
33
+ justify-items: center;
34
+ gap: var(--spacing-medium);
35
+ margin: var(--spacing-medium);
36
+ }
37
+
38
+ div[preview] {
39
+ flex: 1;
40
+ border: 2px solid #ddd;
41
+ border-radius: 10px;
42
+
43
+ display: flex;
44
+ justify-content: center;
45
+ align-items: center;
46
+ }
47
+
48
+ div[preview] img {
49
+ max-width: 100%;
50
+ max-height: 100%;
51
+ object-fit: contain;
52
+ }
53
+
54
+ div[preview] md-icon {
55
+ --md-icon-size: 160px;
56
+ }
57
+
58
+ div[controls] {
59
+ width: 240px;
60
+ display: flex;
61
+ flex-direction: column;
62
+ justify-content: space-between;
63
+ align-items: center;
64
+ }
65
+
66
+ div[action-buttons] {
67
+ display: flex;
68
+ flex-direction: row;
69
+ justify-content: space-between;
70
+ }
71
+
72
+ .switch-container {
73
+ display: flex;
74
+ align-items: center;
75
+ gap: 10px;
76
+ font-size: 24px;
77
+ font-weight: bold;
78
+ }
79
+
80
+ ox-input-switch {
81
+ --ox-simple-switch-fullwidth: 68px;
82
+ --ox-simple-switch-fullheight: 34px;
83
+ --ox-simple-switch-thumbnail-size: 34px;
84
+ }
85
+
86
+ .camera-shutter {
87
+ display: flex;
88
+ justify-content: center;
89
+ align-items: center;
90
+ cursor: pointer;
91
+ position: relative;
92
+ }
93
+
94
+ .camera-shutter md-icon {
95
+ --md-icon-size: 100px;
96
+ }
97
+
98
+ .camera-shutter input {
99
+ opacity: 0;
100
+ width: 100%;
101
+ height: 100%;
102
+ position: absolute;
103
+ left: 0;
104
+ top: 0;
105
+ cursor: pointer;
106
+ }
107
+
108
+ button {
109
+ padding: 10px 20px;
110
+ font-size: 16px;
111
+ border-radius: 5px;
112
+ border: none;
113
+ cursor: pointer;
114
+ }
115
+
116
+ button.save {
117
+ background-color: #4caf50;
118
+ color: white;
119
+ }
120
+
121
+ button.retry {
122
+ background-color: #f0ad4e;
123
+ color: white;
124
+ }
125
+
126
+ button.cancel {
127
+ background-color: #d9534f;
128
+ color: white;
129
+ }
130
+ `
131
+ ]
132
+
133
+ @state() project: any = {}
134
+ @state() buildingInspection: any = {}
135
+ @state() buildingInspectionId: string = ''
136
+ @state() capturedImage: string | null = null // For storing the captured image
137
+ @state() originImage: string | null = null
138
+
139
+ get context() {
140
+ return {
141
+ title: '검측 관리 상세 - 사진 촬영'
142
+ }
143
+ }
144
+
145
+ render() {
146
+ return html`
147
+ <building-inspection-detail-header
148
+ .buildingInspectionId=${this.buildingInspection?.id}
149
+ .buildingLevelId=${this.buildingInspection?.buildingLevel?.id}
150
+ .projectName=${this.project.name}
151
+ .buildingName=${this.buildingInspection?.buildingLevel?.building?.name}
152
+ .buildingLevelFloor=${this.buildingInspection?.buildingLevel?.floor}
153
+ ></building-inspection-detail-header>
154
+
155
+ <div body>
156
+ <!-- Display the captured image if available -->
157
+ <div preview>
158
+ ${this.capturedImage
159
+ ? html`<ox-zoomable-image src=${this.capturedImage} restrict-boundary></ox-zoomable-image>`
160
+ : html`<md-icon>photo_camera</md-icon>`}
161
+ </div>
162
+
163
+ <div controls>
164
+ <!-- AI toggle switch -->
165
+ <div class="switch-container">
166
+ <label>AI 기능</label>
167
+ <ox-input-switch type="checkbox" @change=${this.toggleAI} round></ox-input-switch>
168
+ </div>
169
+
170
+ <!-- Camera shutter button -->
171
+ <div class="camera-shutter">
172
+ <md-icon>camera</md-icon>
173
+ <input type="file" accept="image/*" capture @change="${this.handleImageCapture}" />
174
+ </div>
175
+
176
+ <!-- Action buttons -->
177
+ <div class="action-buttons">
178
+ <button class="save">저장</button>
179
+ <button class="retry">재촬영</button>
180
+ <button class="cancel" @click=${() => (this.capturedImage = this.originImage)}>취소</button>
181
+ </div>
182
+ </div>
183
+ </div>
184
+ `
185
+ }
186
+
187
+ protected async updated(changes: PropertyValues): Promise<void> {}
188
+
189
+ async pageUpdated(changes: any, lifecycle: PageLifecycle) {
190
+ if (this.active) {
191
+ this.buildingInspectionId = lifecycle.resourceId || ''
192
+ await this.initBuildingInspection(this.buildingInspectionId)
193
+ }
194
+ }
195
+
196
+ async initBuildingInspection(buildingInspectionId: string = '') {
197
+ const response = await client.query({
198
+ query: gql`
199
+ query BuildingInspection($buildingInspectionId: String!) {
200
+ buildingInspection(id: $buildingInspectionId) {
201
+ id
202
+ status
203
+ requestDate
204
+ drawingMarker
205
+ checklist {
206
+ location
207
+ inspectionDrawingType
208
+ }
209
+ buildingLevel {
210
+ id
211
+ floor
212
+ mainDrawing {
213
+ id
214
+ name
215
+ fullpath
216
+ }
217
+ mainDrawingImage
218
+ building {
219
+ id
220
+ name
221
+ buildingComplex {
222
+ id
223
+ }
224
+ }
225
+ }
226
+ }
227
+ }
228
+ `,
229
+ variables: {
230
+ buildingInspectionId
231
+ }
232
+ })
233
+
234
+ if (response.errors) return
235
+
236
+ this.buildingInspection = response.data.buildingInspection
237
+
238
+ await this._getProjectByBuildingComplexId(this.buildingInspection?.buildingLevel?.building?.buildingComplex?.id)
239
+ }
240
+
241
+ private async _getProjectByBuildingComplexId(buildingComplexId) {
242
+ const response = await client.query({
243
+ query: gql`
244
+ query ProjectByBuildingComplexId($buildingComplexId: String!) {
245
+ project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {
246
+ id
247
+ name
248
+ }
249
+ }
250
+ `,
251
+ variables: {
252
+ buildingComplexId
253
+ }
254
+ })
255
+
256
+ if (response.errors) return
257
+
258
+ this.project = response.data.project
259
+ }
260
+
261
+ private toggleAI(e: Event) {
262
+ const isChecked = (e.target as HTMLInputElement).checked
263
+ console.log(`AI 기능: ${isChecked ? 'ON' : 'OFF'}`)
264
+ // Implement additional AI functionality toggling if needed
265
+ }
266
+
267
+ private handleImageCapture(event: Event) {
268
+ const input = event.target as HTMLInputElement
269
+ if (input.files && input.files[0]) {
270
+ const reader = new FileReader()
271
+ reader.onload = e => {
272
+ this.capturedImage = e.target?.result as string
273
+ }
274
+ reader.readAsDataURL(input.files[0])
275
+ }
276
+ }
277
+ }
@@ -93,8 +93,8 @@ class BuildingInspectionDetailHeader extends LitElement {
93
93
  <md-icon slot="icon">description</md-icon>검측 체크리스트
94
94
  </md-elevated-button>
95
95
  <md-elevated-button
96
- ?disabled=${path.includes('building-inspection-detail-photo/')}
97
- href=${`building-inspection-detail-photo/${this.buildingInspectionId}`}
96
+ ?disabled=${path.includes('building-inspection-detail-camera/')}
97
+ href=${`building-inspection-detail-camera/${this.buildingInspectionId}`}
98
98
  disabled
99
99
  >
100
100
  <md-icon slot="icon">description</md-icon>사진촬영
package/client/route.ts CHANGED
@@ -19,5 +19,9 @@ export default function route(page: string) {
19
19
  case 'building-inspection-detail-checklist':
20
20
  import('./pages/building-inspection/building-inspection-detail-checklist')
21
21
  return page
22
+
23
+ case 'building-inspection-detail-camera':
24
+ import('./pages/building-inspection/building-inspection-detail-camera')
25
+ return page
22
26
  }
23
27
  }
@@ -0,0 +1,25 @@
1
+ import '@material/web/icon/icon.js';
2
+ import '@operato/input/ox-input-switch.js';
3
+ import '@operato/mini-map/ox-zoomable-image.js';
4
+ import { PropertyValues } from 'lit';
5
+ import { PageView } from '@operato/shell';
6
+ import { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view';
7
+ import './component/building-inspection-detail-header';
8
+ export declare class BuildingInspectionCamera extends PageView {
9
+ static styles: import("lit").CSSResult[];
10
+ project: any;
11
+ buildingInspection: any;
12
+ buildingInspectionId: string;
13
+ capturedImage: string | null;
14
+ originImage: string | null;
15
+ get context(): {
16
+ title: string;
17
+ };
18
+ render(): import("lit-html").TemplateResult<1>;
19
+ protected updated(changes: PropertyValues): Promise<void>;
20
+ pageUpdated(changes: any, lifecycle: PageLifecycle): Promise<void>;
21
+ initBuildingInspection(buildingInspectionId?: string): Promise<void>;
22
+ private _getProjectByBuildingComplexId;
23
+ private toggleAI;
24
+ private handleImageCapture;
25
+ }
@@ -0,0 +1,291 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/icon/icon.js';
3
+ import '@operato/input/ox-input-switch.js';
4
+ import '@operato/mini-map/ox-zoomable-image.js';
5
+ import gql from 'graphql-tag';
6
+ import { css, html } from 'lit';
7
+ import { customElement, state } from 'lit/decorators.js';
8
+ import { PageView } from '@operato/shell';
9
+ import { CommonGristStyles, ScrollbarStyles } from '@operato/styles';
10
+ import { client } from '@operato/graphql';
11
+ import './component/building-inspection-detail-header';
12
+ let BuildingInspectionCamera = class BuildingInspectionCamera extends PageView {
13
+ constructor() {
14
+ super(...arguments);
15
+ this.project = {};
16
+ this.buildingInspection = {};
17
+ this.buildingInspectionId = '';
18
+ this.capturedImage = null; // For storing the captured image
19
+ this.originImage = null;
20
+ }
21
+ get context() {
22
+ return {
23
+ title: '검측 관리 상세 - 사진 촬영'
24
+ };
25
+ }
26
+ render() {
27
+ var _a, _b, _c, _d, _e, _f, _g, _h;
28
+ return html `
29
+ <building-inspection-detail-header
30
+ .buildingInspectionId=${(_a = this.buildingInspection) === null || _a === void 0 ? void 0 : _a.id}
31
+ .buildingLevelId=${(_c = (_b = this.buildingInspection) === null || _b === void 0 ? void 0 : _b.buildingLevel) === null || _c === void 0 ? void 0 : _c.id}
32
+ .projectName=${this.project.name}
33
+ .buildingName=${(_f = (_e = (_d = this.buildingInspection) === null || _d === void 0 ? void 0 : _d.buildingLevel) === null || _e === void 0 ? void 0 : _e.building) === null || _f === void 0 ? void 0 : _f.name}
34
+ .buildingLevelFloor=${(_h = (_g = this.buildingInspection) === null || _g === void 0 ? void 0 : _g.buildingLevel) === null || _h === void 0 ? void 0 : _h.floor}
35
+ ></building-inspection-detail-header>
36
+
37
+ <div body>
38
+ <!-- Display the captured image if available -->
39
+ <div preview>
40
+ ${this.capturedImage
41
+ ? html `<ox-zoomable-image src=${this.capturedImage} restrict-boundary></ox-zoomable-image>`
42
+ : html `<md-icon>photo_camera</md-icon>`}
43
+ </div>
44
+
45
+ <div controls>
46
+ <!-- AI toggle switch -->
47
+ <div class="switch-container">
48
+ <label>AI 기능</label>
49
+ <ox-input-switch type="checkbox" @change=${this.toggleAI} round></ox-input-switch>
50
+ </div>
51
+
52
+ <!-- Camera shutter button -->
53
+ <div class="camera-shutter">
54
+ <md-icon>camera</md-icon>
55
+ <input type="file" accept="image/*" capture @change="${this.handleImageCapture}" />
56
+ </div>
57
+
58
+ <!-- Action buttons -->
59
+ <div class="action-buttons">
60
+ <button class="save">저장</button>
61
+ <button class="retry">재촬영</button>
62
+ <button class="cancel" @click=${() => (this.capturedImage = this.originImage)}>취소</button>
63
+ </div>
64
+ </div>
65
+ </div>
66
+ `;
67
+ }
68
+ async updated(changes) { }
69
+ async pageUpdated(changes, lifecycle) {
70
+ if (this.active) {
71
+ this.buildingInspectionId = lifecycle.resourceId || '';
72
+ await this.initBuildingInspection(this.buildingInspectionId);
73
+ }
74
+ }
75
+ async initBuildingInspection(buildingInspectionId = '') {
76
+ var _a, _b, _c, _d;
77
+ const response = await client.query({
78
+ query: gql `
79
+ query BuildingInspection($buildingInspectionId: String!) {
80
+ buildingInspection(id: $buildingInspectionId) {
81
+ id
82
+ status
83
+ requestDate
84
+ drawingMarker
85
+ checklist {
86
+ location
87
+ inspectionDrawingType
88
+ }
89
+ buildingLevel {
90
+ id
91
+ floor
92
+ mainDrawing {
93
+ id
94
+ name
95
+ fullpath
96
+ }
97
+ mainDrawingImage
98
+ building {
99
+ id
100
+ name
101
+ buildingComplex {
102
+ id
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ `,
109
+ variables: {
110
+ buildingInspectionId
111
+ }
112
+ });
113
+ if (response.errors)
114
+ return;
115
+ this.buildingInspection = response.data.buildingInspection;
116
+ await this._getProjectByBuildingComplexId((_d = (_c = (_b = (_a = this.buildingInspection) === null || _a === void 0 ? void 0 : _a.buildingLevel) === null || _b === void 0 ? void 0 : _b.building) === null || _c === void 0 ? void 0 : _c.buildingComplex) === null || _d === void 0 ? void 0 : _d.id);
117
+ }
118
+ async _getProjectByBuildingComplexId(buildingComplexId) {
119
+ const response = await client.query({
120
+ query: gql `
121
+ query ProjectByBuildingComplexId($buildingComplexId: String!) {
122
+ project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {
123
+ id
124
+ name
125
+ }
126
+ }
127
+ `,
128
+ variables: {
129
+ buildingComplexId
130
+ }
131
+ });
132
+ if (response.errors)
133
+ return;
134
+ this.project = response.data.project;
135
+ }
136
+ toggleAI(e) {
137
+ const isChecked = e.target.checked;
138
+ console.log(`AI 기능: ${isChecked ? 'ON' : 'OFF'}`);
139
+ // Implement additional AI functionality toggling if needed
140
+ }
141
+ handleImageCapture(event) {
142
+ const input = event.target;
143
+ if (input.files && input.files[0]) {
144
+ const reader = new FileReader();
145
+ reader.onload = e => {
146
+ var _a;
147
+ this.capturedImage = (_a = e.target) === null || _a === void 0 ? void 0 : _a.result;
148
+ };
149
+ reader.readAsDataURL(input.files[0]);
150
+ }
151
+ }
152
+ };
153
+ BuildingInspectionCamera.styles = [
154
+ ScrollbarStyles,
155
+ CommonGristStyles,
156
+ css `
157
+ :host {
158
+ display: grid;
159
+ grid-template-rows: 75px auto;
160
+ color: #4e5055;
161
+ width: 100%;
162
+ background-color: #f7f7f7;
163
+ overflow-y: auto;
164
+ }
165
+
166
+ div[body] {
167
+ display: flex;
168
+ justify-items: center;
169
+ gap: var(--spacing-medium);
170
+ margin: var(--spacing-medium);
171
+ }
172
+
173
+ div[preview] {
174
+ flex: 1;
175
+ border: 2px solid #ddd;
176
+ border-radius: 10px;
177
+
178
+ display: flex;
179
+ justify-content: center;
180
+ align-items: center;
181
+ }
182
+
183
+ div[preview] img {
184
+ max-width: 100%;
185
+ max-height: 100%;
186
+ object-fit: contain;
187
+ }
188
+
189
+ div[preview] md-icon {
190
+ --md-icon-size: 160px;
191
+ }
192
+
193
+ div[controls] {
194
+ width: 240px;
195
+ display: flex;
196
+ flex-direction: column;
197
+ justify-content: space-between;
198
+ align-items: center;
199
+ }
200
+
201
+ div[action-buttons] {
202
+ display: flex;
203
+ flex-direction: row;
204
+ justify-content: space-between;
205
+ }
206
+
207
+ .switch-container {
208
+ display: flex;
209
+ align-items: center;
210
+ gap: 10px;
211
+ font-size: 24px;
212
+ font-weight: bold;
213
+ }
214
+
215
+ ox-input-switch {
216
+ --ox-simple-switch-fullwidth: 68px;
217
+ --ox-simple-switch-fullheight: 34px;
218
+ --ox-simple-switch-thumbnail-size: 34px;
219
+ }
220
+
221
+ .camera-shutter {
222
+ display: flex;
223
+ justify-content: center;
224
+ align-items: center;
225
+ cursor: pointer;
226
+ position: relative;
227
+ }
228
+
229
+ .camera-shutter md-icon {
230
+ --md-icon-size: 100px;
231
+ }
232
+
233
+ .camera-shutter input {
234
+ opacity: 0;
235
+ width: 100%;
236
+ height: 100%;
237
+ position: absolute;
238
+ left: 0;
239
+ top: 0;
240
+ cursor: pointer;
241
+ }
242
+
243
+ button {
244
+ padding: 10px 20px;
245
+ font-size: 16px;
246
+ border-radius: 5px;
247
+ border: none;
248
+ cursor: pointer;
249
+ }
250
+
251
+ button.save {
252
+ background-color: #4caf50;
253
+ color: white;
254
+ }
255
+
256
+ button.retry {
257
+ background-color: #f0ad4e;
258
+ color: white;
259
+ }
260
+
261
+ button.cancel {
262
+ background-color: #d9534f;
263
+ color: white;
264
+ }
265
+ `
266
+ ];
267
+ __decorate([
268
+ state(),
269
+ __metadata("design:type", Object)
270
+ ], BuildingInspectionCamera.prototype, "project", void 0);
271
+ __decorate([
272
+ state(),
273
+ __metadata("design:type", Object)
274
+ ], BuildingInspectionCamera.prototype, "buildingInspection", void 0);
275
+ __decorate([
276
+ state(),
277
+ __metadata("design:type", String)
278
+ ], BuildingInspectionCamera.prototype, "buildingInspectionId", void 0);
279
+ __decorate([
280
+ state(),
281
+ __metadata("design:type", Object)
282
+ ], BuildingInspectionCamera.prototype, "capturedImage", void 0);
283
+ __decorate([
284
+ state(),
285
+ __metadata("design:type", Object)
286
+ ], BuildingInspectionCamera.prototype, "originImage", void 0);
287
+ BuildingInspectionCamera = __decorate([
288
+ customElement('building-inspection-detail-camera')
289
+ ], BuildingInspectionCamera);
290
+ export { BuildingInspectionCamera };
291
+ //# sourceMappingURL=building-inspection-detail-camera.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"building-inspection-detail-camera.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-camera.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/input/ox-input-switch.js'\nimport '@operato/mini-map/ox-zoomable-image.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { PageView } from '@operato/shell'\nimport { CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { client } from '@operato/graphql'\n\nimport './component/building-inspection-detail-header'\n\n@customElement('building-inspection-detail-camera')\nexport class BuildingInspectionCamera extends PageView {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 75px auto;\n color: #4e5055;\n width: 100%;\n background-color: #f7f7f7;\n overflow-y: auto;\n }\n\n div[body] {\n display: flex;\n justify-items: center;\n gap: var(--spacing-medium);\n margin: var(--spacing-medium);\n }\n\n div[preview] {\n flex: 1;\n border: 2px solid #ddd;\n border-radius: 10px;\n\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n div[preview] img {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n }\n\n div[preview] md-icon {\n --md-icon-size: 160px;\n }\n\n div[controls] {\n width: 240px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: center;\n }\n\n div[action-buttons] {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n }\n\n .switch-container {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 24px;\n font-weight: bold;\n }\n\n ox-input-switch {\n --ox-simple-switch-fullwidth: 68px;\n --ox-simple-switch-fullheight: 34px;\n --ox-simple-switch-thumbnail-size: 34px;\n }\n\n .camera-shutter {\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n position: relative;\n }\n\n .camera-shutter md-icon {\n --md-icon-size: 100px;\n }\n\n .camera-shutter input {\n opacity: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n left: 0;\n top: 0;\n cursor: pointer;\n }\n\n button {\n padding: 10px 20px;\n font-size: 16px;\n border-radius: 5px;\n border: none;\n cursor: pointer;\n }\n\n button.save {\n background-color: #4caf50;\n color: white;\n }\n\n button.retry {\n background-color: #f0ad4e;\n color: white;\n }\n\n button.cancel {\n background-color: #d9534f;\n color: white;\n }\n `\n ]\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n @state() buildingInspectionId: string = ''\n @state() capturedImage: string | null = null // For storing the captured image\n @state() originImage: string | null = null\n\n get context() {\n return {\n title: '검측 관리 상세 - 사진 촬영'\n }\n }\n\n render() {\n return html`\n <building-inspection-detail-header\n .buildingInspectionId=${this.buildingInspection?.id}\n .buildingLevelId=${this.buildingInspection?.buildingLevel?.id}\n .projectName=${this.project.name}\n .buildingName=${this.buildingInspection?.buildingLevel?.building?.name}\n .buildingLevelFloor=${this.buildingInspection?.buildingLevel?.floor}\n ></building-inspection-detail-header>\n\n <div body>\n <!-- Display the captured image if available -->\n <div preview>\n ${this.capturedImage\n ? html`<ox-zoomable-image src=${this.capturedImage} restrict-boundary></ox-zoomable-image>`\n : html`<md-icon>photo_camera</md-icon>`}\n </div>\n\n <div controls>\n <!-- AI toggle switch -->\n <div class=\"switch-container\">\n <label>AI 기능</label>\n <ox-input-switch type=\"checkbox\" @change=${this.toggleAI} round></ox-input-switch>\n </div>\n\n <!-- Camera shutter button -->\n <div class=\"camera-shutter\">\n <md-icon>camera</md-icon>\n <input type=\"file\" accept=\"image/*\" capture @change=\"${this.handleImageCapture}\" />\n </div>\n\n <!-- Action buttons -->\n <div class=\"action-buttons\">\n <button class=\"save\">저장</button>\n <button class=\"retry\">재촬영</button>\n <button class=\"cancel\" @click=${() => (this.capturedImage = this.originImage)}>취소</button>\n </div>\n </div>\n </div>\n `\n }\n\n protected async updated(changes: PropertyValues): Promise<void> {}\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this.buildingInspectionId = lifecycle.resourceId || ''\n await this.initBuildingInspection(this.buildingInspectionId)\n }\n }\n\n async initBuildingInspection(buildingInspectionId: string = '') {\n const response = await client.query({\n query: gql`\n query BuildingInspection($buildingInspectionId: String!) {\n buildingInspection(id: $buildingInspectionId) {\n id\n status\n requestDate\n drawingMarker\n checklist {\n location\n inspectionDrawingType\n }\n buildingLevel {\n id\n floor\n mainDrawing {\n id\n name\n fullpath\n }\n mainDrawingImage\n building {\n id\n name\n buildingComplex {\n id\n }\n }\n }\n }\n }\n `,\n variables: {\n buildingInspectionId\n }\n })\n\n if (response.errors) return\n\n this.buildingInspection = response.data.buildingInspection\n\n await this._getProjectByBuildingComplexId(this.buildingInspection?.buildingLevel?.building?.buildingComplex?.id)\n }\n\n private async _getProjectByBuildingComplexId(buildingComplexId) {\n const response = await client.query({\n query: gql`\n query ProjectByBuildingComplexId($buildingComplexId: String!) {\n project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {\n id\n name\n }\n }\n `,\n variables: {\n buildingComplexId\n }\n })\n\n if (response.errors) return\n\n this.project = response.data.project\n }\n\n private toggleAI(e: Event) {\n const isChecked = (e.target as HTMLInputElement).checked\n console.log(`AI 기능: ${isChecked ? 'ON' : 'OFF'}`)\n // Implement additional AI functionality toggling if needed\n }\n\n private handleImageCapture(event: Event) {\n const input = event.target as HTMLInputElement\n if (input.files && input.files[0]) {\n const reader = new FileReader()\n reader.onload = e => {\n this.capturedImage = e.target?.result as string\n }\n reader.readAsDataURL(input.files[0])\n }\n }\n}\n"]}
@@ -37,8 +37,8 @@ let BuildingInspectionDetailHeader = class BuildingInspectionDetailHeader extend
37
37
  <md-icon slot="icon">description</md-icon>검측 체크리스트
38
38
  </md-elevated-button>
39
39
  <md-elevated-button
40
- ?disabled=${path.includes('building-inspection-detail-photo/')}
41
- href=${`building-inspection-detail-photo/${this.buildingInspectionId}`}
40
+ ?disabled=${path.includes('building-inspection-detail-camera/')}
41
+ href=${`building-inspection-detail-camera/${this.buildingInspectionId}`}
42
42
  disabled
43
43
  >
44
44
  <md-icon slot="icon">description</md-icon>사진촬영
@@ -1 +1 @@
1
- {"version":3,"file":"building-inspection-detail-header.js","sourceRoot":"","sources":["../../../../client/pages/building-inspection/component/building-inspection-detail-header.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAS,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGxE,IAAM,8BAA8B,GAApC,MAAM,8BAA+B,SAAQ,UAAU;IAAvD;;QAyD8B,yBAAoB,GAAW,EAAE,CAAA;QACjC,oBAAe,GAAW,EAAE,CAAA;QAC5B,gBAAW,GAAW,EAAE,CAAA;QACxB,iBAAY,GAAW,EAAE,CAAA;QACzB,uBAAkB,GAAW,EAAE,CAAA;IA6C7D,CAAC;IA3CC,MAAM;QACJ,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAA;QAErC,OAAO,IAAI,CAAA;;cAED,IAAI,CAAC,WAAW,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE,IAAI,IAAI,CAAC,kBAAkB,IAAI,EAAE;;;wBAGxE,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC;mBAC/C,4BAA4B,IAAI,CAAC,eAAe,EAAE;;;;;wBAK7C,IAAI,CAAC,QAAQ,CAAC,qCAAqC,CAAC;mBACzD,sCAAsC,IAAI,CAAC,oBAAoB,EAAE;;;;;wBAK5D,IAAI,CAAC,QAAQ,CAAC,uCAAuC,CAAC;mBAC3D,wCAAwC,IAAI,CAAC,oBAAoB,EAAE;;;;;wBAK9D,IAAI,CAAC,QAAQ,CAAC,mCAAmC,CAAC;mBACvD,oCAAoC,IAAI,CAAC,oBAAoB,EAAE;;;;;;wBAM1D,IAAI,CAAC,QAAQ,CAAC,qCAAqC,CAAC;mBACzD,sCAAsC,IAAI,CAAC,oBAAoB,EAAE;;;;;;;KAO/E,CAAA;IACH,CAAC;;AAxGM,qCAAM,GAAG;IACd,qBAAqB;IACrB,eAAe;IACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkDF;CACF,CAAA;AAED;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4EAAkC;AAC7D;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;uEAA6B;AACxD;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mEAAyB;AACpD;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;oEAA0B;AACrD;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0EAAgC;AA7DvD,8BAA8B;IADnC,aAAa,CAAC,mCAAmC,CAAC;GAC7C,8BAA8B,CA0GnC","sourcesContent":["import '@material/web/icon/icon.js'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles'\n\n@customElement('building-inspection-detail-header')\nclass BuildingInspectionDetailHeader extends LitElement {\n static styles = [\n ButtonContainerStyles,\n ScrollbarStyles,\n css`\n md-filled-button {\n --md-filled-button-container-color: #0595e5;\n --md-filled-button-container-height: 30px;\n --md-filled-button-trailing-space: 15px;\n --md-filled-button-leading-space: 15px;\n }\n md-outlined-button {\n --md-outlined-button-container-height: 30px;\n --md-outlined-button-trailing-space: 15px;\n --md-outlined-button-leading-space: 15px;\n }\n\n *[bold] {\n font-weight: bold;\n }\n\n div[header] {\n display: flex;\n margin: 0px 20px;\n }\n\n h2 {\n flex: 0.5;\n color: #3f71a0;\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: end;\n flex: 0.5;\n }\n\n md-elevated-button {\n margin: 0px 3px;\n\n --md-elevated-button-container-height: 35px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: #fff;\n --md-elevated-button-hover-label-text-color: #fff;\n --md-elevated-button-pressed-label-text-color: #fff;\n --md-elevated-button-focus-label-text-color: #fff;\n --md-elevated-button-icon-color: #fff;\n --md-elevated-button-hover-icon-color: #fff;\n --md-elevated-button-pressed-icon-color: #fff;\n --md-elevated-button-focus-icon-color: #fff;\n }\n `\n ]\n\n @property({ type: String }) buildingInspectionId: string = ''\n @property({ type: String }) buildingLevelId: string = ''\n @property({ type: String }) projectName: string = ''\n @property({ type: String }) buildingName: string = ''\n @property({ type: String }) buildingLevelFloor: string = ''\n\n render() {\n const path = window.location.pathname\n\n return html`\n <div header>\n <h2>${this.projectName || ''} ${this.buildingName || ''} ${this.buildingLevelFloor || ''}층</h2>\n <div button-container>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-list/')}\n href=${`building-inspection-list/${this.buildingLevelId}`}\n >\n <md-icon slot=\"icon\">assignment</md-icon>검측 리스트\n </md-elevated-button>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-drawing/')}\n href=${`building-inspection-detail-drawing/${this.buildingInspectionId}`}\n >\n <md-icon slot=\"icon\">assignment</md-icon>검측도면\n </md-elevated-button>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-checklist/')}\n href=${`building-inspection-detail-checklist/${this.buildingInspectionId}`}\n >\n <md-icon slot=\"icon\">description</md-icon>검측 체크리스트\n </md-elevated-button>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-photo/')}\n href=${`building-inspection-detail-photo/${this.buildingInspectionId}`}\n disabled\n >\n <md-icon slot=\"icon\">description</md-icon>사진촬영\n </md-elevated-button>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-history/')}\n href=${`building-inspection-detail-history/${this.buildingInspectionId}`}\n disabled\n >\n <md-icon slot=\"icon\">description</md-icon>감리이력\n </md-elevated-button>\n </div>\n </div>\n `\n }\n}\n"]}
1
+ {"version":3,"file":"building-inspection-detail-header.js","sourceRoot":"","sources":["../../../../client/pages/building-inspection/component/building-inspection-detail-header.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAS,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGxE,IAAM,8BAA8B,GAApC,MAAM,8BAA+B,SAAQ,UAAU;IAAvD;;QAyD8B,yBAAoB,GAAW,EAAE,CAAA;QACjC,oBAAe,GAAW,EAAE,CAAA;QAC5B,gBAAW,GAAW,EAAE,CAAA;QACxB,iBAAY,GAAW,EAAE,CAAA;QACzB,uBAAkB,GAAW,EAAE,CAAA;IA6C7D,CAAC;IA3CC,MAAM;QACJ,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAA;QAErC,OAAO,IAAI,CAAA;;cAED,IAAI,CAAC,WAAW,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE,IAAI,IAAI,CAAC,kBAAkB,IAAI,EAAE;;;wBAGxE,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC;mBAC/C,4BAA4B,IAAI,CAAC,eAAe,EAAE;;;;;wBAK7C,IAAI,CAAC,QAAQ,CAAC,qCAAqC,CAAC;mBACzD,sCAAsC,IAAI,CAAC,oBAAoB,EAAE;;;;;wBAK5D,IAAI,CAAC,QAAQ,CAAC,uCAAuC,CAAC;mBAC3D,wCAAwC,IAAI,CAAC,oBAAoB,EAAE;;;;;wBAK9D,IAAI,CAAC,QAAQ,CAAC,oCAAoC,CAAC;mBACxD,qCAAqC,IAAI,CAAC,oBAAoB,EAAE;;;;;;wBAM3D,IAAI,CAAC,QAAQ,CAAC,qCAAqC,CAAC;mBACzD,sCAAsC,IAAI,CAAC,oBAAoB,EAAE;;;;;;;KAO/E,CAAA;IACH,CAAC;;AAxGM,qCAAM,GAAG;IACd,qBAAqB;IACrB,eAAe;IACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkDF;CACF,CAAA;AAED;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4EAAkC;AAC7D;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;uEAA6B;AACxD;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mEAAyB;AACpD;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;oEAA0B;AACrD;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0EAAgC;AA7DvD,8BAA8B;IADnC,aAAa,CAAC,mCAAmC,CAAC;GAC7C,8BAA8B,CA0GnC","sourcesContent":["import '@material/web/icon/icon.js'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles'\n\n@customElement('building-inspection-detail-header')\nclass BuildingInspectionDetailHeader extends LitElement {\n static styles = [\n ButtonContainerStyles,\n ScrollbarStyles,\n css`\n md-filled-button {\n --md-filled-button-container-color: #0595e5;\n --md-filled-button-container-height: 30px;\n --md-filled-button-trailing-space: 15px;\n --md-filled-button-leading-space: 15px;\n }\n md-outlined-button {\n --md-outlined-button-container-height: 30px;\n --md-outlined-button-trailing-space: 15px;\n --md-outlined-button-leading-space: 15px;\n }\n\n *[bold] {\n font-weight: bold;\n }\n\n div[header] {\n display: flex;\n margin: 0px 20px;\n }\n\n h2 {\n flex: 0.5;\n color: #3f71a0;\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: end;\n flex: 0.5;\n }\n\n md-elevated-button {\n margin: 0px 3px;\n\n --md-elevated-button-container-height: 35px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: #fff;\n --md-elevated-button-hover-label-text-color: #fff;\n --md-elevated-button-pressed-label-text-color: #fff;\n --md-elevated-button-focus-label-text-color: #fff;\n --md-elevated-button-icon-color: #fff;\n --md-elevated-button-hover-icon-color: #fff;\n --md-elevated-button-pressed-icon-color: #fff;\n --md-elevated-button-focus-icon-color: #fff;\n }\n `\n ]\n\n @property({ type: String }) buildingInspectionId: string = ''\n @property({ type: String }) buildingLevelId: string = ''\n @property({ type: String }) projectName: string = ''\n @property({ type: String }) buildingName: string = ''\n @property({ type: String }) buildingLevelFloor: string = ''\n\n render() {\n const path = window.location.pathname\n\n return html`\n <div header>\n <h2>${this.projectName || ''} ${this.buildingName || ''} ${this.buildingLevelFloor || ''}층</h2>\n <div button-container>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-list/')}\n href=${`building-inspection-list/${this.buildingLevelId}`}\n >\n <md-icon slot=\"icon\">assignment</md-icon>검측 리스트\n </md-elevated-button>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-drawing/')}\n href=${`building-inspection-detail-drawing/${this.buildingInspectionId}`}\n >\n <md-icon slot=\"icon\">assignment</md-icon>검측도면\n </md-elevated-button>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-checklist/')}\n href=${`building-inspection-detail-checklist/${this.buildingInspectionId}`}\n >\n <md-icon slot=\"icon\">description</md-icon>검측 체크리스트\n </md-elevated-button>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-camera/')}\n href=${`building-inspection-detail-camera/${this.buildingInspectionId}`}\n disabled\n >\n <md-icon slot=\"icon\">description</md-icon>사진촬영\n </md-elevated-button>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-history/')}\n href=${`building-inspection-detail-history/${this.buildingInspectionId}`}\n disabled\n >\n <md-icon slot=\"icon\">description</md-icon>감리이력\n </md-elevated-button>\n </div>\n </div>\n `\n }\n}\n"]}