jobdone-shared-files 0.0.1-beta.8 → 0.0.1-beta.81

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 (112) hide show
  1. package/ProjectManagement/projectNavbar.vue +263 -85
  2. package/README.md +80 -6
  3. package/common/directives/popovers.js +11 -0
  4. package/common/directives/tooltip.js +11 -0
  5. package/common/format.js +16 -2
  6. package/lightboxWithOverview.vue +132 -0
  7. package/package.json +4 -3
  8. package/style/scss/Common/Animation.scss +6 -0
  9. package/style/scss/Common/SelectableTable.scss +31 -0
  10. package/style/scss/Common/filepond.scss +28 -0
  11. package/style/scss/Common/thumbnail-group.scss +14 -0
  12. package/style/scss/Layout/LayoutBase.scss +84 -11
  13. package/style/scss/Layout/LayoutMobile.scss +203 -0
  14. package/style/scss/Layout/LayoutProject.scss +1 -5
  15. package/style/scss/Layout/LayoutTwoColumn.scss +3 -3
  16. package/style/scss/Settings/_MobileVariables.scss +12 -0
  17. package/style/scss/Settings/_basic-import.scss +3 -2
  18. package/style/scss/Settings/_bs-variables.scss +114 -74
  19. package/style/scss/Settings/_custom-variables.scss +5 -1
  20. package/tree.vue +17 -10
  21. package/treeItem.vue +1 -1
  22. package/vueLoadingOverlay.vue +13 -19
  23. package/style/scss/Bootstrap/_accordion.scss +0 -158
  24. package/style/scss/Bootstrap/_alert.scss +0 -68
  25. package/style/scss/Bootstrap/_badge.scss +0 -38
  26. package/style/scss/Bootstrap/_breadcrumb.scss +0 -40
  27. package/style/scss/Bootstrap/_button-group.scss +0 -142
  28. package/style/scss/Bootstrap/_buttons.scss +0 -207
  29. package/style/scss/Bootstrap/_card.scss +0 -238
  30. package/style/scss/Bootstrap/_carousel.scss +0 -238
  31. package/style/scss/Bootstrap/_close.scss +0 -61
  32. package/style/scss/Bootstrap/_containers.scss +0 -41
  33. package/style/scss/Bootstrap/_dropdown.scss +0 -250
  34. package/style/scss/Bootstrap/_forms.scss +0 -9
  35. package/style/scss/Bootstrap/_functions.scss +0 -302
  36. package/style/scss/Bootstrap/_grid.scss +0 -33
  37. package/style/scss/Bootstrap/_helpers.scss +0 -10
  38. package/style/scss/Bootstrap/_images.scss +0 -42
  39. package/style/scss/Bootstrap/_list-group.scss +0 -204
  40. package/style/scss/Bootstrap/_maps.scss +0 -121
  41. package/style/scss/Bootstrap/_mixins.scss +0 -42
  42. package/style/scss/Bootstrap/_modal.scss +0 -237
  43. package/style/scss/Bootstrap/_nav.scss +0 -172
  44. package/style/scss/Bootstrap/_navbar.scss +0 -286
  45. package/style/scss/Bootstrap/_offcanvas.scss +0 -146
  46. package/style/scss/Bootstrap/_pagination.scss +0 -109
  47. package/style/scss/Bootstrap/_placeholders.scss +0 -51
  48. package/style/scss/Bootstrap/_popover.scss +0 -196
  49. package/style/scss/Bootstrap/_progress.scss +0 -68
  50. package/style/scss/Bootstrap/_reboot.scss +0 -610
  51. package/style/scss/Bootstrap/_root.scss +0 -195
  52. package/style/scss/Bootstrap/_spinners.scss +0 -85
  53. package/style/scss/Bootstrap/_tables.scss +0 -164
  54. package/style/scss/Bootstrap/_toasts.scss +0 -73
  55. package/style/scss/Bootstrap/_tooltip.scss +0 -120
  56. package/style/scss/Bootstrap/_transitions.scss +0 -27
  57. package/style/scss/Bootstrap/_type.scss +0 -106
  58. package/style/scss/Bootstrap/_utilities.scss +0 -748
  59. package/style/scss/Bootstrap/_variables-dark.scss +0 -70
  60. package/style/scss/Bootstrap/_variables.scss +0 -1703
  61. package/style/scss/Bootstrap/bootstrap-grid.scss +0 -66
  62. package/style/scss/Bootstrap/bootstrap-reboot.scss +0 -10
  63. package/style/scss/Bootstrap/bootstrap-utilities.scss +0 -19
  64. package/style/scss/Bootstrap/bootstrap.scss +0 -52
  65. package/style/scss/Bootstrap/forms/_floating-labels.scss +0 -90
  66. package/style/scss/Bootstrap/forms/_form-check.scss +0 -188
  67. package/style/scss/Bootstrap/forms/_form-control.scss +0 -201
  68. package/style/scss/Bootstrap/forms/_form-range.scss +0 -91
  69. package/style/scss/Bootstrap/forms/_form-select.scss +0 -81
  70. package/style/scss/Bootstrap/forms/_form-text.scss +0 -11
  71. package/style/scss/Bootstrap/forms/_input-group.scss +0 -132
  72. package/style/scss/Bootstrap/forms/_labels.scss +0 -36
  73. package/style/scss/Bootstrap/forms/_validation.scss +0 -12
  74. package/style/scss/Bootstrap/helpers/_clearfix.scss +0 -3
  75. package/style/scss/Bootstrap/helpers/_color-bg.scss +0 -10
  76. package/style/scss/Bootstrap/helpers/_colored-links.scss +0 -12
  77. package/style/scss/Bootstrap/helpers/_position.scss +0 -36
  78. package/style/scss/Bootstrap/helpers/_ratio.scss +0 -26
  79. package/style/scss/Bootstrap/helpers/_stacks.scss +0 -15
  80. package/style/scss/Bootstrap/helpers/_stretched-link.scss +0 -15
  81. package/style/scss/Bootstrap/helpers/_text-truncation.scss +0 -7
  82. package/style/scss/Bootstrap/helpers/_visually-hidden.scss +0 -8
  83. package/style/scss/Bootstrap/helpers/_vr.scss +0 -8
  84. package/style/scss/Bootstrap/mixins/_alert.scss +0 -18
  85. package/style/scss/Bootstrap/mixins/_backdrop.scss +0 -14
  86. package/style/scss/Bootstrap/mixins/_banner.scss +0 -7
  87. package/style/scss/Bootstrap/mixins/_border-radius.scss +0 -78
  88. package/style/scss/Bootstrap/mixins/_box-shadow.scss +0 -18
  89. package/style/scss/Bootstrap/mixins/_breakpoints.scss +0 -127
  90. package/style/scss/Bootstrap/mixins/_buttons.scss +0 -70
  91. package/style/scss/Bootstrap/mixins/_caret.scss +0 -69
  92. package/style/scss/Bootstrap/mixins/_clearfix.scss +0 -9
  93. package/style/scss/Bootstrap/mixins/_color-mode.scss +0 -21
  94. package/style/scss/Bootstrap/mixins/_color-scheme.scss +0 -7
  95. package/style/scss/Bootstrap/mixins/_container.scss +0 -11
  96. package/style/scss/Bootstrap/mixins/_deprecate.scss +0 -10
  97. package/style/scss/Bootstrap/mixins/_forms.scss +0 -153
  98. package/style/scss/Bootstrap/mixins/_gradients.scss +0 -47
  99. package/style/scss/Bootstrap/mixins/_grid.scss +0 -151
  100. package/style/scss/Bootstrap/mixins/_image.scss +0 -16
  101. package/style/scss/Bootstrap/mixins/_list-group.scss +0 -27
  102. package/style/scss/Bootstrap/mixins/_lists.scss +0 -7
  103. package/style/scss/Bootstrap/mixins/_pagination.scss +0 -10
  104. package/style/scss/Bootstrap/mixins/_reset-text.scss +0 -17
  105. package/style/scss/Bootstrap/mixins/_resize.scss +0 -6
  106. package/style/scss/Bootstrap/mixins/_table-variants.scss +0 -24
  107. package/style/scss/Bootstrap/mixins/_text-truncate.scss +0 -8
  108. package/style/scss/Bootstrap/mixins/_transition.scss +0 -26
  109. package/style/scss/Bootstrap/mixins/_utilities.scss +0 -97
  110. package/style/scss/Bootstrap/mixins/_visually-hidden.scss +0 -29
  111. package/style/scss/Bootstrap/utilities/_api.scss +0 -47
  112. package/style/scss/Bootstrap/vendor/_rfs.scss +0 -354
@@ -1,85 +1,112 @@
1
1
  <template>
2
- <div class="bg-gray-000 sticky-top">
2
+ <div class="bg-gray-000 sticky-top d-print-none">
3
3
  <nav class="navbar navbar-main navbar-expand-lg border-bottoms py-0" data-bs-theme="dark">
4
- <div class="d-flex align-items-center flex-fill w-100">
4
+ <div class="navbar-placeholder-content px-4 placeholder-glow">
5
+ <span class="placeholder w-1rem"></span>
6
+ <span class="placeholder w-20rem"></span>
7
+ <span class="placeholder w-5rem"></span>
8
+ <span class="placeholder w-5rem"></span>
9
+ <span class="placeholder w-5rem"></span>
10
+ </div>
11
+ <div class="navbar-content opacity-0 d-flex align-items-center flex-fill w-100">
5
12
  <div class="border-end">
6
- <a :href="arrowBackLink" class="btn btn-normal btn-square"><span class="material-icons">arrow_back</span></a>
13
+ <a :href="arrowBackLink" class="btn btn-normal btn-square" title="離開專案"><span class="material-icons">arrow_back</span></a>
7
14
  </div>
8
- <span class="fs-6 mb-0 mx-4 text-nowrap text-project-title"><b>{{projectInfo.name}}</b></span>
15
+ <span class="fs-6 mb-0 mx-4 text-nowrap text-project-title"><b>{{projectInfo?.name}}</b></span>
9
16
  <!--TODO: 解決 overflow scroll 與 dropdown 衝突-->
10
17
  <div class="flex-grow-1 text-nowrap">
11
18
  <div class="d-flex flex-grow-1 border-start">
12
- <nav class="navbar-nav navbar-main navbar-line navbar-line-lg">
13
- <!-- <div class="nav-item navbar-line-item btn nav-link border-0 dropdown" :class="{'active':item.isActive}" v-for="item in menuModules">
14
- <a :href="item.moduleUrl" class="dropdown-link" v-if="item.moduleUrl">
15
- <span class="material-icons icon-18 me-2" v-if="item.moduleIcon">{{item.moduleIcon}}</span>
16
- {{item.moduleName}}
17
- </a>
18
- <span class="dropdown-link dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false" v-else>
19
- <span class="material-icons icon-18 me-2" v-if="item.moduleIcon">{{item.moduleIcon}}</span>
20
- {{item.moduleName}}
21
- </span>
22
- <ul class="dropdown-menu" v-if="item.moduleApps.length!==0">
23
- <li><a class="dropdown-item" href="#" v-for="app in item.moduleApps">{{app.appName}}</a></li>
24
- </ul>
25
- </div> -->
26
- <button type="button" class="nav-item navbar-line-item btn nav-link letter-spacing-1 border-0 active">
27
- <a :href="'/ProjectManagement/ProjectInfo?id=' + projectInfo.id">
19
+ <nav class="navbar-nav navbar-main navbar-tab navbar-line navbar-line-lg">
20
+ <div class="nav-item navbar-line-item btn nav-link border-0 dropdown"
21
+ :class="{'active': isActive(null)}">
22
+ <a class="dropdown-link" :href="finalRootDomain + '/ProjectManagement/ProjectInfo?id=' + projectId">
28
23
  專案資訊
29
24
  </a>
30
- </button>
31
- <div class="nav-item navbar-line-item btn nav-link border-0 dropdown" :class="{'active':navLinkObj.isActive}">
32
- <a :href="navLinkObj.url + '?projectId=' + projectInfo.id" class="dropdown-link" v-if="navLinkObj.selfIsApp">
33
- <span class="material-icons icon-18 me-2" v-if="navLinkObj.icon">{{navLinkObj.icon}}</span>
34
- {{navLinkObj.name}}
25
+ </div>
26
+ <div class="nav-item navbar-line-item btn nav-link border-0 dropdown"
27
+ :class="{'active': isActive(navLinkObj.moduleLink)}">
28
+ <a :href="navLinkObj.url + projectId" class="dropdown-link" v-if="navLinkObj?.moduleLink?.selfIsApp">
29
+ <span class="material-icons icon-18 me-2">{{ navLinkObj?.moduleLink?.icon }}</span>
30
+ {{ navLinkObj?.moduleLink?.name }}
35
31
  </a>
36
32
  <span class="dropdown-link dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false" v-else>
37
- <span class="material-icons icon-18 me-2" v-if="navLinkObj.icon">{{navLinkObj.icon}}</span>
38
- {{ navLinkObj.name}}
33
+ <span class="material-icons icon-18 icon-shine me-1">{{ navLinkObj?.moduleLink?.icon }}</span>
34
+ 功能選單
39
35
  </span>
40
- <ul class="dropdown-menu" v-if="navLinkObj.apps.length > 0">
41
- <li>
42
- <a class="dropdown-item" :href="app.url + '?projectId=' + projectInfo.id" v-for="(app, index) in navLinkObj.apps" :key="index">{{app.name}}</a>
36
+ <ul class="dropdown-menu" :class="{'p-0': navLinkObj?.moduleLink?.apps?.length == 0}">
37
+ <li v-if="navLinkObj?.moduleLink?.apps?.length > 0">
38
+ <a class="dropdown-item" :href="app.url + '?projectId=' + projectId" v-for="(app, index) in navLinkObj.moduleLink.apps" :key="index">
39
+ <span class="material-icons icon-18 align-middle me-2">{{app.icon}}</span>
40
+ <span class="align-middle">{{app.name}}</span>
41
+ </a>
43
42
  </li>
44
43
  </ul>
45
44
  </div>
46
- <!--工單流程寫死?-->
47
- <div class="nav-item navbar-line-item btn nav-link border-0 dropdown">
48
- <a href="#" class="dropdown-link">
49
- <span class="material-icons icon-18 me-2">rebase_edit</span>
50
- 工單流程
45
+ <div class="nav-item navbar-line-item btn nav-link border-0 dropdown"
46
+ :class="{'active': isActive(item.clientId)}"
47
+ v-for="item in navLinkObj.generalLink">
48
+ <a :href="item.url + '?projectId=' + projectId" class="dropdown-link">
49
+ <span class="material-icons icon-18 me-2">{{item.icon}}</span>
50
+ {{item.name}}
51
51
  </a>
52
52
  </div>
53
53
  </nav>
54
+ <nav class="navbar-nav navbar-main navbar-line navbar-line-lg ms-auto">
55
+ <div class="nav-item navbar-line-item btn nav-link border-0 dropdown">
56
+ <span class="dropdown-link dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
57
+ <div class="thumbnail-content thumbnail-32 rounded-circle me-2" :style="'background-image: url(' + userPicture + ');'"></div>
58
+ {{userId}}
59
+ </span>
60
+ <ul class="dropdown-menu dropdown-menu-end">
61
+ <li>
62
+ <a class="dropdown-item" :href="finalRootDomain + '/Profile'">個人資訊</a>
63
+ </li>
64
+ <li><hr class="dropdown-divider"></li>
65
+ <li>
66
+ <a class="dropdown-item" :href="logOutLink">登出</a>
67
+ </li>
68
+ </ul>
69
+ </div>
70
+ </nav>
54
71
  </div>
55
72
  </div>
56
73
  </div>
57
74
  </nav>
58
- <div class="info-project d-flex align-items-center bg-primary bg-opacity-25 border-top border-bottom border-primary border-opacity-25 py-2">
59
- <!--TODO: 如果是公共工程才顯示 可能有2種 (公共工程/建築物公共工程)
60
- <span class="badge rounded-pill text-primary bg-primary bg-opacity-10 border border-primary border-opacity-50 me-4">建築物公共工程</span>-->
61
- <small class="d-flex me-4" v-if="projectInfo.caseNo">
62
- <b class="me-2">案號</b>
63
- <span>{{projectInfo.caseNo}}</span>
64
- </small>
65
- <small class="d-flex me-4">
66
- <b class="me-2">工期</b>
67
- <span>{{formatDate(projectInfo.beginDT)}} - {{formatDate(projectInfo.endDT)}} ({{projectInfo.approvedWorkingPeriod}}天)</span>
68
- </small>
69
- <small class="d-flex" v-if="projectInfo.extendToDT">
70
- <b class="me-2">展延</b>
71
- <span>{{ formatDate(projectInfo.extendToDT) }}{{}} ({{projectInfo.extendDays}}天)</span>
72
- </small>
73
- <small class="d-flex ms-auto">
74
- <slot></slot>
75
- </small>
75
+ <div class="info-project bg-primary bg-opacity-25 border-top border-bottom border-primary border-opacity-25 py-2">
76
+ <div class="navbar-placeholder-content px-5 placeholder-glow">
77
+ <span class="placeholder placeholder-xs w-10rem ms-4"></span>
78
+ <span class="placeholder placeholder-xs w-12rem"></span>
79
+ <span class="placeholder placeholder-xs w-6rem"></span>
80
+ </div>
81
+ <div class="navbar-content opacity-0 d-flex align-items-center">
82
+ <span class="badge badge-outline-purple me-3">{{ navLinkObj?.moduleLink?.name }}</span>
83
+ <small class="d-flex me-4" v-if="projectInfo?.caseNo">
84
+ <b class="me-2">案號</b>
85
+ <span>{{projectInfo?.caseNo}}</span>
86
+ </small>
87
+ <small class="d-flex me-4">
88
+ <b class="me-2">開工/完工日期</b>
89
+ <span>{{formatDate(projectInfo?.beginDT)}} - {{formatDate(projectInfo?.endDT)}}</span>
90
+ </small>
91
+ <small class="d-flex me-4">
92
+ <b class="me-2">核定工期</b>
93
+ <span>{{projectInfo?.approvedWorkingPeriod}}天</span>
94
+ </small>
95
+ <small class="d-flex" v-if="projectInfo?.extendToDT">
96
+ <b class="me-2">展延至</b>
97
+ <span>{{ formatDate(projectInfo?.extendToDT) }} ({{projectInfo?.extendDays}}天)</span>
98
+ </small>
99
+ <small class="d-flex ms-auto">
100
+ <slot></slot>
101
+ </small>
102
+ </div>
76
103
  </div>
77
104
  </div>
78
105
  </template>
79
106
 
80
107
  <script>
81
- import { formatDate } from '../common/format';
82
- import { onMounted, reactive } from 'vue';
108
+ import { formatDate } from '../../../node_modules/jobdone-shared-files/common/format';
109
+ import { onMounted, ref, computed, nextTick } from 'vue';
83
110
  import axios from 'axios';
84
111
 
85
112
  export default {
@@ -88,56 +115,182 @@
88
115
  type: String,
89
116
  required: true
90
117
  },
118
+ projectId: {
119
+ type: String,
120
+ required: true
121
+ },
91
122
  projectInfo: {
92
- type: Object,
123
+ type: [String, Object],
93
124
  required: true
94
125
  },
95
- apiUrl: {
126
+ projectApps: {
127
+ type: [String, Object],
128
+ required: true
129
+ },
130
+ activeClientId: {
131
+ type: String,
132
+ required: false,
133
+ },
134
+ rootDomain: {
135
+ type: String,
136
+ required: true
137
+ },
138
+ userId: {
139
+ type: String,
140
+ required: true
141
+ },
142
+ userPicture: {
143
+ type: String,
144
+ required: true
145
+ },
146
+ logOutLink: {
96
147
  type: String,
97
148
  required: true
98
149
  }
99
- // menuModules: {
100
- // type: Array,
101
- // default: function () {
102
- // return [];
103
- // }
104
- // }
105
150
  },
106
151
  setup(props) {
107
- //TBD
108
- //projectInfo from props api
109
- //menuModules from props api
110
- const navLinkObj = reactive({
111
- apps: [],
112
- icon: '',
113
- name: '',
114
- url: '',
115
- selfIsApp: false
152
+ const projectInfo = ref({});
153
+ const navLinkObj = ref({});
154
+ const finalRootDomain = computed(() => {
155
+ if (props.rootDomain.substr(-1) === "/") {
156
+ return props.rootDomain.slice(0, -1);
157
+ }
158
+ return props.rootDomain;
116
159
  });
117
160
 
118
- onMounted(() => {
119
- axios.get(props.apiUrl)
120
- .then(res => {
121
- if (res.status == 200) {
122
- Object.assign(navLinkObj, res.data);
123
- }
161
+ const isActive = (target) => {
162
+ if (target === null) {
163
+ return target === null && !props.activeClientId;
164
+ }
165
+ if (typeof target === 'object') {
166
+ return !!props.activeClientId && (target.clientId === props.activeClientId || target.apps.some(x => x.clientId == props.activeClientId))
167
+ }
168
+ if (!!props.activeClientId && target == props.activeClientId) {
169
+ return true;
170
+ }
171
+ return false;
172
+ }
173
+
174
+ onMounted(async () => {
175
+ try {
176
+ switch (typeof props.projectInfo) {
177
+ case 'string':
178
+ axios.get(props.projectInfo).then((res) => {
179
+ projectInfo.value = res.data;
180
+ });
181
+ break;
182
+ case 'object':
183
+ projectInfo.value = props.projectInfo;
184
+ break;
185
+ default:
186
+ projectInfo.value = {
187
+ caseNo: '',
188
+ name: '',
189
+ beginDT: '',
190
+ endDT: '',
191
+ approvedWorkingPeriod: '',
192
+ extendToDT: '',
193
+ extendDays: ''
194
+ };
195
+ break;
196
+ }
197
+ } catch (e) {
198
+ projectInfo.value = {
199
+ caseNo: '',
200
+ name: '',
201
+ beginDT: '',
202
+ endDT: '',
203
+ approvedWorkingPeriod: '',
204
+ extendToDT: '',
205
+ extendDays: ''
206
+ };
207
+ }
208
+ try {
209
+ switch (typeof props.projectApps) {
210
+ case 'string':
211
+ axios.get(props.projectApps).then((res) => {
212
+ navLinkObj.value = res.data;
213
+ });
214
+ break;
215
+ case 'object':
216
+ navLinkObj.value = props.projectApps;
217
+ break;
218
+ default:
219
+ navLinkObj.value = {
220
+ "moduleLink": {
221
+ "apps": [],
222
+ "icon": "edit_document",
223
+ "name": "Module",
224
+ "url": "",
225
+ "mobileUrl": "",
226
+ "mobileAppRoute": "",
227
+ "clientId": null,
228
+ "selfIsApp": false
229
+ },
230
+ "generalLink": []
231
+ }
232
+ break;
233
+ }
234
+ } catch (e) {
235
+ navLinkObj.value = {
236
+ "moduleLink": {
237
+ "apps": [],
238
+ "icon": "edit_document",
239
+ "name": "Module",
240
+ "url": "",
241
+ "mobileUrl": "",
242
+ "mobileAppRoute": "",
243
+ "clientId": null,
244
+ "selfIsApp": false
245
+ },
246
+ "generalLink": []
247
+ }
248
+ }
249
+
250
+
251
+ nextTick(() => {
252
+ let navbarElements = document.getElementsByClassName('navbar-content');
253
+ Array.from(navbarElements).forEach(function (item) {
254
+ item.classList.remove("opacity-0");
124
255
  });
256
+
257
+ let placeholderElements = document.getElementsByClassName('navbar-placeholder-content');
258
+ Array.from(placeholderElements).forEach(function (item) {
259
+ item.classList.add("opacity-0");
260
+ });
261
+ });
125
262
  });
126
263
 
127
264
 
128
265
  return {
129
266
  formatDate,
130
- navLinkObj
267
+ projectInfo,
268
+ navLinkObj,
269
+ finalRootDomain,
270
+ isActive
131
271
  }
132
272
  }
133
273
  }
134
274
  </script>
135
275
 
136
276
  <style scoped lang="scss">
137
- @import "../style/scss/Settings/basic-import";
277
+ @import "../../../node_modules/jobdone-shared-files/style/scss/Settings/basic-import";
278
+
279
+ .navbar-content{
280
+ transition: .5s;
281
+ }
282
+
283
+ .navbar-placeholder-content{
284
+ @include position-center();
285
+ display: flex;
286
+ align-items: center;
287
+ gap: 1rem;
288
+ mix-blend-mode: color-burn;
289
+ pointer-events: none;
290
+ }
138
291
 
139
292
  .text-project-title {
140
- color: lighten($primary, 8%);
293
+ color: var(--dark-theme-primary);
141
294
  }
142
295
 
143
296
  .navbar[data-bs-theme="dark"] {
@@ -146,23 +299,48 @@
146
299
  }
147
300
 
148
301
  .navbar-main {
149
- background-color: var(--gray-800);
150
-
151
302
  .navbar-line-item {
152
303
  --bs-navbar-nav-link-padding-x: 1rem;
153
304
  }
154
-
155
305
  .dropdown-menu {
156
306
  max-height: 80vh;
157
307
  }
158
308
  }
159
309
 
310
+
311
+ .navbar[data-bs-theme="dark"], .navbar-main {
312
+ background-color: var(--gray-900);
313
+ }
314
+
315
+ .navbar-line-item.active {
316
+ background-color: var(--gray-800);
317
+ }
318
+
319
+ .navbar-tab{
320
+ min-height: 60px;
321
+ padding-top: 0.75rem;
322
+ padding-left: 0.5rem;
323
+ .navbar-line-item{
324
+ min-height: auto;
325
+ }
326
+ }
327
+
160
328
  .navbar-line-item.dropdown .dropdown-menu {
161
329
  z-index: $zindex-sticky + 1;
162
330
  }
331
+ .navbar-line-item.dropdown .dropdown-toggle[aria-expanded=true]{
332
+ color: $white;
333
+ }
163
334
 
164
335
  .info-project {
165
- padding-left: 5.25rem;
336
+ position: relative;
337
+ padding-left: 60px;
166
338
  padding-right: 1rem;
167
339
  }
340
+
341
+ .icon-shine{
342
+ background: linear-gradient(120deg, #fff 20%, #24BCE7 40%, #e8ecff 45%, #5872ff 60%, #fff 90%);
343
+ -webkit-background-clip: text;
344
+ color: transparent;
345
+ }
168
346
  </style>
package/README.md CHANGED
@@ -2,16 +2,22 @@
2
2
  如果要使用 vue 檔,需要直接引用 node_modules 裡的檔案,例如:
3
3
  `import OOXX from '../../node_modules/jobdone-shared-files/OOXX.vue';`
4
4
 
5
- ## paginate
5
+ ## Vue Components
6
+
7
+ ### paginate
6
8
  可設定尺寸:`container-class`
7
9
  - 小:`pagination-sm`
8
10
  - 中:預設
9
11
  - 大:`pagination-lg`
10
12
 
11
- ## tagEditor
13
+ ----
14
+
15
+ ### tagEditor
12
16
  標籤
13
17
 
14
- ## tree
18
+ ----
19
+
20
+ ### tree
15
21
  尺寸:`size`
16
22
  - 小: `sm`
17
23
  - 中:預設
@@ -20,8 +26,76 @@
20
26
  - 預設用在灰色背景上
21
27
  - 用在白背景上:`white`
22
28
 
23
- ## vueLoadingOverlay
29
+ ----
30
+
31
+ ### vueLoadingOverlay
24
32
  指定樣式的 vue-loading-overlay
25
33
 
26
- ## ProjectManagement/projectNavbar
27
- 專案資訊 Navbar
34
+ 用法說明 `("isLoading" => 自定義變數)` :
35
+ | 步驟 | 說明 | 範例 |
36
+ |------|-------------------|----------------------------------------------|
37
+ | 1. | 在js或.vue中import | `import Loading from "../../node_modules/jobdone-shared-files/vueLoadingOverlay.vue";` |
38
+ | 2. | 畫面中放上Component | `<Loading :is-active="isLoading"></Loading>` |
39
+ | 3. | loading 初始化 | `const isLoading = ref(false);` |
40
+ | 4. | 開啟loading | `isLoading.value = true;` |
41
+ | 5. | 關閉loading | `isLoading.value = false;` |
42
+
43
+
44
+
45
+
46
+ ----
47
+
48
+ ### ProjectManagement/projectNavbar
49
+ 專案資訊 Navbar
50
+
51
+ 需要傳入的值:
52
+ | 數值名稱 | 說明 | 必要 |
53
+ |------------------|--------------------------------------------------------------------------------|------|
54
+ | root-domain | 底層的 domain,傳入的值有無斜線皆可 | 是 |
55
+ | arrow-back-link | 離開專案的連結,一般來說是底層的 ProjectList | 是 |
56
+ | project-info | 可接受api url或物件,api僅支援Get請求,結構應為`{name: "", caseNo: "", caseNo: "",beginDT:"",endDT:"",approvedWorkingPeriod:0, extendToDT:"",extendDays:""}`| 是 |
57
+ | project-apps | 可接受api url或物件,api僅支援Get請求,結構去Copy底層API取得專案所屬Module的App連結(V2 TOP)| 是 |
58
+ | active-client-id | Navbar active的對象,請填入client id,不填預設active專案資訊| N |
59
+ | project-id | project id | 是 |
60
+ | user-id | 傳入 user 的帳號 id | 是 |
61
+ | user-picture | 傳入 user 的大頭貼 | 是 |
62
+ | log-out-link | 登出連結 | 是 |
63
+
64
+
65
+ ----
66
+
67
+ ### lightboxWithOverview
68
+ 有縮圖的圖片光箱
69
+
70
+ `<lightbox-with-overview :pictures-data="picturesData" ref="lightboxWithOverviewRef"></lightbox-with-overview>`
71
+
72
+ 可傳入的值:
73
+ | 數值名稱 | 說明 | 必要 |
74
+ |------------------|-----------------------------------------------------------------|----|
75
+ | pictures-data | 格式為: `[{src: "", title: ""}]` | 是 |
76
+ | preview | 是否要顯示縮圖,可傳入 `true` or `false` | 否 |
77
+ | display-index | 預設 index 為 0 | 否 |
78
+ | preview-count | preview 的圖片陣列數量,預設為 5,可使用 `lightboxWithOverviewRef?.previewPictures` 與 `lightboxWithOverviewRef?.otherPictureCount` | 否 |
79
+
80
+ ----
81
+
82
+ ## SCSS
83
+
84
+ ### Layout
85
+ | Layout 名稱 | 說明 | 在 jobdone-shared-files 內? |
86
+ |-------------------|-------------------------|-----------------------------|
87
+ | LayoutBase | 客製化的 Bootstrap (5.3.0) | 是 |
88
+ | LayoutProject | Project 使用的共用樣式,含開合雙欄樣式 | 是 |
89
+ | LayoutSinglePage | 單頁版面的樣式,如:登入、錯誤頁、條款等 | 是 |
90
+ | LayoutTwoColumn | 雙欄可開合樣式 | 是 |
91
+ | LayoutMobile | 針對 (底層) 手機的共用樣式 | 是 |
92
+ | LayoutDocs | 針對條文調整的樣式 | 否 |
93
+ | LayoutInnerColumn | 針對 Project 雙欄樣式內的雙欄樣式 | 否 |
94
+ | LayoutOutside | 針對 (底層) Project 外的共用樣式 | 否 |
95
+
96
+ ### Common
97
+
98
+ - Animation:目前只有 Fade In keyframe
99
+ - SelectableTable:勾選 tr focus style
100
+ - thumbnail-group:方形大頭貼與小大頭貼相疊 style
101
+ - filepond:客製化 filepond 樣式
@@ -0,0 +1,11 @@
1
+ import { Popover } from 'bootstrap'
2
+
3
+ export default {
4
+ mounted(el) {
5
+ Popover.getOrCreateInstance(el);
6
+ },
7
+ unmounted(el) {
8
+ var instance = Popover.getOrCreateInstance(el);
9
+ instance.dispose();
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ import { Tooltip } from 'bootstrap'
2
+
3
+ export default {
4
+ mounted(el) {
5
+ Tooltip.getOrCreateInstance(el);
6
+ },
7
+ unmounted(el) {
8
+ var instance = Tooltip.getOrCreateInstance(el);
9
+ instance.dispose();
10
+ }
11
+ }
package/common/format.js CHANGED
@@ -2,8 +2,22 @@ import dayjs from 'dayjs';
2
2
  import { computed } from 'vue';
3
3
 
4
4
  // 時間格式
5
- export const formatDate = (value) => dayjs(value).format('YYYY-MM-DD');
6
- export const formatDT = (value) => dayjs(value).format('YYYY-MM-DD HH:mm:ss');
5
+ export const formatDate = (value) => {
6
+ if (value === null || !value) {
7
+ return value;
8
+ } else {
9
+ return dayjs(value).format('YYYY-MM-DD');
10
+ }
11
+ };
12
+
13
+ export const formatDT = (value) => {
14
+ if (value === null || !value) {
15
+ return value;
16
+ } else {
17
+ return dayjs(value).format('YYYY-MM-DD HH:mm:ss');
18
+ }
19
+ };
20
+
7
21
 
8
22
  // 千分位格式
9
23
  export const formatThousands = computed(() => {