@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mixd-id/web-scaffold",
3
3
  "private": false,
4
- "version": "0.1.230406373",
4
+ "version": "0.1.230406375",
5
5
  "scripts": {
6
6
  "dev": "vite serve",
7
7
  "build": "vite build",
@@ -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: year + '-' + month.toString().padStart(2, '0') + '-' + (endDateOfLastMonth - startDayOfMonth).toString().padStart(2, '0'),
187
- type: -1
192
+ value,
193
+ type: -1
188
194
  })
189
195
  }
190
196
  else if(currentDate > endDateOfMonth){
191
- dates.push({
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: year + '-' + (month + 2).toString().padStart(2, '0') + '-' + nextDate.toString().padStart(2, '0'),
194
- type: 1
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:hover{
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-300;
313
+ .button:not(:disabled).otherMonth{
314
+ @apply text-text-400;
301
315
  }
302
316
 
303
317
  .arrow{
@@ -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 { generatePivotColumns, generateTotalColumns, sortsFn } from "../utils/preset-selector.mjs";
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('#Loaded',
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('#Next', afterItem.id, afterItem.lastMessageAt)
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('#Loaded',
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
- const key = items[0] && items[0].uid ? 'uid' : 'id'
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=">">&gt;</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"
@@ -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]:{