jobdone-shared-files 0.0.1-beta.9 → 0.0.1-beta.90

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