jobdone-shared-files 0.0.1-beta.2

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 (48) hide show
  1. package/ProjectManagement/projectNavbar.vue +168 -0
  2. package/README.md +27 -0
  3. package/common/directives/collapse.js +13 -0
  4. package/common/format.js +13 -0
  5. package/index.js +15 -0
  6. package/package.json +18 -0
  7. package/paginate.vue +139 -0
  8. package/style/css/vue-loading-overlay/index.css +40 -0
  9. package/style/scss/Bootstrap/_functions.scss +302 -0
  10. package/style/scss/Bootstrap/_mixins.scss +42 -0
  11. package/style/scss/Bootstrap/mixins/_alert.scss +18 -0
  12. package/style/scss/Bootstrap/mixins/_backdrop.scss +14 -0
  13. package/style/scss/Bootstrap/mixins/_banner.scss +7 -0
  14. package/style/scss/Bootstrap/mixins/_border-radius.scss +78 -0
  15. package/style/scss/Bootstrap/mixins/_box-shadow.scss +18 -0
  16. package/style/scss/Bootstrap/mixins/_breakpoints.scss +127 -0
  17. package/style/scss/Bootstrap/mixins/_buttons.scss +70 -0
  18. package/style/scss/Bootstrap/mixins/_caret.scss +69 -0
  19. package/style/scss/Bootstrap/mixins/_clearfix.scss +9 -0
  20. package/style/scss/Bootstrap/mixins/_color-mode.scss +21 -0
  21. package/style/scss/Bootstrap/mixins/_color-scheme.scss +7 -0
  22. package/style/scss/Bootstrap/mixins/_container.scss +11 -0
  23. package/style/scss/Bootstrap/mixins/_deprecate.scss +10 -0
  24. package/style/scss/Bootstrap/mixins/_forms.scss +153 -0
  25. package/style/scss/Bootstrap/mixins/_gradients.scss +47 -0
  26. package/style/scss/Bootstrap/mixins/_grid.scss +151 -0
  27. package/style/scss/Bootstrap/mixins/_image.scss +16 -0
  28. package/style/scss/Bootstrap/mixins/_list-group.scss +27 -0
  29. package/style/scss/Bootstrap/mixins/_lists.scss +7 -0
  30. package/style/scss/Bootstrap/mixins/_pagination.scss +10 -0
  31. package/style/scss/Bootstrap/mixins/_reset-text.scss +17 -0
  32. package/style/scss/Bootstrap/mixins/_resize.scss +6 -0
  33. package/style/scss/Bootstrap/mixins/_table-variants.scss +24 -0
  34. package/style/scss/Bootstrap/mixins/_text-truncate.scss +8 -0
  35. package/style/scss/Bootstrap/mixins/_transition.scss +26 -0
  36. package/style/scss/Bootstrap/mixins/_utilities.scss +97 -0
  37. package/style/scss/Bootstrap/mixins/_visually-hidden.scss +29 -0
  38. package/style/scss/Bootstrap/vendor/_rfs.scss +354 -0
  39. package/style/scss/Settings/_Mixins.scss +228 -0
  40. package/style/scss/Settings/_basic-import.scss +5 -0
  41. package/style/scss/Settings/_bs-variables-dark.scss +70 -0
  42. package/style/scss/Settings/_bs-variables.scss +1703 -0
  43. package/style/scss/Settings/_color-mode.scss +123 -0
  44. package/style/scss/Settings/_custom-variables.scss +7 -0
  45. package/tagEditor.vue +264 -0
  46. package/tree.vue +62 -0
  47. package/treeItem.vue +367 -0
  48. package/vueLoadingOverlay.vue +77 -0
@@ -0,0 +1,168 @@
1
+ <template>
2
+ <div class="bg-gray-000 sticky-top">
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">
5
+ <div class="border-end">
6
+ <a :href="arrowBackLink" class="btn btn-normal btn-square"><span class="material-icons">arrow_back</span></a>
7
+ </div>
8
+ <span class="fs-6 mb-0 mx-4 text-nowrap text-project-title"><b>{{projectInfo.name}}</b></span>
9
+ <!--TODO: 解決 overflow scroll 與 dropdown 衝突-->
10
+ <div class="flex-grow-1 text-nowrap">
11
+ <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">
28
+ 專案資訊
29
+ </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}}
35
+ </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}}
39
+ </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>
43
+ </li>
44
+ </ul>
45
+ </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
+ </nav>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </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>
76
+ </div>
77
+ </div>
78
+ </template>
79
+
80
+ <script>
81
+ import { formatDate } from '../common/format';
82
+ import { onMounted, reactive } from 'vue';
83
+ import axios from 'axios';
84
+
85
+ export default {
86
+ props: {
87
+ arrowBackLink: {
88
+ type: String,
89
+ required: true
90
+ },
91
+ projectInfo: {
92
+ type: Object,
93
+ required: true
94
+ },
95
+ apiUrl: {
96
+ type: String,
97
+ required: true
98
+ }
99
+ // menuModules: {
100
+ // type: Array,
101
+ // default: function () {
102
+ // return [];
103
+ // }
104
+ // }
105
+ },
106
+ 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
116
+ });
117
+
118
+ onMounted(() => {
119
+ axios.get(props.apiUrl)
120
+ .then(res => {
121
+ if (res.status == 200) {
122
+ Object.assign(navLinkObj, res.data);
123
+ }
124
+ });
125
+ });
126
+
127
+
128
+ return {
129
+ formatDate,
130
+ navLinkObj
131
+ }
132
+ }
133
+ }
134
+ </script>
135
+
136
+ <style scoped lang="scss">
137
+ @import "../style/scss/Settings/basic-import";
138
+
139
+ .text-project-title {
140
+ color: lighten($primary, 8%);
141
+ }
142
+
143
+ .navbar[data-bs-theme="dark"] {
144
+ --bs-body-color: var(--gray-500);
145
+ color: var(--bs-body-color);
146
+ }
147
+
148
+ .navbar-main {
149
+ background-color: var(--gray-800);
150
+
151
+ .navbar-line-item {
152
+ --bs-navbar-nav-link-padding-x: 1rem;
153
+ }
154
+
155
+ .dropdown-menu {
156
+ max-height: 80vh;
157
+ }
158
+ }
159
+
160
+ .navbar-line-item.dropdown .dropdown-menu {
161
+ z-index: $zindex-sticky + 1;
162
+ }
163
+
164
+ .info-project {
165
+ padding-left: 5.25rem;
166
+ padding-right: 1rem;
167
+ }
168
+ </style>
package/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # 共用清單
2
+ 如果要使用 vue 檔,需要直接引用 node_modules 裡的檔案,例如:
3
+ `import OOXX from '../../node_modules/jobdone-shared-js/OOXX.vue';`
4
+
5
+ ## paginate
6
+ 可設定尺寸:`container-class`
7
+ - 小:`pagination-sm`
8
+ - 中:預設
9
+ - 大:`pagination-lg`
10
+
11
+ ## tagEditor
12
+ 標籤
13
+
14
+ ## tree
15
+ 尺寸:`size`
16
+ - 小: `sm`
17
+ - 中:預設
18
+
19
+ 背景色:`bgColor`
20
+ - 預設用在灰色背景上
21
+ - 用在白背景上:`white`
22
+
23
+ ## vueLoadingOverlay
24
+ 指定樣式的 vue-loading-overlay
25
+
26
+ ## ProjectManagement/projectNavbar
27
+ 專案資訊 Navbar
@@ -0,0 +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
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ import dayjs from 'dayjs';
2
+ import { computed } from 'vue';
3
+
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');
7
+
8
+ // 千分位格式
9
+ export const formatThousands = computed(() => {
10
+ return function(number){
11
+ return new Intl.NumberFormat().format(number);
12
+ }
13
+ });
package/index.js ADDED
@@ -0,0 +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
15
+ }
package/package.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "jobdone-shared-files",
3
+ "version": "0.0.1-beta.2",
4
+ "description": "Shared JS for Jobdone Enterprise.",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "author": "Pyramius",
10
+ "license": "MIT",
11
+ "dependencies": {
12
+ "axios": "^1.2.2",
13
+ "vue": "^3.2.45",
14
+ "vue-loading-overlay": "^6.0.3",
15
+ "bootstrap": "^5.3.0-alpha1",
16
+ "dayjs": "^1.11.7"
17
+ }
18
+ }
package/paginate.vue ADDED
@@ -0,0 +1,139 @@
1
+ <template>
2
+ <ul class="pagination pagination-round mb-0" :class="containerClass">
3
+ <li class="page-item" :class="{'disabled':!pagination.ShowToPrev}">
4
+ <button type="button" class="page-link" @click="toPage(1)">
5
+ <span class="material-icons">first_page</span>
6
+ </button>
7
+ </li>
8
+ <li class="page-item" :class="{'disabled':!pagination.ShowToPrev}">
9
+ <button type="button" class="page-link" @click="toPage(currentPage-1)">
10
+ <span class="material-icons icon-18">chevron_left</span>
11
+ </button>
12
+ </li>
13
+ <li class="page-item page-item-ellipsis" v-if="pagination.ShowPrevPageMore">
14
+ <span>⋯</span>
15
+ </li>
16
+ <li class="page-item" v-for="n in range" :class="{'active':n===currentPage}">
17
+ <button type="button" class="page-link" @click="toPage(n)">{{n}}</button>
18
+ </li>
19
+ <li class="page-item page-item-ellipsis" v-if="pagination.ShowNextPageMore">
20
+ <span>⋯</span>
21
+ </li>
22
+ <li class="page-item" :class="{'disabled':!pagination.ShowToNext}">
23
+ <button type="button" class="page-link" @click="toPage(currentPage+1)">
24
+ <span class="material-icons icon-18">chevron_right</span>
25
+ </button>
26
+ </li>
27
+ <li class="page-item" :class="{'disabled':!pagination.ShowToNext}">
28
+ <button type="button" class="page-link" @click="toPage(totalPages)">
29
+ <span class="material-icons">last_page</span>
30
+ </button>
31
+ </li>
32
+ </ul>
33
+ </template>
34
+
35
+ <script>
36
+ import { computed } from 'vue';
37
+ export default {
38
+ props: {
39
+ currentPage: {
40
+ type: Number,
41
+ default: 1
42
+ },
43
+ totalPages: {
44
+ type: Number,
45
+ default: 1
46
+ },
47
+ pageRange: {
48
+ type: Number,
49
+ default: 5
50
+ },
51
+ containerClass: {
52
+ type: String,
53
+ default: ""
54
+ },
55
+ pageItemClass: {
56
+ type: String,
57
+ default: ""
58
+ },
59
+ clickHandler: {
60
+ type: Function
61
+ }
62
+ },
63
+ setup(props, { emit}) {
64
+ const range = computed(() => {
65
+ let min = 1;
66
+ let max = 1;
67
+ if (props.pageRange < props.totalPages) {
68
+ max = props.currentPage + Math.floor(props.pageRange / 2);
69
+ max = (max > props.totalPages) ? props.totalPages : max;
70
+ if (max - props.pageRange < 1) {
71
+ min = 1;
72
+ max = props.pageRange;
73
+ } else {
74
+ min = max - props.pageRange + 1;
75
+ }
76
+ } else {
77
+ min = 1;
78
+ max = props.totalPages;
79
+ }
80
+ const range = [];
81
+ for (var i = min; i <= max; i++) {
82
+ range.push(i);
83
+ }
84
+ return range;
85
+ });
86
+ const pagination = computed(() => {
87
+ return {
88
+ ShowToPrev: props.currentPage > 1,
89
+ ShowPrevPageMore: range.value[0] > 2,
90
+ ShowNextPageMore: range.value[range.value.length - 1] < props.totalPages - 1,
91
+ ShowToNext: props.currentPage < props.totalPages
92
+ }
93
+ });
94
+ const toPage = (pageNum) => {
95
+ emit('to-page', pageNum);
96
+ }
97
+ return {
98
+ range,
99
+ pagination,
100
+ toPage
101
+ };
102
+ }
103
+ }
104
+ </script>
105
+
106
+ <style scoped lang="scss">
107
+ @import "./style/scss/Settings/basic-import";
108
+
109
+ .page-link{
110
+ height: 100%;
111
+ }
112
+
113
+ .pagination.pagination-round .page-item{
114
+ &:not(:last-child){
115
+ margin-right: .5em;
116
+ }
117
+ .page-link{
118
+ @include flex-center();
119
+ @include size(35px);
120
+ border-radius: 50%;
121
+ overflow: hidden;
122
+ .material-icons{
123
+ font-size: 130%;
124
+ }
125
+ }
126
+ }
127
+ .pagination-sm.pagination-round .page-item .page-link{
128
+ @include size(30px);
129
+ }
130
+ .pagination-lg.pagination-round .page-item .page-link{
131
+ @include size(60px);
132
+ }
133
+ .page-item-ellipsis{
134
+ display: flex;
135
+ align-items: center;
136
+ color: var(--gray-500);
137
+ font-size: var(--bs-pagination-font-size);
138
+ }
139
+ </style>
@@ -0,0 +1,40 @@
1
+ .vl-shown {
2
+ overflow: hidden;
3
+ }
4
+
5
+ .vl-overlay {
6
+ bottom: 0;
7
+ left: 0;
8
+ position: absolute;
9
+ right: 0;
10
+ top: 0;
11
+ align-items: center;
12
+ display: none;
13
+ justify-content: center;
14
+ overflow: hidden;
15
+ z-index: 9999;
16
+ }
17
+
18
+ .vl-overlay.vl-active {
19
+ display: flex;
20
+ }
21
+
22
+ .vl-overlay.vl-full-page {
23
+ z-index: 9999;
24
+ position: fixed;
25
+ }
26
+
27
+ .vl-overlay .vl-background {
28
+ bottom: 0;
29
+ left: 0;
30
+ position: absolute;
31
+ right: 0;
32
+ top: 0;
33
+ background: #fff;
34
+ opacity: 0.5;
35
+ }
36
+
37
+ .vl-overlay .vl-icon, .vl-parent {
38
+ position: relative;
39
+ }
40
+