jobdone-shared-files 0.0.1-beta.79 → 0.0.1-beta.80

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 (37) hide show
  1. package/.vs/VSWorkspaceState.json +6 -0
  2. package/.vs/jobdone_sharejs/FileContentIndex/a973f22d-a16a-4ca9-ab6a-75ab92ec6af7.vsidx +0 -0
  3. package/.vs/jobdone_sharejs/FileContentIndex/bacf95a3-2185-41c2-b12a-e93bb40f2204.vsidx +0 -0
  4. package/.vs/jobdone_sharejs/config/applicationhost.config +1021 -0
  5. package/.vs/jobdone_sharejs/v17/.wsuo +0 -0
  6. package/.vs/slnx.sqlite +0 -0
  7. package/ProjectManagement/projectNavbar.vue +131 -84
  8. package/README.md +7 -7
  9. package/common/directives/collapse.js +12 -12
  10. package/common/directives/popovers.js +10 -10
  11. package/common/directives/tooltip.js +10 -10
  12. package/common/format.js +26 -26
  13. package/index.js +14 -14
  14. package/lightboxWithOverview.vue +131 -131
  15. package/package.json +19 -19
  16. package/paginate.vue +138 -138
  17. package/style/css/vue-loading-overlay/index.css +40 -40
  18. package/style/scss/Common/Animation.scss +5 -5
  19. package/style/scss/Common/SelectableTable.scss +30 -30
  20. package/style/scss/Common/filepond.scss +27 -27
  21. package/style/scss/Common/thumbnail-group.scss +14 -14
  22. package/style/scss/Layout/LayoutBase.scss +1014 -1014
  23. package/style/scss/Layout/LayoutMobile.scss +202 -202
  24. package/style/scss/Layout/LayoutProject.scss +122 -122
  25. package/style/scss/Layout/LayoutSinglePage.scss +13 -13
  26. package/style/scss/Layout/LayoutTwoColumn.scss +56 -56
  27. package/style/scss/Settings/_Mixins.scss +229 -229
  28. package/style/scss/Settings/_MobileVariables.scss +11 -11
  29. package/style/scss/Settings/_basic-import.scss +5 -5
  30. package/style/scss/Settings/_bs-variables-dark.scss +70 -70
  31. package/style/scss/Settings/_bs-variables.scss +1743 -1743
  32. package/style/scss/Settings/_color-mode.scss +122 -122
  33. package/style/scss/Settings/_custom-variables.scss +13 -13
  34. package/tagEditor.vue +263 -263
  35. package/tree.vue +69 -69
  36. package/treeItem.vue +366 -366
  37. package/vueLoadingOverlay.vue +70 -70
Binary file
Binary file
@@ -12,45 +12,39 @@
12
12
  <div class="border-end">
13
13
  <a :href="arrowBackLink" class="btn btn-normal btn-square" title="離開專案"><span class="material-icons">arrow_back</span></a>
14
14
  </div>
15
- <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>
16
16
  <!--TODO: 解決 overflow scroll 與 dropdown 衝突-->
17
17
  <div class="flex-grow-1 text-nowrap">
18
18
  <div class="d-flex flex-grow-1 border-start">
19
19
  <nav class="navbar-nav navbar-main navbar-line navbar-line-lg">
20
20
  <div class="nav-item navbar-line-item btn nav-link border-0 dropdown"
21
- :class="{'active':activeLinkType==0}">
21
+ :class="{'active': isActive(null)}">
22
22
  <a class="dropdown-link" :href="finalRootDomain + '/ProjectManagement/ProjectInfo?id=' + projectId">
23
23
  專案資訊
24
24
  </a>
25
25
  </div>
26
26
  <div class="nav-item navbar-line-item btn nav-link border-0 dropdown"
27
- :class="{'active':activeLinkType==1}">
28
- <a :href="navLinkObj.url + projectId" class="dropdown-link" v-if="navLinkObj.selfIsApp">
29
- <span class="material-icons icon-18 me-2">{{ navLinkObj.icon }}</span>
30
- {{ navLinkObj.name }}
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 }}
31
31
  </a>
32
32
  <span class="dropdown-link dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false" v-else>
33
- <span class="material-icons icon-18 me-2">{{ navLinkObj.icon }}</span>
34
- {{ navLinkObj.name }}
33
+ <span class="material-icons icon-18 me-2">{{ navLinkObj?.moduleLink?.icon }}</span>
34
+ {{ navLinkObj?.moduleLink?.name }}
35
35
  </span>
36
- <ul class="dropdown-menu" :class="{'p-0': navLinkObj.apps.length == 0}">
37
- <li v-if="navLinkObj.apps.length > 0">
38
- <a class="dropdown-item" :href="app.url + '?projectId=' + projectId" 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 == 0}">
37
+ <li v-if="navLinkObj?.moduleLink?.apps?.length??0 > 0">
38
+ <a class="dropdown-item" :href="app.url + '?projectId=' + projectId" v-for="(app, index) in navLinkObj.moduleLink.apps" :key="index">{{app.name}}</a>
39
39
  </li>
40
40
  </ul>
41
41
  </div>
42
42
  <div class="nav-item navbar-line-item btn nav-link border-0 dropdown"
43
- :class="{'active':activeLinkType==2}">
44
- <a :href="'https://jobdone-improvement-sheet.azurewebsites.net/ProjectSheetList?projectId=' + projectId" class="dropdown-link">
45
- <span class="material-icons icon-18 me-2">edit_document</span>
46
- 改善單
47
- </a>
48
- </div>
49
- <div class="nav-item navbar-line-item btn nav-link border-0 dropdown disabled"
50
- :class="{'active':activeLinkType==3}">
51
- <a href="#" class="dropdown-link">
52
- <span class="material-icons icon-18 me-2">rebase_edit</span>
53
- 家當表單
43
+ :class="{'active': isActive(item.clientId)}"
44
+ v-for="item in navLinkObj.generalLink">
45
+ <a :href="item.url + '?projectId=' + projectId" class="dropdown-link">
46
+ <span class="material-icons icon-18 me-2">{{item.icon}}</span>
47
+ {{item.name}}
54
48
  </a>
55
49
  </div>
56
50
  </nav>
@@ -78,21 +72,21 @@
78
72
  <span class="placeholder placeholder-xs w-6rem"></span>
79
73
  </div>
80
74
  <div class="navbar-content opacity-0 d-flex align-items-center">
81
- <small class="d-flex me-4" v-if="projectInfo.caseNo">
75
+ <small class="d-flex me-4" v-if="projectInfo?.caseNo">
82
76
  <b class="me-2">案號</b>
83
- <span>{{projectInfo.caseNo}}</span>
77
+ <span>{{projectInfo?.caseNo}}</span>
84
78
  </small>
85
79
  <small class="d-flex me-4">
86
80
  <b class="me-2">開工/完工日期</b>
87
- <span>{{formatDate(projectInfo.beginDT)}} - {{formatDate(projectInfo.endDT)}}</span>
81
+ <span>{{formatDate(projectInfo?.beginDT)}} - {{formatDate(projectInfo?.endDT)}}</span>
88
82
  </small>
89
83
  <small class="d-flex me-4">
90
84
  <b class="me-2">核定工期</b>
91
- <span>{{projectInfo.approvedWorkingPeriod}}天</span>
85
+ <span>{{projectInfo?.approvedWorkingPeriod}}天</span>
92
86
  </small>
93
- <small class="d-flex" v-if="projectInfo.extendToDT">
87
+ <small class="d-flex" v-if="projectInfo?.extendToDT">
94
88
  <b class="me-2">展延至</b>
95
- <span>{{ formatDate(projectInfo.extendToDT) }}{{}} ({{projectInfo.extendDays}}天)</span>
89
+ <span>{{ formatDate(projectInfo?.extendToDT) }} ({{projectInfo?.extendDays}}天)</span>
96
90
  </small>
97
91
  <small class="d-flex ms-auto">
98
92
  <slot></slot>
@@ -104,32 +98,32 @@
104
98
 
105
99
  <script>
106
100
  import { formatDate } from '../../../node_modules/jobdone-shared-files/common/format';
107
- import { onMounted, ref } from 'vue';
101
+ import { onMounted, ref, computed, nextTick } from 'vue';
108
102
  import axios from 'axios';
109
103
 
110
104
  export default {
111
105
  props: {
112
- rootDomain: {
106
+ arrowBackLink: {
113
107
  type: String,
114
108
  required: true
115
109
  },
116
- arrowBackLink: {
110
+ projectId: {
117
111
  type: String,
118
112
  required: true
119
113
  },
120
- activeLinkType: {
121
- type: Number,
114
+ projectInfo: {
115
+ type: [String, Object],
122
116
  required: true
123
117
  },
124
- projectId: {
125
- type: String,
118
+ projectApps: {
119
+ type: [String, Object],
126
120
  required: true
127
121
  },
128
- apiProjectInfo: {
122
+ activeClientId: {
129
123
  type: String,
130
- required: true
124
+ required: false,
131
125
  },
132
- apiProjectApps: {
126
+ rootDomain: {
133
127
  type: String,
134
128
  required: true
135
129
  },
@@ -147,64 +141,116 @@
147
141
  }
148
142
  },
149
143
  setup(props) {
150
-
151
- const projectInfo = ref({
152
- id: '',
153
- orgnizationId: '',
154
- moduleId: '',
155
- caseNo: '',
156
- buildingPermit: '',
157
- name: '',
158
- beginDT: '',
159
- endDT: '',
160
- approvedWorkingPeriod: '',
161
- latitude: '',
162
- longitude: '',
163
- latitudeAndLongitude: '',
164
- landSerialNo: '',
165
- remark: '',
166
- roleType: 1,
167
- extendToDT: '',
168
- extendDays: ''
169
- });
170
-
171
- const navLinkObj = ref({
172
- apps: [],
173
- icon: '',
174
- name: '',
175
- url: '',
176
- selfIsApp: false
144
+ const projectInfo = ref({});
145
+ const navLinkObj = ref({});
146
+ const finalRootDomain = computed(() => {
147
+ if (props.rootDomain.substr(-1) === "/") {
148
+ return props.rootDomain.slice(0, -1);
149
+ }
150
+ return props.rootDomain;
177
151
  });
178
152
 
179
- const finalRootDomain = ref(props.rootDomain);
180
-
153
+ const isActive = (target) => {
154
+ if (target === null) {
155
+ return target === null && !props.activeClientId;
156
+ }
157
+ if (typeof target === 'object') {
158
+ return !!props.activeClientId && (target.clientId === props.activeClientId || target.apps.some(x => x.id == props.activeClientId))
159
+ }
160
+ if (!!props.activeClientId && target == props.activeClientId) {
161
+ return true;
162
+ }
163
+ return false;
164
+ }
181
165
 
182
166
  onMounted(async () => {
183
- try {
184
- if (finalRootDomain.value[finalRootDomain.value.length-1] == "/") {
185
- finalRootDomain.value = finalRootDomain.value.slice(0, -1);
186
- }
167
+ try {
168
+ switch (typeof props.projectInfo) {
169
+ case 'string':
170
+ axios.get(props.projectInfo).then((res) => {
171
+ projectInfo.value = res.data;
172
+ });
173
+ break;
174
+ case 'object':
175
+ projectInfo.value = props.projectInfo;
176
+ break;
177
+ default:
178
+ projectInfo.value = {
179
+ caseNo: '',
180
+ name: '',
181
+ beginDT: '',
182
+ endDT: '',
183
+ approvedWorkingPeriod: '',
184
+ extendToDT: '',
185
+ extendDays: ''
186
+ };
187
+ break;
188
+ }
189
+ } catch (e) {
190
+ projectInfo.value = {
191
+ caseNo: '',
192
+ name: '',
193
+ beginDT: '',
194
+ endDT: '',
195
+ approvedWorkingPeriod: '',
196
+ extendToDT: '',
197
+ extendDays: ''
198
+ };
199
+ }
200
+ try {
201
+ switch (typeof props.projectApps) {
202
+ case 'string':
203
+ axios.get(props.projectApps).then((res) => {
204
+ navLinkObj.value = res.data;
205
+ });
206
+ break;
207
+ case 'object':
208
+ navLinkObj.value = props.projectApps;
209
+ break;
210
+ default:
211
+ navLinkObj.value = {
212
+ "moduleLink": {
213
+ "apps": [],
214
+ "icon": "edit_document",
215
+ "name": "Module",
216
+ "url": "",
217
+ "mobileUrl": "",
218
+ "mobileAppRoute": "",
219
+ "clientId": null,
220
+ "selfIsApp": false
221
+ },
222
+ "generalLink": []
223
+ }
224
+ break;
225
+ }
226
+ } catch (e) {
227
+ navLinkObj.value = {
228
+ "moduleLink": {
229
+ "apps": [],
230
+ "icon": "edit_document",
231
+ "name": "Module",
232
+ "url": "",
233
+ "mobileUrl": "",
234
+ "mobileAppRoute": "",
235
+ "clientId": null,
236
+ "selfIsApp": false
237
+ },
238
+ "generalLink": []
239
+ }
240
+ }
241
+
187
242
 
188
- const data = await Promise.all([
189
- axios.get(props.apiProjectInfo),
190
- axios.get(props.apiProjectApps)
191
- ]);
192
- Object.assign(projectInfo.value, data[0].data);
193
- Object.assign(navLinkObj.value, data[1].data);
194
-
243
+ nextTick(() => {
195
244
  let navbarElements = document.getElementsByClassName('navbar-content');
196
- Array.from(navbarElements).forEach(function(item){
245
+ Array.from(navbarElements).forEach(function (item) {
197
246
  item.classList.remove("opacity-0");
198
247
  });
199
248
 
200
249
  let placeholderElements = document.getElementsByClassName('navbar-placeholder-content');
201
- Array.from(placeholderElements).forEach(function(item){
250
+ Array.from(placeholderElements).forEach(function (item) {
202
251
  item.classList.add("opacity-0");
203
252
  });
204
-
205
- } catch (error) {
206
- console.log(error);
207
- }
253
+ });
208
254
  });
209
255
 
210
256
 
@@ -213,6 +259,7 @@
213
259
  projectInfo,
214
260
  navLinkObj,
215
261
  finalRootDomain,
262
+ isActive
216
263
  }
217
264
  }
218
265
  }
package/README.md CHANGED
@@ -49,14 +49,14 @@
49
49
  專案資訊 Navbar
50
50
 
51
51
  需要傳入的值:
52
- | 數值名稱 | 說明 | 必要 |
53
- |------------------|-----------------------------------------------------------------|----|
54
- | root-domain | 底層的 domain,傳入的值有無斜線皆可 | 是 |
55
- | arrow-back-link | 離開專案的連結,一般來說是底層的 ProjectList | 是 |
56
- | active-link-type | Navbar active 的種類 ( 0 = 專案資訊 / 1 = Module / 2 = 改善單 / 3 = 家當表單 ) | 是 |
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 |
57
59
  | project-id | project id | 是 |
58
- | api-project-apps | 取得 project module & menu | 是 |
59
- | api-project-info | 取得 project 資訊 | 是 |
60
60
  | user-id | 傳入 user 的帳號 id | 是 |
61
61
  | user-picture | 傳入 user 的大頭貼 | 是 |
62
62
  | log-out-link | 登出連結 | 是 |
@@ -1,13 +1,13 @@
1
- import { Collapse } from 'bootstrap'
2
-
3
- export default {
4
- mounted(el) {
5
- Collapse.getOrCreateInstance(el, {
6
- toggle: false
7
- });
8
- },
9
- unmounted(el) {
10
- var instance = Collapse.getOrCreateInstance(el);
11
- instance.dispose();
12
- }
1
+ import { Collapse } from 'bootstrap'
2
+
3
+ export default {
4
+ mounted(el) {
5
+ Collapse.getOrCreateInstance(el, {
6
+ toggle: false
7
+ });
8
+ },
9
+ unmounted(el) {
10
+ var instance = Collapse.getOrCreateInstance(el);
11
+ instance.dispose();
12
+ }
13
13
  }
@@ -1,11 +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
- }
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
11
  }
@@ -1,11 +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
- }
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
11
  }
package/common/format.js CHANGED
@@ -1,27 +1,27 @@
1
- import dayjs from 'dayjs';
2
- import { computed } from 'vue';
3
-
4
- // 時間格式
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
-
21
-
22
- // 千分位格式
23
- export const formatThousands = computed(() => {
24
- return function(number){
25
- return new Intl.NumberFormat().format(number);
26
- }
1
+ import dayjs from 'dayjs';
2
+ import { computed } from 'vue';
3
+
4
+ // 時間格式
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
+
21
+
22
+ // 千分位格式
23
+ export const formatThousands = computed(() => {
24
+ return function(number){
25
+ return new Intl.NumberFormat().format(number);
26
+ }
27
27
  });
package/index.js CHANGED
@@ -1,15 +1,15 @@
1
- import paginate from "./paginate.vue";
2
- import tagEditor from "./tagEditor.vue";
3
- import tree from "./tree.vue";
4
- import vueLoadingOverlay from "./vueLoadingOverlay.vue";
5
- import projectNavbar from "./ProjectManagement/projectNavbar.vue";
6
-
7
- export default {
8
- paginate,
9
- tagEditor,
10
- tree,
11
- vueLoadingOverlay,
12
-
13
- // ProjectManagement
14
- projectNavbar
1
+ import paginate from "./paginate.vue";
2
+ import tagEditor from "./tagEditor.vue";
3
+ import tree from "./tree.vue";
4
+ import vueLoadingOverlay from "./vueLoadingOverlay.vue";
5
+ import projectNavbar from "./ProjectManagement/projectNavbar.vue";
6
+
7
+ export default {
8
+ paginate,
9
+ tagEditor,
10
+ tree,
11
+ vueLoadingOverlay,
12
+
13
+ // ProjectManagement
14
+ projectNavbar
15
15
  }