@dssp/project 0.0.27 → 0.0.29

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.
Files changed (49) hide show
  1. package/client/pages/lib/select2-component.ts +12 -1
  2. package/client/pages/project/component/project-update-header.ts +85 -0
  3. package/client/pages/project/popup/popup-schedule-upload.ts +102 -0
  4. package/client/pages/project/project-list.ts +31 -29
  5. package/client/pages/project/project-plan-management.ts +3 -54
  6. package/client/pages/project/project-schedule.ts +60 -13
  7. package/client/pages/project/project-setting-list.ts +46 -40
  8. package/client/pages/project/project-update.ts +4 -52
  9. package/dist-client/pages/lib/select2-component.js +12 -1
  10. package/dist-client/pages/lib/select2-component.js.map +1 -1
  11. package/dist-client/pages/project/component/project-update-header.d.ts +1 -0
  12. package/dist-client/pages/project/component/project-update-header.js +95 -0
  13. package/dist-client/pages/project/component/project-update-header.js.map +1 -0
  14. package/dist-client/pages/project/popup/popup-schedule-upload.d.ts +9 -0
  15. package/dist-client/pages/project/popup/popup-schedule-upload.js +105 -0
  16. package/dist-client/pages/project/popup/popup-schedule-upload.js.map +1 -0
  17. package/dist-client/pages/project/project-list.d.ts +1 -0
  18. package/dist-client/pages/project/project-list.js +30 -29
  19. package/dist-client/pages/project/project-list.js.map +1 -1
  20. package/dist-client/pages/project/project-plan-management.d.ts +1 -0
  21. package/dist-client/pages/project/project-plan-management.js +3 -53
  22. package/dist-client/pages/project/project-plan-management.js.map +1 -1
  23. package/dist-client/pages/project/project-schedule.d.ts +4 -0
  24. package/dist-client/pages/project/project-schedule.js +55 -12
  25. package/dist-client/pages/project/project-schedule.js.map +1 -1
  26. package/dist-client/pages/project/project-setting-list.js +46 -40
  27. package/dist-client/pages/project/project-setting-list.js.map +1 -1
  28. package/dist-client/pages/project/project-update.d.ts +1 -0
  29. package/dist-client/pages/project/project-update.js +4 -52
  30. package/dist-client/pages/project/project-update.js.map +1 -1
  31. package/dist-client/tsconfig.tsbuildinfo +1 -1
  32. package/dist-server/service/project/project-mutation.d.ts +2 -1
  33. package/dist-server/service/project/project-mutation.js +16 -0
  34. package/dist-server/service/project/project-mutation.js.map +1 -1
  35. package/dist-server/service/project/project-query.d.ts +1 -0
  36. package/dist-server/service/project/project-query.js +17 -0
  37. package/dist-server/service/project/project-query.js.map +1 -1
  38. package/dist-server/service/project/project-type.d.ts +4 -0
  39. package/dist-server/service/project/project-type.js +15 -1
  40. package/dist-server/service/project/project-type.js.map +1 -1
  41. package/dist-server/service/project/project.d.ts +1 -0
  42. package/dist-server/service/project/project.js +4 -0
  43. package/dist-server/service/project/project.js.map +1 -1
  44. package/dist-server/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +4 -4
  46. package/server/service/project/project-mutation.ts +16 -1
  47. package/server/service/project/project-query.ts +13 -0
  48. package/server/service/project/project-type.ts +9 -0
  49. package/server/service/project/project.ts +4 -0
@@ -26,7 +26,7 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
26
26
 
27
27
  width: 100%;
28
28
  height: 100%;
29
- background-color: #f7f7f7;
29
+ background-color: var(--md-sys-color-background, #fcf8f8);
30
30
 
31
31
  --grid-record-emphasized-background-color: red;
32
32
  --grid-record-emphasized-color: yellow;
@@ -34,40 +34,42 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
34
34
 
35
35
  div[management-header-container] {
36
36
  display: flex;
37
- margin: 15px 23px 0px 23px;
38
- gap: 13px;
37
+ margin: var(--spacing-large, 12px);
38
+ margin-bottom:0;
39
+ gap: var(--spacing-medium, 8px);
39
40
  overflow-x: auto;
40
41
 
41
42
  a {
42
- min-width: 140px;
43
+ flex:1;
43
44
  text-align: center;
44
- padding: 12px 15px;
45
- background-color: #fff;
46
- color: #586878;
45
+ padding: var(--spacing-medium, 8px);
46
+ background-color: var(--md-sys-color-on-primary);
47
+ color: var(--md-sys-color-tertiary);
47
48
  font-weight: 700;
48
- border-radius: 7px;
49
+ border-radius: var(--md-sys-shape-corner-small, 5px);
49
50
  display: flex;
50
51
  flex-direction: column;
51
52
  justify-content: center;
52
53
  align-items: center;
53
- gap: 5px;
54
+ gap: var(--spacing-small, 4px);
54
55
  border: solid 1px #0000004d;
55
56
  text-decoration: none;
56
57
  cursor: pointer;
57
58
 
58
59
  md-icon {
59
- font-size: 40px;
60
+ font-size: 35px;
60
61
  width: auto;
61
62
  height: auto;
62
63
  }
63
64
  div[label] {
64
- font-size: 15px;
65
+ font-size: 14px;
66
+ line-height:1.3;
65
67
  }
66
68
  }
67
69
 
68
70
  a[green] {
69
71
  background-color: #24be7b;
70
- color: #fff;
72
+ color: var(--md-sys-color-on-primary);
71
73
  }
72
74
  }
73
75
 
@@ -77,20 +79,22 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
77
79
  align-items: center;
78
80
  background-color: #2ea4df1a;
79
81
  border: 1px solid #2ea4df33;
80
- margin: 15px 23px;
81
- font-size: 18px;
82
- padding: 7px;
83
- border-radius: 5px;
82
+ margin: var(--spacing-large, 12px);
83
+ margin-bottom:var(--spacing-small, 5px);
84
+ padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);
85
+ border-radius: var(--md-sys-shape-corner-small, 5px);
84
86
 
85
87
  md-filled-text-field[type='search'] {
86
- margin-left: 5px;
87
- margin-right: 26px;
88
-
89
88
  --md-filled-text-field-container-shape: 0px;
90
89
  --md-filled-text-field-container-color: transparent;
91
90
  --md-filled-text-field-label-text-color: #999999;
92
91
  --md-filled-text-field-input-text-color: #4e5055;
93
92
  }
93
+ strong{
94
+ flex:1;
95
+ padding-right:var(--spacing-medium, 8px);
96
+ text-align:right
97
+ }
94
98
 
95
99
  md-elevated-button[add-project] {
96
100
  font-weight: bold;
@@ -116,15 +120,18 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
116
120
  div[project-container] {
117
121
  display: flex;
118
122
  flex-direction: row;
119
- min-height: 140px;
120
- margin: 17px 23px;
121
- background-color: #ffffff;
123
+ min-height: 130px;
124
+ margin: var(--spacing-large, 12px);
125
+ background-color: var(--md-sys-color-on-primary);
122
126
  border: 1px solid #cccccc80;
123
- border-radius: 5px;
127
+ border-radius: var(--md-sys-shape-corner-small, 5px);
124
128
  align-items: center;
129
+ gap: var(--spacing-medium, 8px);
130
+ overflow:hidden;
125
131
 
126
132
  img[project-img] {
127
- width: 285px;
133
+ width: 240px;
134
+ height: 130px;
128
135
  aspect-ratio: 2;
129
136
  background-color: #cccccc80;
130
137
  }
@@ -134,9 +141,9 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
134
141
  }
135
142
 
136
143
  span[project-info] {
137
- flex: 0.45;
138
- padding: 6px 15px;
139
- font-size: 16px;
144
+ flex: 0.5;
145
+ padding: var(--spacing-small, 4px);
146
+ font-size: 14px;
140
147
 
141
148
  white-space: nowrap;
142
149
  overflow: hidden;
@@ -145,42 +152,42 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
145
152
  div[name] {
146
153
  color: #2e79be;
147
154
  font-weight: bold;
148
- font-size: 19px;
149
- margin-bottom: 2px;
155
+ font-size: 18px;
150
156
  }
151
157
  }
152
158
 
153
159
  span[project-state] {
154
- flex: 0.55;
155
- padding: 10px 20px;
156
- min-width: 350px;
160
+ flex: 0.5;
161
+ padding: var(--spacing-medium, 8px);
162
+ min-width: 340px;
157
163
 
158
164
  & > div {
159
- margin-bottom: 13px;
165
+ margin-bottom: var(--spacing-small, 4px);
160
166
  }
161
167
 
162
168
  div[progress] {
163
169
  position: relative;
164
170
 
165
171
  md-linear-progress {
172
+ margin:var(--spacing-tiny, 2px) 0;
166
173
  --md-linear-progress-track-height: 18px;
167
174
  --md-linear-progress-active-indicator-height: 18px;
168
175
  --md-linear-progress-track-shape: 5px;
169
- --md-linear-progress-active-indicator-color: #0595e51a;
170
- --md-linear-progress-track-color: #0595e533;
176
+ --md-linear-progress-active-indicator-color: #0595e526;
177
+ --md-linear-progress-track-color: #0595e52a;
171
178
  }
172
179
 
173
180
  span {
174
181
  position: absolute;
175
182
  top: 0;
176
- left: 12px;
183
+ left: var(--spacing-large, 12px);
177
184
  font-size: 12px;
178
185
  font-weight: bold;
179
186
  color: #2e79be;
180
187
 
181
188
  &:last-child {
182
189
  left: unset;
183
- right: 12px;
190
+ right: var(--spacing-large, 12px);
184
191
  }
185
192
  }
186
193
  }
@@ -239,7 +246,7 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
239
246
  </a>
240
247
  <a href="inspection-drawing-type-management">
241
248
  <md-icon slot="leading-icon">stacks</md-icon>
242
- <div label>도면타입/검측부위 관리</div>
249
+ <div label>도면타입/검측부위<br/>관리</div>
243
250
  </a>
244
251
  <a href="checklist-type-management">
245
252
  <md-icon slot="leading-icon">rule</md-icon>
@@ -247,13 +254,12 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
247
254
  </a>
248
255
  <a href="checklist-template-list">
249
256
  <md-icon slot="leading-icon">fact_check</md-icon>
250
- <div label>체크리스트 템플릿 관리</div>
257
+ <div label>체크리스트 템플릿<br/>관리</div>
251
258
  </a>
252
259
  </div>
253
260
  </div>
254
261
 
255
262
  <div header>
256
- <label>프로젝트 이름</label>
257
263
  <md-filled-text-field
258
264
  name="projectName"
259
265
  type="search"
@@ -12,6 +12,7 @@ import { notify } from '@operato/layout'
12
12
  import gql from 'graphql-tag'
13
13
  import { Project } from './project-list'
14
14
  import '../lib/select2-component'
15
+ import './component/project-update-header'
15
16
 
16
17
  @customElement('project-update')
17
18
  export class ProjectUpdate extends ScopedElementsMixin(PageView) {
@@ -55,44 +56,6 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
55
56
  padding: 0;
56
57
  }
57
58
 
58
- div[header] {
59
- display: flex;
60
- margin: 0px 20px;
61
-
62
- h2 {
63
- flex: 0.5;
64
- color: #3f71a0;
65
- }
66
-
67
- div[button-container] {
68
- display: flex;
69
- align-items: center;
70
- justify-content: end;
71
- flex: 0.5;
72
-
73
- md-elevated-button {
74
- margin: 0px 3px;
75
-
76
- --md-elevated-button-container-height: 35px;
77
- --md-elevated-button-label-text-size: 16px;
78
- --md-elevated-button-container-color: #0595e5;
79
-
80
- --md-elevated-button-label-text-color: #fff;
81
- --md-elevated-button-hover-label-text-color: #fff;
82
- --md-elevated-button-pressed-label-text-color: #fff;
83
- --md-elevated-button-focus-label-text-color: #fff;
84
- --md-elevated-button-icon-color: #fff;
85
- --md-elevated-button-hover-icon-color: #fff;
86
- --md-elevated-button-pressed-icon-color: #fff;
87
- --md-elevated-button-focus-icon-color: #fff;
88
-
89
- &[green] {
90
- --md-elevated-button-container-color: #42b382;
91
- }
92
- }
93
- }
94
- }
95
-
96
59
  div[body] {
97
60
  display: flex;
98
61
  margin: 0px 25px 25px 25px;
@@ -266,20 +229,9 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
266
229
 
267
230
  render() {
268
231
  return html`
269
- <div header>
270
- <h2>프로젝트 정보 관리</h2>
271
- <div button-container>
272
- <md-elevated-button green @click=${this._saveProject}>
273
- <md-icon slot="icon">save</md-icon>정보 저장
274
- </md-elevated-button>
275
- <md-elevated-button href=${`project-plan-management/${this.project.id}`}>
276
- <md-icon slot="icon">description</md-icon>도면 관리
277
- </md-elevated-button>
278
- <md-elevated-button href=${`project-task-update/${this.project.id}`}>
279
- <md-icon slot="icon">event_note</md-icon>공정표 관리
280
- </md-elevated-button>
281
- </div>
282
- </div>
232
+ <project-update-header .projectId=${this.project.id || ''} title="프로젝트 정보 관리" @custom-click=${this._saveProject}>
233
+ </project-update-header>
234
+
283
235
  <div body>
284
236
  <div project-info>
285
237
  <h3>기본 정보</h3>
@@ -89,6 +89,10 @@ Select2Component.styles = css `
89
89
  position: relative;
90
90
  width: 300px;
91
91
  border: 1px solid #000;
92
+ border-radius: 6px;
93
+ padding: 4px 16px;
94
+ font-size: 14px;
95
+ color: var(--md-sys-color-primary);
92
96
  }
93
97
 
94
98
  div[dropdown] {
@@ -99,6 +103,8 @@ Select2Component.styles = css `
99
103
 
100
104
  div[options] {
101
105
  position: absolute;
106
+ left: 0;
107
+ top: 30px;
102
108
  width: 100%;
103
109
  border: 1px solid #ccc;
104
110
  background-color: white;
@@ -111,6 +117,10 @@ Select2Component.styles = css `
111
117
  div[option] {
112
118
  padding: 10px;
113
119
  cursor: pointer;
120
+ border-bottom: 1px solid #ccc;
121
+ }
122
+ div[option]:last-child {
123
+ border-bottom: none;
114
124
  }
115
125
 
116
126
  div[option]:hover {
@@ -129,10 +139,11 @@ Select2Component.styles = css `
129
139
  }
130
140
 
131
141
  div[tag] {
132
- background-color: #007bff;
142
+ background-color: #2e79be;
133
143
  color: white;
134
144
  padding: 5px 10px;
135
145
  border-radius: 20px;
146
+ font-size: 13px;
136
147
  display: inline-flex;
137
148
  align-items: center;
138
149
  cursor: pointer;
@@ -1 +1 @@
1
- {"version":3,"file":"select2-component.js","sourceRoot":"","sources":["../../../client/pages/lib/select2-component.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n@customElement('select2-component')\nexport class Select2Component extends LitElement {\n static styles = css`\n div[select-container] {\n position: relative;\n width: 300px;\n border: 1px solid #000;\n }\n\n div[dropdown] {\n border: 1px solid #ccc;\n padding: 5px;\n cursor: pointer;\n }\n\n div[options] {\n position: absolute;\n width: 100%;\n border: 1px solid #ccc;\n background-color: white;\n max-height: 150px;\n overflow-y: auto;\n display: block;\n z-index: 1;\n }\n\n div[option] {\n padding: 10px;\n cursor: pointer;\n }\n\n div[option]:hover {\n background-color: #f0f0f0;\n }\n\n div[option][selected] {\n background-color: #d3f9d8;\n }\n\n div[selected-tags] {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n margin-top: 10px;\n }\n\n div[tag] {\n background-color: #007bff;\n color: white;\n padding: 5px 10px;\n border-radius: 20px;\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n }\n\n span[tag-close] {\n margin-left: 8px;\n }\n `\n\n @property({ type: String }) placeholder: string = ''\n @property({ type: Array }) options: Array<{ name: string; value: string }> = []\n @property({ type: Array }) selectedValues: string[] = []\n\n @state() showOptions: boolean = false\n\n get selectedItems() {\n return this.selectedValues.map(id => this.options.find(option => option.value === id)).filter(Boolean)\n }\n\n connectedCallback() {\n super.connectedCallback()\n document.addEventListener('click', this._handleOutsideClick)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n document.removeEventListener('click', this._handleOutsideClick)\n }\n\n private _handleOutsideClick = (event: MouseEvent) => {\n const path = event.composedPath()\n if (!path.includes(this)) {\n this.showOptions = false\n }\n }\n\n private _toggleOptions() {\n this.showOptions = !this.showOptions\n }\n\n private _handleSelect(optionValue: string) {\n if (this.selectedValues.includes(optionValue)) {\n // 이미 선택된 옵션을 선택한 경우 해제\n this.selectedValues = this.selectedValues.filter(value => value !== optionValue)\n } else {\n // 선택되지 않은 옵션 추가\n this.selectedValues = [...this.selectedValues, optionValue]\n }\n\n this.showOptions = false\n this._dispatchEvent(this.selectedValues)\n }\n\n private _handleRemove(tagValue: string) {\n this.selectedValues = this.selectedValues.filter(value => value !== tagValue)\n this._dispatchEvent(this.selectedValues)\n }\n\n private _dispatchEvent(selectedValues: string[]) {\n this.dispatchEvent(\n new CustomEvent('selection-changed', {\n detail: { selectedValues }, // ID 배열을 부모로 전달\n bubbles: true,\n composed: true\n })\n )\n }\n\n render() {\n return html`\n <div select-container>\n <div tags @click=\"${this._toggleOptions}\">${this.placeholder}</div>\n ${this.showOptions\n ? html`\n <div options>\n ${this.options.map(\n option => html`\n <div\n option\n ?selected=${this.selectedValues.includes(option.value)}\n @click=${() => this._handleSelect(option.value)}\n >\n ${option.name}\n </div>\n `\n )}\n </div>\n `\n : ''}\n </div>\n\n <div selected-tags>\n ${this.selectedItems.map(\n (tag: any) => html`\n <div tag @click=${() => this._handleRemove(tag.value)}>\n ${tag!.name}\n <span tag-close>&times;</span>\n </div>\n `\n )}\n </div>\n `\n }\n}\n"]}
1
+ {"version":3,"file":"select2-component.js","sourceRoot":"","sources":["../../../client/pages/lib/select2-component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAG3D,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,UAAU;IAAzC;;QAuEuB,gBAAW,GAAW,EAAE,CAAA;QACzB,YAAO,GAA2C,EAAE,CAAA;QACpD,mBAAc,GAAa,EAAE,CAAA;QAE/C,gBAAW,GAAY,KAAK,CAAA;QAgB7B,wBAAmB,GAAG,CAAC,KAAiB,EAAE,EAAE;YAClD,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAA;YACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACxB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;aACzB;QACH,CAAC,CAAA;IAqEH,CAAC;IAxFC,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACxG,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC9D,CAAC;IAED,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAA;QAC5B,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAA;IACjE,CAAC;IASO,cAAc;QACpB,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAA;IACtC,CAAC;IAEO,aAAa,CAAC,WAAmB;QACvC,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YAC7C,uBAAuB;YACvB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,WAAW,CAAC,CAAA;SACjF;aAAM;YACL,gBAAgB;YAChB,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;SAC5D;QAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;QACxB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1C,CAAC;IAEO,aAAa,CAAC,QAAgB;QACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAA;QAC7E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1C,CAAC;IAEO,cAAc,CAAC,cAAwB;QAC7C,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,mBAAmB,EAAE;YACnC,MAAM,EAAE,EAAE,cAAc,EAAE;YAC1B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAA;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;4BAEa,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,WAAW;UAC1D,IAAI,CAAC,WAAW;YAChB,CAAC,CAAC,IAAI,CAAA;;kBAEE,IAAI,CAAC,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA;;;kCAGE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;+BAC7C,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;;wBAE7C,MAAM,CAAC,IAAI;;mBAEhB,CACF;;aAEJ;YACH,CAAC,CAAC,EAAE;;;;UAIJ,IAAI,CAAC,aAAa,CAAC,GAAG,CACtB,CAAC,GAAQ,EAAE,EAAE,CAAC,IAAI,CAAA;8BACE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;gBACjD,GAAI,CAAC,IAAI;;;WAGd,CACF;;KAEJ,CAAA;IACH,CAAC;;AAnKM,uBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoElB,CAAA;AAED;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDAAyB;AACpD;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;8BAAU,KAAK;iDAAsC;AAC/E;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;wDAA8B;AAExD;IAAC,KAAK,EAAE;;qDAA6B;AA3E1B,gBAAgB;IAD5B,aAAa,CAAC,mBAAmB,CAAC;GACtB,gBAAgB,CAqK5B;SArKY,gBAAgB","sourcesContent":["import { LitElement, html, css } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n@customElement('select2-component')\nexport class Select2Component extends LitElement {\n static styles = css`\n div[select-container] {\n position: relative;\n width: 300px;\n border: 1px solid #000;\n border-radius: 6px;\n padding: 4px 16px;\n font-size: 14px;\n color: var(--md-sys-color-primary);\n }\n\n div[dropdown] {\n border: 1px solid #ccc;\n padding: 5px;\n cursor: pointer;\n }\n\n div[options] {\n position: absolute;\n left: 0;\n top: 30px;\n width: 100%;\n border: 1px solid #ccc;\n background-color: white;\n max-height: 150px;\n overflow-y: auto;\n display: block;\n z-index: 1;\n }\n\n div[option] {\n padding: 10px;\n cursor: pointer;\n border-bottom: 1px solid #ccc;\n }\n div[option]:last-child {\n border-bottom: none;\n }\n\n div[option]:hover {\n background-color: #f0f0f0;\n }\n\n div[option][selected] {\n background-color: #d3f9d8;\n }\n\n div[selected-tags] {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n margin-top: 10px;\n }\n\n div[tag] {\n background-color: #2e79be;\n color: white;\n padding: 5px 10px;\n border-radius: 20px;\n font-size: 13px;\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n }\n\n span[tag-close] {\n margin-left: 8px;\n }\n `\n\n @property({ type: String }) placeholder: string = ''\n @property({ type: Array }) options: Array<{ name: string; value: string }> = []\n @property({ type: Array }) selectedValues: string[] = []\n\n @state() showOptions: boolean = false\n\n get selectedItems() {\n return this.selectedValues.map(id => this.options.find(option => option.value === id)).filter(Boolean)\n }\n\n connectedCallback() {\n super.connectedCallback()\n document.addEventListener('click', this._handleOutsideClick)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n document.removeEventListener('click', this._handleOutsideClick)\n }\n\n private _handleOutsideClick = (event: MouseEvent) => {\n const path = event.composedPath()\n if (!path.includes(this)) {\n this.showOptions = false\n }\n }\n\n private _toggleOptions() {\n this.showOptions = !this.showOptions\n }\n\n private _handleSelect(optionValue: string) {\n if (this.selectedValues.includes(optionValue)) {\n // 이미 선택된 옵션을 선택한 경우 해제\n this.selectedValues = this.selectedValues.filter(value => value !== optionValue)\n } else {\n // 선택되지 않은 옵션 추가\n this.selectedValues = [...this.selectedValues, optionValue]\n }\n\n this.showOptions = false\n this._dispatchEvent(this.selectedValues)\n }\n\n private _handleRemove(tagValue: string) {\n this.selectedValues = this.selectedValues.filter(value => value !== tagValue)\n this._dispatchEvent(this.selectedValues)\n }\n\n private _dispatchEvent(selectedValues: string[]) {\n this.dispatchEvent(\n new CustomEvent('selection-changed', {\n detail: { selectedValues }, // ID 배열을 부모로 전달\n bubbles: true,\n composed: true\n })\n )\n }\n\n render() {\n return html`\n <div select-container>\n <div tags @click=\"${this._toggleOptions}\">${this.placeholder}</div>\n ${this.showOptions\n ? html`\n <div options>\n ${this.options.map(\n option => html`\n <div\n option\n ?selected=${this.selectedValues.includes(option.value)}\n @click=${() => this._handleSelect(option.value)}\n >\n ${option.name}\n </div>\n `\n )}\n </div>\n `\n : ''}\n </div>\n\n <div selected-tags>\n ${this.selectedItems.map(\n (tag: any) => html`\n <div tag @click=${() => this._handleRemove(tag.value)}>\n ${tag!.name}\n <span tag-close>&times;</span>\n </div>\n `\n )}\n </div>\n `\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ import '@material/web/icon/icon.js';
@@ -0,0 +1,95 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/icon/icon.js';
3
+ import { css, html, LitElement } from 'lit';
4
+ import { customElement, property } from 'lit/decorators.js';
5
+ import { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles';
6
+ let ProjectUpdateHeader = class ProjectUpdateHeader extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.projectId = '';
10
+ this.title = '';
11
+ }
12
+ render() {
13
+ const path = window.location.pathname;
14
+ return html `
15
+ <div header>
16
+ <h2>${this.title}</h2>
17
+ <div button-container>
18
+ <md-elevated-button green @click=${this._dispatchEvent} ?disabled=${!this.projectId}>
19
+ <md-icon slot="icon">save</md-icon>정보 저장
20
+ </md-elevated-button>
21
+ <md-elevated-button
22
+ href=${`project-update/${this.projectId}`}
23
+ ?disabled=${!this.projectId || path.includes('project-update/')}
24
+ >
25
+ <md-icon slot="icon">assignment</md-icon>프로젝트 정보 수정
26
+ </md-elevated-button>
27
+ <md-elevated-button
28
+ href=${`project-plan-management/${this.projectId}`}
29
+ ?disabled=${!this.projectId || path.includes('project-plan-management/')}
30
+ >
31
+ <md-icon slot="icon">description</md-icon>도면 관리
32
+ </md-elevated-button>
33
+ </div>
34
+ </div>
35
+ `;
36
+ }
37
+ _dispatchEvent() {
38
+ this.dispatchEvent(new CustomEvent('custom-click'));
39
+ }
40
+ };
41
+ ProjectUpdateHeader.styles = [
42
+ ButtonContainerStyles,
43
+ ScrollbarStyles,
44
+ css `
45
+ div[header] {
46
+ display: flex;
47
+ margin: 0px 20px;
48
+
49
+ h2 {
50
+ flex: 0.5;
51
+ color: #3f71a0;
52
+ }
53
+ }
54
+
55
+ div[button-container] {
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: end;
59
+ flex: 0.5;
60
+
61
+ md-elevated-button {
62
+ margin: 0px 3px;
63
+
64
+ --md-elevated-button-container-height: 35px;
65
+ --md-elevated-button-label-text-size: 16px;
66
+ --md-elevated-button-container-color: #0595e5;
67
+
68
+ --md-elevated-button-label-text-color: #fff;
69
+ --md-elevated-button-hover-label-text-color: #fff;
70
+ --md-elevated-button-pressed-label-text-color: #fff;
71
+ --md-elevated-button-focus-label-text-color: #fff;
72
+ --md-elevated-button-icon-color: #fff;
73
+ --md-elevated-button-hover-icon-color: #fff;
74
+ --md-elevated-button-pressed-icon-color: #fff;
75
+ --md-elevated-button-focus-icon-color: #fff;
76
+
77
+ &[green] {
78
+ --md-elevated-button-container-color: #42b382;
79
+ }
80
+ }
81
+ }
82
+ `
83
+ ];
84
+ __decorate([
85
+ property({ type: String }),
86
+ __metadata("design:type", String)
87
+ ], ProjectUpdateHeader.prototype, "projectId", void 0);
88
+ __decorate([
89
+ property({ type: String }),
90
+ __metadata("design:type", String)
91
+ ], ProjectUpdateHeader.prototype, "title", void 0);
92
+ ProjectUpdateHeader = __decorate([
93
+ customElement('project-update-header')
94
+ ], ProjectUpdateHeader);
95
+ //# sourceMappingURL=project-update-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-update-header.js","sourceRoot":"","sources":["../../../../client/pages/project/component/project-update-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,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGxE,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,UAAU;IAA5C;;QA6C8B,cAAS,GAAW,EAAE,CAAA;QACtB,UAAK,GAAW,EAAE,CAAA;IAgChD,CAAC;IA9BC,MAAM;QACJ,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAA;QAErC,OAAO,IAAI,CAAA;;cAED,IAAI,CAAC,KAAK;;6CAEqB,IAAI,CAAC,cAAc,cAAc,CAAC,IAAI,CAAC,SAAS;;;;mBAI1E,kBAAkB,IAAI,CAAC,SAAS,EAAE;wBAC7B,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;;;;;mBAKxD,2BAA2B,IAAI,CAAC,SAAS,EAAE;wBACtC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC;;;;;;KAM/E,CAAA;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,cAAc,CAAC,CAAC,CAAA;IACrD,CAAC;;AA5EM,0BAAM,GAAG;IACd,qBAAqB;IACrB,eAAe;IACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsCF;CACF,CAAA;AAED;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sDAAuB;AAClD;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;kDAAmB;AA9C1C,mBAAmB;IADxB,aAAa,CAAC,uBAAuB,CAAC;GACjC,mBAAmB,CA8ExB","sourcesContent":["import '@material/web/icon/icon.js'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles'\n\n@customElement('project-update-header')\nclass ProjectUpdateHeader extends LitElement {\n static styles = [\n ButtonContainerStyles,\n ScrollbarStyles,\n css`\n div[header] {\n display: flex;\n margin: 0px 20px;\n\n h2 {\n flex: 0.5;\n color: #3f71a0;\n }\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: end;\n flex: 0.5;\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 &[green] {\n --md-elevated-button-container-color: #42b382;\n }\n }\n }\n `\n ]\n\n @property({ type: String }) projectId: string = ''\n @property({ type: String }) title: string = ''\n\n render() {\n const path = window.location.pathname\n\n return html`\n <div header>\n <h2>${this.title}</h2>\n <div button-container>\n <md-elevated-button green @click=${this._dispatchEvent} ?disabled=${!this.projectId}>\n <md-icon slot=\"icon\">save</md-icon>정보 저장\n </md-elevated-button>\n <md-elevated-button\n href=${`project-update/${this.projectId}`}\n ?disabled=${!this.projectId || path.includes('project-update/')}\n >\n <md-icon slot=\"icon\">assignment</md-icon>프로젝트 정보 수정\n </md-elevated-button>\n <md-elevated-button\n href=${`project-plan-management/${this.projectId}`}\n ?disabled=${!this.projectId || path.includes('project-plan-management/')}\n >\n <md-icon slot=\"icon\">description</md-icon>도면 관리\n </md-elevated-button>\n </div>\n </div>\n `\n }\n\n private _dispatchEvent() {\n this.dispatchEvent(new CustomEvent('custom-click'))\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class PopupScheduleUpload extends LitElement {
3
+ static styles: import("lit").CSSResult[];
4
+ private scheduleTable;
5
+ private projectId;
6
+ render(): import("lit-html").TemplateResult<1>;
7
+ private _close;
8
+ _onChangeAttachment(e: CustomEvent): Promise<void>;
9
+ }
@@ -0,0 +1,105 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { css, html, LitElement } from 'lit';
3
+ import { customElement, property } from 'lit/decorators.js';
4
+ import { client } from '@operato/graphql';
5
+ import { notify } from '@operato/layout';
6
+ import gql from 'graphql-tag';
7
+ let PopupScheduleUpload = class PopupScheduleUpload extends LitElement {
8
+ render() {
9
+ var _a, _b;
10
+ const icon = this.scheduleTable ? '' : 'upload';
11
+ const description = ((_a = this.scheduleTable) === null || _a === void 0 ? void 0 : _a.name) ? ' ' : '공정표 업로드';
12
+ return html `
13
+ <div body>
14
+ <div input-container>
15
+ <ox-input-file
16
+ icon=${icon}
17
+ label=${((_b = this.scheduleTable) === null || _b === void 0 ? void 0 : _b.name) || ''}
18
+ description=${description}
19
+ @change=${this._onChangeAttachment.bind(this)}
20
+ ></ox-input-file>
21
+ </div>
22
+
23
+ <div button-container>
24
+ <md-outlined-button @click=${this._close}><md-icon slot="icon">cancel</md-icon>취소</md-outlined-button>
25
+ </div>
26
+ </div>
27
+ `;
28
+ }
29
+ _close() {
30
+ history.back();
31
+ }
32
+ // 공정표 업로드
33
+ async _onChangeAttachment(e) {
34
+ const file = e.detail[0] || null;
35
+ const response = await client.mutate({
36
+ mutation: gql `
37
+ mutation UploadProjectScheduleTable($param: UploadProjectScheduleTable!) {
38
+ uploadProjectScheduleTable(param: $param)
39
+ }
40
+ `,
41
+ variables: {
42
+ param: {
43
+ projectId: this.projectId,
44
+ scheduleTable: file
45
+ }
46
+ },
47
+ context: {
48
+ hasUpload: true
49
+ }
50
+ });
51
+ if (!response.errors) {
52
+ notify({ message: '공정표가 업로드 되었습니다.' });
53
+ this.dispatchEvent(new CustomEvent('uploaded'));
54
+ }
55
+ }
56
+ };
57
+ PopupScheduleUpload.styles = [
58
+ css `
59
+ :host {
60
+ display: flex;
61
+ flex-direction: column;
62
+ background-color: #fff;
63
+ width: 100%;
64
+ }
65
+
66
+ div[body] {
67
+ flex: 1;
68
+
69
+ div[input-container] {
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: center;
73
+ gap: 25px;
74
+ background-color: #f7f7f7;
75
+ padding: 35px 27px 27px 27px;
76
+
77
+ ox-input-file {
78
+ height: 100px;
79
+ width: 120px;
80
+ line-height: 100%;
81
+ }
82
+ }
83
+
84
+ div[button-container] {
85
+ display: flex;
86
+ align-items: center;
87
+ justify-content: center;
88
+ margin-top: 20px;
89
+ }
90
+ }
91
+ `
92
+ ];
93
+ __decorate([
94
+ property({ type: Object }),
95
+ __metadata("design:type", Object)
96
+ ], PopupScheduleUpload.prototype, "scheduleTable", void 0);
97
+ __decorate([
98
+ property({ type: String }),
99
+ __metadata("design:type", Object)
100
+ ], PopupScheduleUpload.prototype, "projectId", void 0);
101
+ PopupScheduleUpload = __decorate([
102
+ customElement('popup-schedule-upload')
103
+ ], PopupScheduleUpload);
104
+ export { PopupScheduleUpload };
105
+ //# sourceMappingURL=popup-schedule-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popup-schedule-upload.js","sourceRoot":"","sources":["../../../../client/pages/project/popup/popup-schedule-upload.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,GAAG,MAAM,aAAa,CAAA;AAItB,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,UAAU;IAyCjD,MAAM;;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC/C,MAAM,WAAW,GAAG,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,IAAI,EAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;QAE9D,OAAO,IAAI,CAAA;;;;mBAII,IAAI;oBACH,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,IAAI,KAAI,EAAE;0BACxB,WAAW;sBACf,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;uCAKlB,IAAI,CAAC,MAAM;;;KAG7C,CAAA;IACH,CAAC;IAEO,MAAM;QACZ,OAAO,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;IAED,UAAU;IACV,KAAK,CAAC,mBAAmB,CAAC,CAAc;QACtC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;QAEhC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;;;OAIZ;YACD,SAAS,EAAE;gBACT,KAAK,EAAE;oBACL,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,aAAa,EAAE,IAAI;iBACpB;aACF;YACD,OAAO,EAAE;gBACP,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACpB,MAAM,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAA;YACtC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC,CAAA;SAChD;IACH,CAAC;;AA3FM,0BAAM,GAAG;IACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiCF;CACF,CAAA;AAED;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DAA8C;AACzE;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sDAAsC;AAvCtD,mBAAmB;IAD/B,aAAa,CAAC,uBAAuB,CAAC;GAC1B,mBAAmB,CA6F/B;SA7FY,mBAAmB","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport gql from 'graphql-tag'\nimport { Attachment } from '@things-factory/attachment-base'\n\n@customElement('popup-schedule-upload')\nexport class PopupScheduleUpload extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: #fff;\n width: 100%;\n }\n\n div[body] {\n flex: 1;\n\n div[input-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 25px;\n background-color: #f7f7f7;\n padding: 35px 27px 27px 27px;\n\n ox-input-file {\n height: 100px;\n width: 120px;\n line-height: 100%;\n }\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-top: 20px;\n }\n }\n `\n ]\n\n @property({ type: Object }) private scheduleTable: Attachment | undefined\n @property({ type: String }) private projectId: string | undefined\n\n render() {\n const icon = this.scheduleTable ? '' : 'upload'\n const description = this.scheduleTable?.name ? ' ' : '공정표 업로드'\n\n return html`\n <div body>\n <div input-container>\n <ox-input-file\n icon=${icon}\n label=${this.scheduleTable?.name || ''}\n description=${description}\n @change=${this._onChangeAttachment.bind(this)}\n ></ox-input-file>\n </div>\n\n <div button-container>\n <md-outlined-button @click=${this._close}><md-icon slot=\"icon\">cancel</md-icon>취소</md-outlined-button>\n </div>\n </div>\n `\n }\n\n private _close() {\n history.back()\n }\n\n // 공정표 업로드\n async _onChangeAttachment(e: CustomEvent) {\n const file = e.detail[0] || null\n\n const response = await client.mutate({\n mutation: gql`\n mutation UploadProjectScheduleTable($param: UploadProjectScheduleTable!) {\n uploadProjectScheduleTable(param: $param)\n }\n `,\n variables: {\n param: {\n projectId: this.projectId,\n scheduleTable: file\n }\n },\n context: {\n hasUpload: true\n }\n })\n\n if (!response.errors) {\n notify({ message: '공정표가 업로드 되었습니다.' })\n this.dispatchEvent(new CustomEvent('uploaded'))\n }\n }\n}\n"]}
@@ -35,6 +35,7 @@ export interface Project {
35
35
  inspPassRate?: number;
36
36
  robotProgressRate?: number;
37
37
  structuralSafetyRate?: number;
38
+ scheduleTable?: Attachment;
38
39
  buildingComplex: BuildingComplex;
39
40
  }
40
41
  export interface BuildingComplex {