frappe-ui 0.0.38 → 0.0.43

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,6 +1,6 @@
1
1
  {
2
2
  "name": "frappe-ui",
3
- "version": "0.0.38",
3
+ "version": "0.0.43",
4
4
  "description": "A set of components and utilities for rapid UI development",
5
5
  "main": "./src/index.js",
6
6
  "scripts": {
@@ -30,7 +30,7 @@
30
30
  "autoprefixer": "^10.4.2",
31
31
  "feather-icons": "^4.28.0",
32
32
  "postcss": "^8.4.5",
33
- "socket.io-client": "^2.4.0",
33
+ "socket.io-client": "^4.5.1",
34
34
  "tailwindcss": "^3.0.12"
35
35
  }
36
36
  }
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="overflow-hidden" :class="styleClasses">
2
+ <div class="overflow-hidden shrink-0" :class="styleClasses">
3
3
  <img
4
4
  v-if="imageURL"
5
5
  :src="imageURL"
@@ -17,11 +17,11 @@
17
17
  >
18
18
  <MenuItems
19
19
  class="absolute z-10 mt-2 bg-white divide-y divide-gray-100 rounded-md shadow-lg min-w-40 ring-1 ring-black ring-opacity-5 focus:outline-none"
20
- :class="
21
- placement === 'left'
22
- ? 'left-0 origin-top-left'
23
- : 'right-0 origin-top-right'
24
- "
20
+ :class="{
21
+ 'left-0 origin-top-left': placement == 'left',
22
+ 'right-0 origin-top-right': placement == 'right',
23
+ 'inset-x-0 origin-top': placement == 'center',
24
+ }"
25
25
  >
26
26
  <div v-for="group in groups" :key="group.key" class="px-1 py-1">
27
27
  <div
@@ -70,12 +70,16 @@
70
70
  </div>
71
71
  </template>
72
72
  <script>
73
- import { Popover } from 'frappe-ui'
74
-
73
+ import { Popover, Dialog, Input, Button } from 'frappe-ui'
75
74
  export default {
76
75
  name: 'TipTapMenu',
77
76
  props: ['editor', 'buttons'],
78
- components: { Popover },
77
+ components: {
78
+ Popover,
79
+ Dialog,
80
+ Input,
81
+ Button,
82
+ },
79
83
  data() {
80
84
  return {
81
85
  setLinkDialog: { url: '', show: false },
@@ -41,6 +41,12 @@
41
41
  </button>
42
42
  </FloatingMenu>
43
43
  <editor-content :editor="editor" />
44
+ <span
45
+ v-if="!content"
46
+ class="absolute inset-y-0 text-base text-gray-500 pointer-events-none"
47
+ >
48
+ {{ placeholder }}
49
+ </span>
44
50
  </div>
45
51
  </template>
46
52
 
@@ -4,6 +4,7 @@ import { reactive, watch } from 'vue'
4
4
  let cached = {}
5
5
  let documentCache = reactive({})
6
6
  let listCache = reactive({})
7
+ let listResources = {}
7
8
 
8
9
  export function createResource(options, vm, getResource) {
9
10
  let cacheKey = null
@@ -181,6 +182,8 @@ export function createDocumentResource(options, vm) {
181
182
  beforeSubmit(params) {
182
183
  out.previousDoc = JSON.stringify(out.doc)
183
184
  Object.assign(out.doc, params.fieldname || {})
185
+ // update data in list resources
186
+ updateRowInListResource(out.doctype, out.doc)
184
187
  },
185
188
  onSuccess(data) {
186
189
  out.doc = transform(data)
@@ -189,6 +192,8 @@ export function createDocumentResource(options, vm) {
189
192
  onError(error) {
190
193
  out.doc = JSON.parse(out.previousDoc)
191
194
  options.setValue?.onError?.call(vm, error)
195
+ // revert data in list resource
196
+ revertRowInListResource(out.doctype, out.doc)
192
197
  },
193
198
  }
194
199
 
@@ -311,10 +316,12 @@ export function createListResource(options, vm, getResource) {
311
316
  fields: options.fields,
312
317
  filters: options.filters,
313
318
  order_by: options.order_by,
314
- start: options.start,
315
- limit: options.limit,
319
+ start: options.start || 0,
320
+ limit: options.limit || 20,
316
321
  originalData: null,
317
322
  data: null,
323
+ next,
324
+ hasNextPage: true,
318
325
  list: createResource(
319
326
  {
320
327
  method: 'frappe.client.get_list',
@@ -329,8 +336,15 @@ export function createListResource(options, vm, getResource) {
329
336
  }
330
337
  },
331
338
  onSuccess(data) {
332
- out.originalData = data
333
- out.data = transform(data)
339
+ if (data.length < out.limit) {
340
+ out.hasNextPage = false
341
+ }
342
+ if (!out.start || out.start == 0) {
343
+ out.originalData = data
344
+ } else if (out.start > 0) {
345
+ out.originalData = out.originalData.concat(data)
346
+ }
347
+ out.data = transform(out.originalData)
334
348
  options.onSuccess?.call(vm, out.data)
335
349
  },
336
350
  onError: options.onError,
@@ -426,6 +440,7 @@ export function createListResource(options, vm, getResource) {
426
440
  update,
427
441
  reload,
428
442
  setData,
443
+ transform,
429
444
  })
430
445
 
431
446
  function update(updatedOptions) {
@@ -449,6 +464,7 @@ export function createListResource(options, vm, getResource) {
449
464
  }
450
465
 
451
466
  function reload() {
467
+ out.start = 0
452
468
  return out.list.fetch()
453
469
  }
454
470
 
@@ -459,6 +475,11 @@ export function createListResource(options, vm, getResource) {
459
475
  out.data = data
460
476
  }
461
477
 
478
+ function next() {
479
+ out.start = out.start + out.limit
480
+ out.list.fetch()
481
+ }
482
+
462
483
  // fetch list
463
484
  out.list.fetch()
464
485
 
@@ -467,9 +488,50 @@ export function createListResource(options, vm, getResource) {
467
488
  listCache[cacheKey] = out
468
489
  }
469
490
 
491
+ listResources[out.doctype] = listResources[out.doctype] || []
492
+ listResources[out.doctype].push(out)
493
+
470
494
  return out
471
495
  }
472
496
 
497
+ function updateRowInListResource(doctype, doc) {
498
+ let resources = listResources[doctype]
499
+ for (let resource of resources) {
500
+ if (resource.originalData) {
501
+ for (let row of resource.originalData) {
502
+ if (row.name && row.name == doc.name) {
503
+ let previousRowData = JSON.stringify(row)
504
+ for (let key in row) {
505
+ if (key in doc) {
506
+ row[key] = doc[key]
507
+ }
508
+ }
509
+ row._previousData = previousRowData
510
+ }
511
+ }
512
+ resource.data = resource.transform(resource.originalData)
513
+ }
514
+ }
515
+ }
516
+
517
+ function revertRowInListResource(doctype, doc) {
518
+ let resources = listResources[doctype]
519
+ for (let resource of resources) {
520
+ if (resource.originalData) {
521
+ for (let row of resource.originalData) {
522
+ if (row.name && row.name == doc.name) {
523
+ let previousRowData = JSON.parse(row._previousData)
524
+ for (let key in row) {
525
+ row[key] = previousRowData[key]
526
+ }
527
+ delete row._previousData
528
+ }
529
+ }
530
+ resource.data = resource.transform(resource.originalData)
531
+ }
532
+ }
533
+ }
534
+
473
535
  function createResourceForOptions(options, vm, getResource) {
474
536
  if (options.type === 'document') {
475
537
  return createDocumentResource(options, vm, getResource)
@@ -1,9 +1,13 @@
1
- import io from 'socket.io-client/dist/socket.io.slim'
1
+ import { io } from 'socket.io-client'
2
2
 
3
- let host = window.location.hostname
4
- let port = window.location.port ? ':9000' : ''
5
- let protocol = port ? 'http' : 'https'
6
- let url = `${protocol}://${host}${port}`
7
- let socket = io(url)
3
+ function initSocket() {
4
+ let host = window.location.hostname
5
+ let port = window.location.port ? ':9000' : ''
6
+ let protocol = port ? 'http' : 'https'
7
+ let url = `${protocol}://${host}${port}`
8
+ return io(url)
9
+ }
10
+
11
+ let socket = initSocket()
8
12
 
9
13
  export default socket