@mixd-id/web-scaffold 0.1.2301231322 → 0.1.2301231324

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mixd-id/web-scaffold",
3
3
  "private": false,
4
- "version": "0.1.2301231322",
4
+ "version": "0.1.2301231324",
5
5
  "scripts": {
6
6
  "dev": "vite serve",
7
7
  "build": "vite build",
@@ -1,5 +1,7 @@
1
1
  <template>
2
- <div :class="computedOuterClass" @click="onClick">
2
+ <div :class="computedOuterClass">
3
+ <slot v-if="editable && $slots['edit-area']" name="edit-area"></slot>
4
+ <div v-else-if="editable" :class="$style.editArea" @click="edit"></div>
3
5
  <img :class="computedClass" :src="actualSrc" ref="img" :style="imageStyle"/>
4
6
  <input v-if="Boolean(editable)" class="hidden" type="file" accept="image/*" ref="file" @change="onChange"/>
5
7
  <slot></slot>
@@ -54,7 +56,8 @@ export default{
54
56
 
55
57
  computedOuterClass(){
56
58
  return [
57
- this.$style.img
59
+ this.$style.img,
60
+ this.outerClass
58
61
  ]
59
62
  .join(' ')
60
63
  },
@@ -102,7 +105,7 @@ export default{
102
105
  }
103
106
  },
104
107
 
105
- onClick(){
108
+ edit(){
106
109
  if(this.$refs.file){
107
110
  this.$refs.file.click()
108
111
  }
@@ -193,6 +196,10 @@ export default{
193
196
  @apply relative;
194
197
  }
195
198
 
199
+ .editArea{
200
+ @apply absolute top-0 left-0 right-0 bottom-0;
201
+ }
202
+
196
203
  .isLoading{
197
204
  @apply absolute top-0 left-0 right-0 bottom-0;
198
205
  @apply flex items-center justify-center;
@@ -32,11 +32,21 @@ export default{
32
32
  open(imageUrl){
33
33
  this.imageUrl = imageUrl
34
34
  this.isOpen = true
35
+ window.addEventListener('keyup', this.onKeyUp)
35
36
  },
36
37
 
37
38
  close(){
38
39
  this.isOpen = false
39
40
  this.imageUrl = null
41
+ window.removeEventListener('keyup', this.onKeyUp)
42
+ },
43
+
44
+ onKeyUp(e){
45
+ if(e.keyCode === 27){
46
+ e.preventDefault()
47
+ e.stopPropagation()
48
+ this.close()
49
+ }
40
50
  }
41
51
 
42
52
  }
@@ -53,6 +63,7 @@ export default{
53
63
 
54
64
  .previewModal{
55
65
  @apply !w-screen !h-screen !bg-base-300;
66
+ z-index: 21 !important;
56
67
  max-width: unset !important;
57
68
  max-height: unset !important;
58
69
  }
@@ -5,10 +5,11 @@
5
5
  <div class="flex-1 flex flex-col">
6
6
 
7
7
  <div class="p-6 pb-0 flex flex-row gap-3 items-center">
8
- <div class="mr-6">
8
+ <div class="mr-6 hidden md:block">
9
9
  <h2>{{ title }}</h2>
10
10
  </div>
11
- <div class="flex-1 overflow-hidden mr-4">
11
+ <div class="flex-1"></div>
12
+ <div class="overflow-hidden mr-4 hidden md:block">
12
13
  <slot v-if="$slots['lp-search']" name="lp-search" :preset="preset"/>
13
14
  <Textbox v-else :clearable="true" placeholder="Cari..." class="w-[200px]" v-model="preset.search"
14
15
  @clear="clearSearch" @submit="load">
@@ -21,7 +22,7 @@
21
22
  </template>
22
23
  </Textbox>
23
24
  </div>
24
- <div>
25
+ <div class="hidden md:block">
25
26
  <slot name="lp-tabspace" :preset="preset"/>
26
27
  </div>
27
28
  <div class="flex flex-row gap-1 items-center">
@@ -45,8 +46,17 @@
45
46
  </div>
46
47
  </div>
47
48
 
48
- <VirtualTable class="flex-1 m-6" :columns="presetColumns" :items="items"
49
- :appearances="appearances" @scroll-end="loadNext">
49
+ <VirtualScroll v-if="isMobile.value" :items="items" class="flex-1" @scroll-end="loadNext">
50
+ <template #item="{ item, index }">
51
+ <slot v-if="$slots.mobile" name="mobile" :item="item" :index="index"></slot>
52
+ <div v-else>
53
+ <div class="h-[2rem] bg-base-300 rounded-lg my-2"></div>
54
+ </div>
55
+ </template>
56
+ </VirtualScroll>
57
+
58
+ <VirtualTable v-else class="flex-1 m-6" :columns="presetColumns" :items="items"
59
+ :appearances="appearances" @scroll-end="loadNext" :pinned="pinned">
50
60
  <template v-for="(_, slot) in $slots" #[slot]="{ item, index }">
51
61
  <slot :name="slot" :item="item" :index="index"></slot>
52
62
  </template>
@@ -191,6 +201,8 @@ export default{
191
201
 
192
202
  title: String,
193
203
 
204
+ pinned: Function
205
+
194
206
  },
195
207
 
196
208
  computed: {
@@ -381,7 +393,7 @@ export default{
381
393
 
382
394
  onHooks(module, event, items){
383
395
 
384
- console.log('onHooks', module, event, items)
396
+ //console.log('onHooks', module, event, items)
385
397
 
386
398
  if(!Array.isArray(items)) return
387
399
  items = items.filter((_) => _).map((_) => {
@@ -80,6 +80,8 @@ export default{
80
80
 
81
81
  items: Array,
82
82
 
83
+ pinned: Function,
84
+
83
85
  defaultColumnWidth: {
84
86
  type: String,
85
87
  default: _DEFAULT_COLUMN_WIDTH
@@ -108,9 +110,30 @@ export default{
108
110
  return Math.round(this.scrollTop / this.itemHeight)
109
111
  },
110
112
 
113
+ sortedItems(){
114
+ if(!Array.isArray(this.items)) return []
115
+
116
+ if(typeof this.pinned === 'function'){
117
+ const pinnedItems = []
118
+ const unpinnedItems = []
119
+ this.items.forEach((item) => {
120
+ if(this.pinned(item))
121
+ pinnedItems.push(item)
122
+ else
123
+ unpinnedItems.push(item)
124
+ })
125
+
126
+ return [
127
+ ...pinnedItems,
128
+ ...unpinnedItems
129
+ ]
130
+ }
131
+ return this.items
132
+ },
133
+
111
134
  visibleItems(){
112
135
  if(this.itemHeight <= 0) return []
113
- return this.items ? this.items.slice(this.visibleStartIndex, this.visibleStartIndex + this.maxVisibleItems) : []
136
+ return this.sortedItems.slice(this.visibleStartIndex, this.visibleStartIndex + this.maxVisibleItems)
114
137
  },
115
138
 
116
139
  spacerStyle(){
package/src/index.js CHANGED
@@ -1,14 +1,11 @@
1
- import {defineAsyncComponent} from "vue"
1
+ import {defineAsyncComponent, ref} from "vue"
2
2
  import {observeInit} from './helper.js'
3
+ import throttle from "lodash-es/throttle";
3
4
  //import './index.css'
4
5
 
5
- const isBrowser = () => {
6
- return typeof window === 'object'
7
- }
8
-
9
- const isMobile = () => {
10
- return isBrowser &&
11
- (window.innerWidth < window.innerHeight && window.innerWidth <= 800)
6
+ const calculateIsMobile = () => {
7
+ if(typeof window === 'undefined') return false
8
+ return window.innerWidth < window.innerHeight && window.innerWidth <= 800
12
9
  }
13
10
 
14
11
  let _UNIQID = 0
@@ -36,14 +33,18 @@ export default{
36
33
  install: (app, options) => {
37
34
  //console.log('installing webfxfy-vue...')
38
35
 
39
- app.config.globalProperties.isBrowser = isBrowser
40
- app.config.globalProperties.isMobile = isMobile
41
- app.config.globalProperties.uniqid = uniqid
36
+ let isMobile = ref(calculateIsMobile())
42
37
 
43
38
  if(typeof window !== 'undefined' && 'IntersectionObserver' in window) {
44
39
  app.config.globalProperties.$observe = observeInit()
40
+
41
+ window.addEventListener('resize', throttle(() => {
42
+ isMobile.value = calculateIsMobile()
43
+ }, 600, { trailing:true }))
45
44
  }
46
45
 
46
+ app.config.globalProperties.uniqid = uniqid
47
+ app.config.globalProperties.isMobile = isMobile
47
48
  app.config.globalProperties.$download = download
48
49
 
49
50
  app.component('Alert', defineAsyncComponent(() => import("./components/Alert.vue")))