@mixd-id/web-scaffold 0.1.230406373 → 0.1.230406375
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
|
@@ -70,6 +70,7 @@
|
|
|
70
70
|
<div class="grid grid-cols-7 gap-2 mt-2">
|
|
71
71
|
<div v-for="i in 7">{{ getDayOfWeekLabel(i) }}</div>
|
|
72
72
|
<button type="button" :class="buttonStyle(d.value)"
|
|
73
|
+
:disabled="allowedDates && !allowedDates.includes(d.value)"
|
|
73
74
|
v-for="d in contextMenuDates" @click="setValue(d.value)">
|
|
74
75
|
{{ d.date }}
|
|
75
76
|
</button>
|
|
@@ -140,6 +141,8 @@ export default{
|
|
|
140
141
|
|
|
141
142
|
readonly: undefined,
|
|
142
143
|
|
|
144
|
+
allowedDates: Array,
|
|
145
|
+
|
|
143
146
|
},
|
|
144
147
|
|
|
145
148
|
computed:{
|
|
@@ -181,17 +184,22 @@ export default{
|
|
|
181
184
|
for(let i = 1 ; i <= 42 ; i++){
|
|
182
185
|
if(startDayOfMonth > 0){
|
|
183
186
|
startDayOfMonth--
|
|
187
|
+
const value = dayjsInput.subtract(1, 'month')
|
|
188
|
+
.format(`YYYY-MM-${(endDateOfLastMonth - startDayOfMonth).toString().padStart(2, '0')}`)
|
|
189
|
+
|
|
184
190
|
dates.push({
|
|
185
191
|
date: endDateOfLastMonth - startDayOfMonth,
|
|
186
|
-
value
|
|
187
|
-
|
|
192
|
+
value,
|
|
193
|
+
type: -1
|
|
188
194
|
})
|
|
189
195
|
}
|
|
190
196
|
else if(currentDate > endDateOfMonth){
|
|
191
|
-
|
|
197
|
+
const value = dayjsInput.add(1, 'month').format(`YYYY-MM-${nextDate.toString().padStart(2, '0')}`)
|
|
198
|
+
|
|
199
|
+
dates.push({
|
|
192
200
|
date: nextDate,
|
|
193
|
-
value
|
|
194
|
-
|
|
201
|
+
value,
|
|
202
|
+
type: 1
|
|
195
203
|
})
|
|
196
204
|
nextDate++
|
|
197
205
|
}
|
|
@@ -283,21 +291,27 @@ export default{
|
|
|
283
291
|
}
|
|
284
292
|
.datepicker input[type=radio]{
|
|
285
293
|
@apply hidden;
|
|
286
|
-
}
|
|
294
|
+
}K
|
|
287
295
|
.datepicker input[type=radio]:checked + label{
|
|
288
296
|
}
|
|
289
297
|
|
|
290
298
|
.button{
|
|
291
299
|
@apply rounded-full aspect-square;
|
|
292
300
|
}
|
|
293
|
-
.button:
|
|
301
|
+
.button:not(:disabled){
|
|
302
|
+
@apply cursor-default;
|
|
303
|
+
}
|
|
304
|
+
.button:disabled{
|
|
305
|
+
@apply text-text-300;
|
|
306
|
+
}
|
|
307
|
+
.button:not(:disabled):hover{
|
|
294
308
|
@apply bg-primary-200;
|
|
295
309
|
}
|
|
296
310
|
.button.selected{
|
|
297
311
|
@apply bg-primary text-white;
|
|
298
312
|
}
|
|
299
|
-
.button.otherMonth{
|
|
300
|
-
@apply text-text-
|
|
313
|
+
.button:not(:disabled).otherMonth{
|
|
314
|
+
@apply text-text-400;
|
|
301
315
|
}
|
|
302
316
|
|
|
303
317
|
.arrow{
|
package/src/components/List.vue
CHANGED
|
@@ -270,8 +270,9 @@ import VirtualGrid from "./VirtualGrid.vue";
|
|
|
270
270
|
import throttle from "lodash/throttle";
|
|
271
271
|
import PresetSelector from "../widgets/PresetSelector.vue";
|
|
272
272
|
import groupBy from "lodash/groupBy";
|
|
273
|
-
import {
|
|
273
|
+
import {generatePivotColumns, generateTotalColumns, sortsFn} from "../utils/preset-selector.mjs";
|
|
274
274
|
import PresetBar from "../widgets/PresetBar.vue";
|
|
275
|
+
import {queueForLater} from "../utils/helpers.mjs";
|
|
275
276
|
|
|
276
277
|
export default{
|
|
277
278
|
|
|
@@ -370,10 +371,10 @@ export default{
|
|
|
370
371
|
.then(data => {
|
|
371
372
|
const firstItem = data.items[0]
|
|
372
373
|
const lastItem = data.items[data.items.length - 1]
|
|
373
|
-
console.log('#
|
|
374
|
+
console.log('#loaded',
|
|
374
375
|
firstItem?.id, firstItem?.lastMessageAt,
|
|
375
376
|
lastItem?.id, lastItem?.lastMessageAt,
|
|
376
|
-
data.length)
|
|
377
|
+
data.items.length)
|
|
377
378
|
|
|
378
379
|
generatePivotColumns(this.preset, data.items)
|
|
379
380
|
generateTotalColumns(this.preset, data.items)
|
|
@@ -395,7 +396,7 @@ export default{
|
|
|
395
396
|
!(this.preset.pivot ?? {}).enabled) {
|
|
396
397
|
|
|
397
398
|
const afterItem = this.data.items[this.data.items.length - 1]
|
|
398
|
-
console.log('#
|
|
399
|
+
console.log('#next', afterItem.id, afterItem.lastMessageAt)
|
|
399
400
|
|
|
400
401
|
this.readyState = 4
|
|
401
402
|
this.socket.send(this.src, {
|
|
@@ -406,10 +407,10 @@ export default{
|
|
|
406
407
|
.then(data => {
|
|
407
408
|
const firstItem = data.items[0]
|
|
408
409
|
const lastItem = data.items[data.items.length - 1]
|
|
409
|
-
console.log('#
|
|
410
|
+
console.log('#loaded',
|
|
410
411
|
firstItem?.id, firstItem?.lastMessageAt,
|
|
411
412
|
lastItem?.id, lastItem?.lastMessageAt,
|
|
412
|
-
data.length)
|
|
413
|
+
data.items.length)
|
|
413
414
|
|
|
414
415
|
this.data.items.push(...data.items)
|
|
415
416
|
this.loadEnums(data.items)
|
|
@@ -595,6 +596,21 @@ export default{
|
|
|
595
596
|
}
|
|
596
597
|
},
|
|
597
598
|
|
|
599
|
+
loadQueued(items){
|
|
600
|
+
const key = items[0] && items[0].uid ? 'uid' : 'id'
|
|
601
|
+
|
|
602
|
+
this.socket.send(this.src, {
|
|
603
|
+
...this.preset,
|
|
604
|
+
[key]: items.map(item => item[key])
|
|
605
|
+
})
|
|
606
|
+
.then(({ items:nextItems }) => {
|
|
607
|
+
nextItems.forEach(item => this.$util.unshift(this.data.items, item, { highlight: true }))
|
|
608
|
+
|
|
609
|
+
const destroyedItems = items.filter(_ => !nextItems.find(i => i[key] === _[key]))
|
|
610
|
+
this.$util.remove(this.data.items, destroyedItems)
|
|
611
|
+
})
|
|
612
|
+
},
|
|
613
|
+
|
|
598
614
|
onSignal(event, items){
|
|
599
615
|
if(this.pivotEnabled) return
|
|
600
616
|
if(!Array.isArray(items) || items.length < 1) return
|
|
@@ -606,18 +622,7 @@ export default{
|
|
|
606
622
|
break
|
|
607
623
|
|
|
608
624
|
default:
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
this.socket.send(this.src, {
|
|
612
|
-
...this.preset,
|
|
613
|
-
[key]: items.map(item => item[key])
|
|
614
|
-
})
|
|
615
|
-
.then(({ items:nextItems }) => {
|
|
616
|
-
nextItems.forEach(item => this.$util.unshift(this.data.items, item, { highlight: true }))
|
|
617
|
-
|
|
618
|
-
const destroyedItems = items.filter(_ => !nextItems.find(i => i[key] === _[key]))
|
|
619
|
-
this.$util.remove(this.data.items, destroyedItems)
|
|
620
|
-
})
|
|
625
|
+
this.queue(items)
|
|
621
626
|
break
|
|
622
627
|
}
|
|
623
628
|
|
|
@@ -816,6 +821,10 @@ export default{
|
|
|
816
821
|
}
|
|
817
822
|
|
|
818
823
|
window.addEventListener('keydown', this.onKeyDown)
|
|
824
|
+
|
|
825
|
+
this.queue = queueForLater({
|
|
826
|
+
pop: this.loadQueued
|
|
827
|
+
})
|
|
819
828
|
},
|
|
820
829
|
|
|
821
830
|
unmounted() {
|
|
@@ -978,6 +987,7 @@ export default{
|
|
|
978
987
|
enumCache: {},
|
|
979
988
|
extItems: null,
|
|
980
989
|
lastEnumItems: null,
|
|
990
|
+
queue: null,
|
|
981
991
|
}
|
|
982
992
|
},
|
|
983
993
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<div class="flex-1 flex flex-row gap-2">
|
|
7
7
|
<Dropdown v-model="value.operator"
|
|
8
8
|
:readonly="readonly"
|
|
9
|
-
:class="![ 'yesterday', 'today', 'thisWeek', 'thisMonth', 'lastMonth', 'thisYear' ].includes(value.operator) ? 'w-[100px]' : 'w-full'"
|
|
9
|
+
:class="![ 'yesterday', 'today', 'thisWeek', 'thisMonth', 'lastMonth', 'thisYear', 'null' ].includes(value.operator) ? 'w-[100px]' : 'w-full'"
|
|
10
10
|
@change="apply">
|
|
11
11
|
<option value="=">=</option>
|
|
12
12
|
<option value=">">></option>
|
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
<option value="thisMonth">This Month</option>
|
|
21
21
|
<option value="lastMonth">Last Month</option>
|
|
22
22
|
<option value="thisYear">This Year</option>
|
|
23
|
+
<option value="null">No Value</option>
|
|
23
24
|
</Dropdown>
|
|
24
|
-
<div v-if="![ 'yesterday', 'today', 'thisWeek', 'thisMonth', 'lastMonth', 'thisYear' ].includes(value.operator)"
|
|
25
|
+
<div v-if="![ 'yesterday', 'today', 'thisWeek', 'thisMonth', 'lastMonth', 'thisYear', 'null' ].includes(value.operator)"
|
|
25
26
|
class="flex-1 flex flex-row gap-2">
|
|
26
27
|
<Datepicker class="flex-1"
|
|
27
28
|
mode="popup"
|
package/src/utils/helpers.mjs
CHANGED
|
@@ -390,6 +390,35 @@ const invokeAfterIdle = (callback, delay = 1300) => {
|
|
|
390
390
|
}
|
|
391
391
|
}
|
|
392
392
|
|
|
393
|
+
const queueForLater = (params) => {
|
|
394
|
+
|
|
395
|
+
const instance = {
|
|
396
|
+
delay: 1500,
|
|
397
|
+
...params,
|
|
398
|
+
|
|
399
|
+
items: [],
|
|
400
|
+
timeoutId: null,
|
|
401
|
+
|
|
402
|
+
run: () => {
|
|
403
|
+
const items = instance.items.splice(0, instance.items.length);
|
|
404
|
+
typeof instance.pop === 'function' ? instance.pop(items) : null;
|
|
405
|
+
instance.timeoutId = null
|
|
406
|
+
},
|
|
407
|
+
|
|
408
|
+
queue(item) {
|
|
409
|
+
if(Array.isArray(item))
|
|
410
|
+
instance.items.push(...item)
|
|
411
|
+
else
|
|
412
|
+
instance.items.push(item)
|
|
413
|
+
|
|
414
|
+
if(!instance.timeoutId)
|
|
415
|
+
instance.timeoutId = window.setTimeout(instance.run, instance.delay);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
return instance.queue
|
|
420
|
+
}
|
|
421
|
+
|
|
393
422
|
|
|
394
423
|
export {
|
|
395
424
|
capitalize,
|
|
@@ -416,7 +445,8 @@ export {
|
|
|
416
445
|
unslugAndCapitalize,
|
|
417
446
|
applyDatasourceReplacer,
|
|
418
447
|
strVars,
|
|
419
|
-
invokeAfterIdle
|
|
448
|
+
invokeAfterIdle,
|
|
449
|
+
queueForLater
|
|
420
450
|
}
|
|
421
451
|
|
|
422
452
|
function observeInit(){
|
|
@@ -113,6 +113,16 @@ const getValue = (filter, opt) => {
|
|
|
113
113
|
}
|
|
114
114
|
break
|
|
115
115
|
|
|
116
|
+
case 'null':
|
|
117
|
+
withoutKey ?
|
|
118
|
+
whereObj = {
|
|
119
|
+
[Op.eq]: null
|
|
120
|
+
} :
|
|
121
|
+
whereObj[key] = {
|
|
122
|
+
[Op.eq]: null
|
|
123
|
+
}
|
|
124
|
+
break
|
|
125
|
+
|
|
116
126
|
case 'between':
|
|
117
127
|
withoutKey ?
|
|
118
128
|
whereObj = {
|
|
@@ -472,6 +482,12 @@ const filtersToSequelizeWhere = async(filters, opt) => {
|
|
|
472
482
|
}
|
|
473
483
|
break
|
|
474
484
|
|
|
485
|
+
case 'null':
|
|
486
|
+
whereObj = {
|
|
487
|
+
[key]: null
|
|
488
|
+
}
|
|
489
|
+
break
|
|
490
|
+
|
|
475
491
|
case 'between':
|
|
476
492
|
whereObj = {
|
|
477
493
|
[key]:{
|