@dssp/project 0.0.31 → 0.0.32

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 (52) hide show
  1. package/client/pages/lib/select2-component.ts +21 -16
  2. package/client/pages/project/component/project-update-header.ts +16 -13
  3. package/client/pages/project/project-detail.ts +74 -60
  4. package/client/pages/project/project-plan-management.ts +39 -29
  5. package/client/pages/project/project-schedule.ts +4 -3
  6. package/client/pages/project/project-setting-list.ts +9 -9
  7. package/client/pages/project/project-update.ts +53 -29
  8. package/dist-client/pages/lib/select2-component.js +21 -16
  9. package/dist-client/pages/lib/select2-component.js.map +1 -1
  10. package/dist-client/pages/project/component/project-update-header.js +16 -13
  11. package/dist-client/pages/project/component/project-update-header.js.map +1 -1
  12. package/dist-client/pages/project/project-detail.js +74 -60
  13. package/dist-client/pages/project/project-detail.js.map +1 -1
  14. package/dist-client/pages/project/project-plan-management.js +39 -29
  15. package/dist-client/pages/project/project-plan-management.js.map +1 -1
  16. package/dist-client/pages/project/project-schedule.js +4 -3
  17. package/dist-client/pages/project/project-schedule.js.map +1 -1
  18. package/dist-client/pages/project/project-setting-list.js +9 -9
  19. package/dist-client/pages/project/project-setting-list.js.map +1 -1
  20. package/dist-client/pages/project/project-update.js +53 -29
  21. package/dist-client/pages/project/project-update.js.map +1 -1
  22. package/dist-client/tsconfig.tsbuildinfo +1 -1
  23. package/dist-server/controllers/{project-to-excel.js → export-tasks.js} +1 -1
  24. package/dist-server/controllers/export-tasks.js.map +1 -0
  25. package/dist-server/controllers/import-task.d.ts +1 -17
  26. package/dist-server/controllers/import-task.js +24 -14
  27. package/dist-server/controllers/import-task.js.map +1 -1
  28. package/dist-server/controllers/parse-excel.d.ts +4 -0
  29. package/dist-server/controllers/parse-excel.js +75 -0
  30. package/dist-server/controllers/parse-excel.js.map +1 -0
  31. package/dist-server/controllers/types.d.ts +18 -0
  32. package/dist-server/controllers/types.js +3 -0
  33. package/dist-server/controllers/types.js.map +1 -0
  34. package/dist-server/routes.js +2 -2
  35. package/dist-server/routes.js.map +1 -1
  36. package/dist-server/service/project/project-mutation.d.ts +2 -1
  37. package/dist-server/service/project/project-mutation.js +52 -24
  38. package/dist-server/service/project/project-mutation.js.map +1 -1
  39. package/dist-server/service/task/task.d.ts +1 -0
  40. package/dist-server/service/task/task.js +5 -0
  41. package/dist-server/service/task/task.js.map +1 -1
  42. package/dist-server/tsconfig.tsbuildinfo +1 -1
  43. package/package.json +3 -3
  44. package/server/controllers/import-task.ts +25 -31
  45. package/server/controllers/parse-excel.ts +86 -0
  46. package/server/controllers/types.ts +20 -0
  47. package/server/routes.ts +1 -1
  48. package/server/service/project/project-mutation.ts +40 -24
  49. package/server/service/task/task.ts +4 -0
  50. package/dist-server/controllers/project-to-excel.js.map +0 -1
  51. /package/dist-server/controllers/{project-to-excel.d.ts → export-tasks.d.ts} +0 -0
  52. /package/server/controllers/{project-to-excel.ts → export-tasks.ts} +0 -0
@@ -26,7 +26,7 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
26
26
 
27
27
  width: 100%;
28
28
  height: 100%;
29
- background-color: var(--md-sys-color-background, #fcf8f8);
29
+ background-color: var(--md-sys-color-background, #f6f6f6);
30
30
 
31
31
  --grid-record-emphasized-background-color: red;
32
32
  --grid-record-emphasized-color: yellow;
@@ -102,14 +102,14 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
102
102
  padding: 13px 20px;
103
103
 
104
104
  --md-elevated-button-container-color: #24be7b;
105
- --md-elevated-button-label-text-color: #ffffff;
106
- --md-elevated-button-hover-label-text-color: #fff;
107
- --md-elevated-button-pressed-label-text-color: #fff;
108
- --md-elevated-button-focus-label-text-color: #fff;
109
- --md-elevated-button-icon-color: #fff;
110
- --md-elevated-button-hover-icon-color: #fff;
111
- --md-elevated-button-pressed-icon-color: #fff;
112
- --md-elevated-button-focus-icon-color: #fff;
105
+ --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);
106
+ --md-elevated-button-hover-label-text-color:var(--md-sys-color-on-primary);
107
+ --md-elevated-button-pressed-label-text-color:var(--md-sys-color-on-primary);
108
+ --md-elevated-button-focus-label-text-color:var(--md-sys-color-on-primary);
109
+ --md-elevated-button-icon-color:var(--md-sys-color-on-primary);
110
+ --md-elevated-button-hover-icon-color:var(--md-sys-color-on-primary);
111
+ --md-elevated-button-pressed-icon-color:var(--md-sys-color-on-primary);
112
+ --md-elevated-button-focus-icon-color:var(--md-sys-color-on-primary);
113
113
 
114
114
  --md-elevated-button-container-shape: 7px;
115
115
  }
@@ -20,11 +20,11 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
20
20
  css`
21
21
  :host {
22
22
  display: grid;
23
- grid-template-rows: 75px auto;
23
+ grid-template-rows: 55px auto;
24
24
  color: #4e5055;
25
25
 
26
26
  width: 100%;
27
- background-color: #f7f7f7;
27
+ background-color: var(--md-sys-color-background, #f6f6f6);
28
28
  overflow-y: auto;
29
29
 
30
30
  --grid-record-emphasized-background-color: red;
@@ -35,45 +35,59 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
35
35
  width: 100%;
36
36
 
37
37
  --md-outlined-text-field-container-shape: 5px;
38
+ --md-outlined-text-field-outline-color: rgba(51,51,51,.20);
39
+ --md-outlined-text-field-focus-outline-color: #1f7fd9;
40
+ --md-outlined-text-field-focus-outline-width: 1px;
38
41
  --md-sys-color-primary: #586878;
39
42
  --md-outlined-text-field-input-text-size: 14px;
40
- --md-outlined-field-bottom-space: 4px;
41
- --md-outlined-field-top-space: 4px;
43
+ --md-outlined-field-bottom-space: 3px;
44
+ --md-outlined-field-top-space: 3px;
45
+ --md-outlined-field-leading-space: var(--spacing-medium, 8px);
46
+ --md-outlined-field-trailing-space: var(--spacing-medium, 8px);
47
+ }
48
+ select2-component {
49
+ width:100%;
50
+ }
51
+ input[type="date"] {
52
+ border:1px solid rgba(51,51,51,.20);
53
+ padding:var(--spacing-small, 4px) var(--spacing-medium, 8px);
54
+ border-radius: 5px;
42
55
  }
43
56
  md-outlined-text-field[type='textarea'] {
44
57
  width: 100%;
45
- height: 130px;
58
+ height: 120px;
46
59
  resize: none;
47
60
  }
48
61
 
49
62
  ox-input-image {
50
- width: 100px;
51
- height: 100px;
63
+ width: 120px;
64
+ height: 90px;
52
65
  }
53
66
  ox-input-file {
54
- width: 100px;
55
- height: 100px;
67
+ width: 120px;
68
+ height: 90px;
56
69
  padding: 0;
57
70
  }
58
71
 
59
72
  div[body] {
60
73
  display: flex;
61
- margin: 0px 25px 25px 25px;
62
- gap: 10px;
74
+ margin: var(--spacing-large, 12px);
75
+ margin-top:0;
76
+ gap: var(--spacing-medium, 8px);
63
77
 
64
78
  & > div {
65
79
  display: flex;
66
80
  height: fit-content;
67
81
  flex-direction: column;
68
- padding: 15px;
69
- background-color: #ffffff;
82
+ padding: var(--spacing-large, 12px);
83
+ background-color: var(--md-sys-color-on-primary);
70
84
  border: 1px solid #cccccc80;
71
85
  border-radius: 5px;
72
- gap: 10px;
86
+ gap: var(--spacing-medium, 8px);
73
87
 
74
88
  h3 {
75
89
  color: #2e79be;
76
- font-size: 18px;
90
+ font-size: 16px;
77
91
  margin: 0px;
78
92
  }
79
93
 
@@ -84,13 +98,14 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
84
98
  span:first-child {
85
99
  flex: 0.3;
86
100
  text-align: right;
101
+ font-size: 14px;
87
102
  }
88
103
 
89
104
  span:last-child {
90
105
  flex: 0.7;
91
106
  display: flex;
92
- gap: 10px;
93
- margin-left: 12px;
107
+ gap: var(--spacing-medium, 8px);
108
+ margin-left: var(--spacing-medium, 8px);
94
109
  align-items: center;
95
110
 
96
111
  &[align-end] {
@@ -114,11 +129,11 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
114
129
  & > div {
115
130
  display: flex;
116
131
  flex-direction: column;
117
- gap: 10px;
132
+ gap: var(--spacing-medium, 8px);
118
133
  border: 1px solid #cccccc80;
119
134
  border-radius: 5px;
120
- padding: 15px;
121
- background-color: #fff;
135
+ padding: var(--spacing-large, 12px);
136
+ background-color: var(--md-sys-color-on-primary);
122
137
 
123
138
  md-outlined-text-field[type='text'] {
124
139
  width: 60%;
@@ -126,19 +141,28 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
126
141
 
127
142
  md-elevated-button {
128
143
  --md-elevated-button-container-height: 30px;
129
- --md-elevated-button-container-color: #fff;
144
+ --md-elevated-button-container-color: var(--md-sys-color-on-primary);
130
145
  --md-elevated-button-label-text-size: 16px;
131
146
  }
132
147
  hr {
133
- border: 1px #cccccc dashed;
148
+ border: 1px rgba(51,51,51,.1) dashed;
134
149
  width: 100%;
135
- margin-bottom: 2px;
150
+ margin-bottom: var(--spacing-tiny, 2px);
136
151
  }
137
152
  div[warn] {
138
153
  font-size: 12px;
139
154
  color: red;
140
- margin-left: 5px;
141
- margin-bottom: 5px;
155
+ margin-left: var(--spacing-small, 4px);
156
+ margin-bottom: var(--spacing-small, 4px);
157
+ }
158
+
159
+ md-outlined-button {
160
+ min-height: 30px;
161
+ padding: 0 var(--spacing-large, 12px);
162
+ box-shadow: 1px 1px 1px #0000001a;
163
+ --md-outlined-button-label-text-color: #586878;
164
+ --md-outlined-button-label-text-weight: bold;
165
+ --md-sys-color-outline: rgba(51,51,51,.20);
142
166
  }
143
167
 
144
168
  div[row] {
@@ -153,7 +177,7 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
153
177
  div[separate-container] {
154
178
  display: grid;
155
179
  grid-template-columns: repeat(2, 1fr);
156
- gap: 10px;
180
+ gap: var(--spacing-medium, 8px);
157
181
 
158
182
  md-outlined-text-field {
159
183
  width: 70px;
@@ -164,7 +188,7 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
164
188
 
165
189
  span[floor-title] {
166
190
  min-width: 33px;
167
- margin-right: 5px;
191
+ margin-right: var(--spacing-small, 4px);
168
192
  }
169
193
  span:first-child {
170
194
  flex: 0.4;
@@ -175,7 +199,7 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
175
199
  flex: 0.6;
176
200
  display: flex;
177
201
  align-items: center;
178
- padding-left: 17px;
202
+ padding-left: var(--spacing-medium, 8px);
179
203
  }
180
204
  }
181
205
  }
@@ -505,7 +529,7 @@ export class ProjectUpdate extends ScopedElementsMixin(PageView) {
505
529
  value=${this.project?.buildingComplex?.buildingCount?.toString() || ''}
506
530
  @input=${this._onInputChange}
507
531
  ></md-outlined-text-field>
508
- <md-elevated-button @click=${this._setBuilding}>적용</md-elevated-button>
532
+ <md-outlined-button @click=${this._setBuilding}>적용</md-outlined-button>
509
533
  </span>
510
534
  </div>
511
535
  <hr />
@@ -87,17 +87,19 @@ let Select2Component = class Select2Component extends LitElement {
87
87
  Select2Component.styles = css `
88
88
  div[select-container] {
89
89
  position: relative;
90
- width: 300px;
91
- border: 1px solid #000;
92
- border-radius: 6px;
93
- padding: 4px 16px;
90
+ border: 1px solid rgba(51,51,51,.20);
91
+ border-radius: 5px;
92
+ padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);
94
93
  font-size: 14px;
95
94
  color: var(--md-sys-color-primary);
96
95
  }
96
+ div[select-container]:focus {
97
+ border: 1px solid #1f7fd9;
98
+ }
97
99
 
98
100
  div[dropdown] {
99
101
  border: 1px solid #ccc;
100
- padding: 5px;
102
+ padding: var(--spacing-small, 4px);
101
103
  cursor: pointer;
102
104
  }
103
105
 
@@ -105,9 +107,10 @@ Select2Component.styles = css `
105
107
  position: absolute;
106
108
  left: 0;
107
109
  top: 30px;
108
- width: 100%;
110
+ min-width: 50%;
109
111
  border: 1px solid #ccc;
110
- background-color: white;
112
+ background-color: var(--md-sys-color-surface-tint);
113
+ color:var(--md-sys-color-on-primary);
111
114
  max-height: 150px;
112
115
  overflow-y: auto;
113
116
  display: block;
@@ -115,42 +118,44 @@ Select2Component.styles = css `
115
118
  }
116
119
 
117
120
  div[option] {
118
- padding: 10px;
121
+ padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);
119
122
  cursor: pointer;
120
- border-bottom: 1px solid #ccc;
123
+ border-bottom: 1px solid rgba(0,0,0,.4);
121
124
  }
122
125
  div[option]:last-child {
123
126
  border-bottom: none;
124
127
  }
125
128
 
126
129
  div[option]:hover {
127
- background-color: #f0f0f0;
130
+ background-color: var(--md-sys-color-tertiary-container);
128
131
  }
129
132
 
130
133
  div[option][selected] {
131
- background-color: #d3f9d8;
134
+ background-color: var(--md-sys-color-tertiary-container);
135
+ font-weight: bold;
136
+ color:var(--md-sys-color-on-primary);
132
137
  }
133
138
 
134
139
  div[selected-tags] {
135
140
  display: flex;
136
141
  flex-wrap: wrap;
137
- gap: 5px;
138
- margin-top: 10px;
142
+ gap: var(--spacing-small, 4px);
143
+ margin-top: var(--spacing-small, 4px);
139
144
  }
140
145
 
141
146
  div[tag] {
142
147
  background-color: #2e79be;
143
148
  color: white;
144
- padding: 5px 10px;
149
+ padding: var(--spacing-tiny, 2px) var(--spacing-medium, 8px);
145
150
  border-radius: 20px;
146
- font-size: 13px;
151
+ font-size: 12px;
147
152
  display: inline-flex;
148
153
  align-items: center;
149
154
  cursor: pointer;
150
155
  }
151
156
 
152
157
  span[tag-close] {
153
- margin-left: 8px;
158
+ margin-left: var(--spacing-small, 4px);
154
159
  }
155
160
  `;
156
161
  __decorate([
@@ -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 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"]}
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 border: 1px solid rgba(51,51,51,.20);\n border-radius: 5px;\n padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n font-size: 14px;\n color: var(--md-sys-color-primary);\n }\n div[select-container]:focus {\n border: 1px solid #1f7fd9;\n }\n\n div[dropdown] {\n border: 1px solid #ccc;\n padding: var(--spacing-small, 4px);\n cursor: pointer;\n }\n\n div[options] {\n position: absolute;\n left: 0;\n top: 30px;\n min-width: 50%;\n border: 1px solid #ccc;\n background-color: var(--md-sys-color-surface-tint);\n color:var(--md-sys-color-on-primary);\n max-height: 150px;\n overflow-y: auto;\n display: block;\n z-index: 1;\n }\n\n div[option] {\n padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n cursor: pointer;\n border-bottom: 1px solid rgba(0,0,0,.4);\n }\n div[option]:last-child {\n border-bottom: none;\n }\n\n div[option]:hover {\n background-color: var(--md-sys-color-tertiary-container);\n }\n\n div[option][selected] {\n background-color: var(--md-sys-color-tertiary-container);\n font-weight: bold;\n color:var(--md-sys-color-on-primary);\n }\n\n div[selected-tags] {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n margin-top: var(--spacing-small, 4px);\n }\n\n div[tag] {\n background-color: #2e79be;\n color: white;\n padding: var(--spacing-tiny, 2px) var(--spacing-medium, 8px);\n border-radius: 20px;\n font-size: 12px;\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n }\n\n span[tag-close] {\n margin-left: var(--spacing-small, 4px);\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"]}
@@ -44,11 +44,13 @@ ProjectUpdateHeader.styles = [
44
44
  css `
45
45
  div[header] {
46
46
  display: flex;
47
- margin: 0px 20px;
47
+ margin: 0px var(--spacing-large, 12px);
48
48
 
49
49
  h2 {
50
- flex: 0.5;
50
+ flex: 1;
51
+ margin-bottom: var(--spacing-medium, 8px);
51
52
  color: #3f71a0;
53
+ font-size:18px;
52
54
  }
53
55
  }
54
56
 
@@ -56,23 +58,24 @@ ProjectUpdateHeader.styles = [
56
58
  display: flex;
57
59
  align-items: center;
58
60
  justify-content: end;
59
- flex: 0.5;
61
+ flex: 1;
62
+ padding-top: var(--spacing-medium, 8px);
60
63
 
61
64
  md-elevated-button {
62
- margin: 0px 3px;
65
+ margin: 0 var(--spacing-small, 4px);
63
66
 
64
- --md-elevated-button-container-height: 35px;
67
+ --md-elevated-button-container-height: 32px;
65
68
  --md-elevated-button-label-text-size: 16px;
66
69
  --md-elevated-button-container-color: #0595e5;
67
70
 
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;
71
+ --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);
72
+ --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);
73
+ --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);
74
+ --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);
75
+ --md-elevated-button-icon-color: var(--md-sys-color-on-primary);
76
+ --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);
77
+ --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);
78
+ --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);
76
79
 
77
80
  &[green] {
78
81
  --md-elevated-button-container-color: #42b382;
@@ -1 +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"]}
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;;QAgD8B,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;;AA/EM,0BAAM,GAAG;IACd,qBAAqB;IACrB,eAAe;IACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyCF;CACF,CAAA;AAED;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sDAAuB;AAClD;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;kDAAmB;AAjD1C,mBAAmB;IADxB,aAAa,CAAC,uBAAuB,CAAC;GACjC,mBAAmB,CAiFxB","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 var(--spacing-large, 12px);\n\n h2 {\n flex: 1;\n margin-bottom: var(--spacing-medium, 8px);\n color: #3f71a0;\n font-size:18px;\n }\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: end;\n flex: 1;\n padding-top: var(--spacing-medium, 8px); \n\n md-elevated-button {\n margin: 0 var(--spacing-small, 4px);\n\n --md-elevated-button-container-height: 32px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);\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"]}